Files
RobustToolbox/Robust.Shared/GameObjects/Systems/CollisionWakeSystem.cs
T
metalgearslothandGitHub 71c2993d20 Add joint support for CollisionWakeComponent (#1794)
* Add joint support for CollisionWakeComponent

* Less bad

* Fix heresy
2021-06-05 18:16:06 +10:00

64 lines
2.4 KiB
C#

using System.Linq;
using Robust.Shared.Physics;
namespace Robust.Shared.GameObjects
{
public sealed class CollisionWakeSystem : EntitySystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CollisionWakeComponent, EntityInitializedMessage>(HandleInitialize);
SubscribeLocalEvent<CollisionWakeComponent, PhysicsWakeMessage>(HandleWake);
SubscribeLocalEvent<CollisionWakeComponent, PhysicsSleepMessage>(HandleSleep);
SubscribeLocalEvent<CollisionWakeComponent, CollisionWakeStateMessage>(HandleCollisionWakeState);
SubscribeLocalEvent<CollisionWakeComponent, JointAddedEvent>(HandleJointAdd);
SubscribeLocalEvent<CollisionWakeComponent, JointRemovedEvent>(HandleJointRemove);
}
private void HandleInitialize(EntityUid uid, CollisionWakeComponent component, EntityInitializedMessage args)
{
component.RaiseStateChange();
}
private void HandleJointRemove(EntityUid uid, CollisionWakeComponent component, JointRemovedEvent args)
{
if (component.Owner.TryGetComponent(out PhysicsComponent? body) && body.Joints.Any()) return;
// Force an update
component.RaiseStateChange();
}
private void HandleJointAdd(EntityUid uid, CollisionWakeComponent component, JointAddedEvent args)
{
if (!ComponentManager.TryGetComponent(uid, out PhysicsComponent body)) return;
body.CanCollide = true;
}
private void HandleWake(EntityUid uid, CollisionWakeComponent component, PhysicsWakeMessage args)
{
if (!component.Enabled) return;
args.Body.CanCollide = true;
}
private void HandleSleep(EntityUid uid, CollisionWakeComponent component, PhysicsSleepMessage args)
{
if (!component.Enabled) return;
args.Body.CanCollide = false;
}
private void HandleCollisionWakeState(EntityUid uid, CollisionWakeComponent component, CollisionWakeStateMessage args)
{
if (!ComponentManager.TryGetComponent<PhysicsComponent>(uid, out var body)) return;
body.CanCollide = !component.Enabled || body.Awake || body.Joints.Any();
}
}
public sealed class CollisionWakeStateMessage : EntityEventArgs { }
}