using Content.Server.Humanoid; using Content.Shared._Sunrise.Antags.Abductor; using Content.Shared.Damage; using Content.Shared.Damage.Components; using Content.Shared.Damage.Systems; using Content.Shared.Eye.Blinding.Components; using Content.Shared.Eye.Blinding.Systems; using Content.Shared.Speech.Muting; using Content.Shared.Starlight.Medical.Surgery.Events; using Content.Shared.Starlight.Medical.Surgery.Steps.Parts; namespace Content.Server._Starlight.Medical.Surgery; public sealed partial class OrganSystem : EntitySystem { [Dependency] private readonly BlindableSystem _blindable = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly IComponentFactory _compFactory = default!; [Dependency] private readonly HumanoidAppearanceSystem _humanoidAppearanceSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnFunctionalOrganImplanted); SubscribeLocalEvent(OnFunctionalOrganExtracted); SubscribeLocalEvent(OnEyeImplanted); SubscribeLocalEvent(OnEyeExtracted); SubscribeLocalEvent(OnTongueImplanted); SubscribeLocalEvent(OnTongueExtracted); SubscribeLocalEvent(OnOrganImplanted); SubscribeLocalEvent(OnOrganExtracted); SubscribeLocalEvent(OnVisualizationImplanted); SubscribeLocalEvent(OnVisualizationExtracted); } // private void OnFunctionalOrganImplanted(Entity ent, ref SurgeryOrganImplantationCompleted args) { foreach (var comp in (ent.Comp.Components ?? []).Values) if (!EntityManager.HasComponent(args.Body, comp.Component.GetType())) EntityManager.AddComponent(args.Body, _compFactory.GetComponent(comp.Component.GetType())); } private void OnFunctionalOrganExtracted(Entity ent, ref SurgeryOrganExtracted args) { foreach (var comp in (ent.Comp.Components ?? []).Values) if (EntityManager.HasComponent(args.Body, comp.Component.GetType())) EntityManager.RemoveComponent(args.Body, _compFactory.GetComponent(comp.Component.GetType())); } // private void OnOrganImplanted(Entity ent, ref SurgeryOrganImplantationCompleted args) { if (!TryComp(args.Body, out var bodyDamageable)) return; var change = _damageableSystem.ChangeDamage(args.Body, ent.Comp.Damage, true, false); if (change is not null) _damageableSystem.ChangeDamage(ent.Owner, change.Invert(), true, false); } private void OnOrganExtracted(Entity ent, ref SurgeryOrganExtracted args) { if (!TryComp(ent.Owner, out var damageRule) || damageRule.Damage is null || !TryComp(args.Body, out var bodyDamageable)) return; var change = _damageableSystem.ChangeDamage(args.Body, damageRule.Damage.Invert(), true, false); if (change is not null) _damageableSystem.ChangeDamage(ent.Owner, change.Invert(), true, false); } private void OnTongueImplanted(Entity ent, ref SurgeryOrganImplantationCompleted args) { if (HasComp(args.Body) || !ent.Comp.IsMuted) return; RemComp(args.Body); } private void OnTongueExtracted(Entity ent, ref SurgeryOrganExtracted args) { ent.Comp.IsMuted = HasComp(args.Body); AddComp(args.Body); } // private void OnEyeExtracted(Entity ent, ref SurgeryOrganExtracted args) { if (!TryComp(args.Body, out var blindable)) return; ent.Comp.EyeDamage = blindable.EyeDamage; ent.Comp.MinDamage = blindable.MinDamage; _blindable.UpdateIsBlind((args.Body, blindable)); } private void OnEyeImplanted(Entity ent, ref SurgeryOrganImplantationCompleted args) { if (!TryComp(args.Body, out var blindable)) return; _blindable.SetMinDamage((args.Body, blindable), ent.Comp.MinDamage ?? 0); _blindable.AdjustEyeDamage((args.Body, blindable), (ent.Comp.EyeDamage ?? 0) - blindable.MaxDamage); } // private void OnVisualizationExtracted(Entity ent, ref SurgeryOrganExtracted args) => _humanoidAppearanceSystem.SetLayersVisibility(args.Body, [ent.Comp.Layer], false); private void OnVisualizationImplanted(Entity ent, ref SurgeryOrganImplantationCompleted args) { _humanoidAppearanceSystem.SetLayersVisibility(args.Body, [ent.Comp.Layer], true); _humanoidAppearanceSystem.SetBaseLayerId(args.Body, ent.Comp.Layer, ent.Comp.Prototype); } }