Fix ResearchSystem threading exception (#40917)

* Fix ResearchSystem threading exception

* Update Content.Server/Research/Systems/ResearchSystem.Client.cs

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
This commit is contained in:
Leon Friedrich
2025-10-16 01:53:34 +13:00
committed by GitHub
parent 704521d8df
commit 68f9d748a2
2 changed files with 12 additions and 34 deletions

View File

@@ -2,6 +2,7 @@ using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using Content.Server.Power.EntitySystems; using Content.Server.Power.EntitySystems;
using Content.Shared.Research.Components; using Content.Shared.Research.Components;
using Robust.Shared.Utility;
namespace Content.Server.Research.Systems; namespace Content.Server.Research.Systems;
@@ -62,10 +63,8 @@ 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 = GetServers(uid).ToList(); if (GetServers(uid).FirstOrNull() is { } server)
RegisterClient(uid, server, component, server);
if (allServers.Count > 0)
RegisterClient(uid, allServers[0], component, allServers[0]);
} }
private void OnClientShutdown(EntityUid uid, ResearchClientComponent component, ComponentShutdown args) private void OnClientShutdown(EntityUid uid, ResearchClientComponent component, ComponentShutdown args)
@@ -85,10 +84,8 @@ public sealed partial class ResearchSystem
if (ent.Comp.Server is not null) if (ent.Comp.Server is not null)
return; return;
var allServers = GetServers(ent).ToList(); if (GetServers(ent).FirstOrNull() is { } server)
RegisterClient(ent, server, ent, server);
if (allServers.Count > 0)
RegisterClient(ent, allServers[0], ent, allServers[0]);
} }
else else
{ {

View File

@@ -23,8 +23,6 @@ namespace Content.Server.Research.Systems
[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();
@@ -49,7 +47,7 @@ namespace Content.Server.Research.Systems
serverUid = null; serverUid = null;
serverComponent = null; serverComponent = null;
var query = GetServers(client).ToList(); var query = GetServers(client);
foreach (var (uid, server) in query) foreach (var (uid, server) in query)
{ {
if (server.Id != id) if (server.Id != id)
@@ -67,15 +65,7 @@ namespace Content.Server.Research.Systems
/// <returns></returns> /// <returns></returns>
public string[] GetServerNames(EntityUid client) public string[] GetServerNames(EntityUid client)
{ {
var allServers = GetServers(client).ToArray(); return GetServers(client).Select(x => x.Comp.ServerName).ToArray();
var list = new string[allServers.Length];
for (var i = 0; i < allServers.Length; i++)
{
list[i] = allServers[i].Comp.ServerName;
}
return list;
} }
/// <summary> /// <summary>
@@ -84,27 +74,18 @@ namespace Content.Server.Research.Systems
/// <returns></returns> /// <returns></returns>
public int[] GetServerIds(EntityUid client) public int[] GetServerIds(EntityUid client)
{ {
var allServers = GetServers(client).ToArray(); return GetServers(client).Select(x => x.Comp.Id).ToArray();
var list = new int[allServers.Length];
for (var i = 0; i < allServers.Length; i++)
{
list[i] = allServers[i].Comp.Id;
}
return list;
} }
public HashSet<Entity<ResearchServerComponent>> GetServers(EntityUid client) public HashSet<Entity<ResearchServerComponent>> GetServers(EntityUid client)
{ {
ClientLookup.Clear();
var clientXform = Transform(client); var clientXform = Transform(client);
if (clientXform.GridUid is not { } grid) if (clientXform.GridUid is not { } grid)
return ClientLookup; return [];
_lookup.GetGridEntities(grid, ClientLookup); var set = new HashSet<Entity<ResearchServerComponent>>();
return ClientLookup; _lookup.GetGridEntities(grid, set);
return set;
} }
public override void Update(float frameTime) public override void Update(float frameTime)