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:
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user