]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Cleanup more follower leaks (#20902)
authormetalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Sat, 14 Oct 2023 18:02:36 +0000 (05:02 +1100)
committerGitHub <noreply@github.com>
Sat, 14 Oct 2023 18:02:36 +0000 (14:02 -0400)
* Cleanup more follower leaks

Rather than check stop everywhere we'll just check it on start and cleanup the old following. If someone were already following and followed something new the FollowedComponent would never get cleaned up and would never have its ref to the entity removed.

* Don't cause archetype changes

Content.Shared/Follower/FollowerSystem.cs

index 38c0e5ada3f52b019f0e65049c7ee89a214f5782..e4a0488dfb5b6fbbe559b022f7e20063ea446eff 100644 (file)
@@ -138,7 +138,20 @@ public sealed class FollowerSystem : EntitySystem
             targetXform = Transform(targetXform.ParentUid);
         }
 
-        var followerComp = EnsureComp<FollowerComponent>(follower);
+        // Cleanup old following.
+        if (TryComp<FollowerComponent>(follower, out var followerComp))
+        {
+            // Already following you goob
+            if (followerComp.Following == entity)
+                return;
+
+            StopFollowingEntity(follower, followerComp.Following, deparent: false, removeComp: false);
+        }
+        else
+        {
+            followerComp = AddComp<FollowerComponent>(follower);
+        }
+        
         followerComp.Following = entity;
 
         var followedComp = EnsureComp<FollowedComponent>(entity);
@@ -167,14 +180,14 @@ public sealed class FollowerSystem : EntitySystem
 
         RaiseLocalEvent(follower, followerEv);
         RaiseLocalEvent(entity, entityEv);
-        Dirty(followedComp);
+        Dirty(entity, followedComp);
     }
 
     /// <summary>
     ///     Forces an entity to stop following another entity, if it is doing so.
     /// </summary>
     /// <param name="deparent">Should the entity deparent itself</param>
-    public void StopFollowingEntity(EntityUid uid, EntityUid target, FollowedComponent? followed = null, bool deparent = true)
+    public void StopFollowingEntity(EntityUid uid, EntityUid target, FollowedComponent? followed = null, bool deparent = true, bool removeComp = true)
     {
         if (!Resolve(target, ref followed, false))
             return;
@@ -186,8 +199,12 @@ public sealed class FollowerSystem : EntitySystem
         if (followed.Following.Count == 0)
             RemComp<FollowedComponent>(target);
 
-        RemComp<FollowerComponent>(uid);
-        RemComp<OrbitVisualsComponent>(uid);
+        if (removeComp)
+        {
+            RemComp<FollowerComponent>(uid);
+            RemComp<OrbitVisualsComponent>(uid);
+        }
+
         var uidEv = new StoppedFollowingEntityEvent(target, uid);
         var targetEv = new EntityStoppedFollowingEvent(target, uid);