« Minecraft MOD開発 3 | トップページ | Minecraft MOD開発 5 »

2014年3月12日 (水)

Minecraft MOD開発 4

初MODに挑戦してみる。まずはオリジナルレシピの追加に挑戦する。

デコンパイルしようとしたら、大量のログを吐いて失敗した。インストール時のログを見るとソースコードにパッチを当てている。forge-1.6.4-9.11.1.965-src.zipではinstall.cmdを実行するだけでよく、デコンパイルは必要ないのか。

鉄を金に変換するレシピを作る。Minecraft Modding Wikiのチュートリアルを見ると、net.minecraft.item.ItemクラスからアイテムのIDを取得しなければならない。鉄インゴットはItem.ingotIron、金インゴットはItem.ingotGoldだ。チュートリアルを元にソースを作る。ブロックは使わないので、net.minecraft.block.Blockはインポートしない。

alchemy_sample.java

package mods.alchemy_sample;
 
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
 
@Mod(modid="AlchemySampleMod", name="AlchemySampleMod", version="1.0")
public class RecipeSample
{
 @EventHandler
 public void init(FMLInitializationEvent event)
 {
  GameRegistry.addRecipe(new ItemStack(Item.ingotGold, 1), 
    new Object[]{ "X",
    'X',Item.ingotIron });
 }
}

これをC:\forge-1.6.4-9.11.1.965-src\forge\mcp\src\minecraft\modに置いてリコンパイルすると大量の警告とともに、以下のエラーが出た。そりゃそうだ。

C:\forge-1.6.4-9.11.1.965-src\forge\mcp\src\minecraft\mod\alchemy_sample.java:11: エラー: クラスRecipeSampleはpublicであり、ファイルRecipeSample.javaで宣言する必要があります
public class RecipeSample
       ^

修正してもう一度リコンパイル。

package mods.alchemy_sample;
 
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
 
@Mod(modid="AlchemySampleMod", name="AlchemySampleMod", version="1.0")
public class alchemy_sample
{
 @EventHandler
 public void init(FMLInitializationEvent event)
 {
  GameRegistry.addRecipe(new ItemStack(Item.ingotGold, 1), 
    new Object[]{ "X",
    'X',Item.ingotIron });
 }
}

エラーも出ずに終わった。

C:\forge-1.6.4-9.11.1.965-src\forge\mcp>recompile.bat
== MCP 8.09 (data: 8.11, client: 1.6.4, server: 1.6.4) ==
"scalac" is not found on the PATH.  Scala files will not be recompiled
# found ff, ff patches, srgs, name csvs, doc csvs, param csvs, astyle, astyle config, rg, ss
== Recompiling client ==
> Cleaning bin
> Recompiling
- Done in 14.57 seconds
!! Can not find server sources, try decompiling !!
続行するには何かキーを押してください . . .

startclient.batを実行して動作テスト。Modsを見ると確かに追加されている。

鉄インゴットを金インゴットへクラフトすることができた!

チュートリアルを読むと、reobfuscate.batを実行せよと書いてある。何のことだか分からないが、実行してみる。

C:\forge-1.6.4-9.11.1.965-src\forge\mcp>reobfuscate
== MCP 8.09 (data: 8.11, client: 1.6.4, server: 1.6.4) ==
"scalac" is not found on the PATH.  Scala files will not be recompiled
# found ff, ff patches, srgs, name csvs, doc csvs, param csvs, astyle, astyle config, rg, ss
> Creating Retroguard config files
== Reobfuscating client ==
> Cleaning reobf
> Generating md5s
> Packing jar
> Reobfuscating jar
> Extracting modified classes
> New class found      : mods/alchemy_sample/alchemy_sample
> Outputted mods/alchemy_sample/alchemy_sample  to reobf\minecraft as mods/alchemy_sample/alchemy_sample.class
- Done in 3.48 seconds
!! Can not find server md5s !!
続行するには何かキーを押してください . . .

確かにC:\forge-1.6.4-9.11.1.965-src\forge\mcp\reobf\minecraft\mods\alchemy_sampleにalchemy_sample.classができている。alchemy_sample.classはもともとC:\forge-1.6.4-9.11.1.965-src\forge\mcp\bin\minecraft\mods\alchemy_sampleにあるから、reobfuscateは必要ないんじゃないかな? ファイルがたくさんあるときの差分抽出用? ファイルサイズは1222→1099バイトへ、ちょっとだけ小さくなってる。

C:\forge-1.6.4-9.11.1.965-src\forge\mcp\reobf\minecraft\modsにあるalchemy_sampleフォルダごと圧縮して、alchemy_sample.zipとする。本番環境のmodsフォルダに入れて実行したら、ClassNotFoundExceptionが出て落ちた。

---- Minecraft Crash Report ----
// I let you down. Sorry :(

Time: 14/03/12 1:34
Description: There was a severe problem during mod loading that has caused the game to fail

cpw.mods.fml.common.LoaderException: java.lang.ClassNotFoundException: mods.alchemy_sample.alchemy_sample
at cpw.mods.fml.common.LoadController.transition(LoadController.java:156)
at cpw.mods.fml.common.Loader.loadMods(Loader.java:521)
at cpw.mods.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:183)
at net.minecraft.client.Minecraft.func_71384_a(Minecraft.java:473)
at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:808)
at net.minecraft.client.main.Main.main(SourceFile:101)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at net.minecraft.launchwrapper.Launch.launch(Launch.java:131)
at net.minecraft.launchwrapper.Launch.main(Launch.java:27)
Caused by: java.lang.ClassNotFoundException: mods.alchemy_sample.alchemy_sample
at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:186)

圧縮する階層が悪かった。modsフォルダをzip圧縮して、本番環境のmodsフォルダに入れたら認識された。

本番環境でも鉄を金へクラフトできた。

完成したalchemy_sample.zip。Minecraft 1.6.4+Mincraft Forge1.6.4-9.11.1.965用です。

« Minecraft MOD開発 3 | トップページ | Minecraft MOD開発 5 »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1499066/55336134

この記事へのトラックバック一覧です: Minecraft MOD開発 4:

« Minecraft MOD開発 3 | トップページ | Minecraft MOD開発 5 »