提供: Minecraft Modding Wiki
この編集を取り消せます。
下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
このページでは mod がどのようにして動作しているのかを知るため、Java ソースファイルに変換するための Tips を記述します。<br/> | このページでは mod がどのようにして動作しているのかを知るため、Java ソースファイルに変換するための Tips を記述します。<br/> | ||
− | == | + | ==デコンパイルに必要なツール== |
;Java Decompiler | ;Java Decompiler | ||
− | :http:// | + | :http://java.decompiler.free.fr/ |
:GUIとEclipseの両方で使えるデコンパイラ。 | :GUIとEclipseの両方で使えるデコンパイラ。 | ||
:動作が軽く、コードエクスプローラ機能もあるため使いやすい。 | :動作が軽く、コードエクスプローラ機能もあるため使いやすい。 | ||
:難読化は解除できないものの、手軽にデコンパイルするには便利。 | :難読化は解除できないものの、手軽にデコンパイルするには便利。 | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
;mcp | ;mcp | ||
− | :http:// | + | :http://mcp.ocean-labs.de/index.php/MCP_Releases |
− | |||
:ご存知、Minecraft.jar のデコンパイラ。 | :ご存知、Minecraft.jar のデコンパイラ。 | ||
:Minecraft.jar に mod を導入しておけば、mod ごとデコンパイルできる。 | :Minecraft.jar に mod を導入しておけば、mod ごとデコンパイルできる。 | ||
30行目: | 14行目: | ||
:ただし既存classの書き換えがある場合、どれを書き換えているのか事前に調べておかないと探すのが困難。 | :ただし既存classの書き換えがある場合、どれを書き換えているのか事前に調べておかないと探すのが困難。 | ||
:そのままリコンパイルしても動かない事もある。特にリソースの再配置は必須。 | :そのままリコンパイルしても動かない事もある。特にリソースの再配置は必須。 | ||
− | + | ;jad | |
− | : | + | :これまでスタンダードだったデコンパイラ。 |
− | + | :公式のページが消滅したため、現在では入手困難。 | |
− | |||
==手作業で逆コンパイルをする場合== | ==手作業で逆コンパイルをする場合== | ||
− | |||
− | |||
mcp 以外で逆コンパイルする場合、手作業で難読化を解除することになります。<br/> | mcp 以外で逆コンパイルする場合、手作業で難読化を解除することになります。<br/> | ||
量が多いとかなり大変なので、大型の mod の場合は mcp で逆コンパイルすることをおすすめします。<br/> | 量が多いとかなり大変なので、大型の mod の場合は mcp で逆コンパイルすることをおすすめします。<br/> | ||
44行目: | 25行目: | ||
;Java Decompiler等で class ファイルをソースファイルに変換する。 | ;Java Decompiler等で 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行目: | 31行目: | ||
:この中にクラス、フィールド、メソッドが記述されています。 | :この中にクラス、フィールド、メソッドが記述されています。 | ||
:行の先頭が CL ならクラス、FD がフィールド、MD がメソッドになります。 | :行の先頭が CL ならクラス、FD がフィールド、MD がメソッドになります。 | ||
− | ; | + | ;ソースを開き、クラスと思われる部分を置換していきます。 |
:例)aan itemstack = ~~; | :例)aan itemstack = ~~; | ||
:aan がクラス名になりますので client.srg から検索します("CL: aan" とかね)。 | :aan がクラス名になりますので client.srg から検索します("CL: aan" とかね)。 | ||
57行目: | 37行目: | ||
:例)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行目: | 46行目: | ||
:「field_646_aA」を検索すれば、フィールド名が見つかります。「isDead」です。 | :「field_646_aA」を検索すれば、フィールド名が見つかります。「isDead」です。 | ||
:結果)if(!entity.isDead) | :結果)if(!entity.isDead) | ||
− | ; | + | ;同じようにして、メソッド名も methods.csv から探します。 |
− | |||
:メソッド名は場合によって、同一メソッド名が複数存在します。引数が異なることでオーバーロードできるためです。 | :メソッド名は場合によって、同一メソッド名が複数存在します。引数が異なることでオーバーロードできるためです。 | ||
:その場合は引数や戻り値の型からどのメソッドかを調べてください。 | :その場合は引数や戻り値の型からどのメソッドかを調べてください。 | ||
96行目: | 75行目: | ||
まれに複数の候補が存在します。そのクラスのソースを見て、どれが正しいか判断しましょう。<br/> | まれに複数の候補が存在します。そのクラスのソースを見て、どれが正しいか判断しましょう。<br/> | ||
− |