概要
新しい食料アイテムを追加する。
食べたときにポーションエフェクトを確率で付与することもできる。
ソースコード
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 |
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;
}
}
|
コメント
この項目に関する質問などをどうぞ。
最終更新:2016年12月12日 22:38