]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Follower fixes (#15348)
authormetalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Sun, 23 Apr 2023 10:01:15 +0000 (20:01 +1000)
committerGitHub <noreply@github.com>
Sun, 23 Apr 2023 10:01:15 +0000 (20:01 +1000)
Content.Client/Eye/EyeLerpingSystem.cs
Content.Shared/Follower/Components/FollowedComponent.cs
Content.Shared/Follower/Components/FollowerComponent.cs
Content.Shared/Follower/FollowerSystem.cs
Content.Shared/Movement/Systems/SharedMoverController.Input.cs

index 8e9679afbd0dcf02175f41aba992671b976c49eb..8a5a6586aa14f36612cbc201e65e3723a137faa4 100644 (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));
index 63a71106bbdd63fa264a47c4685ff8d30822934b..259af7c4845d952ebd37d3b999abf5bbb7865393 100644 (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();
 }
index 040bab4df13cb74997a71ddf341ca484224fa49d..15d23a7037ddd4e041d85faeb148ab79e67db2c4 100644 (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;
 }
index 4e5f0931a77a6f7c2c1547e94ed0aac5d02d7bf7..1493ce444545accfe09f3cd6b5d7cc8745e83f5a 100644 (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>
index d1da217a3dce9c5914fa70b2e36f19799f429be4..186c4f8756b91e8e7aff00974fb119f0ecd11f7d 100644 (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.