Ahelp / player list changes (#11392)
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
using System.Globalization;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using Content.Server.Administration.Managers;
|
||||
using Content.Server.GameTicking.Events;
|
||||
using Content.Server.IdentityManagement;
|
||||
using Content.Server.Players;
|
||||
using Content.Server.Roles;
|
||||
using Content.Shared.Administration;
|
||||
using Content.Shared.Administration.Events;
|
||||
using Content.Shared.GameTicking;
|
||||
using Content.Shared.IdentityManagement;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Server.Player;
|
||||
@@ -21,6 +23,13 @@ namespace Content.Server.Administration.Systems
|
||||
|
||||
private readonly Dictionary<NetUserId, PlayerInfo> _playerList = new();
|
||||
|
||||
/// <summary>
|
||||
/// Set of players that have participated in this round.
|
||||
/// </summary>
|
||||
public IReadOnlySet<NetUserId> RoundActivePlayers => _roundActivePlayers;
|
||||
|
||||
private readonly HashSet<NetUserId> _roundActivePlayers = new();
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
@@ -32,11 +41,36 @@ namespace Content.Server.Administration.Systems
|
||||
SubscribeLocalEvent<PlayerDetachedEvent>(OnPlayerDetached);
|
||||
SubscribeLocalEvent<RoleAddedEvent>(OnRoleEvent);
|
||||
SubscribeLocalEvent<RoleRemovedEvent>(OnRoleEvent);
|
||||
SubscribeLocalEvent<RoundRestartCleanupEvent>(OnRoundRestartCleanup);
|
||||
}
|
||||
|
||||
private void OnRoundRestartCleanup(RoundRestartCleanupEvent ev)
|
||||
{
|
||||
_roundActivePlayers.Clear();
|
||||
|
||||
foreach (var (id, data) in _playerList)
|
||||
{
|
||||
if (!data.ActiveThisRound)
|
||||
continue;
|
||||
|
||||
if (!_playerManager.TryGetPlayerData(id, out var playerData))
|
||||
return;
|
||||
|
||||
_playerManager.TryGetSessionById(id, out var session);
|
||||
_playerList[id] = GetPlayerInfo(playerData, session);
|
||||
}
|
||||
|
||||
var updateEv = new FullPlayerListEvent() { PlayersInfo = _playerList.Values.ToList() };
|
||||
|
||||
foreach (var admin in _adminManager.ActiveAdmins)
|
||||
{
|
||||
RaiseNetworkEvent(updateEv, admin.ConnectedClient);
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdatePlayerList(IPlayerSession player)
|
||||
{
|
||||
_playerList[player.UserId] = GetPlayerInfo(player);
|
||||
_playerList[player.UserId] = GetPlayerInfo(player.Data, player);
|
||||
|
||||
var playerInfoChangedEvent = new PlayerInfoChangedEvent
|
||||
{
|
||||
@@ -89,6 +123,7 @@ namespace Content.Server.Administration.Systems
|
||||
{
|
||||
if(ev.Player.Status == SessionStatus.Disconnected) return;
|
||||
|
||||
_roundActivePlayers.Add(ev.Player.UserId);
|
||||
UpdatePlayerList(ev.Player);
|
||||
}
|
||||
|
||||
@@ -113,29 +148,29 @@ namespace Content.Server.Administration.Systems
|
||||
RaiseNetworkEvent(ev, playerSession.ConnectedClient);
|
||||
}
|
||||
|
||||
private PlayerInfo GetPlayerInfo(IPlayerSession session)
|
||||
private PlayerInfo GetPlayerInfo(IPlayerData data, IPlayerSession? session)
|
||||
{
|
||||
var name = session.Name;
|
||||
var username = string.Empty;
|
||||
var name = data.UserName;
|
||||
var entityName = string.Empty;
|
||||
var identityName = string.Empty;
|
||||
|
||||
if (session.AttachedEntity != null)
|
||||
if (session?.AttachedEntity != null)
|
||||
{
|
||||
username = EntityManager.GetComponent<MetaDataComponent>(session.AttachedEntity.Value).EntityName;
|
||||
entityName = EntityManager.GetComponent<MetaDataComponent>(session.AttachedEntity.Value).EntityName;
|
||||
identityName = Identity.Name(session.AttachedEntity.Value, EntityManager);
|
||||
}
|
||||
|
||||
var mind = session.ContentData()?.Mind;
|
||||
var mind = data.ContentData()?.Mind;
|
||||
|
||||
var job = mind?.AllRoles.FirstOrDefault(role => role is Job);
|
||||
var startingRole = job != null ? CultureInfo.CurrentCulture.TextInfo.ToTitleCase(job.Name) : string.Empty;
|
||||
|
||||
var antag = mind?.AllRoles.Any(r => r.Antagonist) ?? false;
|
||||
|
||||
var connected = session.Status is SessionStatus.Connected or SessionStatus.InGame;
|
||||
var connected = session != null && session.Status is SessionStatus.Connected or SessionStatus.InGame;
|
||||
|
||||
return new PlayerInfo(name, username, identityName, startingRole, antag, session.AttachedEntity.GetValueOrDefault(), session.UserId,
|
||||
connected);
|
||||
return new PlayerInfo(name, entityName, identityName, startingRole, antag, session?.AttachedEntity, data.UserId,
|
||||
connected, _roundActivePlayers.Contains(data.UserId));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user