Make research clients grid-local (#36821)
* Limit RD servers to the station grid * the sluth
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>();
|
||||||
|
|||||||
Reference in New Issue
Block a user