4

Minecraft のソース ファイルにメソッドを追加しようとしていますが、ソース ファイルを実際に編集せずにそれを行う方法を見つけなければなりません。これは、作成している mod に含める必要があるソース ファイルを再配布することは違法であるためです。 . setInPortalZub()にある"EntityPlayer" ファイルにメソッドを追加する必要があります。MCP net.minecraft.entity.player/ Minecraft Forge API を使用していますEntityPlayer

4

1 に答える 1

9

あなたはコアモッドの素晴らしくもどかしい世界に足を踏み入れようとしています! FML (Forge ModLoader) のコアモッドは、クラス ファイルの修正版を配布することなく、バニラ Minecraft クラスに任意のコードを挿入する「最も簡単な」方法です。

これは、ObjectWeb によってリリースされた ASM バイトコード操作フレームワークを利用することによって実現されます。このフレームワークを使用すると、ロード時にクラスのバイトコードを読み取って操作できる Java コードを作成できます。

この偉業を達成するために必要なすべてのステップを説明することは不可能なので、代わりに、私自身のコアモッド インジェクション クラスへのリンクを投稿し、それぞれの説明を試みます。

これがCorePluginクラスです。

このCorePluginクラスは、実際のコード インジェクションを行うトランスフォーマー クラスの場所を Forge ModLoader に伝えます。

.jarこのクラスは、ファイル マニフェストに基づいて FML によって検出されます。

Manifest-Version: 1.0
FMLCorePlugin: bspkrs.treecapitator.fml.asm.TreeCapitatorCorePlugin
FMLCorePluginContainsFMLMod: bspkrs.treecapitator.fml.TreeCapitatorMod
Created-By: 1.7.0 (Oracle Corporation)

FMLCorePluginCorePlugin クラスへの完全修飾パスを指定します。.jarファイルに通常@Modのスタイルの Forge ModLoader mod クラスも含める場合は、指定する必要があります(FMLCorePluginContainsFMLMod期待される値は不明ですが、値に何を入力するかは実際には問題ではないと思いますが、キーはそこの)。

さて、楽しい部分は...実際のバイトコードトランスフォーマーです。Treecapitator のトランスフォーマーへのリンクは次のとおりです。

あまり詳しくは説明しませんが、このクラスは、Eclipse と「本番環境」の両方で実行できるように記述しました。そのため、 が 2 つありHashMapます。1 つは MCP 実行用、もう 1 つは難読化実行用です。ロードされるすべてのクラスは、最初にメソッドに渡されtransform()ます。コードは、変換したいクラスかどうかをチェックし、そうであれば変換します。

これらすべてを実装した結果、 のインスタンスが作成されるたびにトランスフォーマーが実行され、メソッドItemInWorldManager内の特定の場所に単一の行が追加されます。removeBlock()この 1 行は、プレーヤーがブロックを壊したときにコードを実行できるようにするための安価なブロック ブレーク フックとして機能します。


チップ:

  • Eclipse 用の ByteCode Outline プラグインを入手します。Object Web Web サイトで見つけることができます。
  • 難読化された環境にあるため、Eclipse/MCP のクラス構造が異なる場合があります。
  • これらは、理解するのが簡単な概念ではありません。Bytecode Outline プラグインを使用して、変換するクラスを表示します。コードを含めたい場合と含めない場合があります。これは、探すべき「ランドマーク」と、挿入する必要がある ASM ノードを理解するのに役立ちます。

それが役立つことを願っています!

編集: クラスがまだ含まれている古いブランチを参照するように壊れたリンクを修正しました。

于 2013-09-25T17:01:44.167 に答える