Files
tbd-station-14/Content.Shared/Ensnaring/SharedEnsnareableSystem.cs
Leon Friedrich 19277a2276 More DoAfter Changes (#14609)
* DoAfters

* Compact Clone()

* Fix mice and cuffables

* Try generalize attempt events

* moves climbabledoafter event to shared, fixes issue with climbable target

* Fix merge (cuffing)

* Make all events netserializable

* handful of doafter events moved

* moves the rest of the events to their respective shared folders

* Changes all mentions of server doafter to shared

* stop stripping cancellation

* fix merge errors

* draw paused doafters

* handle unpausing

* missing netserializable ref

* removes break on stun reference

* removes cuffing state reference

* Fix tools

* Fix door prying.

* Fix construction

* Fix dumping

* Fix wielding assert

* fix rev

* Fix test

* more test fixes

---------

Co-authored-by: keronshb <keronshb@live.com>
2023-04-02 21:13:48 -04:00

86 lines
3.0 KiB
C#

using Content.Shared.DoAfter;
using Content.Shared.Ensnaring.Components;
using Content.Shared.Movement.Systems;
using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
namespace Content.Shared.Ensnaring;
[Serializable, NetSerializable]
public sealed class EnsnareableDoAfterEvent : SimpleDoAfterEvent
{
}
public abstract class SharedEnsnareableSystem : EntitySystem
{
[Dependency] private readonly MovementSpeedModifierSystem _speedModifier = default!;
[Dependency] protected readonly SharedAppearanceSystem Appearance = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<EnsnareableComponent, RefreshMovementSpeedModifiersEvent>(MovementSpeedModify);
SubscribeLocalEvent<EnsnareableComponent, EnsnareEvent>(OnEnsnare);
SubscribeLocalEvent<EnsnareableComponent, EnsnareRemoveEvent>(OnEnsnareRemove);
SubscribeLocalEvent<EnsnareableComponent, EnsnaredChangedEvent>(OnEnsnareChange);
SubscribeLocalEvent<EnsnareableComponent, ComponentGetState>(OnGetState);
SubscribeLocalEvent<EnsnareableComponent, ComponentHandleState>(OnHandleState);
}
private void OnHandleState(EntityUid uid, EnsnareableComponent component, ref ComponentHandleState args)
{
if (args.Current is not EnsnareableComponentState state)
return;
if (state.IsEnsnared == component.IsEnsnared)
return;
component.IsEnsnared = state.IsEnsnared;
RaiseLocalEvent(uid, new EnsnaredChangedEvent(component.IsEnsnared));
}
private void OnGetState(EntityUid uid, EnsnareableComponent component, ref ComponentGetState args)
{
args.State = new EnsnareableComponentState(component.IsEnsnared);
}
private void OnEnsnare(EntityUid uid, EnsnareableComponent component, EnsnareEvent args)
{
component.WalkSpeed = args.WalkSpeed;
component.SprintSpeed = args.SprintSpeed;
_speedModifier.RefreshMovementSpeedModifiers(uid);
var ev = new EnsnaredChangedEvent(component.IsEnsnared);
RaiseLocalEvent(uid, ev);
}
private void OnEnsnareRemove(EntityUid uid, EnsnareableComponent component, EnsnareRemoveEvent args)
{
_speedModifier.RefreshMovementSpeedModifiers(uid);
var ev = new EnsnaredChangedEvent(component.IsEnsnared);
RaiseLocalEvent(uid, ev);
}
private void OnEnsnareChange(EntityUid uid, EnsnareableComponent component, EnsnaredChangedEvent args)
{
UpdateAppearance(uid, component);
}
private void UpdateAppearance(EntityUid uid, EnsnareableComponent component, AppearanceComponent? appearance = null)
{
Appearance.SetData(uid, EnsnareableVisuals.IsEnsnared, component.IsEnsnared, appearance);
}
private void MovementSpeedModify(EntityUid uid, EnsnareableComponent component,
RefreshMovementSpeedModifiersEvent args)
{
if (!component.IsEnsnared)
return;
args.ModifySpeed(component.WalkSpeed, component.SprintSpeed);
}
}