石橋を叩いて壊すページ

Minecraft V1.6.2をMCP8.05でデコンパイルするとエラーが出る

MinecraftのクライアントMODを作るには、まずMinecraftをデコンパイルし(ソースの形に戻し)、
それを改造・コンパイルしなければならない。
このデコンパイル・コンパイルの作業に使われるのがMCP。らしい。

で、このMCPはJava 6にしか対応していないと某サイトに書いてあった。
しかし困ったことに、手元にはJava 7しかない。
Java 6は既に古いバージョンで、Oracleの公式サイトからダウンロードできない。
公式サイトにも「Javaサポートを購入したユーザー、またはJava 6が必要なOracle製品を所有するユーザーのみ」Java 6を配布すると書いてある。
当然そんなサポートは購入していない。

仕方が無いのでJava 7でMCPを動かしてみると以下のとおりエラーが出た。

src\minecraft\net\minecraft\src\ChatMessageComponent.java:256: 警告:最終パラメータの不正確な引数型を持った可変引数メソッドの非可変引数呼出し。

                var7.append(StatCollector.translateToLocalFormatted(this.field_111090_h, var13));
                                                                                         ^

  可変引数呼出しに関してはObjectにキャストします。
  非可変引数呼出しに関してはObject[]にキャストしてこの警告を出さないようにします
src\minecraft\net\minecraft\src\Minecraft.java:293: エラー: シンボルを見つけられません
        Display.setResizable(true);
               ^

  シンボル:   メソッド setResizable(boolean)
  場所: クラス Display
src\minecraft\net\minecraft\src\Minecraft.java:851: エラー: シンボルを見つけられません
        if (!this.fullscreen && Display.wasResized())
                                       ^

  シンボル:   メソッド wasResized()
  場所: クラス Display
src\minecraft\net\minecraft\src\Minecraft.java:853: エラー: シンボルを見つけられません
            this.displayWidth = Display.getWidth();
                                       ^

  シンボル:   メソッド getWidth()
  場所: クラス Display
src\minecraft\net\minecraft\src\Minecraft.java:854: エラー: シンボルを見つけられません
            this.displayHeight = Display.getHeight();
                                        ^

  シンボル:   メソッド getHeight()
  場所: クラス Display
src\minecraft\net\minecraft\src\MouseHelper.java:29: エラー: シンボルを見つけられません
        Mouse.setCursorPosition(Display.getWidth() / 2, Display.getHeight() / 2);
                                       ^

  シンボル:   メソッド getWidth()
  場所: クラス Display
src\minecraft\net\minecraft\src\MouseHelper.java:29: エラー: シンボルを見つけられません
        Mouse.setCursorPosition(Display.getWidth() / 2, Display.getHeight() / 2);
                                                               ^

  シンボル:   メソッド getHeight()
  場所: クラス Display
注意:入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。
注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。
エラー6個
警告1個

MCPのrecompile.batを実行してコンパイルしようとしても同様のエラーが出る。
これではMODを作成できない。

…と思ったのだが、自分はMOD製作にEclipseを使っていて、物は試しとEclipseの実行ボタンを押すと、なぜかコンパイルしてクライアントを実行できる。
なんでだ?
調査してみよう。

まず先に、1個だけでている警告を片付けておく。
コンパイラが「可変引数呼出しに関してはObjectにキャストします」と助言してくれているとおり
キャストすれば問題は解決する。

編集前:var7.append(StatCollector.translateToLocalFormatted(this.field_111090_h, var13));

                                                                                    ↓ここに(Object)を追加する。

編集後:var7.append(StatCollector.translateToLocalFormatted(this.field_111090_h, (Object)var13));

次に、残る6件のエラーだが、recompile.batもEclipseもきっと同様にjavacを使ってコンパイルしているのだろう…
とすると引数が違うのか?と思い、javacの-classpathを比較してみた。
問題になっているDisplayクラスは、ソースファイル(Minecraft.java)の先頭部分で「import org.lwjgl.opengl.Display;」と書いてあったから、
lwjglに関する部分に違いがあるに違いない。

下は、recompile.batを実行したときに表示されるログのうち、javacの-classpath引数部分を見やすく改行したもの。

-classpath 
"jars\versions\1.6.2\1.6.2.jar;
lib;
lib\*;
lib;
lib\*;
jars\bin\minecraft.jar;
jars\bin\jinput.jar;
jars\bin\lwjgl.jar;
jars\bin\lwjgl_util.jar;
jars\libraries\net\java\jinput\jinput\2.0.5\jinput-2.0.5.jar;
jars\libraries\org\lwjgl\lwjgl\lwjgl-platform\2.9.0\lwjgl-platform-2.9.0-natives-windows.jar;
jars\libraries\org\lwjgl\lwjgl\lwjgl_util\2.9.0\lwjgl_util-2.9.0.jar;
jars\libraries\com\paulscode\codecwav\20101023\codecwav-20101023.jar;
jars\libraries\net\java\jinput\jinput-platform\2.0.5\jinput-platform-2.0.5-natives-windows.jar;
jars\libraries\argo\argo\2.25_fixed\argo-2.25_fixed.jar;
jars\libraries\com\paulscode\codecjorbis\20101023\codecjorbis-20101023.jar;
jars\libraries\org\bouncycastle\bcprov-jdk15on\1.47\bcprov-jdk15on-1.47.jar;
jars\libraries\org\apache\commons\commons-lang3\3.1\commons-lang3-3.1.jar;
jars\libraries\com\paulscode\soundsystem\20120107\soundsystem-20120107.jar;
jars\libraries\org\lwjgl\lwjgl\lwjgl\2.9.0\lwjgl-2.9.0.jar;
jars\libraries\commons-io\commons-io\2.4\commons-io-2.4.jar;
jars\libraries\com\paulscode\libraryjavasound\20101123\libraryjavasound-20101123.jar;
jars\libraries\net\sf\jopt-simple\jopt-simple\4.5\jopt-simple-4.5.jar;
jars\libraries\com\paulscode\librarylwjglopenal\20100824\librarylwjglopenal-20100824.jar;
jars\libraries\com\google\guava\guava\14.0\guava-14.0.jar;
jars\libraries\com\google\code\gson\gson\2.2.2\gson-2.2.2.jar;
jars\libraries\net\java\jutils\jutils\1.0.0\jutils-1.0.0.jar"

次の画像は、Eclipseでパッケージの「Client」を右クリックしてプロパティを表示し、
コンパイル時に読み込まれるjarファイルの設定画面を撮ったもの。

Eclipseでは、lwjglに関するファイルは画像で選択されている3件しかない。
すなわち、
lwjgl-platform-2.9.0-natives-windows.jar
lwjgl_util-2.9.0.jar
lwjgl-2.9.0.jar
である。

recompile.batが読み込んでいるファイルのうちlwjglに関するものは、6件ある。
すなわち、
lwjgl.jar
lwjgl_util.jar
lwjgl-platform-2.9.0-natives-windows.jar
lwjgl_util-2.9.0.jar
lwjgl-2.9.0.jar
librarylwjglopenal-20100824.jar
である。

この違いが何なのかについて調べるには自分では知識が足らないが
とりあえず環境をあわせれば上手くいくかもしれないという直感はあるので
mcp805\jars\のフォルダから、問題のlwjgl.jarとlwjgl_util.jarを消してrecompile.batしてみる。※

== Recompiling client ==
> Cleaning bin
> Recompiling
- Done in 11.88 seconds
== Recompiling server ==
> Cleaning bin
> Recompiling
- Done in 8.55 seconds
続行するには何かキーを押してください . . .

コンパイルが通った。( ゚д゚)ポカーン
起動も出来てしまった。
これでいいのか?
わからないけどいいことにしておこう。

ついでに、問題の2ファイルを消してからデコンパイルすると、デコンパイル時にエラーが出なくなった。

Minecraft V1.6でランチャーが導入されてフォルダ構成も変わっているようだから
ひょっとして問題の2つのファイルはいらないファイルなのかもしれない。
Minecraftをアンインストールして再インストールしたら綺麗に掃除できるだろうか。恐いからやらないけど。

(※
lwjgl.jarとlwjgl_util.jarのほかにlibrarylwjglopenal-20100824.jarは消さなくていいのか?
と言われそうだが、librarylwjglopenal-20100824.jarの存在はこの記事を書いているときに画像を見直して気づいた。
ようするに消さなくても動くようだ。)

この記事を評価

この記事にコメント

  1. ...

【この記事にコメント】
お名前:
コメント:

Menu