Ensnaring Component and Bola Update (#9968)
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
namespace Content.Shared.Ensnaring.Components;
|
||||
/// <summary>
|
||||
/// Use this on an entity that you would like to be ensnared by anything that has the <see cref="SharedEnsnaringComponent"/>
|
||||
/// </summary>
|
||||
public abstract class SharedEnsnareableComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// How much should this slow down the entities walk?
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("walkSpeed")]
|
||||
public float WalkSpeed = 1.0f;
|
||||
|
||||
/// <summary>
|
||||
/// How much should this slow down the entities sprint?
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("sprintSpeed")]
|
||||
public float SprintSpeed = 1.0f;
|
||||
|
||||
/// <summary>
|
||||
/// Is this entity currently ensnared?
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("isEnsnared")]
|
||||
public bool IsEnsnared;
|
||||
}
|
||||
|
||||
public sealed class EnsnaredChangedEvent : EntityEventArgs
|
||||
{
|
||||
public readonly bool IsEnsnared;
|
||||
|
||||
public EnsnaredChangedEvent(bool isEnsnared)
|
||||
{
|
||||
IsEnsnared = isEnsnared;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
namespace Content.Shared.Ensnaring.Components;
|
||||
/// <summary>
|
||||
/// Use this on something you want to use to ensnare an entity with
|
||||
/// </summary>
|
||||
public abstract class SharedEnsnaringComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// How long it should take to free someone else.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("freeTime")]
|
||||
public float FreeTime = 3.5f;
|
||||
|
||||
/// <summary>
|
||||
/// How long it should take for an entity to free themselves.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("breakoutTime")]
|
||||
public float BreakoutTime = 30.0f;
|
||||
|
||||
/// <summary>
|
||||
/// How much should this slow down the entities walk?
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("walkSpeed")]
|
||||
public float WalkSpeed = 0.9f;
|
||||
|
||||
/// <summary>
|
||||
/// How much should this slow down the entities sprint?
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("sprintSpeed")]
|
||||
public float SprintSpeed = 0.9f;
|
||||
|
||||
/// <summary>
|
||||
/// Should this ensnare someone when thrown?
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("canThrowTrigger")]
|
||||
public bool CanThrowTrigger;
|
||||
|
||||
/// <summary>
|
||||
/// What is ensnared?
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("ensnared")]
|
||||
public EntityUid? Ensnared;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Used whenever you want to do something when someone becomes ensnared by the <see cref="SharedEnsnaringComponent"/>
|
||||
/// </summary>
|
||||
public sealed class EnsnareEvent : EntityEventArgs
|
||||
{
|
||||
public readonly float WalkSpeed;
|
||||
public readonly float SprintSpeed;
|
||||
|
||||
public EnsnareEvent(float walkSpeed, float sprintSpeed)
|
||||
{
|
||||
WalkSpeed = walkSpeed;
|
||||
SprintSpeed = sprintSpeed;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Used whenever you want to do something when someone is freed by the <see cref="SharedEnsnaringComponent"/>
|
||||
/// </summary>
|
||||
public sealed class EnsnareRemoveEvent : CancellableEntityEventArgs
|
||||
{
|
||||
|
||||
}
|
||||
9
Content.Shared/Ensnaring/EnsnareableVisuals.cs
Normal file
9
Content.Shared/Ensnaring/EnsnareableVisuals.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Ensnaring;
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public enum EnsnareableVisuals : byte
|
||||
{
|
||||
IsEnsnared
|
||||
}
|
||||
59
Content.Shared/Ensnaring/SharedEnsnareableSystem.cs
Normal file
59
Content.Shared/Ensnaring/SharedEnsnareableSystem.cs
Normal file
@@ -0,0 +1,59 @@
|
||||
using Content.Shared.Ensnaring.Components;
|
||||
using Content.Shared.Movement.Systems;
|
||||
|
||||
namespace Content.Shared.Ensnaring;
|
||||
|
||||
public abstract class SharedEnsnareableSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly MovementSpeedModifierSystem _speedModifier = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<SharedEnsnareableComponent, RefreshMovementSpeedModifiersEvent>(MovementSpeedModify);
|
||||
SubscribeLocalEvent<SharedEnsnareableComponent, EnsnareEvent>(OnEnsnare);
|
||||
SubscribeLocalEvent<SharedEnsnareableComponent, EnsnareRemoveEvent>(OnEnsnareRemove);
|
||||
SubscribeLocalEvent<SharedEnsnareableComponent, EnsnaredChangedEvent>(OnEnsnareChange);
|
||||
}
|
||||
|
||||
private void OnEnsnare(EntityUid uid, SharedEnsnareableComponent component, EnsnareEvent args)
|
||||
{
|
||||
component.WalkSpeed = args.WalkSpeed;
|
||||
component.SprintSpeed = args.SprintSpeed;
|
||||
|
||||
_speedModifier.RefreshMovementSpeedModifiers(uid);
|
||||
|
||||
var ev = new EnsnaredChangedEvent(component.IsEnsnared);
|
||||
RaiseLocalEvent(uid, ev, true);
|
||||
}
|
||||
|
||||
private void OnEnsnareRemove(EntityUid uid, SharedEnsnareableComponent component, EnsnareRemoveEvent args)
|
||||
{
|
||||
_speedModifier.RefreshMovementSpeedModifiers(uid);
|
||||
|
||||
var ev = new EnsnaredChangedEvent(component.IsEnsnared);
|
||||
RaiseLocalEvent(uid, ev, true);
|
||||
}
|
||||
|
||||
private void OnEnsnareChange(EntityUid uid, SharedEnsnareableComponent component, EnsnaredChangedEvent args)
|
||||
{
|
||||
UpdateAppearance(uid, component);
|
||||
}
|
||||
|
||||
private void UpdateAppearance(EntityUid uid, SharedEnsnareableComponent? component, AppearanceComponent? appearance = null)
|
||||
{
|
||||
if (!Resolve(uid, ref component, ref appearance, false))
|
||||
return;
|
||||
|
||||
appearance.SetData(EnsnareableVisuals.IsEnsnared, component.IsEnsnared);
|
||||
}
|
||||
|
||||
private void MovementSpeedModify(EntityUid uid, SharedEnsnareableComponent component, RefreshMovementSpeedModifiersEvent args)
|
||||
{
|
||||
if (!component.IsEnsnared)
|
||||
return;
|
||||
|
||||
args.ModifySpeed(component.WalkSpeed, component.SprintSpeed);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user