]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix non-ghosts and admins counting toward most followed (#28120)
authorTayrtahn <tayrtahn@gmail.com>
Mon, 20 May 2024 14:12:05 +0000 (10:12 -0400)
committerGitHub <noreply@github.com>
Mon, 20 May 2024 14:12:05 +0000 (07:12 -0700)
* Fixed non-ghosts and admins counting toward most followed

* Redone to better leverage EntityQueryEnumerator

* Remember to test your code before you commit it, kids

* Review revisions

* Update Content.Shared/Follower/FollowerSystem.cs

Co-authored-by: ShadowCommander <shadowjjt@gmail.com>
* Update Content.Shared/Follower/FollowerSystem.cs

Co-authored-by: ShadowCommander <shadowjjt@gmail.com>
* Update Content.Shared/Follower/FollowerSystem.cs

* Clean up

---------

Co-authored-by: ShadowCommander <shadowjjt@gmail.com>
Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com>
Content.Server/Ghost/GhostSystem.cs
Content.Shared/Follower/FollowerSystem.cs

index 6c3d69fea7f1a18d57bf1289450837c159d7b0c5..1a411f13a05f1a5b3994ae3ddaf58acf2bb621bd 100644 (file)
@@ -306,7 +306,7 @@ namespace Content.Server.Ghost
                 return;
             }
 
-            if (_followerSystem.GetMostFollowed() is not {} target)
+            if (_followerSystem.GetMostGhostFollowed() is not {} target)
                 return;
 
             WarpTo(uid, target);
index 6c02b130762fc4ed82e0e9675afa56cb3b3d0cda..8027ee449c4a350abc24d162f7a5e34be6dde381 100644 (file)
@@ -1,11 +1,11 @@
 using System.Numerics;
+using Content.Shared.Administration.Managers;
 using Content.Shared.Database;
 using Content.Shared.Follower.Components;
 using Content.Shared.Ghost;
 using Content.Shared.Hands;
 using Content.Shared.Movement.Events;
 using Content.Shared.Movement.Pulling.Events;
-using Content.Shared.Movement.Systems;
 using Content.Shared.Tag;
 using Content.Shared.Verbs;
 using Robust.Shared.Containers;
@@ -14,6 +14,7 @@ using Robust.Shared.Map.Events;
 using Robust.Shared.Network;
 using Robust.Shared.Physics;
 using Robust.Shared.Physics.Systems;
+using Robust.Shared.Player;
 using Robust.Shared.Utility;
 
 namespace Content.Shared.Follower;
@@ -26,6 +27,7 @@ public sealed class FollowerSystem : EntitySystem
     [Dependency] private readonly SharedJointSystem _jointSystem = default!;
     [Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!;
     [Dependency] private readonly INetManager _netMan = default!;
+    [Dependency] private readonly ISharedAdminManager _adminManager = default!;
 
     public override void Initialize()
     {
@@ -249,20 +251,33 @@ public sealed class FollowerSystem : EntitySystem
     }
 
     /// <summary>
-    /// Get the most followed entity.
+    /// Gets the entity with the most non-admin ghosts following it.
     /// </summary>
-    public EntityUid? GetMostFollowed()
+    public EntityUid? GetMostGhostFollowed()
     {
         EntityUid? picked = null;
-        int most = 0;
-        var query = EntityQueryEnumerator<FollowedComponent>();
-        while (query.MoveNext(out var uid, out var comp))
+        var most = 0;
+
+        // Keep a tally of how many ghosts are following each entity
+        var followedEnts = new Dictionary<EntityUid, int>();
+
+        // Look for followers that are ghosts and are player controlled
+        var query = EntityQueryEnumerator<FollowerComponent, GhostComponent, ActorComponent>();
+        while (query.MoveNext(out _, out var follower, out _, out var actor))
         {
-            var count = comp.Following.Count;
-            if (count > most)
+            // Exclude admins
+            if (_adminManager.IsAdmin(actor.PlayerSession))
+                continue;
+
+            var followed = follower.Following;
+            // Add new entry or increment existing
+            followedEnts.TryGetValue(followed, out var currentValue);
+            followedEnts[followed] = currentValue + 1;
+
+            if (followedEnts[followed] > most)
             {
-                picked = uid;
-                most = count;
+                picked = followed;
+                most = followedEnts[followed];
             }
         }