提供: Minecraft Modding Wiki
この編集を取り消せます。
下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
+ | {{前提MOD|reqmod="ModLoader"}} | ||
+ | |||
+ | ==mod の逆コンパイル Tips== | ||
このページでは mod がどのようにして動作しているのかを知るため、Java ソースファイルに変換するための Tips を記述します。<br/> | このページでは mod がどのようにして動作しているのかを知るため、Java ソースファイルに変換するための Tips を記述します。<br/> | ||
− | == | + | ==もっとも簡単な方法== |
− | + | mcp で逆コンパイルを行う前に minecraft.jar に mod の class ファイルをいれておけば、一緒に逆コンパイルしてくれるそうです。<br/> | |
− | + | この方法ですと難読化も解除してくれるので楽に読みやすいソースファイルが手に入ります。<br/> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | </ | ||
− | |||
− | </ | ||
− | |||
==手作業で逆コンパイルをする場合== | ==手作業で逆コンパイルをする場合== | ||
− | + | mcp での作業後に新たに mod を逆コンパイルする場合、手作業で難読化を解除することになります。<br/> | |
− | + | 量が多いとかなり大変なので、大型の mod の場合は mcp で再度逆コンパイルすることをおすすめします。<br/> | |
− | mcp | ||
− | 量が多いとかなり大変なので、大型の mod の場合は mcp | ||
ここでは小型・単機能の mod を手作業で難読化解除する方法について記述します。<br/> | ここでは小型・単機能の mod を手作業で難読化解除する方法について記述します。<br/> | ||
− | ; | + | ;jad で class ファイルをソースファイルに変換する。 |
:eclipse で強制的に class ファイルを読ませても逆コンパイルできたような…。 | :eclipse で強制的に class ファイルを読ませても逆コンパイルできたような…。 | ||
− | ;mcp/conf の中にある client.srg | + | ;mcp/conf の中にある client.srg を開きます。今回は mcp62(本体ver1.2.5用)を使います。 |
− | |||
:mcp は mod の対応バージョンをよく確認して選んでください。 | :mcp は mod の対応バージョンをよく確認して選んでください。 | ||
:本体ver1.2.5用の mod なのに、mcp72(ver1.3.2用)を使ったりすると悲惨なことになります。 | :本体ver1.2.5用の mod なのに、mcp72(ver1.3.2用)を使ったりすると悲惨なことになります。 | ||
51行目: | 21行目: | ||
:この中にクラス、フィールド、メソッドが記述されています。 | :この中にクラス、フィールド、メソッドが記述されています。 | ||
:行の先頭が CL ならクラス、FD がフィールド、MD がメソッドになります。 | :行の先頭が CL ならクラス、FD がフィールド、MD がメソッドになります。 | ||
− | ; | + | ;ソースを開き、クラスと思われる部分を置換していきます。 |
:例)aan itemstack = ~~; | :例)aan itemstack = ~~; | ||
:aan がクラス名になりますので client.srg から検索します("CL: aan" とかね)。 | :aan がクラス名になりますので client.srg から検索します("CL: aan" とかね)。 | ||
57行目: | 27行目: | ||
:例)if (entity instanceof fq) | :例)if (entity instanceof fq) | ||
:正規表現「^CL: fq 」で検索します。EntityItem ですね。 | :正規表現「^CL: fq 」で検索します。EntityItem ですね。 | ||
− | ; | + | ;クラス名を解除できたら、次はフィールドです。 |
:例)if(!entity.G) | :例)if(!entity.G) | ||
:entity は Entity クラスのインスタンスです。 | :entity は Entity クラスのインスタンスです。 | ||
66行目: | 36行目: | ||
:「field_646_aA」を検索すれば、フィールド名が見つかります。「isDead」です。 | :「field_646_aA」を検索すれば、フィールド名が見つかります。「isDead」です。 | ||
:結果)if(!entity.isDead) | :結果)if(!entity.isDead) | ||
− | ; | + | ;同じようにして、メソッド名も methods.csv から探します。 |
− | |||
:メソッド名は場合によって、同一メソッド名が複数存在します。引数が異なることでオーバーロードできるためです。 | :メソッド名は場合によって、同一メソッド名が複数存在します。引数が異なることでオーバーロードできるためです。 | ||
:その場合は引数や戻り値の型からどのメソッドかを調べてください。 | :その場合は引数や戻り値の型からどのメソッドかを調べてください。 | ||
78行目: | 47行目: | ||
:よって void func_238_a(IBlockAccess b, int i, int j, int k) になります。 | :よって void func_238_a(IBlockAccess b, int i, int j, int k) になります。 | ||
:同様に F は float、D が double になります。 | :同様に F は float、D が double になります。 | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |