跳到正文
烈焰甘蔗Wiki

Lunch Box

基本信息

属性 值
注册名 SpiceOfLife:lunchbox
最大堆叠 1(显式 setMaxStackSize(1))
槽位数 6
耐久度 无(全类未调用 setMaxDamage)
附魔适用 否(未重写 isEnchantable)
创造模式标签 CreativeTabs.tabMisc

[!WARNING] 已订正(本轮源码审计)

  1. 注册名大小写错:原文 spiceoflife:lunchbox → 正确 SpiceOfLife:lunchbox。注册域 = @Mod 的 modid ModInfo.MODID = "SpiceOfLife"(ModInfo.java:5、ModSpiceOfLife.java:31),GameRegistry.registerItem(ModContent.java:22)原样取用。字符串实参为 ModConfig.ITEM_LUNCH_BOX_NAME = "lunchbox"(ModConfig.java:29)。
  2. 合成配方描述反了:原文表格写"空格处为重力加重压力板" → 实际 _ 下划线才是压力板,空格是空位。原配方是 2 行 "_ _" / " _ ",共 3 块压力板(ModContent.java:31-36)。原文表格只有 2 行且把材料位置说反。
  3. 右键语义漏写 Sneak 分支:原文只写"右键 → 打开容器 GUI"。实际 onItemRightClick 有三条互斥分支(ItemFoodContainer.java:313-323),见下方语义表。
  4. 左键语义错:原文写"打开容器 GUI(客户端)"。实际左键向服务器发 PacketToggleFoodContainer,服务端切换 Open NBT 标志(toggle,不是 open),并不开 GUI(ItemFoodContainer.java:326-334、PacketToggleFoodContainer.java:18-24)。且该配置默认 false(ModConfig.java:189),原文未写默认值。
  5. 选食判据写错:原文写"饱食度/饱和度比最高"。实际排序是三级的(MealPrioritizationHelper.java:126-146),见下方「食用时的选食判据」。
  6. 漏写「右键方块」倒出/补入机制(ItemFoodContainer.java:292-304)。

功能

午餐盒是一个 6 槽食物容器,可存放 6 种不同的食物。

实现 IEdible 接口,可以直接食用。当食用时自动从容器中挑选一个食物吃掉(由 MealPrioritizationHelper 决定,非"比值最高")。

使用方式

右键语义(ItemFoodContainer.java:313-323,三条互斥分支)

条件 行为
玩家潜行(isSneaking()) 切换开/关状态(setIsOpen(!isOpen)),不开 GUI
已开 && 非空 && player.canEat(false) 进入进食动作(setItemInUse,时长 32 tick),完成后 onEaten 吃掉一份
未开 打开容器 GUI(服务端 player.openGui)并置 Open=true
已开 && 空 什么都不做(无分支命中)

语义提示:潜行 = 开/关切换是本类唯一能"关闭"容器的途径;未开状态下普通右键才是"打开 GUI"。

其他交互

使用方式 触发条件 使用效果
右键方块 容器已开,且目标方块有可被该玩家使用的容器 先把容器内食物全部倒出到目标容器,再从目标容器补入若干食物(服务端执行)
左键空气 left.click.opens.food.containers = true 且 MiscHelper.isMouseOverNothing() 客户端发 PacketToggleFoodContainer 到服务端,切换开关状态(不开 GUI)
食用 容器已开且非空 按下方判据选出 1 份食物消耗,并触发 onItemUseFinish(含其他 mod 的进食完成加成)

食用时的选食判据

MealPrioritizationHelper.FoodInfoComparator.compare(MealPrioritizationHelper.java:126-146)三级排序,取第一条:

  1. 未被递减收益削弱者优先 —— 比较 diminishingReturnsModifier 降序(:129)
  2. 恰好补满饥饿者优先 —— 比较 |maxHungerRestored - 修正后饥饿值| 升序(:131-139;仅在 findBestFoodForPlayerToEat 传入剩余饥饿时启用,此处 ignoreHungerRemainder=false)
  3. 总饱和度高者优先 —— 比较 saturationModifier × hunger 降序(:141-143)

原文"饱食度/饱和度比最高"两点都不对:主键是递减收益系数,末位兜底是饱和度与饥饿值的乘积,不是比值。

合成配方

第1行:  _ _
第2行:   _ _

_ = 重力加重压力板 (minecraft:heavy_weighted_pressure_plate)
(空格 = 空位;共 3 块压力板;来源 ModContent.java:31-36)

数值

属性 值
槽位数 6(构造参数,ModContent.java:21)
物品本身最大堆叠 1
每槽最大堆叠 food.containers.max.stacksize,默认 2(ModConfig.java:180、ItemFoodContainer.java:135-137)
进食动作时长 32 tick(ItemFoodContainer.java:337-339)
可存入的物品 必须是 AppleCore 认定的食物 且 可直接食用;蛋糕被排除,食物容器本身也被排除(ItemFoodContainer.java:142-145、FoodHelper.java:34-36)

状态与外观

  • Open 标志存在物品 NBT 里(另有 Inventory、UUID 三个键,ItemFoodContainer.java:50-52)
  • 开启时贴图切换为 lunchbox_open_empty / lunchbox_open_full(ItemFoodContainer.java:278-284, 357-363)
  • 工具提示随状态显示"潜行使用以关闭/打开"(ItemFoodContainer.java:265-276;en_US.lang:19-20)
  • NBT 里的 UUID 用于防止"玩家丢弃的正是自己正开着的容器"导致 GUI 死循环(ItemFoodContainer.java:228-248)

相关条目

浏览全部模组