<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://mcbbs.wiki/index.php?action=history&amp;feed=atom&amp;title=%E7%94%A8%E6%88%B7%3AMashKJo%2F1.12.2%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B%2F13.%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%EF%BC%88%E4%B8%80%EF%BC%89_-_%E9%A3%9F%E7%89%A9%E5%92%8C%E9%A5%AE%E6%96%99</id>
	<title>用户:MashKJo/1.12.2模组开发教程/13.高级物品（一） - 食物和饮料 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://mcbbs.wiki/index.php?action=history&amp;feed=atom&amp;title=%E7%94%A8%E6%88%B7%3AMashKJo%2F1.12.2%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B%2F13.%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%EF%BC%88%E4%B8%80%EF%BC%89_-_%E9%A3%9F%E7%89%A9%E5%92%8C%E9%A5%AE%E6%96%99"/>
	<link rel="alternate" type="text/html" href="https://mcbbs.wiki/index.php?title=%E7%94%A8%E6%88%B7:MashKJo/1.12.2%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/13.%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%EF%BC%88%E4%B8%80%EF%BC%89_-_%E9%A3%9F%E7%89%A9%E5%92%8C%E9%A5%AE%E6%96%99&amp;action=history"/>
	<updated>2026-05-06T07:00:59Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.40.3</generator>
	<entry>
		<id>https://mcbbs.wiki/index.php?title=%E7%94%A8%E6%88%B7:MashKJo/1.12.2%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/13.%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%EF%BC%88%E4%B8%80%EF%BC%89_-_%E9%A3%9F%E7%89%A9%E5%92%8C%E9%A5%AE%E6%96%99&amp;diff=55032&amp;oldid=prev</id>
		<title>MashKJo：​创建页面，内容为“在1.13+的Minecraft源代码中，食物和流体类似，都是被单独分离成了一个特殊的概念——流体对应Fluid类，而食物对应Food类，而声明某物品是一种食物，则需要调用&lt;code&gt;Item.Properties#food&lt;/code&gt;方法来完成。但在1.12中，食物仅仅是一种特殊的物品——ItemFood。因此，我们可以通过简单复用该类创建出许多种食物。  ItemFood类的构造器为&lt;code&gt;(int amount, float saturati…”</title>
		<link rel="alternate" type="text/html" href="https://mcbbs.wiki/index.php?title=%E7%94%A8%E6%88%B7:MashKJo/1.12.2%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/13.%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%EF%BC%88%E4%B8%80%EF%BC%89_-_%E9%A3%9F%E7%89%A9%E5%92%8C%E9%A5%AE%E6%96%99&amp;diff=55032&amp;oldid=prev"/>
		<updated>2025-01-04T08:34:21Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“在1.13+的Minecraft源代码中，食物和流体类似，都是被单独分离成了一个特殊的概念——流体对应Fluid类，而食物对应Food类，而声明某物品是一种食物，则需要调用&amp;lt;code&amp;gt;Item.Properties#food&amp;lt;/code&amp;gt;方法来完成。但在1.12中，食物仅仅是一种特殊的物品——ItemFood。因此，我们可以通过简单复用该类创建出许多种食物。  ItemFood类的构造器为&amp;lt;code&amp;gt;(int amount, float saturati…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;在1.13+的Minecraft源代码中，食物和流体类似，都是被单独分离成了一个特殊的概念——流体对应Fluid类，而食物对应Food类，而声明某物品是一种食物，则需要调用&amp;lt;code&amp;gt;Item.Properties#food&amp;lt;/code&amp;gt;方法来完成。但在1.12中，食物仅仅是一种特殊的物品——ItemFood。因此，我们可以通过简单复用该类创建出许多种食物。&lt;br /&gt;
&lt;br /&gt;
ItemFood类的构造器为&amp;lt;code&amp;gt;(int amount, float saturation, boolean isWolfFood)&amp;lt;/code&amp;gt;。amount为所恢复的饥饿值，saturation为所恢复的饱食度的比例系数（而真正的饱和度值计算公式为&amp;lt;code&amp;gt;2 * amount * saturation&amp;lt;/code&amp;gt;），而isWolfFood则用于决定该食物是否能被用于驯服狼狗。前两个参数均有对应的getter可以用，从这些getter中你可以拿到对应的ItemStack，也就是说你可以配合着meta-hack来覆写这2个getter。&lt;br /&gt;
&lt;br /&gt;
此外，该类还有2个setter可以用：&lt;br /&gt;
* setAlwaysEdible：用于设定：无论玩家的饥饿值是否是满的，均可以食用该食物。&lt;br /&gt;
* setPotionEffect：用于设定：吃下该食物后，获得的药水效果，第一个参数要求一个PotionEffect，这个后面会讲到的，它的用法和ItemStack其实是类似的，而Potion之于PotionEffect就相当于Item之于ItemStack。第二个参数是&amp;lt;code&amp;gt;float probability&amp;lt;/code&amp;gt;，取值范围为[0.0F, 1.0F]，这个其实是表示产生预期药水效果的概率（想想看生鸡肉吧）——1.0F即代表100%，即一定会发生。&lt;br /&gt;
&lt;br /&gt;
不过显然，光是一个setPotionEffect，根本没法满足大部分模组甚至于原版的需求——例如原版的金苹果就追加了不止一种PotionEffect，而该方法却只能传入一个PotionEffect。所以我们实际上可以覆写&amp;lt;code&amp;gt;onFoodEaten&amp;lt;/code&amp;gt;这个方法。形参列表为&amp;lt;code&amp;gt;(ItemStack stackIn, World worldIn, EntityPlayer playerIn)&amp;lt;/code&amp;gt;，显然这是个很丰富的形参列表，因此，我们不妨放开点思路——我们真的只能在这里追加不止一种PotionEffect吗？实际上我们可以在这里写任何逻辑。&lt;br /&gt;
&lt;br /&gt;
创建一种新食物很简单，那么新的饮料呢，比如原版的牛奶桶和药水？很遗憾，原版并没有提供专门的饮料物品类，不过也没关系，我们自己从头写就好。让我们想想看一种饮料物品应当具有怎样的行为？答案是：有饮用的时长、动画和音效。没错，就这么简单。还记得上一节的内容吗？对于设定饮用的时长，我们可以覆写&amp;lt;code&amp;gt;getMaxItemUseDuration&amp;lt;/code&amp;gt;，单位为tick（游戏刻，原版的食物和饮料默认为32ticks），想追加饮用后的特定逻辑的话，再覆写&amp;lt;code&amp;gt;onItemUseFinish&amp;lt;/code&amp;gt;即可。至于饮用的动画和音效，这些是由枚举对象EnumAction.DRINK来决定的。另外，由于设定上饮料一般都是由容器盛装的，因此我们通常会设定该饮料物品的containerItem，以及喝完它后返还给我们1个该containerItem&amp;lt;ref&amp;gt;原版的牛奶桶并未设定其containerItem（设定上应该是桶），所以原版中有“拿牛奶桶做蛋糕，蛋糕把三个桶生吞了”这种奇葩现象。&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
 import net.minecraft.entity.EntityLivingBase;&lt;br /&gt;
 import net.minecraft.entity.player.EntityPlayer;&lt;br /&gt;
 import net.minecraft.item.EnumAction;&lt;br /&gt;
 import net.minecraft.item.Item;&lt;br /&gt;
 import net.minecraft.item.ItemStack;&lt;br /&gt;
 import net.minecraft.world.World;&lt;br /&gt;
 &lt;br /&gt;
 public class MyCustomDrink extends Item{&lt;br /&gt;
    public MyCustomDrink(){&lt;br /&gt;
        this.setRegistryName(...);&lt;br /&gt;
        this.setUnlocalizedName(...);&lt;br /&gt;
        this.setCreativeTab(...);&lt;br /&gt;
 &lt;br /&gt;
        this.setMaxStackSize(1);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public ItemStack getContainerItem(ItemStack stack){&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public int getMaxItemUseDuration(ItemStack stack){&lt;br /&gt;
        return 32;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public EnumAction getItemUseAction(ItemStack stack){&lt;br /&gt;
        return EnumAction.DRINK;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public ItemStack onItemUseFinish(ItemStack stack, World worldIn, EntityLivingBase entityLiving){&lt;br /&gt;
        ... //Do your custom game logics...&lt;br /&gt;
 &lt;br /&gt;
        ItemStack container = getContainerItem(stack);&lt;br /&gt;
 &lt;br /&gt;
        if(entityLiving instanceof EntityPlayer &amp;amp;&amp;amp; !((EntityPlayer)entityLiving).capabilities.isCreativeMode){&lt;br /&gt;
            stack.shrink(1);&lt;br /&gt;
        }&lt;br /&gt;
        return stack.isEmpty() ? container : stack;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
就是这样，实际上该类的实现和ItemFood是大同小异的。&lt;br /&gt;
&lt;br /&gt;
== 注释与外部链接 ==&lt;/div&gt;</summary>
		<author><name>MashKJo</name></author>
	</entry>
</feed>