MOD製作チュートリアル > 食料の追加

概要

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

ソースコード

  • AluminiumMod.java
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を継承しているが、オーバーライドして変えている部分も多い。
+ オファレンMOD
  • OfalenModCore.java
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();
 
/*略*/
	}
 
/*略*/
 
}
 

  • OfalenModItemCore.java
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");
 
/*略*/
	}
 
}
 

  • OfalenBall.java
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;
	}
 
}
 

コメント

この項目に関する質問などをどうぞ。
  • ItemFood setPotionEffect の引数が (int, int, int, float) ではなく (string) になっているのですが、なぜですか? - あるふぁ 2017-05-20 14:48:36
    • 自己解決しました。 - あるふぁ 2017-05-20 14:51:35
  • 金リンゴのように、満腹度MAXの時でも食べられるものはどう作るのですか? - あるふぁ 2017-05-20 14:54:50
    • こちらも解決しました。setAlwaysEdible()を使いました。 - あるふぁ 2017-05-20 18:57:23
最終更新:2016年12月12日 22:38