[Minecraft]基于Forge的1.8.9MOD开发教程——第五讲:物品篇(食物·下)

一个真正的食物

目前的钻石苹果只是一个普通的物品,只能看不能吃,这就非常蛋疼了。所以我们要将他变成一个真正的食物
——知识点1————————————————————
在MC中,并不是所有物品的父类都是Item。一般工具继承自ItemTool类,护甲继承自ItemArmor类,自然食物要继承ItemFood。(事实上,不管是ItemFood还是ItemArmor都派生自Item类)
当上一讲中,Item的构造方法是没有参数的。而ItemFood类则有三个:

super(amount, saturation, isWolfFood);
  • 参数一 amount:int类型。该食物所恢复的饥饿值
  • 参数二 saturation:单精度浮点。增加饱和度,2 * amount * saturation(不知道饱和度是什么请自行百度)
  • 参数三 isWolfFood:boolean。狼是否能食用

——————————————————————————
打开DiamondApple.java,修改一下:
[Minecraft]基于Forge的1.8.9MOD开发教程——第五讲:物品篇(食物·下)_第1张图片
嗯,真香~
[Minecraft]基于Forge的1.8.9MOD开发教程——第五讲:物品篇(食物·下)_第2张图片

添加药水效果

——知识点1————————————————————
作为一个钻石苹果,当然要自带Buff啦
Forge为我们提供了这样一个方法:

setPotionEffect(Potion.XXX.id, duration, amplifier, probability);
  • 参数一:药水类型。在MC中一共有二十三种类型,可以翻看net.minecraft.potion.Potion类
  • 参数二 duration:int,作用时间。单位:s
  • 参数三 amplifier:int,对应的药水等级。注意:Java是零基的!!
  • 参数四 probability:float,触发几率。1.0为百分之百

算了,我还是把各种Potion ID列一下吧:

  1. 速度:moveSpeed
  2. 缓慢:moveSlowdown
  3. 急迫:digSpeed
  4. 挖掘疲劳:digSlowDown
  5. 力量:damageBoost
  6. 瞬间治疗:heal
  7. 瞬间伤害:harm
  8. 跳跃提升:jump
  9. 反胃:confusion
  10. 生命恢复:regeneration
  11. 抗性提升:resistance
  12. 防火:fireResistance
  13. 水下呼吸:waterBreathing
  14. 隐身:invisibility
  15. 失明:blindness
  16. 夜视:nightVision
  17. 饥饿:hunger
  18. 虚弱:weakness
  19. 中毒:poison
  20. 凋零:wither
  21. 生命提升:healthBoost
  22. 伤害吸收:absorption
  23. 饱和:saturation

在满饥饿值时食用,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类的构造器(舍去了触发几率),不是同一个方法!!
——————————————————————————
仿照金苹果,我把钻石苹果的效果翻倍(偷懒~):
[Minecraft]基于Forge的1.8.9MOD开发教程——第五讲:物品篇(食物·下)_第3张图片
看看效果吧:
[Minecraft]基于Forge的1.8.9MOD开发教程——第五讲:物品篇(食物·下)_第4张图片

这一期作者弄得非常心累,昨天快要写好了,结果CSDN给我来了个Surprise!~~稿子全废了。。。你们看到的其实是第二次版本,希望大家也能支持我这个教程继续写下去,加油!!!

Source·源代码

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=钻石苹果

你可能感兴趣的:(Forge开发)