饥饿游戏规则(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):
@Inject(method = "<init>", at = @At("RETURN"))—— 构造末尾调addGameRule("disableHunger", "false")(:23-26)@Inject(method = "setOrCreateGameRule", at = @At(…GameRules$Value.setValue…AFTER))—— 值变化时更新@Unique字段hodgepodge$disableHunger(:28-38)- 实现
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的正常持久化与同步路径不变。