* some work * equip: done unequip: todo * unequipping done & refactored events * workin * movin * reee namespaces * stun * mobstate * fixes * some work on events * removes serverside itemcomp & misc fixes * work * smol merge fix * ports template to prototype & finishes ui * moves relay & adds containerenumerator * actions & cuffs * my god what is actioncode * more fixes * im loosing my grasp on reality * more fixes * more work * explosions * yes * more work * more fixes * merge master & misc fixed because i forgot to commit before merging master * more fixes * fixes * moar * more work * moar fixes * suffixmap * more work on client * motivation low * no. no containers * mirroring client to server * fixes * move serverinvcomp * serverinventorycomponent is dead * gaming * only strippable & ai left... * only ai and richtext left * fixes ai * fixes * fixes sprite layers * more fixes * resolves optional * yes * stable™️ * fixes * moar fixes * moar * fix some tests * lmao * no comment * good to merge™️ * fixes build but for real * adresses some reviews * adresses some more reviews * nullables, yo * fixes lobbyscreen * timid refactor to differentiate actor & target * adresses more reviews * more * my god what a mess * removed the rest of duplicates * removed duplicate slotflags and renamed shoes to feet * removes another unused one * yes * fixes lobby & makes tryunequip return unequipped item * fixes * some funny renames * fixes * misc improvements to attemptevents * fixes * merge fixes Co-authored-by: Paul Ritter <ritter.paul1@gmail.com>
78 lines
3.1 KiB
C#
78 lines
3.1 KiB
C#
using Content.Server.Hands.Components;
|
|
using Content.Server.Popups;
|
|
using Content.Shared.ActionBlocker;
|
|
using Content.Shared.Actions.Behaviors;
|
|
using Content.Shared.Cooldown;
|
|
using Content.Shared.Item;
|
|
using Content.Shared.Popups;
|
|
using Content.Shared.Sound;
|
|
using JetBrains.Annotations;
|
|
using Robust.Shared.Audio;
|
|
using Robust.Shared.GameObjects;
|
|
using Robust.Shared.IoC;
|
|
using Robust.Shared.Localization;
|
|
using Robust.Shared.Log;
|
|
using Robust.Shared.Player;
|
|
using Robust.Shared.Prototypes;
|
|
using Robust.Shared.Serialization.Manager.Attributes;
|
|
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
|
using Robust.Shared.ViewVariables;
|
|
|
|
namespace Content.Server.Actions.Spells
|
|
{
|
|
[UsedImplicitly]
|
|
[DataDefinition]
|
|
public class GiveItemSpell : IInstantAction
|
|
{ //TODO: Needs to be an EntityPrototype for proper validation
|
|
[ViewVariables] [DataField("castMessage")] public string? CastMessage { get; set; } = default!;
|
|
[ViewVariables] [DataField("cooldown")] public float CoolDown { get; set; } = 1f;
|
|
[ViewVariables] [DataField("spellItem", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))] public string ItemProto { get; set; } = default!;
|
|
|
|
[ViewVariables] [DataField("castSound", required: true)] public SoundSpecifier CastSound { get; set; } = default!;
|
|
|
|
//Rubber-band snapping items into player's hands, originally was a workaround, later found it works quite well with stuns
|
|
//Not sure if needs fixing
|
|
|
|
public void DoInstantAction(InstantActionEventArgs args)
|
|
{
|
|
var entMan = IoCManager.Resolve<IEntityManager>();
|
|
|
|
var caster = args.Performer;
|
|
|
|
if (!entMan.TryGetComponent(caster, out HandsComponent? handsComponent))
|
|
{
|
|
caster.PopupMessage(Loc.GetString("spell-fail-no-hands"));
|
|
return;
|
|
}
|
|
|
|
if (!EntitySystem.Get<ActionBlockerSystem>().CanInteract(caster)) return;
|
|
|
|
// TODO: Nix when we get EntityPrototype serializers
|
|
if (!IoCManager.Resolve<IPrototypeManager>().HasIndex<EntityPrototype>(ItemProto))
|
|
{
|
|
Logger.Error($"Invalid prototype {ItemProto} supplied for {nameof(GiveItemSpell)}");
|
|
return;
|
|
}
|
|
|
|
// TODO: Look this is shitty and ideally a test would do it
|
|
var spawnedProto = entMan.SpawnEntity(ItemProto, entMan.GetComponent<TransformComponent>(caster).MapPosition);
|
|
|
|
if (!entMan.TryGetComponent(spawnedProto, out SharedItemComponent? itemComponent))
|
|
{
|
|
Logger.Error($"Tried to use {nameof(GiveItemSpell)} but prototype has no {nameof(SharedItemComponent)}?");
|
|
entMan.DeleteEntity(spawnedProto);
|
|
return;
|
|
}
|
|
|
|
args.PerformerActions?.Cooldown(args.ActionType, Cooldowns.SecondsFromNow(CoolDown));
|
|
|
|
if (CastMessage != null)
|
|
caster.PopupMessageEveryone(CastMessage);
|
|
|
|
handsComponent.PutInHandOrDrop(itemComponent);
|
|
|
|
SoundSystem.Play(Filter.Pvs(caster), CastSound.GetSound(), caster);
|
|
}
|
|
}
|
|
}
|