Follower fixes (#15348)

This commit is contained in:
metalgearsloth
2023-04-23 20:01:15 +10:00
committed by GitHub
parent 06d99b4cb7
commit 7e886dc95a
5 changed files with 36 additions and 11 deletions

View File

@@ -1,3 +1,4 @@
using Content.Shared.Follower.Components;
using Content.Shared.Movement.Components;
using Content.Shared.Movement.Systems;
using Robust.Client.GameObjects;
@@ -25,8 +26,9 @@ public sealed class EyeLerpingSystem : EntitySystem
SubscribeLocalEvent<EyeComponent, ComponentStartup>(OnEyeStartup);
SubscribeLocalEvent<EyeComponent, ComponentShutdown>(OnEyeShutdown);
SubscribeLocalEvent<LerpingEyeComponent, EntParentChangedMessage>(HandleMapChange);
SubscribeLocalEvent<EyeComponent, PlayerAttachedEvent>(OnAttached);
SubscribeLocalEvent<LerpingEyeComponent, EntParentChangedMessage>(HandleMapChange);
SubscribeLocalEvent<LerpingEyeComponent, PlayerDetachedEvent>(OnDetached);
UpdatesAfter.Add(typeof(TransformSystem));

View File

@@ -7,8 +7,9 @@ namespace Content.Shared.Follower.Components;
/// Attached to entities that are currently being followed by a ghost.
/// </summary>
[RegisterComponent, Access(typeof(FollowerSystem))]
[NetworkedComponent]
public sealed class FollowedComponent : Component
[NetworkedComponent, AutoGenerateComponentState]
public sealed partial class FollowedComponent : Component
{
[AutoNetworkedField(true), DataField("following")]
public HashSet<EntityUid> Following = new();
}

View File

@@ -4,8 +4,9 @@ namespace Content.Shared.Follower.Components;
[RegisterComponent]
[Access(typeof(FollowerSystem))]
[NetworkedComponent]
public sealed class FollowerComponent : Component
[NetworkedComponent, AutoGenerateComponentState]
public sealed partial class FollowerComponent : Component
{
[AutoNetworkedField, DataField("following")]
public EntityUid Following;
}

View File

@@ -2,6 +2,7 @@ using Content.Shared.Database;
using Content.Shared.Follower.Components;
using Content.Shared.Ghost;
using Content.Shared.Movement.Events;
using Content.Shared.Movement.Systems;
using Content.Shared.Verbs;
using Robust.Shared.Map;
using Robust.Shared.Utility;
@@ -71,12 +72,12 @@ public sealed class FollowerSystem : EntitySystem
followerComp.Following = entity;
var followedComp = EnsureComp<FollowedComponent>(entity);
followedComp.Following.Add(follower);
if (!followedComp.Following.Add(follower))
return;
var xform = Transform(follower);
_transform.SetParent(follower, xform, entity);
xform.LocalPosition = Vector2.Zero;
xform.LocalRotation = Angle.Zero;
_transform.SetCoordinates(follower, xform, new EntityCoordinates(entity, Vector2.Zero), Angle.Zero);
EnsureComp<OrbitVisualsComponent>(follower);
@@ -85,6 +86,7 @@ public sealed class FollowerSystem : EntitySystem
RaiseLocalEvent(follower, followerEv, true);
RaiseLocalEvent(entity, entityEv, false);
Dirty(followedComp);
}
/// <summary>
@@ -105,10 +107,10 @@ public sealed class FollowerSystem : EntitySystem
RemComp<FollowerComponent>(uid);
var xform = Transform(uid);
xform.AttachToGridOrMap();
_transform.AttachToGridOrMap(uid, xform);
if (xform.MapID == MapId.Nullspace)
{
Del(uid);
QueueDel(uid);
return;
}
@@ -119,6 +121,7 @@ public sealed class FollowerSystem : EntitySystem
RaiseLocalEvent(uid, uidEv, true);
RaiseLocalEvent(target, targetEv, false);
Dirty(followed);
}
/// <summary>

View File

@@ -1,4 +1,5 @@
using Content.Shared.CCVar;
using Content.Shared.Follower.Components;
using Content.Shared.Input;
using Content.Shared.Movement.Components;
using Content.Shared.Movement.Events;
@@ -51,6 +52,8 @@ namespace Content.Shared.Movement.Systems
SubscribeLocalEvent<InputMoverComponent, ComponentHandleState>(OnInputHandleState);
SubscribeLocalEvent<InputMoverComponent, EntParentChangedMessage>(OnInputParentChange);
SubscribeLocalEvent<FollowedComponent, EntParentChangedMessage>(OnFollowedParentChange);
_configManager.OnValueChanged(CCVars.CameraRotationLocked, SetCameraRotationLocked, true);
_configManager.OnValueChanged(CCVars.GameDiagonalMovement, SetDiagonalMovement, true);
}
@@ -145,6 +148,21 @@ namespace Content.Shared.Movement.Systems
return rotation;
}
private void OnFollowedParentChange(EntityUid uid, FollowedComponent component, ref EntParentChangedMessage args)
{
var moverQuery = GetEntityQuery<InputMoverComponent>();
var xformQuery = GetEntityQuery<TransformComponent>();
foreach (var foll in component.Following)
{
if (!moverQuery.TryGetComponent(foll, out var mover))
continue;
var ev = new EntParentChangedMessage(foll, null, args.OldMapId, xformQuery.GetComponent(foll));
OnInputParentChange(foll, mover, ref ev);
}
}
private void OnInputParentChange(EntityUid uid, InputMoverComponent component, ref EntParentChangedMessage args)
{
// If we change our grid / map then delay updating our LastGridAngle.