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

@@ -247,7 +247,10 @@ namespace Content.Client.Actions
if (action.ClientExclusive)
{
if (instantAction.Event != null)
{
instantAction.Event.Performer = user;
instantAction.Event.Action = actionId;
}
PerformAction(user, actions, actionId, instantAction, instantAction.Event, GameTiming.CurTime);
}

View File

@@ -217,6 +217,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
{
action.Event.Target = coords;
action.Event.Performer = user;
action.Event.Action = actionId;
}
_actionsSystem.PerformAction(user, actionComp, actionId, action, action.Event, _timing.CurTime);
@@ -251,6 +252,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
{
action.Event.Target = entity;
action.Event.Performer = user;
action.Event.Action = actionId;
}
_actionsSystem.PerformAction(user, actionComp, actionId, action, action.Event, _timing.CurTime);

View File

@@ -285,10 +285,19 @@ public sealed class ActionButton : Control, IEntityControl
_controller ??= UserInterfaceManager.GetUIController<ActionUIController>();
_spriteSys ??= _entities.System<SpriteSystem>();
if ((_controller.SelectingTargetFor == ActionId || _action.Toggled) && _action.IconOn != null)
SetActionIcon(_spriteSys.Frame0(_action.IconOn));
if ((_controller.SelectingTargetFor == ActionId || _action.Toggled))
{
if (_action.IconOn != null)
SetActionIcon(_spriteSys.Frame0(_action.IconOn));
if (_action.BackgroundOn != null)
_buttonBackgroundTexture = _spriteSys.Frame0(_action.BackgroundOn);
}
else
{
SetActionIcon(_action.Icon != null ? _spriteSys.Frame0(_action.Icon) : null);
_buttonBackgroundTexture = Theme.ResolveTexture("SlotBackground");
}
}
public void UpdateBackground()

View File

@@ -47,7 +47,10 @@ public sealed class ActionOnInteractSystem : EntitySystem
var (actId, act) = _random.Pick(options);
if (act.Event != null)
{
act.Event.Performer = args.User;
act.Event.Action = actId;
}
_actions.PerformAction(args.User, null, actId, act, act.Event, _timing.CurTime, false);
args.Handled = true;
@@ -75,6 +78,7 @@ public sealed class ActionOnInteractSystem : EntitySystem
if (entAct.Event != null)
{
entAct.Event.Performer = args.User;
entAct.Event.Action = entActId;
entAct.Event.Target = args.Target.Value;
}
@@ -100,6 +104,7 @@ public sealed class ActionOnInteractSystem : EntitySystem
if (act.Event != null)
{
act.Event.Performer = args.User;
act.Event.Action = actId;
act.Event.Target = args.ClickLocation;
}

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