using Content.Shared._CP14.MagicSpell.Components; using Content.Shared._CP14.MagicSpell.Events; using Content.Shared.Hands.Components; using Content.Shared.Speech.Muting; namespace Content.Shared._CP14.MagicSpell; public abstract partial class CP14SharedMagicSystem { private void InitializeAspects() { SubscribeLocalEvent(OnSomaticAspectBeforeCast); SubscribeLocalEvent(OnVerbalAspectBeforeCast); SubscribeLocalEvent(OnVerbalAspectStartCast); SubscribeLocalEvent(OnVerbalAspectAfterCast); } private void OnSomaticAspectBeforeCast(Entity ent, ref CP14CastMagicEffectAttemptEvent args) { if (TryComp(args.Performer, out var hands) || hands is not null) { var freeHand = 0; foreach (var hand in hands.Hands) { if (hand.Value.IsEmpty) freeHand++; } if (freeHand >= ent.Comp.FreeHandRequired) return; } args.PushReason(Loc.GetString("cp14-magic-spell-need-somatic-component")); args.Cancel(); } private void OnVerbalAspectBeforeCast(Entity ent, ref CP14CastMagicEffectAttemptEvent args) { if (HasComp(args.Performer)) { args.PushReason(Loc.GetString("cp14-magic-spell-need-verbal-component")); args.Cancel(); } } private void OnVerbalAspectStartCast(Entity ent, ref CP14StartCastMagicEffectEvent args) { var ev = new CP14VerbalAspectSpeechEvent { Performer = args.Performer, Speech = ent.Comp.StartSpeech, }; RaiseLocalEvent(ent, ref ev); } private void OnVerbalAspectAfterCast(Entity ent, ref CP14AfterCastMagicEffectEvent args) { if (_net.IsClient) return; var ev = new CP14VerbalAspectSpeechEvent { Performer = args.Performer, Speech = ent.Comp.EndSpeech, }; RaiseLocalEvent(ent, ref ev); } }