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:
@@ -247,7 +247,10 @@ namespace Content.Client.Actions
|
|||||||
if (action.ClientExclusive)
|
if (action.ClientExclusive)
|
||||||
{
|
{
|
||||||
if (instantAction.Event != null)
|
if (instantAction.Event != null)
|
||||||
|
{
|
||||||
instantAction.Event.Performer = user;
|
instantAction.Event.Performer = user;
|
||||||
|
instantAction.Event.Action = actionId;
|
||||||
|
}
|
||||||
|
|
||||||
PerformAction(user, actions, actionId, instantAction, instantAction.Event, GameTiming.CurTime);
|
PerformAction(user, actions, actionId, instantAction, instantAction.Event, GameTiming.CurTime);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -217,6 +217,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
|
|||||||
{
|
{
|
||||||
action.Event.Target = coords;
|
action.Event.Target = coords;
|
||||||
action.Event.Performer = user;
|
action.Event.Performer = user;
|
||||||
|
action.Event.Action = actionId;
|
||||||
}
|
}
|
||||||
|
|
||||||
_actionsSystem.PerformAction(user, actionComp, actionId, action, action.Event, _timing.CurTime);
|
_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.Target = entity;
|
||||||
action.Event.Performer = user;
|
action.Event.Performer = user;
|
||||||
|
action.Event.Action = actionId;
|
||||||
}
|
}
|
||||||
|
|
||||||
_actionsSystem.PerformAction(user, actionComp, actionId, action, action.Event, _timing.CurTime);
|
_actionsSystem.PerformAction(user, actionComp, actionId, action, action.Event, _timing.CurTime);
|
||||||
|
|||||||
@@ -285,10 +285,19 @@ public sealed class ActionButton : Control, IEntityControl
|
|||||||
|
|
||||||
_controller ??= UserInterfaceManager.GetUIController<ActionUIController>();
|
_controller ??= UserInterfaceManager.GetUIController<ActionUIController>();
|
||||||
_spriteSys ??= _entities.System<SpriteSystem>();
|
_spriteSys ??= _entities.System<SpriteSystem>();
|
||||||
if ((_controller.SelectingTargetFor == ActionId || _action.Toggled) && _action.IconOn != null)
|
if ((_controller.SelectingTargetFor == ActionId || _action.Toggled))
|
||||||
SetActionIcon(_spriteSys.Frame0(_action.IconOn));
|
{
|
||||||
|
if (_action.IconOn != null)
|
||||||
|
SetActionIcon(_spriteSys.Frame0(_action.IconOn));
|
||||||
|
|
||||||
|
if (_action.BackgroundOn != null)
|
||||||
|
_buttonBackgroundTexture = _spriteSys.Frame0(_action.BackgroundOn);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
SetActionIcon(_action.Icon != null ? _spriteSys.Frame0(_action.Icon) : null);
|
SetActionIcon(_action.Icon != null ? _spriteSys.Frame0(_action.Icon) : null);
|
||||||
|
_buttonBackgroundTexture = Theme.ResolveTexture("SlotBackground");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateBackground()
|
public void UpdateBackground()
|
||||||
|
|||||||
@@ -47,7 +47,10 @@ public sealed class ActionOnInteractSystem : EntitySystem
|
|||||||
|
|
||||||
var (actId, act) = _random.Pick(options);
|
var (actId, act) = _random.Pick(options);
|
||||||
if (act.Event != null)
|
if (act.Event != null)
|
||||||
|
{
|
||||||
act.Event.Performer = args.User;
|
act.Event.Performer = args.User;
|
||||||
|
act.Event.Action = actId;
|
||||||
|
}
|
||||||
|
|
||||||
_actions.PerformAction(args.User, null, actId, act, act.Event, _timing.CurTime, false);
|
_actions.PerformAction(args.User, null, actId, act, act.Event, _timing.CurTime, false);
|
||||||
args.Handled = true;
|
args.Handled = true;
|
||||||
@@ -75,6 +78,7 @@ public sealed class ActionOnInteractSystem : EntitySystem
|
|||||||
if (entAct.Event != null)
|
if (entAct.Event != null)
|
||||||
{
|
{
|
||||||
entAct.Event.Performer = args.User;
|
entAct.Event.Performer = args.User;
|
||||||
|
entAct.Event.Action = entActId;
|
||||||
entAct.Event.Target = args.Target.Value;
|
entAct.Event.Target = args.Target.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,6 +104,7 @@ public sealed class ActionOnInteractSystem : EntitySystem
|
|||||||
if (act.Event != null)
|
if (act.Event != null)
|
||||||
{
|
{
|
||||||
act.Event.Performer = args.User;
|
act.Event.Performer = args.User;
|
||||||
|
act.Event.Action = actId;
|
||||||
act.Event.Target = args.ClickLocation;
|
act.Event.Target = args.ClickLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -155,4 +155,9 @@ public abstract partial class BaseActionEvent : HandledEntityEventArgs
|
|||||||
/// The user performing the action.
|
/// The user performing the action.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public EntityUid Performer;
|
public EntityUid Performer;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The action that was performed.
|
||||||
|
/// </summary>
|
||||||
|
public EntityUid Action;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using Content.Shared.Mobs;
|
using Robust.Shared.Audio;
|
||||||
using Robust.Shared.Audio;
|
|
||||||
using Robust.Shared.Serialization;
|
using Robust.Shared.Serialization;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
|
|
||||||
@@ -25,6 +24,11 @@ public abstract partial class BaseActionComponent : Component
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField("iconOn")] public SpriteSpecifier? IconOn;
|
[DataField("iconOn")] public SpriteSpecifier? IconOn;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// For toggle actions only, background to show when toggled on.
|
||||||
|
/// </summary>
|
||||||
|
[DataField] public SpriteSpecifier? BackgroundOn;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// If not null, this color will modulate the action icon color.
|
/// If not null, this color will modulate the action icon color.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
8
Content.Shared/Actions/Events/ActionPerformedEvent.cs
Normal file
8
Content.Shared/Actions/Events/ActionPerformedEvent.cs
Normal 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);
|
||||||
@@ -144,9 +144,6 @@ public abstract class SharedActionsSystem : EntitySystem
|
|||||||
|
|
||||||
public void SetCooldown(EntityUid? actionId, TimeSpan start, TimeSpan end)
|
public void SetCooldown(EntityUid? actionId, TimeSpan start, TimeSpan end)
|
||||||
{
|
{
|
||||||
if (actionId == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!TryGetActionData(actionId, out var action))
|
if (!TryGetActionData(actionId, out var action))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -162,9 +159,6 @@ public abstract class SharedActionsSystem : EntitySystem
|
|||||||
|
|
||||||
public void ClearCooldown(EntityUid? actionId)
|
public void ClearCooldown(EntityUid? actionId)
|
||||||
{
|
{
|
||||||
if (actionId == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!TryGetActionData(actionId, out var action))
|
if (!TryGetActionData(actionId, out var action))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -175,6 +169,27 @@ public abstract class SharedActionsSystem : EntitySystem
|
|||||||
Dirty(actionId.Value, action);
|
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)
|
public void StartUseDelay(EntityUid? actionId)
|
||||||
{
|
{
|
||||||
if (actionId == null)
|
if (actionId == null)
|
||||||
@@ -438,7 +453,10 @@ public abstract class SharedActionsSystem : EntitySystem
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (performEvent != null)
|
if (performEvent != null)
|
||||||
|
{
|
||||||
performEvent.Performer = user;
|
performEvent.Performer = user;
|
||||||
|
performEvent.Action = actionEnt;
|
||||||
|
}
|
||||||
|
|
||||||
// All checks passed. Perform the action!
|
// All checks passed. Perform the action!
|
||||||
PerformAction(user, component, actionEnt, action, performEvent, curTime);
|
PerformAction(user, component, actionEnt, action, performEvent, curTime);
|
||||||
@@ -580,6 +598,9 @@ public abstract class SharedActionsSystem : EntitySystem
|
|||||||
|
|
||||||
if (dirty && component != null)
|
if (dirty && component != null)
|
||||||
Dirty(performer, component);
|
Dirty(performer, component);
|
||||||
|
|
||||||
|
var ev = new ActionPerformedEvent(performer);
|
||||||
|
RaiseLocalEvent(actionId, ref ev);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user