Fix hunger + thirst mispredicts (#36549)

* Fix hunger + thirst mispredicts

* Review
This commit is contained in:
metalgearsloth
2025-04-17 21:43:16 +10:00
committed by GitHub
parent a85370cc81
commit 9b7af5dfcf
2 changed files with 12 additions and 1 deletions

View File

@@ -123,6 +123,7 @@ public sealed class HungerSystem : EntitySystem
entity.Comp.LastAuthoritativeHungerChangeTime = _timing.CurTime; entity.Comp.LastAuthoritativeHungerChangeTime = _timing.CurTime;
entity.Comp.LastAuthoritativeHungerValue = ClampHungerWithinThresholds(entity.Comp, value); entity.Comp.LastAuthoritativeHungerValue = ClampHungerWithinThresholds(entity.Comp, value);
DirtyField(entity.Owner, entity.Comp, nameof(HungerComponent.LastAuthoritativeHungerChangeTime)); DirtyField(entity.Owner, entity.Comp, nameof(HungerComponent.LastAuthoritativeHungerChangeTime));
DirtyField(entity.Owner, entity.Comp, nameof(HungerComponent.LastAuthoritativeHungerValue));
} }
private void UpdateCurrentThreshold(EntityUid uid, HungerComponent? component = null) private void UpdateCurrentThreshold(EntityUid uid, HungerComponent? component = null)
@@ -135,6 +136,7 @@ public sealed class HungerSystem : EntitySystem
return; return;
component.CurrentThreshold = calculatedHungerThreshold; component.CurrentThreshold = calculatedHungerThreshold;
DirtyField(uid, component, nameof(HungerComponent.CurrentThreshold));
DoHungerThresholdEffects(uid, component); DoHungerThresholdEffects(uid, component);
} }
@@ -163,10 +165,12 @@ public sealed class HungerSystem : EntitySystem
if (component.HungerThresholdDecayModifiers.TryGetValue(component.CurrentThreshold, out var modifier)) if (component.HungerThresholdDecayModifiers.TryGetValue(component.CurrentThreshold, out var modifier))
{ {
component.ActualDecayRate = component.BaseDecayRate * modifier; component.ActualDecayRate = component.BaseDecayRate * modifier;
DirtyField(uid, component, nameof(HungerComponent.ActualDecayRate));
SetAuthoritativeHungerValue((uid, component), GetHunger(component)); SetAuthoritativeHungerValue((uid, component), GetHunger(component));
} }
component.LastThreshold = component.CurrentThreshold; component.LastThreshold = component.CurrentThreshold;
DirtyField(uid, component, nameof(HungerComponent.LastThreshold));
} }
private void DoContinuousHungerEffects(EntityUid uid, HungerComponent? component = null) private void DoContinuousHungerEffects(EntityUid uid, HungerComponent? component = null)

View File

@@ -49,6 +49,8 @@ public sealed class ThirstSystem : EntitySystem
component.CurrentThirst = _random.Next( component.CurrentThirst = _random.Next(
(int) component.ThirstThresholds[ThirstThreshold.Thirsty] + 10, (int) component.ThirstThresholds[ThirstThreshold.Thirsty] + 10,
(int) component.ThirstThresholds[ThirstThreshold.Okay] - 1); (int) component.ThirstThresholds[ThirstThreshold.Okay] - 1);
DirtyField(uid, component, nameof(ThirstComponent.CurrentThirst));
} }
component.NextUpdateTime = _timing.CurTime; component.NextUpdateTime = _timing.CurTime;
component.CurrentThirstThreshold = GetThirstThreshold(component, component.CurrentThirst); component.CurrentThirstThreshold = GetThirstThreshold(component, component.CurrentThirst);
@@ -56,6 +58,8 @@ public sealed class ThirstSystem : EntitySystem
// TODO: Check all thresholds make sense and throw if they don't. // TODO: Check all thresholds make sense and throw if they don't.
UpdateEffects(uid, component); UpdateEffects(uid, component);
DirtyFields(uid, component, null, nameof(ThirstComponent.NextUpdateTime), nameof(ThirstComponent.CurrentThirstThreshold), nameof(ThirstComponent.LastThirstThreshold));
TryComp(uid, out MovementSpeedModifierComponent? moveMod); TryComp(uid, out MovementSpeedModifierComponent? moveMod);
_movement.RefreshMovementSpeedModifiers(uid, moveMod); _movement.RefreshMovementSpeedModifiers(uid, moveMod);
} }
@@ -103,7 +107,7 @@ public sealed class ThirstSystem : EntitySystem
component.ThirstThresholds[ThirstThreshold.OverHydrated] component.ThirstThresholds[ThirstThreshold.OverHydrated]
); );
EntityManager.DirtyField(uid, component, nameof(ThirstComponent.CurrentThirst)); DirtyField(uid, component, nameof(ThirstComponent.CurrentThirst));
} }
private bool IsMovementThreshold(ThirstThreshold threshold) private bool IsMovementThreshold(ThirstThreshold threshold)
@@ -164,6 +168,9 @@ public sealed class ThirstSystem : EntitySystem
_alerts.ClearAlertCategory(uid, component.ThirstyCategory); _alerts.ClearAlertCategory(uid, component.ThirstyCategory);
} }
DirtyField(uid, component, nameof(ThirstComponent.LastThirstThreshold));
DirtyField(uid, component, nameof(ThirstComponent.ActualDecayRate));
switch (component.CurrentThirstThreshold) switch (component.CurrentThirstThreshold)
{ {
case ThirstThreshold.OverHydrated: case ThirstThreshold.OverHydrated: