目前的钻石苹果只是一个普通的物品,只能看不能吃,这就非常蛋疼了。所以我们要将他变成一个真正的食物
——知识点1————————————————————
在MC中,并不是所有物品的父类都是Item。一般工具继承自ItemTool类,护甲继承自ItemArmor类,自然食物要继承ItemFood。(事实上,不管是ItemFood还是ItemArmor都派生自Item类)
当上一讲中,Item的构造方法是没有参数的。而ItemFood类则有三个:
super(amount, saturation, isWolfFood);
——————————————————————————
打开DiamondApple.java,修改一下:
嗯,真香~
——知识点1————————————————————
作为一个钻石苹果,当然要自带Buff啦
Forge为我们提供了这样一个方法:
setPotionEffect(Potion.XXX.id, duration, amplifier, probability);
算了,我还是把各种Potion ID列一下吧:
在满饥饿值时食用,Forge默认不会同意的。我们可以添加语句,保证任何时候都可以吃:
this.setAlwaysEdible();
——————————————————————————
添加如下代码,我这里是伤害吸收:
赶紧运行一下试试!!
——知识点2————————————————————
一些读者可能会意识到,像金苹果这样的食物光一个setPotionEffect方法是实现不了的。这里我们就要用到ItemFood类里的onFoodEaten方法
原方法如下(摘自ItemFood类):
protected void onFoodEaten(ItemStack stack, World worldIn, EntityPlayer player)
{
if (!worldIn.isRemote && this.potionId > 0 && worldIn.rand.nextFloat() < this.potionEffectProbability)
{
player.addPotionEffect(new PotionEffect(this.potionId, this.potionDuration * 20, this.potionAmplifier));
}
}
可以看到,这是一个受保护的方法,也就是只有它的子类能调用。ItemStack就是物品堆,参数player就是玩家的一个实例。其他的就比较明显了,如果条件成立,则会给予玩家对应的药水效果
在重写该方法之前,我们先看一看它的子类金苹果是怎么写的(摘自ItemAppleGold.java):
protected void onFoodEaten(ItemStack stack, World worldIn, EntityPlayer player)
{
if (!worldIn.isRemote)
{
player.addPotionEffect(new PotionEffect(Potion.absorption.id, 2400, 0));
}
if (stack.getMetadata() > 0)
{
if (!worldIn.isRemote)
{
player.addPotionEffect(new PotionEffect(Potion.regeneration.id, 600, 4));
player.addPotionEffect(new PotionEffect(Potion.resistance.id, 6000, 0));
player.addPotionEffect(new PotionEffect(Potion.fireResistance.id, 6000, 0));
}
}
else
{
super.onFoodEaten(stack, worldIn, player);
}
}
此方法做了两次条件判断。第一次会给玩家一个伤害吸收的效果。第二次如果该物品的Metadata值大于0(上一讲介绍过),!worldIn.isRemote(这个在以后的教程里会讲到)也为true,给予抗性提升、生命恢复、抗火药水效果;否则反过来调用父类的原方法
补充:有人可能会疑问,为什么这里只有三个参数?注意我们前面写的是setPotionEffect,而这里是PotionEffect类的构造器(舍去了触发几率),不是同一个方法!!
——————————————————————————
仿照金苹果,我把钻石苹果的效果翻倍(偷懒~):
看看效果吧:
这一期作者弄得非常心累,昨天快要写好了,结果CSDN给我来了个Surprise!~~稿子全废了。。。你们看到的其实是第二次版本,希望大家也能支持我这个教程继续写下去,加油!!!
MainClass.java:
package net.csdn.mymod;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
@Mod(modid = "mymod", name = "MyMod", version = "1.0.0", acceptedMinecraftVersions = "[1.8,1.8.9]")
//声明:这是我的Mod主类
public class MainClass { //类声明
@EventHandler
public void preLoad(FMLPreInitializationEvent event){ //preLoad方法
new ItemLoader(event);
}
@EventHandler
public void Load(FMLInitializationEvent event){ //Load方法
}
@EventHandler
public void postLoad(FMLPostInitializationEvent event){ //postLoad方法
}
}
DiamondApple.java:
package net.csdn.mymod;
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 DiamondApple extends ItemFood {
public DiamondApple(){
super(4, 0.6F, false);
this.setUnlocalizedName("diamondApple");
this.setAlwaysEdible();
}
@Override
public void onFoodEaten(ItemStack stack, World worldIn, EntityPlayer player)
{
if (!worldIn.isRemote)
{
player.addPotionEffect(new PotionEffect(Potion.absorption.id, 4800, 1));
player.addPotionEffect(new PotionEffect(Potion.regeneration.id, 1200, 8));
player.addPotionEffect(new PotionEffect(Potion.resistance.id, 12000, 1));
player.addPotionEffect(new PotionEffect(Potion.fireResistance.id, 12000, 1));
}
super.onFoodEaten(stack, worldIn, player);
}
}
ItemLoader.java:
package net.csdn.mymod;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;
public class ItemLoader {
public static Item diamondApple = new DiamondApple();
public ItemLoader(FMLPreInitializationEvent event){
GameRegistry.registerItem(diamondApple, "apple_diamond");
ModelResourceLocation model = new ModelResourceLocation("mymod:apple_diamond", "inventory");
ModelLoader.setCustomModelResourceLocation(diamondApple, 0, model);
}
}
apple_diamond.json:
{
"parent": "builtin/generated",
"textures": {
"layer0": "mymod:items/apple_diamond"
},
"display": {
"thirdperson": {
"rotation": [ -90, 0, 0 ],
"translation": [ 0, 1, -2 ],
"scale": [ 0.55, 0.55, 0.55 ]
},
"firstperson": {
"rotation": [ 0, -135, 25 ],
"translation": [ 0, 4, 2 ],
"scale": [ 1.7, 1.7, 1.7 ]
}
}
}
en_US.lang:
item.diamondApple.name=Diamond Apple
zh_CN.lang:
item.diamondApple.name=钻石苹果