diff --git a/Content.Server/Body/Systems/BodySystem.cs b/Content.Server/Body/Systems/BodySystem.cs index d41f2d5769..fb6f8d6777 100644 --- a/Content.Server/Body/Systems/BodySystem.cs +++ b/Content.Server/Body/Systems/BodySystem.cs @@ -12,6 +12,7 @@ using Content.Shared.Movement.Systems; using Robust.Shared.Audio; using Robust.Shared.Timing; using System.Numerics; +using Content.Shared.Damage.Components; namespace Content.Server.Body.Systems; @@ -110,6 +111,9 @@ public sealed class BodySystem : SharedBodySystem return new HashSet(); } + if (HasComp(bodyId)) + return new HashSet(); + var xform = Transform(bodyId); if (xform.MapUid is null) return new HashSet(); diff --git a/Content.Server/ImmovableRod/ImmovableRodSystem.cs b/Content.Server/ImmovableRod/ImmovableRodSystem.cs index 0d3d69c1bc..d881f90341 100644 --- a/Content.Server/ImmovableRod/ImmovableRodSystem.cs +++ b/Content.Server/ImmovableRod/ImmovableRodSystem.cs @@ -1,4 +1,6 @@ using Content.Server.Body.Systems; +using Content.Server.Destructible; +using Content.Server.Examine; using Content.Server.Polymorph.Components; using Content.Server.Popups; using Content.Shared.Body.Components; @@ -24,6 +26,7 @@ public sealed class ImmovableRodSystem : EntitySystem [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly DestructibleSystem _destructible = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SharedMapSystem _map = default!; @@ -127,7 +130,7 @@ public sealed class ImmovableRodSystem : EntitySystem return; } - QueueDel(ent); + _destructible.DestroyEntity(ent); } private void OnExamined(EntityUid uid, ImmovableRodComponent component, ExaminedEvent args) diff --git a/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs b/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs index de848b34c2..cd0ce8f3a6 100644 --- a/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs @@ -20,6 +20,7 @@ using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Timing; using System.Linq; +using Content.Server.Construction.Completions; using Content.Server.Jittering; using Content.Shared.Jittering; using Content.Shared.Power; @@ -38,6 +39,7 @@ namespace Content.Server.Kitchen.EntitySystems [Dependency] private readonly SharedAudioSystem _audioSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; [Dependency] private readonly SharedContainerSystem _containerSystem = default!; + [Dependency] private readonly SharedDestructibleSystem _destructible = default!; [Dependency] private readonly RandomHelperSystem _randomHelper = default!; [Dependency] private readonly JitteringSystem _jitter = default!; @@ -123,10 +125,7 @@ namespace Content.Server.Kitchen.EntitySystems if (solution.Volume > containerSolution.AvailableVolume) continue; - var dev = new DestructionEventArgs(); - RaiseLocalEvent(item, dev); - - QueueDel(item); + _destructible.DestroyEntity(item); } _solutionContainersSystem.TryAddSolution(containerSoln.Value, solution); diff --git a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs index e294edf15b..8b7626e031 100644 --- a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs @@ -52,6 +52,7 @@ public sealed class FoodSystem : EntitySystem [Dependency] private readonly ReactiveSystem _reaction = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedDestructibleSystem _destructible = default!; [Dependency] private readonly SharedHandsSystem _hands = default!; [Dependency] private readonly SharedInteractionSystem _interaction = default!; [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!; @@ -336,6 +337,11 @@ public sealed class FoodSystem : EntitySystem if (ev.Cancelled) return; + var attemptEv = new DestructionAttemptEvent(); + RaiseLocalEvent(food, attemptEv); + if (attemptEv.Cancelled) + return; + var afterEvent = new AfterFullyEatenEvent(user); RaiseLocalEvent(food, ref afterEvent); diff --git a/Content.Shared/Damage/Systems/SharedGodmodeSystem.cs b/Content.Shared/Damage/Systems/SharedGodmodeSystem.cs index 4ccc56dcb8..b6b487430b 100644 --- a/Content.Shared/Damage/Systems/SharedGodmodeSystem.cs +++ b/Content.Shared/Damage/Systems/SharedGodmodeSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Damage.Components; using Content.Shared.Damage.Events; +using Content.Shared.Destructible; using Content.Shared.Rejuvenate; using Content.Shared.Slippery; using Content.Shared.StatusEffect; @@ -18,6 +19,7 @@ public abstract class SharedGodmodeSystem : EntitySystem SubscribeLocalEvent(OnBeforeStatusEffect); SubscribeLocalEvent(OnBeforeStaminaDamage); SubscribeLocalEvent(OnSlipAttempt); + SubscribeLocalEvent(OnDestruction); } private void OnSlipAttempt(EntityUid uid, GodmodeComponent component, SlipAttemptEvent args) @@ -40,6 +42,11 @@ public abstract class SharedGodmodeSystem : EntitySystem args.Cancelled = true; } + private void OnDestruction(Entity ent, ref DestructionAttemptEvent args) + { + args.Cancel(); + } + public virtual void EnableGodmode(EntityUid uid, GodmodeComponent? godmode = null) { godmode ??= EnsureComp(uid); diff --git a/Content.Shared/Destructible/SharedDestructibleSystem.cs b/Content.Shared/Destructible/SharedDestructibleSystem.cs index eb87f00b6c..572ed9d560 100644 --- a/Content.Shared/Destructible/SharedDestructibleSystem.cs +++ b/Content.Shared/Destructible/SharedDestructibleSystem.cs @@ -5,12 +5,18 @@ public abstract class SharedDestructibleSystem : EntitySystem /// /// Force entity to be destroyed and deleted. /// - public void DestroyEntity(EntityUid owner) + public bool DestroyEntity(EntityUid owner) { - var eventArgs = new DestructionEventArgs(); + var ev = new DestructionAttemptEvent(); + RaiseLocalEvent(owner, ev); + if (ev.Cancelled) + return false; + var eventArgs = new DestructionEventArgs(); RaiseLocalEvent(owner, eventArgs); + QueueDel(owner); + return true; } /// @@ -23,6 +29,14 @@ public abstract class SharedDestructibleSystem : EntitySystem } } +/// +/// Raised before an entity is about to be destroyed and deleted +/// +public sealed class DestructionAttemptEvent : CancellableEntityEventArgs +{ + +} + /// /// Raised when entity is destroyed and about to be deleted. ///