From: ActiveMammmoth <140334666+ActiveMammmoth@users.noreply.github.com> Date: Tue, 29 Apr 2025 19:40:49 +0000 (-0400) Subject: Staff of Animation Fixes & Recharging (#37021) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=a8ff93076311a185d7b96264ae0466ec37847089;p=space-station-14.git Staff of Animation Fixes & Recharging (#37021) --- diff --git a/Content.Server/Actions/ActionOnInteractComponent.cs b/Content.Server/Actions/ActionOnInteractComponent.cs index 3a7e15649b..4ae3d9e5f7 100644 --- a/Content.Server/Actions/ActionOnInteractComponent.cs +++ b/Content.Server/Actions/ActionOnInteractComponent.cs @@ -1,6 +1,5 @@ using Content.Shared.Interaction; using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; namespace Content.Server.Actions; @@ -20,8 +19,10 @@ namespace Content.Server.Actions; [RegisterComponent] public sealed partial class ActionOnInteractComponent : Component { - [DataField(required:true)] + [DataField(required: true)] public List? Actions; [DataField] public List? ActionEntities; + + [DataField] public bool RequiresCharge; } diff --git a/Content.Server/Actions/ActionOnInteractSystem.cs b/Content.Server/Actions/ActionOnInteractSystem.cs index af9b0b1ddb..c658b3f90a 100644 --- a/Content.Server/Actions/ActionOnInteractSystem.cs +++ b/Content.Server/Actions/ActionOnInteractSystem.cs @@ -1,5 +1,7 @@ using System.Linq; using Content.Shared.Actions; +using Content.Shared.Charges.Components; +using Content.Shared.Charges.Systems; using Content.Shared.Interaction; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -15,6 +17,7 @@ public sealed class ActionOnInteractSystem : EntitySystem [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly ActionContainerSystem _actionContainer = default!; + [Dependency] private readonly SharedChargesSystem _charges = default!; public override void Initialize() { @@ -54,6 +57,9 @@ public sealed class ActionOnInteractSystem : EntitySystem if (options.Count == 0) return; + if (!TryUseCharge((uid, component))) + return; + var (actId, act) = _random.Pick(options); _actions.PerformAction(args.User, null, actId, act, act.Event, _timing.CurTime, false); args.Handled = true; @@ -85,6 +91,9 @@ public sealed class ActionOnInteractSystem : EntitySystem if (entOptions.Count > 0) { + if (!TryUseCharge((uid, component))) + return; + var (entActId, entAct) = _random.Pick(entOptions); if (entAct.Event != null) { @@ -108,6 +117,9 @@ public sealed class ActionOnInteractSystem : EntitySystem if (entWorldOptions.Count > 0) { + if (!TryUseCharge((uid, component))) + return; + var (entActId, entAct) = _random.Pick(entWorldOptions); if (entAct.Event != null) { @@ -132,6 +144,9 @@ public sealed class ActionOnInteractSystem : EntitySystem if (options.Count == 0) return; + if (!TryUseCharge((uid, component))) + return; + var (actId, act) = _random.Pick(options); if (act.Event != null) { @@ -163,4 +178,17 @@ public sealed class ActionOnInteractSystem : EntitySystem return valid; } + + private bool TryUseCharge(Entity ent) + { + if (!ent.Comp.RequiresCharge) + return true; + + Entity charges = ent.Owner; + if (_charges.IsEmpty(charges)) + return false; + + _charges.TryUseCharge(charges); + return true; + } } diff --git a/Content.Server/NPC/Systems/NPCUtilitySystem.cs b/Content.Server/NPC/Systems/NPCUtilitySystem.cs index eff4f2772b..7b485eeb96 100644 --- a/Content.Server/NPC/Systems/NPCUtilitySystem.cs +++ b/Content.Server/NPC/Systems/NPCUtilitySystem.cs @@ -232,6 +232,9 @@ public sealed class NPCUtilitySystem : EntitySystem { if (_container.TryGetContainingContainer(targetUid, out var container)) { + if (container.Owner == owner) + return 0f; + if (TryComp(container.Owner, out var storageComponent)) { if (storageComponent is { Open: false } && _weldable.IsWelded(container.Owner)) diff --git a/Content.Shared/Magic/Systems/AnimateSpellSystem.cs b/Content.Shared/Magic/Systems/AnimateSpellSystem.cs index 458336dea1..202605a338 100644 --- a/Content.Shared/Magic/Systems/AnimateSpellSystem.cs +++ b/Content.Shared/Magic/Systems/AnimateSpellSystem.cs @@ -40,7 +40,7 @@ public sealed class AnimateSpellSystem : EntitySystem _container.AttachParentToContainerOrGrid((ent, xform)); // Items animated inside inventory now exit, they can't be picked up and so can't escape otherwise var ev = new AnimateSpellEvent(); - RaiseLocalEvent(ref ev); + RaiseLocalEvent(ent, ref ev); } } diff --git a/Resources/Prototypes/Magic/animate_spell.yml b/Resources/Prototypes/Magic/animate_spell.yml index d36afb49d9..6d1319944b 100644 --- a/Resources/Prototypes/Magic/animate_spell.yml +++ b/Resources/Prototypes/Magic/animate_spell.yml @@ -3,14 +3,12 @@ name: Animate description: Bring an inanimate object to life! components: - - type: LimitedCharges - maxCharges: 5 - type: EntityTargetAction useDelay: 0 itemIconStyle: BigAction whitelist: components: - - Animateable # Currently on: SeatBase, TableBase, ClosetBase, BaseMachine, ConstructibleMachine, BaseComputer, BaseItem, CrateGeneric, StorageTank, GasCanister, BaseTarget + - Animateable # Currently on: SeatBase, TableBase, ClosetBase, BaseMachine, ConstructibleMachine, BaseComputer, BaseItem, CrateGeneric, StorageTank, GasCanister blacklist: components: - MindContainer @@ -19,7 +17,7 @@ - AnomalyGenerator - TegGenerator - TegCirculator - - Artifact + - XenoArtifact canTargetSelf: false interactOnMiss: false sound: !type:SoundPathSpecifier @@ -70,9 +68,11 @@ collection: MetalBreak - type: Hands - type: CanEscapeInventory + - type: MobCollision toRemove: - RequireProjectileTarget - BlockMovement - Item + - MeleeRequiresWield speech: action-speech-spell-animate doSpeech: false diff --git a/Resources/Prototypes/Magic/staves.yml b/Resources/Prototypes/Magic/staves.yml index 8bfb30b887..ff43db866e 100644 --- a/Resources/Prototypes/Magic/staves.yml +++ b/Resources/Prototypes/Magic/staves.yml @@ -7,6 +7,10 @@ name: RGB staff description: Helps fix the underabundance of RGB gear on the station. components: + - type: LimitedCharges + maxCharges: 25 + - type: AutoRecharge + rechargeDuration: 30 - type: Sprite sprite: Objects/Weapons/Guns/Basic/staves.rsi layers: @@ -14,6 +18,7 @@ - state: nothing-unshaded shader: unshaded - type: ActionOnInteract + requiresCharge: true actions: - ActionRgbLight - type: Item @@ -38,11 +43,16 @@ name: staff of animation description: Brings inanimate objects to life! components: + - type: LimitedCharges + maxCharges: 5 + - type: AutoRecharge + rechargeDuration: 30 - type: Sprite sprite: Objects/Weapons/Guns/Basic/staves.rsi layers: - state: animation - type: ActionOnInteract + requiresCharge: true actions: - ActionAnimateSpell - type: Item @@ -59,8 +69,6 @@ - type: entity id: ActionRgbLight components: - - type: LimitedCharges - maxCharges: 25 - type: EntityTargetAction whitelist: { components: [ PointLight ] } sound: /Audio/Magic/blink.ogg