using Content.Shared.Body.Events; using Content.Shared.Gibbing; using Content.Shared.Humanoid; using Content.Shared.Medical; namespace Content.Shared.Body; public sealed partial class BodySystem { private void InitializeRelay() { SubscribeLocalEvent(RefRelayBodyEvent); SubscribeLocalEvent(RefRelayBodyEvent); SubscribeLocalEvent(RefRelayBodyEvent); SubscribeLocalEvent(RefRelayBodyEvent); SubscribeLocalEvent(RefRelayBodyEvent); SubscribeLocalEvent(RefRelayBodyEvent); SubscribeLocalEvent(RefRelayBodyEvent); } private void RefRelayBodyEvent(EntityUid uid, BodyComponent component, ref T args) where T : struct { RelayEvent((uid, component), ref args); } private void RelayBodyEvent(EntityUid uid, BodyComponent component, T args) where T : class { RelayEvent((uid, component), args); } public void RelayEvent(Entity ent, ref T args) where T : struct { var ev = new BodyRelayedEvent(ent, args); foreach (var organ in ent.Comp.Organs?.ContainedEntities ?? []) { RaiseLocalEvent(organ, ref ev); } args = ev.Args; } public void RelayEvent(Entity ent, T args) where T : class { var ev = new BodyRelayedEvent(ent, args); foreach (var organ in ent.Comp.Organs?.ContainedEntities ?? []) { RaiseLocalEvent(organ, ref ev); } } } /// /// Event wrapper for relayed events. /// [ByRefEvent] public record struct BodyRelayedEvent(Entity Body, TEvent Args);