From 737bd3e22ce1fc00620bfb653bfed5dfb69b1aed Mon Sep 17 00:00:00 2001 From: Pok <113675512+Pok27@users.noreply.github.com> Date: Wed, 3 Dec 2025 21:44:17 +0200 Subject: [PATCH] Predict BedSystem (#41686) * BedSystem-move-to-shared * dependency * dirty!!! --- Content.Client/Bed/BedSystem.cs | 8 --- Content.Server/Bed/BedSystem.cs | 54 ------------------- .../Bed/{SharedBedSystem.cs => BedSystem.cs} | 52 +++++++++++++++--- .../Components/StasisBedBuckledComponent.cs | 2 +- .../Bed/Components/StasisBedComponent.cs | 2 +- 5 files changed, 48 insertions(+), 70 deletions(-) delete mode 100644 Content.Client/Bed/BedSystem.cs delete mode 100644 Content.Server/Bed/BedSystem.cs rename Content.Shared/Bed/{SharedBedSystem.cs => BedSystem.cs} (72%) diff --git a/Content.Client/Bed/BedSystem.cs b/Content.Client/Bed/BedSystem.cs deleted file mode 100644 index 9c6f28290f..0000000000 --- a/Content.Client/Bed/BedSystem.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Content.Shared.Bed; - -namespace Content.Client.Bed; - -public sealed class BedSystem : SharedBedSystem -{ - -} diff --git a/Content.Server/Bed/BedSystem.cs b/Content.Server/Bed/BedSystem.cs deleted file mode 100644 index f6c2862a84..0000000000 --- a/Content.Server/Bed/BedSystem.cs +++ /dev/null @@ -1,54 +0,0 @@ -using Content.Shared.Bed; -using Content.Shared.Bed.Components; -using Content.Shared.Bed.Sleep; -using Content.Shared.Buckle.Components; -using Content.Shared.Damage.Systems; -using Content.Shared.Mobs.Systems; - -namespace Content.Server.Bed -{ - public sealed class BedSystem : SharedBedSystem - { - [Dependency] private readonly DamageableSystem _damageableSystem = default!; - [Dependency] private readonly MobStateSystem _mobStateSystem = default!; - - private EntityQuery _sleepingQuery; - - public override void Initialize() - { - base.Initialize(); - - _sleepingQuery = GetEntityQuery(); - } - - public override void Update(float frameTime) - { - base.Update(frameTime); - - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out _, out var bedComponent, out var strapComponent)) - { - if (Timing.CurTime < bedComponent.NextHealTime) - continue; - - bedComponent.NextHealTime += TimeSpan.FromSeconds(bedComponent.HealTime); - - if (strapComponent.BuckledEntities.Count == 0) - continue; - - foreach (var healedEntity in strapComponent.BuckledEntities) - { - if (_mobStateSystem.IsDead(healedEntity)) - continue; - - var damage = bedComponent.Damage; - - if (_sleepingQuery.HasComp(healedEntity)) - damage *= bedComponent.SleepMultiplier; - - _damageableSystem.TryChangeDamage(healedEntity, damage, true, origin: uid); - } - } - } - } -} diff --git a/Content.Shared/Bed/SharedBedSystem.cs b/Content.Shared/Bed/BedSystem.cs similarity index 72% rename from Content.Shared/Bed/SharedBedSystem.cs rename to Content.Shared/Bed/BedSystem.cs index 0518f05fdf..229c3a9bed 100644 --- a/Content.Shared/Bed/SharedBedSystem.cs +++ b/Content.Shared/Bed/BedSystem.cs @@ -4,7 +4,9 @@ using Content.Shared.Bed.Sleep; using Content.Shared.Body.Events; using Content.Shared.Body.Systems; using Content.Shared.Buckle.Components; +using Content.Shared.Damage.Systems; using Content.Shared.Emag.Systems; +using Content.Shared.Mobs.Systems; using Content.Shared.Power; using Content.Shared.Power.EntitySystems; using Robust.Shared.Timing; @@ -12,16 +14,20 @@ using Robust.Shared.Utility; namespace Content.Shared.Bed; -public abstract class SharedBedSystem : EntitySystem +public sealed class BedSystem : EntitySystem { - [Dependency] protected readonly IGameTiming Timing = default!; [Dependency] private readonly ActionContainerSystem _actConts = default!; - [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly EmagSystem _emag = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly MobStateSystem _mobStateSystem = default!; + [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; [Dependency] private readonly SharedMetabolizerSystem _metabolizer = default!; [Dependency] private readonly SharedPowerReceiverSystem _powerReceiver = default!; [Dependency] private readonly SleepingSystem _sleepingSystem = default!; + private EntityQuery _sleepingQuery; + public override void Initialize() { base.Initialize(); @@ -35,6 +41,8 @@ public abstract class SharedBedSystem : EntitySystem SubscribeLocalEvent(OnStasisEmagged); SubscribeLocalEvent(OnPowerChanged); SubscribeLocalEvent(OnStasisGetMetabolicMultiplier); + + _sleepingQuery = GetEntityQuery(); } private void OnHealMapInit(Entity ent, ref MapInitEvent args) @@ -46,7 +54,7 @@ public abstract class SharedBedSystem : EntitySystem private void OnStrapped(Entity bed, ref StrappedEvent args) { EnsureComp(bed); - bed.Comp.NextHealTime = Timing.CurTime + TimeSpan.FromSeconds(bed.Comp.HealTime); + bed.Comp.NextHealTime = _timing.CurTime + TimeSpan.FromSeconds(bed.Comp.HealTime); _actionsSystem.AddAction(args.Buckle, ref bed.Comp.SleepAction, SleepingSystem.SleepActionId, bed); Dirty(bed); @@ -62,7 +70,7 @@ public abstract class SharedBedSystem : EntitySystem _actionsSystem.RemoveAction(args.Buckle.Owner, bed.Comp.SleepAction); _sleepingSystem.TryWaking(args.Buckle.Owner); } - + RemComp(bed); } @@ -112,7 +120,7 @@ public abstract class SharedBedSystem : EntitySystem args.Multiplier *= stasis.Multiplier; } - protected void UpdateMetabolisms(Entity ent) + private void UpdateMetabolisms(Entity ent) { if (!Resolve(ent, ref ent.Comp, false)) return; @@ -122,4 +130,36 @@ public abstract class SharedBedSystem : EntitySystem _metabolizer.UpdateMetabolicMultiplier(buckledEntity); } } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out _, out var bedComponent, out var strapComponent)) + { + if (_timing.CurTime < bedComponent.NextHealTime) + continue; + + bedComponent.NextHealTime += TimeSpan.FromSeconds(bedComponent.HealTime); + + Dirty(uid, bedComponent); + + if (strapComponent.BuckledEntities.Count == 0) + continue; + + foreach (var healedEntity in strapComponent.BuckledEntities) + { + if (_mobStateSystem.IsDead(healedEntity)) + continue; + + var damage = bedComponent.Damage; + + if (_sleepingQuery.HasComp(healedEntity)) + damage *= bedComponent.SleepMultiplier; + + _damageableSystem.TryChangeDamage(healedEntity, damage, true, origin: uid); + } + } + } } diff --git a/Content.Shared/Bed/Components/StasisBedBuckledComponent.cs b/Content.Shared/Bed/Components/StasisBedBuckledComponent.cs index 3a1c991b1e..09759f71ef 100644 --- a/Content.Shared/Bed/Components/StasisBedBuckledComponent.cs +++ b/Content.Shared/Bed/Components/StasisBedBuckledComponent.cs @@ -6,5 +6,5 @@ namespace Content.Shared.Bed.Components; /// Tracking component added to entities buckled to stasis beds. /// [RegisterComponent, NetworkedComponent] -[Access(typeof(SharedBedSystem))] +[Access(typeof(BedSystem))] public sealed partial class StasisBedBuckledComponent : Component; diff --git a/Content.Shared/Bed/Components/StasisBedComponent.cs b/Content.Shared/Bed/Components/StasisBedComponent.cs index 97936261d6..fdc720c34f 100644 --- a/Content.Shared/Bed/Components/StasisBedComponent.cs +++ b/Content.Shared/Bed/Components/StasisBedComponent.cs @@ -7,7 +7,7 @@ namespace Content.Shared.Bed.Components; /// A that modifies a strapped entity's metabolic rate by the given multiplier /// [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] -[Access(typeof(SharedBedSystem))] +[Access(typeof(BedSystem))] public sealed partial class StasisBedComponent : Component { /// -- 2.52.0