允许过度进食
基本信息
| 属性 | 值 |
|---|---|
| 事件类 | ca.wescook.nutrition.events.EventAllowOvereating |
| 触发开关 | NutritionConfig.nutrition.allowOvereating = false(默认) |
| 所需重启 | RequiresMcRestart |
功能
当配置开启时,允许玩家在饥饿条已满的情况下继续吃食物 / 点 cake-like 可食用方块。主要是为 peaceful 模式服务(peaceful 不会自然掉饥饿,但玩家仍希望维持 Nutrient 值触发效果)。
实现
食物(ItemFood)
@SubscribeEvent
public void startUsingItem(PlayerUseItemEvent event) {
EntityPlayer player = (EntityPlayer) event.entity;
if (player.getEntityWorld().isRemote) return;
ItemStack itemStack = event.item;
if (itemStack == null) return;
if (itemStack.getItem() instanceof ItemFood itemFood) {
itemFood.setAlwaysEdible();
}
}
副作用:把内存中所有 ItemFood 子类的 alwaysEdible 标志设为 true。这意味着这个修改变成全局的,且会随玩家 use 任意 ItemFood 持续触发;对类静态字段的修改在多 mod 共存时可能干扰其他 mod 的判定。
可食用方块(IEdibleBlock,如 Cake)
@SubscribeEvent
public void rightClickBlock(PlayerInteractEvent event) {
World world = event.world;
int x = event.x, y = event.y, z = event.z;
Block block = world.getBlock(x, y, z);
if (block instanceof IEdibleBlock edibleBlock) {
edibleBlock.setEdibleAtMaxHunger(true);
}
}
只对实现 AppleCore IEdibleBlock 接口的可食用方块生效(原版 Cake、HarvestCraft 蛋糕等)。
配置
NutritionConfig.nutrition.allowOvereating = false:关闭时不订阅这两个事件,行为保持原版- 设为
true后必须重启游戏(@Config.RequiresMcRestart),因为事件总线订阅是preInit阶段决定的
与 Nutrition 其他机制的交互
- 玩家吃过食物 →
EventEatFood.onFoodEaten仍按正常 Nutrient 计算累加 - 满饥饿吃 food 不会恢复饥饿(
setAlwaysEdible只改"是否允许吃",不强制填饥饿) - 营养增益效果(如 Strength)继续按 Nutrient 值正常应用