« Minecraft MOD開発 15 | トップページ | Journey Map »

2014年4月 6日 (日)

Minecraft MOD開発 16

次はメタデータとダメージ値を理解することを目標にする。まずは英語Wikiのチュートリアルを参考に、精錬レシピの作成に挑戦。

NishinaCore.java

package nishina;
 
import net.minecraft.block.Block;
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 = "DirtSmeltingMod", name = "DirtSmeltingMod", version = "1.0")
public class NishinaCore
{
 
 @EventHandler
 public void init(FMLInitializationEvent event)
 {
  GameRegistry.addSmelting( Block.dirt.blockID, new ItemStack( Block.blockDiamond), 0.1f);
 }
 
}

石を焼くとダイヤモンドブロックになった。

では、メタデータを持ったアイテムのレシピに挑戦してみる。メタデータの一覧はMinecraft Wiki(英語)が参考になる。とりあえずsampling(苗木)を作成できるレシピに挑戦してみる。Wikiの表記でも、Not Enough Itemsの表示でも苗木のアイテムIDは6なのだが、ソースコードでは6は矢に割り当てられている。

とりえあず精錬後のアイテムIDは6にする。

NishinaCore.java

package nishina;
 
import net.minecraft.block.Block;
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 = "DirtSmeltingMod", name = "DirtSmeltingMod", version = "1.0")
public class NishinaCore
{
 @EventHandler
 public void init(FMLInitializationEvent event)
 {
  GameRegistry.addSmelting( Block.dirt.blockID, new ItemStack( 6, 1, 0), 0.1f);
  GameRegistry.addSmelting( Block.stone.blockID, new ItemStack( 6, 1, 1), 0.1f);
 }
}

土を精錬すると樫の苗木になった。

石を精錬すると松の苗木になった。

チュートリアルによると、レシピの材料にダメージ値を指定するのは難しい上に1.7では動かないそうなので、これはパスする。

メタデータは15までしかないはずだが、武器防具のダメージ値はどうやって保持しているのだろうか? ItemSword.javaを読むと、EnumToolMaterialで決められている。EnumToolMaterialは武器防具道具の、素材毎の性能を決めている。鉄のツールは250回使えるので、メタデータとは別に十分な記憶領域が確保されているようだ。

Wikiによると鉄の剣のアイテムIDは267だ。土を精錬すると半分消耗した鉄の剣を生成するようにしてみる。

NishinaCore.java

package nishina;
 
import net.minecraft.block.Block;
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 = "DirtSmeltingMod", name = "DirtSmeltingMod", version = "1.0")
public class NishinaCore
{
 @EventHandler
 public void init(FMLInitializationEvent event)
 {
  GameRegistry.addSmelting( Block.dirt.blockID, new ItemStack( 267, 1, 125), 0.1f);
 }
}

ダメージ値ありの剣を生成することに成功した。

ダメージ値がいかなる値であっても、クラフトの元にする方法が存在する。この時はダメージ値にShort.MAX_VALUEを指定する。精錬レシピの元にダメージ値を指定するのは上に述べたように難しいので、shapeless recipeを追加する。

NishinaCore.java

package nishina;
 
import net.minecraft.block.Block;
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 = "DirtSmeltingMod", name = "DirtSmeltingMod", version = "1.0")
public class NishinaCore
{
 @EventHandler
 public void init(FMLInitializationEvent event)
 {
  GameRegistry.addSmelting( Block.dirt.blockID, new ItemStack( 267, 1, 125), 0.1f);
  GameRegistry.addShapelessRecipe( new ItemStack(Item.swordIron), new ItemStack( Item.swordIron, 1, Short.MAX_VALUE));
 }
}

ダメージのある剣をクラフトでダメージ無しにすることができた。

« Minecraft MOD開発 15 | トップページ | Journey Map »

コメント

コメントを書く

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

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

トラックバック

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

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

« Minecraft MOD開発 15 | トップページ | Journey Map »