using System.Diagnostics.CodeAnalysis; using Content.Shared._CP14.Magic.Events; using Content.Shared.DoAfter; using Content.Shared.Hands.Components; using Content.Shared.Verbs; namespace Content.Server._CP14.Magic; public sealed partial class CPMagicSpellContainerSystem { private void InitializeCast() { SubscribeLocalEvent>(OnGetVerb); SubscribeLocalEvent(OnCast); } private void OnGetVerb(Entity container, ref GetVerbsEvent args) { var user = args.User; args.Verbs.Add(new AlternativeVerb { Text = "Get spell", Disabled = container.Comp.Effects.Count == 0, Priority = 10, Act = () => { StartCast(container, user); } }); } private void OnCast(Entity container, ref CPMagicCastDoAfterEvent args) { if (args.Handled || args.Cancelled || args.Target is null) return; Cast(container, args.Target.Value); args.Handled = true; } public void StartCast(Entity container, EntityUid caster) { if (!CastValidate(container, caster, out _)) return; var doAfterArgs = new DoAfterArgs(EntityManager, caster, container.Comp.TotalCastTime, new CPMagicCastDoAfterEvent(), target: caster, used: container, eventTarget: container) { BreakOnDamage = true, BreakOnMove = true, MovementThreshold = 0.5f, CancelDuplicate = false, }; _doAfter.TryStartDoAfter(doAfterArgs); } public void Cast(Entity container, EntityUid caster) { if (!CastValidate(container, caster, out var hand)) return; var entity = Spawn(BaseSpellItemEntity, _transform.GetMapCoordinates(container)); var spell = EnsureComp(entity); spell.Effects = new List(container.Comp.EffectPrototypes); _hands.TryPickup(caster, entity, hand); } private bool CastValidate(Entity container, EntityUid caster, [NotNullWhen(true)] out Hand? hand) { hand = default; if (container.Comp.TotalCompleteness > container.Comp.MaximumCompleteness) { _popup.PopupEntity("Too much complicated", container); return false; } if (!_hands.TryGetEmptyHand(caster, out hand)) { _popup.PopupEntity("The spell can't fit in your hand", container); return false; } return true; } }