Files
crystall-punk-14/Content.Server/_CP14/Magic/CPMagicSpellContainerSystem.Cast.cs
2024-05-08 20:15:05 +10:00

90 lines
2.8 KiB
C#

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<CPMagicSpellContainerComponent, GetVerbsEvent<AlternativeVerb>>(OnGetVerb);
SubscribeLocalEvent<CPMagicSpellContainerComponent, CPMagicCastDoAfterEvent>(OnCast);
}
private void OnGetVerb(Entity<CPMagicSpellContainerComponent> container, ref GetVerbsEvent<AlternativeVerb> 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<CPMagicSpellContainerComponent> 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<CPMagicSpellContainerComponent> 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<CPMagicSpellContainerComponent> container, EntityUid caster)
{
if (!CastValidate(container, caster, out var hand))
return;
var entity = Spawn(BaseSpellItemEntity, _transform.GetMapCoordinates(container));
var spell = EnsureComp<CPMagicSpellComponent>(entity);
spell.Effects = new List<CPMagicEffectPrototype>(container.Comp.EffectPrototypes);
_hands.TryPickup(caster, entity, hand);
}
private bool CastValidate(Entity<CPMagicSpellContainerComponent> 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;
}
}