Make research clients grid-local (#36821)

* Limit RD servers to the station grid

* the sluth
This commit is contained in:
Nemanja
2025-05-18 00:04:27 -04:00
committed by GitHub
parent ffc65ea474
commit 4bced26086
2 changed files with 58 additions and 20 deletions

View File

@@ -1,4 +1,5 @@
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Server.Power.EntitySystems; using Content.Server.Power.EntitySystems;
using Content.Shared.Research.Components; using Content.Shared.Research.Components;
@@ -12,6 +13,7 @@ public sealed partial class ResearchSystem
SubscribeLocalEvent<ResearchClientComponent, ComponentShutdown>(OnClientShutdown); SubscribeLocalEvent<ResearchClientComponent, ComponentShutdown>(OnClientShutdown);
SubscribeLocalEvent<ResearchClientComponent, BoundUIOpenedEvent>(OnClientUIOpen); SubscribeLocalEvent<ResearchClientComponent, BoundUIOpenedEvent>(OnClientUIOpen);
SubscribeLocalEvent<ResearchClientComponent, ConsoleServerSelectionMessage>(OnConsoleSelect); SubscribeLocalEvent<ResearchClientComponent, ConsoleServerSelectionMessage>(OnConsoleSelect);
SubscribeLocalEvent<ResearchClientComponent, AnchorStateChangedEvent>(OnClientAnchorStateChanged);
SubscribeLocalEvent<ResearchClientComponent, ResearchClientSyncMessage>(OnClientSyncMessage); SubscribeLocalEvent<ResearchClientComponent, ResearchClientSyncMessage>(OnClientSyncMessage);
SubscribeLocalEvent<ResearchClientComponent, ResearchClientServerSelectedMessage>(OnClientSelected); SubscribeLocalEvent<ResearchClientComponent, ResearchClientServerSelectedMessage>(OnClientSelected);
@@ -23,7 +25,11 @@ public sealed partial class ResearchSystem
private void OnClientSelected(EntityUid uid, ResearchClientComponent component, ResearchClientServerSelectedMessage args) 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; return;
UnregisterClient(uid, component); UnregisterClient(uid, component);
@@ -56,12 +62,7 @@ public sealed partial class ResearchSystem
private void OnClientMapInit(EntityUid uid, ResearchClientComponent component, MapInitEvent args) private void OnClientMapInit(EntityUid uid, ResearchClientComponent component, MapInitEvent args)
{ {
var allServers = new List<Entity<ResearchServerComponent>>(); var allServers = GetServers(uid).ToList();
var query = AllEntityQuery<ResearchServerComponent>();
while (query.MoveNext(out var serverUid, out var serverComp))
{
allServers.Add((serverUid, serverComp));
}
if (allServers.Count > 0) if (allServers.Count > 0)
RegisterClient(uid, allServers[0], component, allServers[0]); RegisterClient(uid, allServers[0], component, allServers[0]);
@@ -77,6 +78,24 @@ public sealed partial class ResearchSystem
UpdateClientInterface(uid, component); 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) private void UpdateClientInterface(EntityUid uid, ResearchClientComponent? component = null)
{ {
if (!Resolve(uid, ref component, false)) if (!Resolve(uid, ref component, false))
@@ -84,9 +103,12 @@ public sealed partial class ResearchSystem
TryGetClientServer(uid, out _, out var serverComponent, component); TryGetClientServer(uid, out _, out var serverComponent, component);
var names = GetServerNames(); var names = GetServerNames(uid);
var state = new ResearchClientBoundInterfaceState(names.Length, names, var state = new ResearchClientBoundInterfaceState(
GetServerIds(), serverComponent?.Id ?? -1); names.Length,
names,
GetServerIds(uid),
serverComponent?.Id ?? -1);
_uiSystem.SetUiState(uid, ResearchClientUiKey.Key, state); _uiSystem.SetUiState(uid, ResearchClientUiKey.Key, state);
} }

View File

@@ -18,10 +18,13 @@ namespace Content.Server.Research.Systems
[Dependency] private readonly IAdminLogManager _adminLog = default!; [Dependency] private readonly IAdminLogManager _adminLog = default!;
[Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly AccessReaderSystem _accessReader = default!; [Dependency] private readonly AccessReaderSystem _accessReader = default!;
[Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly RadioSystem _radio = default!; [Dependency] private readonly RadioSystem _radio = default!;
private static readonly HashSet<Entity<ResearchServerComponent>> ClientLookup = new();
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
@@ -34,19 +37,20 @@ namespace Content.Server.Research.Systems
} }
/// <summary> /// <summary>
/// Gets a server based on it's unique numeric id. /// Gets a server based on its unique numeric id.
/// </summary> /// </summary>
/// <param name="client"></param>
/// <param name="id"></param> /// <param name="id"></param>
/// <param name="serverUid"></param> /// <param name="serverUid"></param>
/// <param name="serverComponent"></param> /// <param name="serverComponent"></param>
/// <returns></returns> /// <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; serverUid = null;
serverComponent = null; serverComponent = null;
var query = EntityQueryEnumerator<ResearchServerComponent>(); var query = GetServers(client).ToList();
while (query.MoveNext(out var uid, out var server)) foreach (var (uid, server) in query)
{ {
if (server.Id != id) if (server.Id != id)
continue; continue;
@@ -61,14 +65,14 @@ namespace Content.Server.Research.Systems
/// Gets the names of all the servers. /// Gets the names of all the servers.
/// </summary> /// </summary>
/// <returns></returns> /// <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]; var list = new string[allServers.Length];
for (var i = 0; i < allServers.Length; i++) for (var i = 0; i < allServers.Length; i++)
{ {
list[i] = allServers[i].ServerName; list[i] = allServers[i].Comp.ServerName;
} }
return list; return list;
@@ -78,19 +82,31 @@ namespace Content.Server.Research.Systems
/// Gets the ids of all the servers /// Gets the ids of all the servers
/// </summary> /// </summary>
/// <returns></returns> /// <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]; var list = new int[allServers.Length];
for (var i = 0; i < allServers.Length; i++) for (var i = 0; i < allServers.Length; i++)
{ {
list[i] = allServers[i].Id; list[i] = allServers[i].Comp.Id;
} }
return list; 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) public override void Update(float frameTime)
{ {
var query = EntityQueryEnumerator<ResearchServerComponent>(); var query = EntityQueryEnumerator<ResearchServerComponent>();