using Content.Shared.Chat; using Content.Shared.IdentityManagement.Components; using Content.Shared.Implants.Components; using Content.Shared.Interaction.Events; using Content.Shared.Mindshield; using Content.Shared.Mobs; using Content.Shared.Store; using Content.Shared.VoiceMask; using Content.Shared.Corvax.TTS; namespace Content.Shared.Implants; public abstract partial class SharedSubdermalImplantSystem { public void InitializeRelay() { SubscribeLocalEvent(RelayToImplantEvent); SubscribeLocalEvent(RelayToImplantEvent); SubscribeLocalEvent(RelayToImplantEvent); SubscribeLocalEvent(RelayToImplantEvent); SubscribeLocalEvent(RelayToImplantEvent); SubscribeLocalEvent(RelayToImplantEvent); SubscribeLocalEvent(RelayToImplantEvent); SubscribeLocalEvent(RelayToImplantEvent); // Corvax TTS // Ref relays, for when you need to write to the event! SubscribeLocalEvent(RefRelayToImplantEvent); SubscribeLocalEvent(RefRelayToImplantEvent); SubscribeLocalEvent(RefRelayToImplantEvent, after: [typeof(MindShieldSystem)]); SubscribeLocalEvent(RefRelayToImplantEvent); } /// /// Relays events from the implanted to the implant. /// private void RelayToImplantEvent(EntityUid uid, ImplantedComponent component, T args) where T : notnull { if (!_container.TryGetContainer(uid, ImplanterComponent.ImplantSlotId, out var implantContainer)) return; var relayEv = new ImplantRelayEvent(args, uid); foreach (var implant in implantContainer.ContainedEntities) { if (args is HandledEntityEventArgs { Handled: true }) return; RaiseLocalEvent(implant, relayEv); } } /// /// Relays events from the implanted to the implant. /// private void RefRelayToImplantEvent(Entity entity, ref T args) where T : notnull { if (!_container.TryGetContainer(entity, ImplanterComponent.ImplantSlotId, out var implantContainer)) return; var relayEv = new ImplantRelayEvent(args, entity); foreach (var implant in implantContainer.ContainedEntities) { if (args is HandledEntityEventArgs { Handled: true }) return; RaiseLocalEvent(implant, relayEv); } args = relayEv.Args; } } /// /// Wrapper for relaying events from an implanted entity to their implants. /// public sealed class ImplantRelayEvent where T : notnull { public T Args; public readonly EntityUid ImplantedEntity; public ImplantRelayEvent(T ev, EntityUid implantedEntity) { Args = ev; ImplantedEntity = implantedEntity; } }