FoodStatsMixin
基本信息
| 属性 | 值 |
|---|---|
| 目标类 | net.minecraft.util.FoodStats |
| Mixin 阶段 | EARLY |
| 注入数 | 3(全部在 addStats) |
| 挂载接口 | FoodStatsExt |
| 注册于 | Mixins.MINECRAFT(common mixin) |
| 启用版本 | Minecraft 1.7.10 |
功能
本 mod 的核心事件总闸。原版 FoodStats 把进食、消耗、回血、掉血
全部塞在 addStats(int, float) 这一个方法里,因此全部 12 个
FoodEvent / ExhaustionEvent / HealthRegenEvent / StarvationEvent
子事件都在此处触发。
实现要点
- 触发的事件(由源码实际调用确认):
FoodEvent.FoodStatsAddition、FoodEvent.FoodEatenExhaustionEvent.AllowExhaustion、ExhaustionEvent.ExhaustedHealthRegenEvent.AllowRegen、HealthRegenEvent.GetRegenTickPeriod、HealthRegenEvent.RegenStarvationEvent.AllowStarvation、StarvationEvent.GetStarveTickPeriod、StarvationEvent.Starve
GetRegenTickPeriod/GetStarveTickPeriod/GetMaxExhaustion的返回值被写回原版的tickCount与foodExhaustionLevel判定, 因此 IAppleCoreAccessor 里的 3 个get*TickPeriod方法最终读取的是这里被事件改写后的结果。Exhausted事件处读取exhaustedEvent.deltaExhaustion、deltaHunger、deltaSaturation三个可写字段作为实际扣减量, 并检查isCanceled()。Starve事件处读取可写的starveDamage。Regen事件处读取deltaHealth与deltaExhaustion。- 三个
Allow*事件都通过getResult()决定是否继续 (Event.Result.DENY即阻止)。 - 隐藏字段的读写由 FoodStatsAccessor 提供通道, 本类只负责事件编排。
相关条目
- FoodStatsAccessor - 兄弟 Mixin,字段访问通道
- FoodStatsExt - 本 Mixin 挂载的 duck 接口
- ExhaustionEvent - 3 个子事件
- HealthRegenEvent - 3 个子事件
- StarvationEvent - 3 个子事件
- FoodEvent - 2 个子事件
- EntityPlayerMixin - 兄弟 Mixin,承担另 2 个事件