Refactors stunnable to be ECS. (#4819)

Also cleans up StandingStatesystem.
This commit is contained in:
Vera Aguilera Puerto
2021-10-10 12:47:26 +02:00
committed by GitHub
parent 19a588a70a
commit 6eee256b11
34 changed files with 776 additions and 633 deletions

View File

@@ -1,92 +1,117 @@
using System;
using Content.Shared.Audio;
using Content.Shared.Hands;
using Content.Shared.Hands.Components;
using Content.Shared.Rotation;
using Robust.Shared.Audio;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Player;
namespace Content.Shared.Standing
{
public sealed class StandingStateSystem : EntitySystem
{
[Dependency] private readonly SharedHandsSystem _sharedHandsSystem = default!;
[Obsolete("Use the EntityUid overloads instead.")]
public bool IsDown(IEntity entity)
{
if (entity.TryGetComponent(out StandingStateComponent? standingState) &&
standingState.Standing) return true;
return false;
return IsDown(entity.Uid);
}
public bool IsDown(EntityUid uid, StandingStateComponent? standingState = null)
{
if (!Resolve(uid, ref standingState, false))
return false;
return !standingState.Standing;
}
[Obsolete("Use the EntityUid overloads instead.")]
public void Down(IEntity entity, bool playSound = true, bool dropHeldItems = true)
{
if (!entity.TryGetComponent(out StandingStateComponent? comp)) return;
Down(comp, playSound, dropHeldItems);
Down(entity.Uid, playSound, dropHeldItems);
}
public void Stand(IEntity entity)
public bool Down(EntityUid uid, bool playSound = true, bool dropHeldItems = true,
StandingStateComponent? standingState = null,
SharedAppearanceComponent? appearance = null,
SharedHandsComponent? hands = null)
{
if (!entity.TryGetComponent(out StandingStateComponent? comp)) return;
Stand(comp);
}
// TODO: This should actually log missing comps...
if (!Resolve(uid, ref standingState, false))
return false;
public void Down(StandingStateComponent component, bool playSound = true, bool dropHeldItems = true)
{
if (!component.Standing) return;
// Optional component.
Resolve(uid, ref appearance, ref hands, false);
var entity = component.Owner;
var uid = entity.Uid;
if (!standingState.Standing)
return true;
// This is just to avoid most callers doing this manually saving boilerplate
// 99% of the time you'll want to drop items but in some scenarios (e.g. buckling) you don't want to.
// We do this BEFORE downing because something like buckle may be blocking downing but we want to drop hand items anyway
// and ultimately this is just to avoid boilerplate in Down callers + keep their behavior consistent.
if (dropHeldItems)
if (dropHeldItems && hands != null)
{
Get<SharedHandsSystem>().DropHandItems(entity, false);
_sharedHandsSystem.DropHandItems(uid, false, hands);
}
var msg = new DownAttemptEvent();
EntityManager.EventBus.RaiseLocalEvent(uid, msg);
RaiseLocalEvent(uid, msg, false);
if (msg.Cancelled) return;
if (msg.Cancelled)
return false;
component.Standing = false;
component.Dirty();
EntityManager.EventBus.RaiseLocalEvent(uid, new DownedEvent());
standingState.Standing = false;
standingState.Dirty();
RaiseLocalEvent(uid, new DownedEvent(), false);
// Seemed like the best place to put it
if (entity.TryGetComponent(out SharedAppearanceComponent? appearance))
{
appearance.SetData(RotationVisuals.RotationState, RotationState.Horizontal);
}
appearance?.SetData(RotationVisuals.RotationState, RotationState.Horizontal);
// Currently shit is only downed by server but when it's predicted we can probably only play this on server / client
if (playSound)
{
SoundSystem.Play(Filter.Pvs(entity), component.DownSoundCollection.GetSound(), entity, AudioHelpers.WithVariation(0.25f));
SoundSystem.Play(Filter.Pvs(uid), standingState.DownSoundCollection.GetSound(), uid, AudioHelpers.WithVariation(0.25f));
}
return true;
}
public void Stand(StandingStateComponent component)
[Obsolete("Use the EntityUid overloads instead.")]
public void Stand(IEntity entity)
{
if (component.Standing) return;
Stand(entity.Uid);
}
var entity = component.Owner;
var uid = entity.Uid;
public bool Stand(EntityUid uid,
StandingStateComponent? standingState = null,
SharedAppearanceComponent? appearance = null)
{
// TODO: This should actually log missing comps...
if (!Resolve(uid, ref standingState, false))
return false;
// Optional component.
Resolve(uid, ref appearance, false);
if (standingState.Standing)
return true;
var msg = new StandAttemptEvent();
EntityManager.EventBus.RaiseLocalEvent(uid, msg);
RaiseLocalEvent(uid, msg, false);
if (msg.Cancelled) return;
if (msg.Cancelled)
return false;
component.Standing = true;
component.Dirty();
EntityManager.EventBus.RaiseLocalEvent(uid, new StoodEvent());
standingState.Standing = true;
standingState.Dirty();
RaiseLocalEvent(uid, new StoodEvent(), false);
if (entity.TryGetComponent(out SharedAppearanceComponent? appearance))
{
appearance.SetData(RotationVisuals.RotationState, RotationState.Vertical);
}
appearance?.SetData(RotationVisuals.RotationState, RotationState.Vertical);
return true;
}
}