Fix RotateWhilePulling not working (#29032)

This commit is contained in:
Leon Friedrich
2024-06-16 23:30:35 +12:00
committed by GitHub
parent ac979640bf
commit f121946b12
5 changed files with 29 additions and 36 deletions

View File

@@ -1,13 +0,0 @@
namespace Content.Server.Movement.Components;
/// <summary>
/// Added to an entity that is ctrl-click moving their pulled object.
/// </summary>
/// <remarks>
/// This just exists so we don't have MoveEvent subs going off for every single mob constantly.
/// </remarks>
[RegisterComponent]
public sealed partial class PullMoverComponent : Component
{
}

View File

@@ -18,6 +18,7 @@ using Robust.Shared.Physics.Controllers;
using Robust.Shared.Physics.Dynamics.Joints; using Robust.Shared.Physics.Dynamics.Joints;
using Robust.Shared.Player; using Robust.Shared.Player;
using Robust.Shared.Timing; using Robust.Shared.Timing;
using Robust.Shared.Utility;
namespace Content.Server.Movement.Systems; namespace Content.Server.Movement.Systems;
@@ -91,7 +92,7 @@ public sealed class PullController : VirtualController
UpdatesAfter.Add(typeof(MoverController)); UpdatesAfter.Add(typeof(MoverController));
SubscribeLocalEvent<PullMovingComponent, PullStoppedMessage>(OnPullStop); SubscribeLocalEvent<PullMovingComponent, PullStoppedMessage>(OnPullStop);
SubscribeLocalEvent<PullMoverComponent, MoveEvent>(OnPullerMove); SubscribeLocalEvent<ActivePullerComponent, MoveEvent>(OnPullerMove);
base.Initialize(); base.Initialize();
} }
@@ -155,19 +156,22 @@ public sealed class PullController : VirtualController
coords = fromUserCoords.WithEntityId(coords.EntityId); coords = fromUserCoords.WithEntityId(coords.EntityId);
} }
EnsureComp<PullMoverComponent>(player);
var moving = EnsureComp<PullMovingComponent>(pulled!.Value); var moving = EnsureComp<PullMovingComponent>(pulled!.Value);
moving.MovingTo = coords; moving.MovingTo = coords;
return false; return false;
} }
private void OnPullerMove(EntityUid uid, PullMoverComponent component, ref MoveEvent args) private void OnPullerMove(EntityUid uid, ActivePullerComponent component, ref MoveEvent args)
{ {
if (!_pullerQuery.TryComp(uid, out var puller)) if (!_pullerQuery.TryComp(uid, out var puller))
return; return;
if (puller.Pulling is not { } pullable) if (puller.Pulling is not { } pullable)
{
DebugTools.Assert($"Failed to clean up puller: {ToPrettyString(uid)}");
RemCompDeferred(uid, component);
return; return;
}
UpdatePulledRotation(uid, pullable); UpdatePulledRotation(uid, pullable);
@@ -182,13 +186,7 @@ public sealed class PullController : VirtualController
if (_physicsQuery.TryComp(uid, out var physics)) if (_physicsQuery.TryComp(uid, out var physics))
PhysicsSystem.WakeBody(uid, body: physics); PhysicsSystem.WakeBody(uid, body: physics);
StopMove(uid, pullable); RemCompDeferred<PullMovingComponent>(pullable);
}
private void StopMove(Entity<PullMoverComponent?> mover, Entity<PullMovingComponent?> moving)
{
RemCompDeferred<PullMoverComponent>(mover.Owner);
RemCompDeferred<PullMovingComponent>(moving.Owner);
} }
private void UpdatePulledRotation(EntityUid puller, EntityUid pulled) private void UpdatePulledRotation(EntityUid puller, EntityUid pulled)
@@ -302,17 +300,5 @@ public sealed class PullController : VirtualController
PhysicsSystem.ApplyLinearImpulse(puller, -impulse); PhysicsSystem.ApplyLinearImpulse(puller, -impulse);
} }
} }
// Cleanup PullMover
var moverQuery = EntityQueryEnumerator<PullMoverComponent, PullerComponent>();
while (moverQuery.MoveNext(out var uid, out _, out var puller))
{
if (!HasComp<PullMovingComponent>(puller.Pulling))
{
RemCompDeferred<PullMoverComponent>(uid);
continue;
}
}
} }
} }

View File

@@ -0,0 +1,7 @@
namespace Content.Shared.Movement.Pulling.Components;
/// <summary>
/// Component that indicates that an entity is currently pulling some other entity.
/// </summary>
[RegisterComponent]
public sealed partial class ActivePullerComponent : Component;

View File

@@ -9,7 +9,7 @@ namespace Content.Shared.Movement.Pulling.Components;
/// <summary> /// <summary>
/// Specifies an entity as being able to pull another entity with <see cref="PullableComponent"/> /// Specifies an entity as being able to pull another entity with <see cref="PullableComponent"/>
/// </summary> /// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] [RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)]
[Access(typeof(PullingSystem))] [Access(typeof(PullingSystem))]
public sealed partial class PullerComponent : Component public sealed partial class PullerComponent : Component
{ {

View File

@@ -61,6 +61,7 @@ public sealed class PullingSystem : EntitySystem
SubscribeLocalEvent<PullableComponent, EntGotInsertedIntoContainerMessage>(OnPullableContainerInsert); SubscribeLocalEvent<PullableComponent, EntGotInsertedIntoContainerMessage>(OnPullableContainerInsert);
SubscribeLocalEvent<PullableComponent, ModifyUncuffDurationEvent>(OnModifyUncuffDuration); SubscribeLocalEvent<PullableComponent, ModifyUncuffDurationEvent>(OnModifyUncuffDuration);
SubscribeLocalEvent<PullerComponent, AfterAutoHandleStateEvent>(OnAfterState);
SubscribeLocalEvent<PullerComponent, EntGotInsertedIntoContainerMessage>(OnPullerContainerInsert); SubscribeLocalEvent<PullerComponent, EntGotInsertedIntoContainerMessage>(OnPullerContainerInsert);
SubscribeLocalEvent<PullerComponent, EntityUnpausedEvent>(OnPullerUnpaused); SubscribeLocalEvent<PullerComponent, EntityUnpausedEvent>(OnPullerUnpaused);
SubscribeLocalEvent<PullerComponent, VirtualItemDeletedEvent>(OnVirtualItemDeleted); SubscribeLocalEvent<PullerComponent, VirtualItemDeletedEvent>(OnVirtualItemDeleted);
@@ -72,6 +73,14 @@ public sealed class PullingSystem : EntitySystem
.Register<PullingSystem>(); .Register<PullingSystem>();
} }
private void OnAfterState(Entity<PullerComponent> ent, ref AfterAutoHandleStateEvent args)
{
if (ent.Comp.Pulling == null)
RemComp<ActivePullerComponent>(ent.Owner);
else
EnsureComp<ActivePullerComponent>(ent.Owner);
}
private void OnDropHandItems(EntityUid uid, PullerComponent pullerComp, DropHandItemsEvent args) private void OnDropHandItems(EntityUid uid, PullerComponent pullerComp, DropHandItemsEvent args)
{ {
if (pullerComp.Pulling == null || pullerComp.NeedsHands) if (pullerComp.Pulling == null || pullerComp.NeedsHands)
@@ -228,6 +237,9 @@ public sealed class PullingSystem : EntitySystem
} }
var oldPuller = pullableComp.Puller; var oldPuller = pullableComp.Puller;
if (oldPuller != null)
RemComp<ActivePullerComponent>(oldPuller.Value);
pullableComp.PullJointId = null; pullableComp.PullJointId = null;
pullableComp.Puller = null; pullableComp.Puller = null;
Dirty(pullableUid, pullableComp); Dirty(pullableUid, pullableComp);
@@ -410,6 +422,7 @@ public sealed class PullingSystem : EntitySystem
// Use net entity so it's consistent across client and server. // Use net entity so it's consistent across client and server.
pullableComp.PullJointId = $"pull-joint-{GetNetEntity(pullableUid)}"; pullableComp.PullJointId = $"pull-joint-{GetNetEntity(pullableUid)}";
EnsureComp<ActivePullerComponent>(pullerUid);
pullerComp.Pulling = pullableUid; pullerComp.Pulling = pullableUid;
pullableComp.Puller = pullerUid; pullableComp.Puller = pullerUid;