Lunch Box
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | SpiceOfLife:lunchbox |
| 最大堆叠 | 1(显式 setMaxStackSize(1)) |
| 槽位数 | 6 |
| 耐久度 | 无(全类未调用 setMaxDamage) |
| 附魔适用 | 否(未重写 isEnchantable) |
| 创造模式标签 | CreativeTabs.tabMisc |
[!WARNING] 已订正(本轮源码审计)
- 注册名大小写错:原文
spiceoflife:lunchbox→ 正确SpiceOfLife:lunchbox。注册域 =@Mod的 modidModInfo.MODID = "SpiceOfLife"(ModInfo.java:5、ModSpiceOfLife.java:31),GameRegistry.registerItem(ModContent.java:22)原样取用。字符串实参为ModConfig.ITEM_LUNCH_BOX_NAME = "lunchbox"(ModConfig.java:29)。- 合成配方描述反了:原文表格写"空格处为重力加重压力板" → 实际
_下划线才是压力板,空格是空位。原配方是 2 行"_ _"/" _ ",共 3 块压力板(ModContent.java:31-36)。原文表格只有 2 行且把材料位置说反。- 右键语义漏写 Sneak 分支:原文只写"右键 → 打开容器 GUI"。实际
onItemRightClick有三条互斥分支(ItemFoodContainer.java:313-323),见下方语义表。- 左键语义错:原文写"打开容器 GUI(客户端)"。实际左键向服务器发
PacketToggleFoodContainer,服务端切换OpenNBT 标志(toggle,不是 open),并不开 GUI(ItemFoodContainer.java:326-334、PacketToggleFoodContainer.java:18-24)。且该配置默认false(ModConfig.java:189),原文未写默认值。- 选食判据写错:原文写"饱食度/饱和度比最高"。实际排序是三级的(
MealPrioritizationHelper.java:126-146),见下方「食用时的选食判据」。- 漏写「右键方块」倒出/补入机制(
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)三级排序,取第一条:
- 未被递减收益削弱者优先 —— 比较
diminishingReturnsModifier降序(:129) - 恰好补满饥饿者优先 —— 比较
|maxHungerRestored - 修正后饥饿值|升序(:131-139;仅在findBestFoodForPlayerToEat传入剩余饥饿时启用,此处ignoreHungerRemainder=false) - 总饱和度高者优先 —— 比较
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)
相关条目
- Lunch Bag - 3 槽食物容器
- Food Journal - 食物历史查看器
- Diminishing Returns - 递减收益机制