RemoveComponentsOnTrigger, ToggleComponentsOnTrigger (#39639)
This commit is contained in:
@@ -0,0 +1,35 @@
|
|||||||
|
using Robust.Shared.GameStates;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Shared.Trigger.Components.Effects;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Removes the specified components when triggered.
|
||||||
|
/// If TargetUser is true they will be from the user instead.
|
||||||
|
/// </summary>
|
||||||
|
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||||
|
public sealed partial class RemoveComponentsOnTriggerComponent : BaseXOnTriggerComponent
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The list of components that will be removed.
|
||||||
|
/// </summary>
|
||||||
|
/// <summary>
|
||||||
|
/// TODO: Using a ComponentRegistry for this is cursed because it stores all the datafields along with it,
|
||||||
|
/// but ComponentNameSerializer will complain if you have components that are not in shared.
|
||||||
|
/// </summary>
|
||||||
|
[DataField(required: true)]
|
||||||
|
public ComponentRegistry Components = new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If this component has been triggered at least once already.
|
||||||
|
/// If this is true the components have been removed.
|
||||||
|
/// </summary>
|
||||||
|
[DataField, AutoNetworkedField]
|
||||||
|
public bool Triggered = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If this effect can only be triggered once.
|
||||||
|
/// </summary>
|
||||||
|
[DataField, AutoNetworkedField]
|
||||||
|
public bool TriggerOnce = false;
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
using Robust.Shared.GameStates;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Shared.Trigger.Components.Effects;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds or removes the specified components when triggered.
|
||||||
|
/// If TargetUser is true they will be added to or removed from the user instead.
|
||||||
|
/// </summary>
|
||||||
|
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||||
|
public sealed partial class ToggleComponentsOnTriggerComponent : BaseXOnTriggerComponent
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The list of components that will be added/removed.
|
||||||
|
/// </summary>
|
||||||
|
[DataField(required: true)]
|
||||||
|
public ComponentRegistry Components = new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Are the components currently added?
|
||||||
|
/// </summary>
|
||||||
|
[DataField, AutoNetworkedField]
|
||||||
|
public bool ComponentsAdded;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Should components that already exist on the entity be overwritten?
|
||||||
|
/// (They will still be removed when toggling again).
|
||||||
|
/// </summary>
|
||||||
|
[DataField, AutoNetworkedField]
|
||||||
|
public bool RemoveExisting = false;
|
||||||
|
}
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
using Content.Shared.Trigger.Components.Effects;
|
|
||||||
|
|
||||||
namespace Content.Shared.Trigger.Systems;
|
|
||||||
|
|
||||||
public sealed partial class AddComponentsOnTriggerSystem : EntitySystem
|
|
||||||
{
|
|
||||||
public override void Initialize()
|
|
||||||
{
|
|
||||||
base.Initialize();
|
|
||||||
|
|
||||||
SubscribeLocalEvent<AddComponentsOnTriggerComponent, TriggerEvent>(OnTrigger);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnTrigger(Entity<AddComponentsOnTriggerComponent> ent, ref TriggerEvent args)
|
|
||||||
{
|
|
||||||
if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key))
|
|
||||||
return;
|
|
||||||
|
|
||||||
var target = ent.Comp.TargetUser ? args.User : ent.Owner;
|
|
||||||
|
|
||||||
if (target == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (ent.Comp.TriggerOnce && ent.Comp.Triggered)
|
|
||||||
return;
|
|
||||||
|
|
||||||
EntityManager.AddComponents(target.Value, ent.Comp.Components, ent.Comp.RemoveExisting);
|
|
||||||
ent.Comp.Triggered = true;
|
|
||||||
Dirty(ent);
|
|
||||||
|
|
||||||
args.Handled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
76
Content.Shared/Trigger/Systems/ComponentsOnTriggerSystem.cs
Normal file
76
Content.Shared/Trigger/Systems/ComponentsOnTriggerSystem.cs
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
using Content.Shared.Trigger.Components.Effects;
|
||||||
|
|
||||||
|
namespace Content.Shared.Trigger.Systems;
|
||||||
|
|
||||||
|
public sealed partial class ComponentsOnTriggerSystem : EntitySystem
|
||||||
|
{
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
base.Initialize();
|
||||||
|
|
||||||
|
SubscribeLocalEvent<AddComponentsOnTriggerComponent, TriggerEvent>(HandleAddTrigger);
|
||||||
|
SubscribeLocalEvent<RemoveComponentsOnTriggerComponent, TriggerEvent>(HandleRemoveTrigger);
|
||||||
|
SubscribeLocalEvent<ToggleComponentsOnTriggerComponent, TriggerEvent>(HandleToggleTrigger);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleAddTrigger(Entity<AddComponentsOnTriggerComponent> ent, ref TriggerEvent args)
|
||||||
|
{
|
||||||
|
if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var target = ent.Comp.TargetUser ? args.User : ent.Owner;
|
||||||
|
|
||||||
|
if (target == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (ent.Comp.TriggerOnce && ent.Comp.Triggered)
|
||||||
|
return;
|
||||||
|
|
||||||
|
EntityManager.AddComponents(target.Value, ent.Comp.Components, ent.Comp.RemoveExisting);
|
||||||
|
ent.Comp.Triggered = true;
|
||||||
|
Dirty(ent);
|
||||||
|
|
||||||
|
args.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleRemoveTrigger(Entity<RemoveComponentsOnTriggerComponent> ent, ref TriggerEvent args)
|
||||||
|
{
|
||||||
|
if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var target = ent.Comp.TargetUser ? args.User : ent.Owner;
|
||||||
|
|
||||||
|
if (target == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (ent.Comp.TriggerOnce && ent.Comp.Triggered)
|
||||||
|
return;
|
||||||
|
|
||||||
|
EntityManager.RemoveComponents(target.Value, ent.Comp.Components);
|
||||||
|
ent.Comp.Triggered = true;
|
||||||
|
Dirty(ent);
|
||||||
|
|
||||||
|
args.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleToggleTrigger(Entity<ToggleComponentsOnTriggerComponent> ent, ref TriggerEvent args)
|
||||||
|
{
|
||||||
|
if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var target = ent.Comp.TargetUser ? args.User : ent.Owner;
|
||||||
|
|
||||||
|
if (target == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!ent.Comp.ComponentsAdded)
|
||||||
|
EntityManager.AddComponents(target.Value, ent.Comp.Components, ent.Comp.RemoveExisting);
|
||||||
|
else
|
||||||
|
EntityManager.RemoveComponents(target.Value, ent.Comp.Components);
|
||||||
|
|
||||||
|
ent.Comp.ComponentsAdded = !ent.Comp.ComponentsAdded;
|
||||||
|
Dirty(ent);
|
||||||
|
|
||||||
|
args.Handled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user