2023-04-03 13:13:48 +12:00
|
|
|
using Content.Shared.DoAfter;
|
2022-10-16 06:00:04 +13:00
|
|
|
using Content.Shared.Ensnaring.Components;
|
2022-08-24 10:50:31 -04:00
|
|
|
using Content.Shared.Movement.Systems;
|
2022-10-16 06:00:04 +13:00
|
|
|
using Robust.Shared.GameStates;
|
2023-04-03 13:13:48 +12:00
|
|
|
using Robust.Shared.Serialization;
|
2022-08-24 10:50:31 -04:00
|
|
|
|
|
|
|
|
namespace Content.Shared.Ensnaring;
|
|
|
|
|
|
2023-04-03 13:13:48 +12:00
|
|
|
[Serializable, NetSerializable]
|
2023-08-22 18:14:33 -07:00
|
|
|
public sealed partial class EnsnareableDoAfterEvent : SimpleDoAfterEvent
|
2023-04-03 13:13:48 +12:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2022-08-24 10:50:31 -04:00
|
|
|
public abstract class SharedEnsnareableSystem : EntitySystem
|
|
|
|
|
{
|
|
|
|
|
[Dependency] private readonly MovementSpeedModifierSystem _speedModifier = default!;
|
2022-08-28 13:26:35 +10:00
|
|
|
[Dependency] protected readonly SharedAppearanceSystem Appearance = default!;
|
2022-08-24 10:50:31 -04:00
|
|
|
|
|
|
|
|
public override void Initialize()
|
|
|
|
|
{
|
|
|
|
|
base.Initialize();
|
|
|
|
|
|
2022-12-23 23:55:31 -05:00
|
|
|
SubscribeLocalEvent<EnsnareableComponent, RefreshMovementSpeedModifiersEvent>(MovementSpeedModify);
|
|
|
|
|
SubscribeLocalEvent<EnsnareableComponent, EnsnareEvent>(OnEnsnare);
|
|
|
|
|
SubscribeLocalEvent<EnsnareableComponent, EnsnareRemoveEvent>(OnEnsnareRemove);
|
|
|
|
|
SubscribeLocalEvent<EnsnareableComponent, EnsnaredChangedEvent>(OnEnsnareChange);
|
|
|
|
|
SubscribeLocalEvent<EnsnareableComponent, ComponentGetState>(OnGetState);
|
|
|
|
|
SubscribeLocalEvent<EnsnareableComponent, ComponentHandleState>(OnHandleState);
|
2022-10-16 06:00:04 +13:00
|
|
|
}
|
|
|
|
|
|
2022-12-23 23:55:31 -05:00
|
|
|
private void OnHandleState(EntityUid uid, EnsnareableComponent component, ref ComponentHandleState args)
|
2022-10-16 06:00:04 +13:00
|
|
|
{
|
|
|
|
|
if (args.Current is not EnsnareableComponentState state)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (state.IsEnsnared == component.IsEnsnared)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
component.IsEnsnared = state.IsEnsnared;
|
|
|
|
|
RaiseLocalEvent(uid, new EnsnaredChangedEvent(component.IsEnsnared));
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-23 23:55:31 -05:00
|
|
|
private void OnGetState(EntityUid uid, EnsnareableComponent component, ref ComponentGetState args)
|
2022-10-16 06:00:04 +13:00
|
|
|
{
|
|
|
|
|
args.State = new EnsnareableComponentState(component.IsEnsnared);
|
2022-08-24 10:50:31 -04:00
|
|
|
}
|
|
|
|
|
|
2022-12-23 23:55:31 -05:00
|
|
|
private void OnEnsnare(EntityUid uid, EnsnareableComponent component, EnsnareEvent args)
|
2022-08-24 10:50:31 -04:00
|
|
|
{
|
2023-05-22 17:49:37 -04:00
|
|
|
component.WalkSpeed *= args.WalkSpeed;
|
|
|
|
|
component.SprintSpeed *= args.SprintSpeed;
|
2022-08-24 10:50:31 -04:00
|
|
|
|
|
|
|
|
_speedModifier.RefreshMovementSpeedModifiers(uid);
|
|
|
|
|
|
|
|
|
|
var ev = new EnsnaredChangedEvent(component.IsEnsnared);
|
2022-08-28 13:26:35 +10:00
|
|
|
RaiseLocalEvent(uid, ev);
|
2022-08-24 10:50:31 -04:00
|
|
|
}
|
|
|
|
|
|
2022-12-23 23:55:31 -05:00
|
|
|
private void OnEnsnareRemove(EntityUid uid, EnsnareableComponent component, EnsnareRemoveEvent args)
|
2022-08-24 10:50:31 -04:00
|
|
|
{
|
2023-05-22 17:49:37 -04:00
|
|
|
component.WalkSpeed /= args.WalkSpeed;
|
|
|
|
|
component.SprintSpeed /= args.SprintSpeed;
|
|
|
|
|
|
2022-08-24 10:50:31 -04:00
|
|
|
_speedModifier.RefreshMovementSpeedModifiers(uid);
|
|
|
|
|
|
|
|
|
|
var ev = new EnsnaredChangedEvent(component.IsEnsnared);
|
2022-08-28 13:26:35 +10:00
|
|
|
RaiseLocalEvent(uid, ev);
|
2022-08-24 10:50:31 -04:00
|
|
|
}
|
|
|
|
|
|
2022-12-23 23:55:31 -05:00
|
|
|
private void OnEnsnareChange(EntityUid uid, EnsnareableComponent component, EnsnaredChangedEvent args)
|
2022-08-24 10:50:31 -04:00
|
|
|
{
|
|
|
|
|
UpdateAppearance(uid, component);
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-23 23:55:31 -05:00
|
|
|
private void UpdateAppearance(EntityUid uid, EnsnareableComponent component, AppearanceComponent? appearance = null)
|
2022-08-24 10:50:31 -04:00
|
|
|
{
|
2022-08-28 13:26:35 +10:00
|
|
|
Appearance.SetData(uid, EnsnareableVisuals.IsEnsnared, component.IsEnsnared, appearance);
|
2022-08-24 10:50:31 -04:00
|
|
|
}
|
|
|
|
|
|
2023-04-03 13:13:48 +12:00
|
|
|
private void MovementSpeedModify(EntityUid uid, EnsnareableComponent component,
|
|
|
|
|
RefreshMovementSpeedModifiersEvent args)
|
2022-08-24 10:50:31 -04:00
|
|
|
{
|
|
|
|
|
if (!component.IsEnsnared)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
args.ModifySpeed(component.WalkSpeed, component.SprintSpeed);
|
|
|
|
|
}
|
|
|
|
|
}
|