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:
parent
a9d328e632
commit
77df3ccf27
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,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();
|
||||||
|
|
@ -50,7 +48,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)
|
||||||
|
|
@ -68,15 +66,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>
|
||||||
|
|
@ -85,24 +75,16 @@ 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 [];
|
||||||
|
|
||||||
|
var set = new HashSet<Entity<ResearchServerComponent>>();
|
||||||
|
|
||||||
// Begin DeltaV Additions - use legacy behaviour if the grid has GlobalResearchGridComponent
|
// Begin DeltaV Additions - use legacy behaviour if the grid has GlobalResearchGridComponent
|
||||||
if (HasComp<GlobalResearchGridComponent>(grid))
|
if (HasComp<GlobalResearchGridComponent>(grid))
|
||||||
|
|
@ -110,14 +92,14 @@ namespace Content.Server.Research.Systems
|
||||||
var query = EntityQueryEnumerator<ResearchServerComponent>();
|
var query = EntityQueryEnumerator<ResearchServerComponent>();
|
||||||
while (query.MoveNext(out var uid, out var comp))
|
while (query.MoveNext(out var uid, out var comp))
|
||||||
{
|
{
|
||||||
ClientLookup.Add((uid, comp));
|
set.Add((uid, comp));
|
||||||
}
|
}
|
||||||
return ClientLookup;
|
return set;
|
||||||
}
|
}
|
||||||
// End DeltaV Additions
|
// End DeltaV Additions
|
||||||
|
|
||||||
_lookup.GetGridEntities(grid, ClientLookup);
|
_lookup.GetGridEntities(grid, set);
|
||||||
return ClientLookup;
|
return set;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Update(float frameTime)
|
public override void Update(float frameTime)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue