diff --git a/Content.Shared/Disposal/Holder/SharedDisposalHolderSystem.cs b/Content.Shared/Disposal/Holder/SharedDisposalHolderSystem.cs index 6aa28be0d1..7b2491897d 100644 --- a/Content.Shared/Disposal/Holder/SharedDisposalHolderSystem.cs +++ b/Content.Shared/Disposal/Holder/SharedDisposalHolderSystem.cs @@ -19,41 +19,41 @@ namespace Content.Shared.Disposal.Holder; /// public abstract partial class SharedDisposalHolderSystem : EntitySystem { + [Dependency] private INetManager _net = default!; [Dependency] private DamageableSystem _damageable = default!; [Dependency] private DisposalTubeSystem _disposalTube = default!; [Dependency] private SharedAudioSystem _audio = default!; [Dependency] private SharedContainerSystem _container = default!; + [Dependency] private SharedEyeSystem _eye = default!; [Dependency] private SharedPhysicsSystem _physics = default!; [Dependency] private SharedTransformSystem _xform = default!; - [Dependency] private INetManager _net = default!; - [Dependency] private SharedEyeSystem _eye = default!; - private EntityQuery _xformQuery; + [Dependency] private EntityQuery _xformQuery; /// /// Allowed characters for tagging disposed entities. /// public static readonly Regex TagRegex = new("^[a-zA-Z0-9, ]*$", RegexOptions.Compiled); - public override void Initialize() - { - base.Initialize(); - - _xformQuery = GetEntityQuery(); - - SubscribeLocalEvent(OnComponentStartup); - SubscribeLocalEvent(OnExploded); - - SubscribeLocalEvent(OnActorTransition); - SubscribeLocalEvent(OnGetVisibility); - } - + [SubscribeLocalEvent] private void OnComponentStartup(Entity ent, ref ComponentStartup args) { // Ensure the holder will have its container ent.Comp.Container = _container.EnsureContainer(ent, nameof(DisposalHolderComponent)); } + [SubscribeLocalEvent] + private void OnComponentRemove(Entity ent, ref ComponentRemove args) + { + if (ent.Comp.Container is not { } container) + return; + + // Inform the contained entities that they aren't in disposals anymore. + foreach (var contained in container.ContainedEntities) + DetachEntity(contained); + } + + [SubscribeLocalEvent] private void OnExploded(Entity ent, ref BeforeExplodeEvent args) { if (ent.Comp.Container == null) @@ -62,12 +62,14 @@ public abstract partial class SharedDisposalHolderSystem : EntitySystem args.Contents.AddRange(ent.Comp.Container.ContainedEntities); } + [SubscribeLocalEvent] private void OnActorTransition(Entity ent, ref DisposalSystemTransitionEvent args) { // Refreshes visibility mask of a player, leading to OnGetVisibility being called _eye.RefreshVisibilityMask(ent.Owner); } + [SubscribeLocalEvent] private void OnGetVisibility(Entity entity, ref GetVisMaskEvent ev) { // Prevents mispredictions by allowing players in the disposal system @@ -76,6 +78,13 @@ public abstract partial class SharedDisposalHolderSystem : EntitySystem ev.VisibilityMask |= (int)VisibilityFlags.Subfloor; } + [SubscribeLocalEvent] + private void OnDisposedRemovedFromContainer(Entity ent, ref EntGotRemovedFromContainerMessage args) + { + if (args.Container.Owner == ent.Comp.Holder) + DetachEntity(ent); + } + /// /// Ejects all entities inside a disposal holder from the disposals system. ///