Fix followers getting sent to nullspace when target is polymorphed (#33878)
* Add an event for polymorph actions * Subscribe FollowerSystem to the event * Add check that unfollow target is actually current target. * Make followers try to follow on state update; Dirty follower on follow.
This commit is contained in:
@@ -6,6 +6,7 @@ using Content.Shared.Ghost;
|
||||
using Content.Shared.Hands;
|
||||
using Content.Shared.Movement.Events;
|
||||
using Content.Shared.Movement.Pulling.Events;
|
||||
using Content.Shared.Polymorph;
|
||||
using Content.Shared.Tag;
|
||||
using Content.Shared.Verbs;
|
||||
using Robust.Shared.Containers;
|
||||
@@ -38,10 +39,12 @@ public sealed class FollowerSystem : EntitySystem
|
||||
SubscribeLocalEvent<FollowerComponent, MoveInputEvent>(OnFollowerMove);
|
||||
SubscribeLocalEvent<FollowerComponent, PullStartedMessage>(OnPullStarted);
|
||||
SubscribeLocalEvent<FollowerComponent, EntityTerminatingEvent>(OnFollowerTerminating);
|
||||
SubscribeLocalEvent<FollowerComponent, AfterAutoHandleStateEvent>(OnAfterHandleState);
|
||||
|
||||
SubscribeLocalEvent<FollowedComponent, ComponentGetStateAttemptEvent>(OnFollowedAttempt);
|
||||
SubscribeLocalEvent<FollowerComponent, GotEquippedHandEvent>(OnGotEquippedHand);
|
||||
SubscribeLocalEvent<FollowedComponent, EntityTerminatingEvent>(OnFollowedTerminating);
|
||||
SubscribeLocalEvent<FollowedComponent, PolymorphedEvent>(OnFollowedPolymorphed);
|
||||
SubscribeLocalEvent<BeforeSaveEvent>(OnBeforeSave);
|
||||
}
|
||||
|
||||
@@ -135,6 +138,11 @@ public sealed class FollowerSystem : EntitySystem
|
||||
StopFollowingEntity(uid, component.Following, deparent: false);
|
||||
}
|
||||
|
||||
private void OnAfterHandleState(Entity<FollowerComponent> entity, ref AfterAutoHandleStateEvent args)
|
||||
{
|
||||
StartFollowingEntity(entity, entity.Comp.Following);
|
||||
}
|
||||
|
||||
// Since we parent our observer to the followed entity, we need to detach
|
||||
// before they get deleted so that we don't get recursively deleted too.
|
||||
private void OnFollowedTerminating(EntityUid uid, FollowedComponent component, ref EntityTerminatingEvent args)
|
||||
@@ -142,6 +150,15 @@ public sealed class FollowerSystem : EntitySystem
|
||||
StopAllFollowers(uid, component);
|
||||
}
|
||||
|
||||
private void OnFollowedPolymorphed(Entity<FollowedComponent> entity, ref PolymorphedEvent args)
|
||||
{
|
||||
foreach (var follower in entity.Comp.Following)
|
||||
{
|
||||
// Stop following the target's old entity and start following the new one
|
||||
StartFollowingEntity(follower, args.NewEntity);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Makes an entity follow another entity, by parenting to it.
|
||||
/// </summary>
|
||||
@@ -202,6 +219,7 @@ public sealed class FollowerSystem : EntitySystem
|
||||
RaiseLocalEvent(follower, followerEv);
|
||||
RaiseLocalEvent(entity, entityEv);
|
||||
Dirty(entity, followedComp);
|
||||
Dirty(follower, followerComp);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -213,7 +231,7 @@ public sealed class FollowerSystem : EntitySystem
|
||||
if (!Resolve(target, ref followed, false))
|
||||
return;
|
||||
|
||||
if (!HasComp<FollowerComponent>(uid))
|
||||
if (!TryComp<FollowerComponent>(uid, out var followerComp) || followerComp.Following != target)
|
||||
return;
|
||||
|
||||
followed.Following.Remove(uid);
|
||||
|
||||
Reference in New Issue
Block a user