Add ActionPerformedEvent, ActionsSystem.SetIfBiggerCooldown, action id to action events and BackgroundOn field (#27682)

* Add ActionPerformedEvent and ActionsSystem.SetIfBiggerCooldown

* Add action id to action events and backgroundon field to action component
This commit is contained in:
DrSmugleaf
2024-05-10 17:04:01 -07:00
committed by GitHub
parent bc53a46a73
commit 9741fda672
8 changed files with 67 additions and 10 deletions

View File

@@ -155,4 +155,9 @@ public abstract partial class BaseActionEvent : HandledEntityEventArgs
/// The user performing the action.
/// </summary>
public EntityUid Performer;
/// <summary>
/// The action that was performed.
/// </summary>
public EntityUid Action;
}

View File

@@ -1,5 +1,4 @@
using Content.Shared.Mobs;
using Robust.Shared.Audio;
using Robust.Shared.Audio;
using Robust.Shared.Serialization;
using Robust.Shared.Utility;
@@ -25,6 +24,11 @@ public abstract partial class BaseActionComponent : Component
/// </summary>
[DataField("iconOn")] public SpriteSpecifier? IconOn;
/// <summary>
/// For toggle actions only, background to show when toggled on.
/// </summary>
[DataField] public SpriteSpecifier? BackgroundOn;
/// <summary>
/// If not null, this color will modulate the action icon color.
/// </summary>

View File

@@ -0,0 +1,8 @@
namespace Content.Shared.Actions.Events;
/// <summary>
/// Raised on the action entity when it is used and <see cref="BaseActionEvent.Handled"/>.
/// </summary>
/// <param name="Performer">The entity that performed this action.</param>
[ByRefEvent]
public readonly record struct ActionPerformedEvent(EntityUid Performer);

View File

@@ -144,9 +144,6 @@ public abstract class SharedActionsSystem : EntitySystem
public void SetCooldown(EntityUid? actionId, TimeSpan start, TimeSpan end)
{
if (actionId == null)
return;
if (!TryGetActionData(actionId, out var action))
return;
@@ -162,9 +159,6 @@ public abstract class SharedActionsSystem : EntitySystem
public void ClearCooldown(EntityUid? actionId)
{
if (actionId == null)
return;
if (!TryGetActionData(actionId, out var action))
return;
@@ -175,6 +169,27 @@ public abstract class SharedActionsSystem : EntitySystem
Dirty(actionId.Value, action);
}
/// <summary>
/// Sets the cooldown for this action only if it is bigger than the one it already has.
/// </summary>
public void SetIfBiggerCooldown(EntityUid? actionId, TimeSpan? cooldown)
{
if (cooldown == null ||
cooldown.Value <= TimeSpan.Zero ||
!TryGetActionData(actionId, out var action))
{
return;
}
var start = GameTiming.CurTime;
var end = start + cooldown;
if (action.Cooldown?.End > end)
return;
action.Cooldown = (start, end.Value);
Dirty(actionId.Value, action);
}
public void StartUseDelay(EntityUid? actionId)
{
if (actionId == null)
@@ -438,7 +453,10 @@ public abstract class SharedActionsSystem : EntitySystem
}
if (performEvent != null)
{
performEvent.Performer = user;
performEvent.Action = actionEnt;
}
// All checks passed. Perform the action!
PerformAction(user, component, actionEnt, action, performEvent, curTime);
@@ -580,6 +598,9 @@ public abstract class SharedActionsSystem : EntitySystem
if (dirty && component != null)
Dirty(performer, component);
var ev = new ActionPerformedEvent(performer);
RaiseLocalEvent(actionId, ref ev);
}
#endregion