From 9b7af5dfcfc3aa49a91b1df8fa4edee16c57bd33 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 17 Apr 2025 21:43:16 +1000 Subject: [PATCH] Fix hunger + thirst mispredicts (#36549) * Fix hunger + thirst mispredicts * Review --- Content.Shared/Nutrition/EntitySystems/HungerSystem.cs | 4 ++++ Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs index a8697ffee4..be8f19f98c 100644 --- a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs @@ -123,6 +123,7 @@ public sealed class HungerSystem : EntitySystem entity.Comp.LastAuthoritativeHungerChangeTime = _timing.CurTime; entity.Comp.LastAuthoritativeHungerValue = ClampHungerWithinThresholds(entity.Comp, value); DirtyField(entity.Owner, entity.Comp, nameof(HungerComponent.LastAuthoritativeHungerChangeTime)); + DirtyField(entity.Owner, entity.Comp, nameof(HungerComponent.LastAuthoritativeHungerValue)); } private void UpdateCurrentThreshold(EntityUid uid, HungerComponent? component = null) @@ -135,6 +136,7 @@ public sealed class HungerSystem : EntitySystem return; component.CurrentThreshold = calculatedHungerThreshold; + DirtyField(uid, component, nameof(HungerComponent.CurrentThreshold)); DoHungerThresholdEffects(uid, component); } @@ -163,10 +165,12 @@ public sealed class HungerSystem : EntitySystem if (component.HungerThresholdDecayModifiers.TryGetValue(component.CurrentThreshold, out var modifier)) { component.ActualDecayRate = component.BaseDecayRate * modifier; + DirtyField(uid, component, nameof(HungerComponent.ActualDecayRate)); SetAuthoritativeHungerValue((uid, component), GetHunger(component)); } component.LastThreshold = component.CurrentThreshold; + DirtyField(uid, component, nameof(HungerComponent.LastThreshold)); } private void DoContinuousHungerEffects(EntityUid uid, HungerComponent? component = null) diff --git a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs index 2937c48d48..052e73cd1b 100644 --- a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs @@ -49,6 +49,8 @@ public sealed class ThirstSystem : EntitySystem component.CurrentThirst = _random.Next( (int) component.ThirstThresholds[ThirstThreshold.Thirsty] + 10, (int) component.ThirstThresholds[ThirstThreshold.Okay] - 1); + + DirtyField(uid, component, nameof(ThirstComponent.CurrentThirst)); } component.NextUpdateTime = _timing.CurTime; 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. UpdateEffects(uid, component); + DirtyFields(uid, component, null, nameof(ThirstComponent.NextUpdateTime), nameof(ThirstComponent.CurrentThirstThreshold), nameof(ThirstComponent.LastThirstThreshold)); + TryComp(uid, out MovementSpeedModifierComponent? moveMod); _movement.RefreshMovementSpeedModifiers(uid, moveMod); } @@ -103,7 +107,7 @@ public sealed class ThirstSystem : EntitySystem component.ThirstThresholds[ThirstThreshold.OverHydrated] ); - EntityManager.DirtyField(uid, component, nameof(ThirstComponent.CurrentThirst)); + DirtyField(uid, component, nameof(ThirstComponent.CurrentThirst)); } private bool IsMovementThreshold(ThirstThreshold threshold) @@ -164,6 +168,9 @@ public sealed class ThirstSystem : EntitySystem _alerts.ClearAlertCategory(uid, component.ThirstyCategory); } + DirtyField(uid, component, nameof(ThirstComponent.LastThirstThreshold)); + DirtyField(uid, component, nameof(ThirstComponent.ActualDecayRate)); + switch (component.CurrentThirstThreshold) { case ThirstThreshold.OverHydrated: