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