using System.Diagnostics.CodeAnalysis;
+using System.Linq;
using Content.Server.Power.EntitySystems;
using Content.Shared.Research.Components;
SubscribeLocalEvent<ResearchClientComponent, ComponentShutdown>(OnClientShutdown);
SubscribeLocalEvent<ResearchClientComponent, BoundUIOpenedEvent>(OnClientUIOpen);
SubscribeLocalEvent<ResearchClientComponent, ConsoleServerSelectionMessage>(OnConsoleSelect);
+ SubscribeLocalEvent<ResearchClientComponent, AnchorStateChangedEvent>(OnClientAnchorStateChanged);
SubscribeLocalEvent<ResearchClientComponent, ResearchClientSyncMessage>(OnClientSyncMessage);
SubscribeLocalEvent<ResearchClientComponent, ResearchClientServerSelectedMessage>(OnClientSelected);
private void OnClientSelected(EntityUid uid, ResearchClientComponent component, ResearchClientServerSelectedMessage args)
{
- if (!TryGetServerById(args.ServerId, out var serveruid, out var serverComponent))
+ if (!TryGetServerById(uid, args.ServerId, out var serveruid, out var serverComponent))
+ return;
+
+ // Validate that we can access this server.
+ if (!GetServers(uid).Contains((serveruid.Value, serverComponent)))
return;
UnregisterClient(uid, component);
private void OnClientMapInit(EntityUid uid, ResearchClientComponent component, MapInitEvent args)
{
- var allServers = new List<Entity<ResearchServerComponent>>();
- var query = AllEntityQuery<ResearchServerComponent>();
- while (query.MoveNext(out var serverUid, out var serverComp))
- {
- allServers.Add((serverUid, serverComp));
- }
+ var allServers = GetServers(uid).ToList();
if (allServers.Count > 0)
RegisterClient(uid, allServers[0], component, allServers[0]);
UpdateClientInterface(uid, component);
}
+ private void OnClientAnchorStateChanged(Entity<ResearchClientComponent> ent, ref AnchorStateChangedEvent args)
+ {
+ if (args.Anchored)
+ {
+ if (ent.Comp.Server is not null)
+ return;
+
+ var allServers = GetServers(ent).ToList();
+
+ if (allServers.Count > 0)
+ RegisterClient(ent, allServers[0], ent, allServers[0]);
+ }
+ else
+ {
+ UnregisterClient(ent, ent.Comp);
+ }
+ }
+
private void UpdateClientInterface(EntityUid uid, ResearchClientComponent? component = null)
{
if (!Resolve(uid, ref component, false))
TryGetClientServer(uid, out _, out var serverComponent, component);
- var names = GetServerNames();
- var state = new ResearchClientBoundInterfaceState(names.Length, names,
- GetServerIds(), serverComponent?.Id ?? -1);
+ var names = GetServerNames(uid);
+ var state = new ResearchClientBoundInterfaceState(
+ names.Length,
+ names,
+ GetServerIds(uid),
+ serverComponent?.Id ?? -1);
_uiSystem.SetUiState(uid, ResearchClientUiKey.Key, state);
}
[Dependency] private readonly IAdminLogManager _adminLog = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly AccessReaderSystem _accessReader = default!;
+ [Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly RadioSystem _radio = default!;
+ private static readonly HashSet<Entity<ResearchServerComponent>> ClientLookup = new();
+
public override void Initialize()
{
base.Initialize();
}
/// <summary>
- /// Gets a server based on it's unique numeric id.
+ /// Gets a server based on its unique numeric id.
/// </summary>
+ /// <param name="client"></param>
/// <param name="id"></param>
/// <param name="serverUid"></param>
/// <param name="serverComponent"></param>
/// <returns></returns>
- public bool TryGetServerById(int id, [NotNullWhen(true)] out EntityUid? serverUid, [NotNullWhen(true)] out ResearchServerComponent? serverComponent)
+ public bool TryGetServerById(EntityUid client, int id, [NotNullWhen(true)] out EntityUid? serverUid, [NotNullWhen(true)] out ResearchServerComponent? serverComponent)
{
serverUid = null;
serverComponent = null;
- var query = EntityQueryEnumerator<ResearchServerComponent>();
- while (query.MoveNext(out var uid, out var server))
+ var query = GetServers(client).ToList();
+ foreach (var (uid, server) in query)
{
if (server.Id != id)
continue;
/// Gets the names of all the servers.
/// </summary>
/// <returns></returns>
- public string[] GetServerNames()
+ public string[] GetServerNames(EntityUid client)
{
- var allServers = EntityQuery<ResearchServerComponent>(true).ToArray();
+ var allServers = GetServers(client).ToArray();
var list = new string[allServers.Length];
for (var i = 0; i < allServers.Length; i++)
{
- list[i] = allServers[i].ServerName;
+ list[i] = allServers[i].Comp.ServerName;
}
return list;
/// Gets the ids of all the servers
/// </summary>
/// <returns></returns>
- public int[] GetServerIds()
+ public int[] GetServerIds(EntityUid client)
{
- var allServers = EntityQuery<ResearchServerComponent>(true).ToArray();
+ var allServers = GetServers(client).ToArray();
var list = new int[allServers.Length];
for (var i = 0; i < allServers.Length; i++)
{
- list[i] = allServers[i].Id;
+ list[i] = allServers[i].Comp.Id;
}
return list;
}
+ public HashSet<Entity<ResearchServerComponent>> GetServers(EntityUid client)
+ {
+ ClientLookup.Clear();
+
+ var clientXform = Transform(client);
+ if (clientXform.GridUid is not { } grid)
+ return ClientLookup;
+
+ _lookup.GetGridEntities(grid, ClientLookup);
+ return ClientLookup;
+ }
+
public override void Update(float frameTime)
{
var query = EntityQueryEnumerator<ResearchServerComponent>();