From 4a6fc71d07ae230d62201cddc4c11c8d35497c3c Mon Sep 17 00:00:00 2001 From: Winkarst-cpu <74284083+Winkarst-cpu@users.noreply.github.com> Date: Sat, 30 Aug 2025 19:52:34 +0300 Subject: [PATCH] SharedKitchenSpikeSystem bugfixes (#39959) * Fixes * Update * Update --- .../Kitchen/SharedKitchenSpikeSystem.cs | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/Content.Shared/Kitchen/SharedKitchenSpikeSystem.cs b/Content.Shared/Kitchen/SharedKitchenSpikeSystem.cs index 57b08569f5..c691a973f9 100644 --- a/Content.Shared/Kitchen/SharedKitchenSpikeSystem.cs +++ b/Content.Shared/Kitchen/SharedKitchenSpikeSystem.cs @@ -17,11 +17,11 @@ using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Events; using Content.Shared.Nutrition.Components; using Content.Shared.Popups; +using Content.Shared.Random.Helpers; using Content.Shared.Throwing; using Content.Shared.Verbs; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; -using Robust.Shared.Random; using Robust.Shared.Serialization; using Robust.Shared.Timing; @@ -44,7 +44,6 @@ public sealed class SharedKitchenSpikeSystem : EntitySystem [Dependency] private readonly SharedAudioSystem _audioSystem = default!; [Dependency] private readonly SharedBodySystem _bodySystem = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly IRobustRandom _random = default!; public override void Initialize() { @@ -81,7 +80,7 @@ public sealed class SharedKitchenSpikeSystem : EntitySystem private void OnInit(Entity ent, ref ComponentInit args) { - ent.Comp.BodyContainer = _containerSystem.EnsureContainer(ent, ent.Comp.ContainerId); + ent.Comp.BodyContainer = _containerSystem.EnsureContainer(ent, ent.Comp.ContainerId); } private void OnInsertAttempt(Entity ent, ref ContainerIsInsertingAttemptEvent args) @@ -94,15 +93,24 @@ public sealed class SharedKitchenSpikeSystem : EntitySystem private void OnEntInsertedIntoContainer(Entity ent, ref EntInsertedIntoContainerMessage args) { + if (_gameTiming.ApplyingState) + return; + EnsureComp(args.Entity); _damageableSystem.TryChangeDamage(args.Entity, ent.Comp.SpikeDamage, true); + ent.Comp.NextDamage = _gameTiming.CurTime + ent.Comp.DamageInterval; + Dirty(ent); + // TODO: Add sprites for different species. _appearanceSystem.SetData(ent.Owner, KitchenSpikeVisuals.Status, KitchenSpikeStatus.Bloody); } private void OnEntRemovedFromContainer(Entity ent, ref EntRemovedFromContainerMessage args) { + if (_gameTiming.ApplyingState) + return; + RemComp(args.Entity); _damageableSystem.TryChangeDamage(args.Entity, ent.Comp.SpikeDamage, true); @@ -263,7 +271,7 @@ public sealed class SharedKitchenSpikeSystem : EntitySystem private void OnSpikeButcherDoAfter(Entity ent, ref SpikeButcherDoAfterEvent args) { - if (args.Handled || args.Cancelled || !args.Target.HasValue || !args.Used.HasValue || !TryComp(args.Target, out var butcherable) ) + if (args.Handled || args.Cancelled || !args.Target.HasValue || !args.Used.HasValue || !TryComp(args.Target, out var butcherable)) return; var victimIdentity = Identity.Entity(args.Target.Value, EntityManager); @@ -275,7 +283,11 @@ public sealed class SharedKitchenSpikeSystem : EntitySystem PopupType.MediumCaution); // Get a random entry to spawn. - var index = _random.Next(butcherable.SpawnedEntities.Count); + // TODO: Replace with RandomPredicted once the engine PR is merged + var seed = SharedRandomExtensions.HashCodeCombine(new() { (int)_gameTiming.CurTick.Value, GetNetEntity(ent).Id }); + var rand = new System.Random(seed); + + var index = rand.Next(butcherable.SpawnedEntities.Count); var entry = butcherable.SpawnedEntities[index]; var uid = PredictedSpawnNextToOrDrop(entry.PrototypeId, ent); @@ -378,13 +390,18 @@ public sealed class SharedKitchenSpikeSystem : EntitySystem while (query.MoveNext(out var uid, out var kitchenSpike)) { + var contained = kitchenSpike.BodyContainer.ContainedEntity; + + if (!contained.HasValue) + continue; + if (kitchenSpike.NextDamage > _gameTiming.CurTime) continue; kitchenSpike.NextDamage += kitchenSpike.DamageInterval; Dirty(uid, kitchenSpike); - _damageableSystem.TryChangeDamage(kitchenSpike.BodyContainer.ContainedEntity, kitchenSpike.TimeDamage, true); + _damageableSystem.TryChangeDamage(contained, kitchenSpike.TimeDamage, true); } } -- 2.51.2