饥饿游戏规则(disableHunger)

基本信息

属性 值
游戏规则名 disableHunger
注册值 false(MixinGameRules_HungerRule.java:25)
总开关 TweaksConfig.hungerGameRule(TweaksConfig.java:502)
挂载的 Mixin 3 个(见下表),注册为 Mixin 条目 ADD_HUNGER_GAMERULE(Mixins.java:1045-1051)
相位 EARLY(COMMON)
关联 Tweaks 配置、Mixin 系统

功能

Hodgepodge 唯一注册的游戏规则。开启后玩家的饥饿值不再下降 —— 服务端可用 /gamerule disableHunger true 关闭服务器的食物消耗。

这是 1.7.10 原版不存在、而在现代版本加入的规则的回移。

三个 Mixin 的分工

Mixin 类 目标类 作用
minecraft.MixinGameRules_HungerRule net.minecraft.world.GameRules 注册规则并持有其状态
minecraft.MixinEntityPlayer_HungerRule net.minecraft.entity.player.EntityPlayer 玩家侧:改写 getFoodStats() 判定
minecraft.MixinFoodStats_HungerRule net.minecraft.util.FoodStats 食物值侧:改写饥饿下降判定

实现机制

MixinGameRules_HungerRule 用三段注入 + 一个接口完成(MixinGameRules_HungerRule.java):

  1. @Inject(method = "<init>", at = @At("RETURN")) —— 构造末尾调 addGameRule("disableHunger", "false")(:23-26)
  2. @Inject(method = "setOrCreateGameRule", at = @At(…GameRules$Value.setValue…AFTER)) —— 值变化时更新 @Unique 字段 hodgepodge$disableHunger(:28-38)
  3. 实现 mixins/interfaces/GameRuleExt(唯一方法 hodgepodge$isHungerDisabled()),供另两个 Mixin 查询(:40-43)

两个消费方各只有一行判定 —— 注意取反:

消费方 源码
MixinEntityPlayer_HungerRule.java:22 return !((GameRuleExt) this.worldObj.getGameRules()).hodgepodge$isHungerDisabled();
MixinFoodStats_HungerRule.java:21 return !((GameRuleExt) player.worldObj.getGameRules()).hodgepodge$isHungerDisabled();

交互

操作 结果
/gamerule disableHunger 查询当前值
/gamerule disableHunger true 关闭饥饿消耗
/gamerule disableHunger false 恢复饥饿消耗(默认)
TweaksConfig.hungerGameRule = false 整个规则不注册,命令报未知游戏规则。需重启

规则状态存在 @Unique 字段而非 GameRules 自身的 map 之外,读写都经 setOrCreateGameRule 钩子,因此 /gamerule 的正常持久化与同步路径不变。

相关条目

  • Tweaks 配置 - hungerGameRule 的定义(默认 true)
  • Mixin 系统 - ADD_HUNGER_GAMERULE 条目的注册方式
  • 跨模组修复 - 另有 FixesConfig.fixHungerOverhaul 处理 Hunger Overhaul 模组的兼容