using Content.Shared.Damage; using Content.Shared.Hands; using Robust.Shared.Containers; namespace Content.Server.Mail { /// /// A placeholder for another entity, spawned when taken out of a container, with the placeholder deleted shortly after. /// Useful for storing instant effect entities, e.g. smoke, in the mail. /// public sealed class DelayedItemSystem : EntitySystem { public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnDropAttempt); SubscribeLocalEvent(OnHandEquipped); SubscribeLocalEvent(OnDamageChanged); SubscribeLocalEvent(OnRemovedFromContainer); } /// /// EntGotRemovedFromContainerMessage handler - spawn the intended entity after removed from a container. /// private void OnRemovedFromContainer(EntityUid uid, DelayedItemComponent component, ContainerModifiedMessage args) { Spawn(component.Item, Transform(uid).Coordinates); } /// /// GotEquippedHandEvent handler - destroy the placeholder. /// private void OnHandEquipped(EntityUid uid, DelayedItemComponent component, EquippedHandEvent args) { EntityManager.DeleteEntity(uid); } /// /// OnDropAttempt handler - destroy the placeholder. /// private void OnDropAttempt(EntityUid uid, DelayedItemComponent component, DropAttemptEvent args) { EntityManager.DeleteEntity(uid); } /// /// OnDamageChanged handler - item has taken damage (e.g. inside the envelope), spawn the intended entity outside of any container and delete the placeholder. /// private void OnDamageChanged(EntityUid uid, DelayedItemComponent component, DamageChangedEvent args) { Spawn(component.Item, Transform(uid).Coordinates); EntityManager.DeleteEntity(uid); } } }