允许过度进食

基本信息

属性 值
事件类 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 值正常应用

相关条目