« Minecraft MOD開発 7 | トップページ | Minecraft MOD開発 9 »

2014年3月15日 (土)

Minecraft MOD開発 8

次は独自アイテムの開発に挑戦する。

まずテクスチャを作って、C:\forge-1.6.4-9.11.1.965-src\forge\mcp\src\minecraft\assets\nishina\textures\itemsへ配置する。

チュートリアルを参考に、pink_item_core.javaとpink_item.javaをつくる。

pink_item_core.java

package nishina;
 
import net.minecraft.item.Item;
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.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
 
@Mod(modid="PinkItemCore", name="PinkItemCore", version="1.0")
public class pink_item_core
{
 public static Item PinkItem;
 public static int PinkItemID = 28000;
 
 @EventHandler
 public void init(FMLInitializationEvent event)
 {
  LanguageRegistry.addName(PinkItem, "Pink Item");
  LanguageRegistry.instance().addNameForObject(PinkItem, "ja_JP", "ピンク アイテム");
 }
 
 @EventHandler
 public void preInit(FMLPreInitializationEvent event)
 {
  PinkItem = new pink_item(PinkItemID);
  GameRegistry.registerItem(PinkItem, "PinkItem");
 }
}

pink_item.java

package nishina;
 
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
 
public class pink_item extends Item
{
 
 public pink_item(int par1)
 {
  super(par1);
  this.setCreativeTab(CreativeTabs.tabMaterials); //クリエイティブのタブ
  this.setUnlocalizedName("PinkItem"); //システム名の登録
  this.setTextureName("nishina:pink_item"); //テクスチャの指定
  this.setMaxStackSize(64); //スタックできる量
 }
}

リコンパイルは通った。

C:\forge-1.6.4-9.11.1.965-src\forge\mcp>recompile
== 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.77 seconds
!! Can not find server sources, try decompiling !!
続行するには何かキーを押してください . . .

ブロックのテクスチャをC:\forge-1.6.4-9.11.1.965-src\forge\mcp\bin\minecraft\assets\nishina\textures\itemsへコピーして、startclientでテストする。登録したアイテムが表示された。

次はこれをかまどの燃料として使えるようにしたい。燃焼時間はTileEntityFurnace.javaのgetItemBurnTimeで設定されている。Minecraft本体のソースに手を付けなければならないのかと思ったら、メソッドの最後でreturn GameRegistry.getFuelValue(par0ItemStack)となっている。独自アイテムの燃焼時間はGameRegistryへ登録すればよいようだ。ForgeのWikiによると、IFuelHandlerを継承したクラスを作り、getBurnTimeで燃焼時間を返せとある。

pink_item_fuelhandler.java

package nishina;
 
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.IFuelHandler;
 
public class pink_item_fuelhandler implements IFuelHandler {
 @Override
 public int getBurnTime(ItemStack fuel)
 {
  int var1 = fuel.itemID;
  if( var1 == pink_item_core.PinkItemID)
  {
   return 1600;
  }
  else
  {
   return 0;
  }
 }
}

pink_item_core.javaの方はpreInitにGameRegistry.registerFuelHandler(new pink_item_fuelhandler());と追加する。ForgeのWikiを見ると全てinitで登録しているようだが、どっちがいいのだろうね。

pink_item_core.java

package nishina;
 
import net.minecraft.item.Item;
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.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
 
@Mod(modid="PinkItemCore", name="PinkItemCore", version="1.0")
public class pink_item_core
{
 public static Item PinkItem;
 public static int PinkItemID = 28000;
 
 @EventHandler
 public void init(FMLInitializationEvent event)
 {
  LanguageRegistry.addName(PinkItem, "Pink Item");
  LanguageRegistry.instance().addNameForObject(PinkItem, "ja_JP", "ピンク アイテム");
 }
 
 @EventHandler
 public void preInit(FMLPreInitializationEvent event)
 {
  PinkItem = new pink_item(PinkItemID);
  GameRegistry.registerItem(PinkItem, "PinkItem");
  GameRegistry.registerFuelHandler(new pink_item_fuelhandler());
 }
}

かまどの燃料スロットにおけるけど、燃えない。

printfを仕込んでみる。Minecraftでもprintfデバッグは有効だろうか?

package nishina;
 
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.IFuelHandler;
 
public class pink_item_fuelhandler implements IFuelHandler {
 @Override
 public int getBurnTime(ItemStack fuel)
 {
  System.out.printf( "pink_item: pink_item_fulehandler.getBurnTime is called\n");
  int var1 = fuel.itemID;
  if( var1 == pink_item_core.PinkItemID)
  {
   System.out.printf( "pink_item: ItemID is %d, return 1600\n", var1);
   return 1600;
  }
  else
  {
   System.out.printf( "pink_item: ItemID is %d, return 0\n", var1);
   return 0;
  }
 }
}

コンソールにはこのように表示された。アイテムIDが+256されるのに対応しなければならないようだ。

[18:15:39] 2014-03-15 18:15:39 [情報] [STDOUT] pink_item: pink_item_fulehandler.getBurnTime is called
[18:15:39] 2014-03-15 18:15:39 [情報] [STDOUT] pink_item: ItemID is 28256, return 0

pink_item_fuelhandler.javaの方を修正する。

package nishina;
 
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.IFuelHandler;
 
public class pink_item_fuelhandler implements IFuelHandler {
 @Override
 public int getBurnTime(ItemStack fuel)
 {
  int var1 = fuel.itemID;
  if( var1 == pink_item_core.PinkItemID+256)
  {
   return 1600;
  }
  else
  {
   return 0;
  }
 }
}

ちゃんとかまどの燃料として使えたし、燃焼時間も石炭と同じだ。

« Minecraft MOD開発 7 | トップページ | Minecraft MOD開発 9 »

コメント

コメントを書く

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

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

トラックバック

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

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

« Minecraft MOD開発 7 | トップページ | Minecraft MOD開発 9 »