seperate Stealth and StealthOnMove (#12035)

This commit is contained in:
Rane
2022-10-22 18:06:55 -04:00
committed by GitHub
parent 637d53222a
commit a2a895de4e
4 changed files with 65 additions and 19 deletions

View File

@@ -5,8 +5,9 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
namespace Content.Shared.Stealth.Components; namespace Content.Shared.Stealth.Components;
/// <summary> /// <summary>
/// Add this component to an entity that you want to be cloaked. /// Add this component to an entity that you want to be cloaked.
/// It overlays a shader on the entity to give them an invisibility cloaked effect /// It overlays a shader on the entity to give them an invisibility cloaked effect.
/// It also turns the entity invisible /// It also turns the entity invisible.
/// Use other components (like StealthOnMove) to modify this component's visibility based on certain conditions.
/// </summary> /// </summary>
[RegisterComponent, NetworkedComponent] [RegisterComponent, NetworkedComponent]
[Access(typeof(SharedStealthSystem))] [Access(typeof(SharedStealthSystem))]
@@ -35,6 +36,7 @@ public sealed class StealthComponent : Component
/// outside of this range simply act as a buffer for the visual effect (i.e., a delay before turning invisible). To /// outside of this range simply act as a buffer for the visual effect (i.e., a delay before turning invisible). To
/// get the actual current visibility, use <see cref="SharedStealthSystem.GetVisibility(EntityUid, /// get the actual current visibility, use <see cref="SharedStealthSystem.GetVisibility(EntityUid,
/// StealthComponent?)"/> /// StealthComponent?)"/>
/// If you don't have anything else updating the stealth, this will just stay at a constant value, which can be useful.
/// </summary> /// </summary>
[DataField("lastVisibility")] [DataField("lastVisibility")]
[Access(typeof(SharedStealthSystem), Other = AccessPermissions.None)] [Access(typeof(SharedStealthSystem), Other = AccessPermissions.None)]
@@ -48,18 +50,6 @@ public sealed class StealthComponent : Component
[DataField("lastUpdate", customTypeSerializer:typeof(TimeOffsetSerializer))] [DataField("lastUpdate", customTypeSerializer:typeof(TimeOffsetSerializer))]
public TimeSpan? LastUpdated; public TimeSpan? LastUpdated;
/// <summary>
/// Rate that effects how fast an entity's visibility passively changes.
/// </summary>
[DataField("passiveVisibilityRate")]
public readonly float PassiveVisibilityRate = -0.15f;
/// <summary>
/// Rate for movement induced visibility changes. Scales with distance moved.
/// </summary>
[DataField("movementVisibilityRate")]
public readonly float MovementVisibilityRate = 0.2f;
/// <summary> /// <summary>
/// Minimum visibility. Note that the visual effect caps out at -1, but this value is allowed to be larger or smaller. /// Minimum visibility. Note that the visual effect caps out at -1, but this value is allowed to be larger or smaller.
/// </summary> /// </summary>

View File

@@ -0,0 +1,22 @@
namespace Content.Shared.Stealth.Components
{
/// <summary>
/// When added to an entity with stealth component, this component will change the visibility
/// based on the entity's (lack of) movement.
/// </summary>
[RegisterComponent]
public sealed class StealthOnMoveComponent : Component
{
/// <summary>
/// Rate that effects how fast an entity's visibility passively changes.
/// </summary>
[DataField("passiveVisibilityRate")]
public readonly float PassiveVisibilityRate = -0.15f;
/// <summary>
/// Rate for movement induced visibility changes. Scales with distance moved.
/// </summary>
[DataField("movementVisibilityRate")]
public readonly float MovementVisibilityRate = 0.2f;
}
}

View File

@@ -15,7 +15,8 @@ public abstract class SharedStealthSystem : EntitySystem
SubscribeLocalEvent<StealthComponent, ComponentGetState>(OnStealthGetState); SubscribeLocalEvent<StealthComponent, ComponentGetState>(OnStealthGetState);
SubscribeLocalEvent<StealthComponent, ComponentHandleState>(OnStealthHandleState); SubscribeLocalEvent<StealthComponent, ComponentHandleState>(OnStealthHandleState);
SubscribeLocalEvent<StealthComponent, MoveEvent>(OnMove); SubscribeLocalEvent<StealthOnMoveComponent, MoveEvent>(OnMove);
SubscribeLocalEvent<StealthOnMoveComponent, GetVisibilityModifiersEvent>(OnGetVisibilityModifiers);
SubscribeLocalEvent<StealthComponent, EntityPausedEvent>(OnPaused); SubscribeLocalEvent<StealthComponent, EntityPausedEvent>(OnPaused);
SubscribeLocalEvent<StealthComponent, ComponentInit>(OnInit); SubscribeLocalEvent<StealthComponent, ComponentInit>(OnInit);
SubscribeLocalEvent<StealthComponent, ExamineAttemptEvent>(OnExamine); SubscribeLocalEvent<StealthComponent, ExamineAttemptEvent>(OnExamine);
@@ -87,7 +88,7 @@ public abstract class SharedStealthSystem : EntitySystem
component.LastUpdated = cast.LastUpdated; component.LastUpdated = cast.LastUpdated;
} }
private void OnMove(EntityUid uid, StealthComponent component, ref MoveEvent args) private void OnMove(EntityUid uid, StealthOnMoveComponent component, ref MoveEvent args)
{ {
if (args.FromStateHandling) if (args.FromStateHandling)
return; return;
@@ -96,7 +97,13 @@ public abstract class SharedStealthSystem : EntitySystem
return; return;
var delta = component.MovementVisibilityRate * (args.NewPosition.Position - args.OldPosition.Position).Length; var delta = component.MovementVisibilityRate * (args.NewPosition.Position - args.OldPosition.Position).Length;
ModifyVisibility(uid, delta, component); ModifyVisibility(uid, delta);
}
private void OnGetVisibilityModifiers(EntityUid uid, StealthOnMoveComponent component, GetVisibilityModifiersEvent args)
{
var mod = args.SecondsSinceUpdate * component.PassiveVisibilityRate;
args.FlatModifier += mod;
} }
/// <summary> /// <summary>
@@ -150,6 +157,32 @@ public abstract class SharedStealthSystem : EntitySystem
return component.LastVisibility; return component.LastVisibility;
var deltaTime = _timing.CurTime - component.LastUpdated.Value; var deltaTime = _timing.CurTime - component.LastUpdated.Value;
return Math.Clamp(component.LastVisibility + (float) deltaTime.TotalSeconds * component.PassiveVisibilityRate, component.MinVisibility, component.MaxVisibility);
var ev = new GetVisibilityModifiersEvent(uid, component, (float) deltaTime.TotalSeconds, 0f);
RaiseLocalEvent(uid, ev, false);
return Math.Clamp(component.LastVisibility + ev.FlatModifier, component.MinVisibility, component.MaxVisibility);
}
/// <summary>
/// Used to run through any stealth effecting components on the entity.
/// <summary>
private sealed class GetVisibilityModifiersEvent : EntityEventArgs
{
public readonly StealthComponent Stealth = default!;
public readonly float SecondsSinceUpdate;
/// <summary>
/// Calculate this and add to it. Do not divide, multiply, or overwrite.
/// The sum will be added to the stealth component's visibility.
/// </summary>
public float FlatModifier;
public GetVisibilityModifiersEvent(EntityUid uid, StealthComponent stealth, float secondsSinceUpdate, float flatModifier)
{
Stealth = stealth;
SecondsSinceUpdate = secondsSinceUpdate;
FlatModifier = flatModifier;
}
} }
} }

View File

@@ -68,6 +68,7 @@
state: agentbox state: agentbox
state_open: cardboard_open state_open: cardboard_open
- type: Stealth - type: Stealth
- type: StealthOnMove
passiveVisibilityRate: -0.24 passiveVisibilityRate: -0.24
movementVisibilityRate: 0.10 movementVisibilityRate: 0.10
@@ -75,7 +76,7 @@
- type: entity - type: entity
id: GhostBox id: GhostBox
parent: StealthBox parent: StealthBox
suffix: suffix:
name: ghost box name: ghost box
description: Beware! description: Beware!
components: components: