食料の追加(1.7.10)

1.7.10の開発講座を修正中です。このページには誤りや古い情報が含まれる可能性があります。

新しい食料アイテムを追加する。
食べたときにポーションエフェクトを確率で付与することもできる。

ソースコード


package tutorial.aluminiummod;

import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemFood; import net.minecraft.potion.Potion;

@Mod(modid = AluminiumMod.MODID, name = AluminiumMod.MODNAME, version = AluminiumMod.VERSION) public class AluminiumMod {

public static final String MODID = "AluminiumMod"; public static final String MODNAME = "Aluminium Mod"; public static final String VERSION = "1.0.0";

public static Item foodAluminium;

@EventHandler public void perInit(FMLPreInitializationEvent event) { foodAluminium = new ItemFood(5, 2.0F, false) .setPotionEffect(Potion.regeneration.id, 60, 0, 0.8F) .setCreativeTab(CreativeTabs.tabFood) .setUnlocalizedName("foodAluminium") .setTextureName("aluminiummod:foodAluminium"); GameRegistry.registerItem(foodAluminium, "foodAluminium"); }

}

解説

ItemFood

コンストラクタ(int healAmount, float saturationModifier, boolean isWolfsFavoriteMeat)

引数は順に、満腹度回復量・隠し満腹度回復量(腹持ち)・オオカミが食べられるか

ItemFood setPotionEffect(int potionId, int potionDuration, int potionAmplifier, float potionEffectProbability)

食べたときに確率でポーションエフェクトを付与する。
引数は順に、ポーションID・効果時間・効果レベル・付与される確率。
効果時間は単位が秒なので注意。
効果レベルは表示値より1少ない。(0がレベル1)

使用例

オファレンMODの回復玉を追加している部分。
回復玉は、ItemFoodを継承しているが、オーバーライドして変えている部分も多い。


package nahama.ofalenmod;

/*略*/

/** @author Akasata Nahama */ @Mod(modid = OfalenModCore.MODID, name = OfalenModCore.MODNAME, version = OfalenModCore.VERSION) public class OfalenModCore {

public static final String MODID = "OfalenMod"; public static final String MODNAME = "Ofalen Mod"; public static final String VERSION = "[1.7.10]1.0.0";

/*略*/

/** 最初に行われる処理。アイテム・ブロックの追加などを行う */ @EventHandler public void preInit(FMLPreInitializationEvent event) { /*略*/

// アイテムを設定するメソッドを実行 OfalenModItemCore.registerItem();

/*略*/ }

/*略*/

}


package nahama.ofalenmod.core;

/*略*/

public class OfalenModItemCore {

/*略*/

public static Item ballRecovery; /*略*/

/**アイテムを設定する*/ public static void registerItem () { /*略*/

ballRecovery = new OfalenBall(new PotionEffect[]{new PotionEffect(Potion.heal.id, 1, 0)}) .setUnlocalizedName("ballRecovery") .setTextureName("ofalenmod:recovery_ball"); GameRegistry.registerItem(ballRecovery, "ballRecovery");

/*略*/ }

}


package nahama.ofalenmod.item;

import nahama.ofalenmod.OfalenModCore; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World;

public class OfalenBall extends ItemFood {

/**付与するポーション効果の配列*/ private final PotionEffect[] effects;

/**新規コンストラクター。ポーション効果の配列を受け取る。*/ public OfalenBall(PotionEffect[] effects) { super(0, 0.0F, false); this.effects = effects; this.setCreativeTab(OfalenModCore.tabOfalen); }

/**食べるのにかかる時間を返す。(通常よりも少し早い) * @return 20*/ @Override public int getMaxItemUseDuration(ItemStack itemStack) { return 20; }

/**右クリックされた時の処理。ItemFoodの満腹度の判定を消している。*/ @Override public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) { player.setItemInUse(itemStack, this.getMaxItemUseDuration(itemStack)); return itemStack; }

/**食べる時の処理。クリエイティブモードではアイテム数が減らないようにしている。また、ポーション効果も付与する。*/ /* EntityLivingBase.addPotionEffect(PotionEffect)では、効果時間を上書きしているらしい(?)ので、 * 新たにPotionEffectのオブジェクトを生成して引数として渡している。*/ @Override public ItemStack onEaten(ItemStack itemStack, World world, EntityPlayer player) { //クリエイティブモード以外ならスタックサイズを減らす。 if (!player.capabilities.isCreativeMode) { --itemStack.stackSize; } //つけるポーション効果の数だけ繰り返す。 for (int i = 0; i < effects.length; i ++) { //サーバー側の処理で、情報が正常なら処理を続ける。 if (!world.isRemote && effects[i] != null && effects[i].getPotionID() > 0) { //即時回復なら、 if (effects[i].getPotionID() == Potion.heal.id) { //ID・効果時間を固定して、 PotionEffect effect = new PotionEffect(Potion.heal.id, 1, effects[i].getAmplifier()); //プレイヤーに付与。 player.addPotionEffect(effect); //即時回復以外なら、 } else { //効果時間のみ固定して、 PotionEffect effect = new PotionEffect(effects[i].getPotionID(), effects[i].getDuration(), effects[i].getAmplifier()); //プレイヤーに付与。 player.addPotionEffect(effect); } } } world.playSoundAtEntity(player, "random.burp", 0.5F, world.rand.nextFloat() * 0.1F + 0.9F); return itemStack; }

}

過去の質問

  • 金リンゴのように、満腹度MAXの時でも食べられるものはどう作るのですか?
    • 自己解決しました。setAlwaysEdible()を使いました。 (質問者による投稿)

コメントはこちらです。(スパム対策の為コメントは手動承認になっています。未承認のコメントは表示されないので連投はお控え下さい。)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください