From: Tayrtahn Date: Mon, 20 May 2024 14:12:05 +0000 (-0400) Subject: Fix non-ghosts and admins counting toward most followed (#28120) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=8995810ade1daf49daac4738d3b1eb247302acc6;p=space-station-14.git Fix non-ghosts and admins counting toward most followed (#28120) * 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 * Update Content.Shared/Follower/FollowerSystem.cs Co-authored-by: ShadowCommander * Update Content.Shared/Follower/FollowerSystem.cs * Clean up --------- Co-authored-by: ShadowCommander Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> --- diff --git a/Content.Server/Ghost/GhostSystem.cs b/Content.Server/Ghost/GhostSystem.cs index 6c3d69fea7..1a411f13a0 100644 --- a/Content.Server/Ghost/GhostSystem.cs +++ b/Content.Server/Ghost/GhostSystem.cs @@ -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); diff --git a/Content.Shared/Follower/FollowerSystem.cs b/Content.Shared/Follower/FollowerSystem.cs index 6c02b13076..8027ee449c 100644 --- a/Content.Shared/Follower/FollowerSystem.cs +++ b/Content.Shared/Follower/FollowerSystem.cs @@ -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 } /// - /// Get the most followed entity. + /// Gets the entity with the most non-admin ghosts following it. /// - public EntityUid? GetMostFollowed() + public EntityUid? GetMostGhostFollowed() { EntityUid? picked = null; - int most = 0; - var query = EntityQueryEnumerator(); - 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(); + + // Look for followers that are ghosts and are player controlled + var query = EntityQueryEnumerator(); + 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]; } }