try-finally multiple UniqueEvents.ToList() to avoid issues(Destination array was not long enough. Check the destination index, length, and the array's lower bounds)

This commit is contained in:
NotAlwaysTrue
2025-12-22 22:43:02 +08:00
parent b891ec7793
commit dadd6c598f
2 changed files with 29 additions and 16 deletions
@@ -1218,6 +1218,8 @@ namespace Barotrauma.Networking
errorLines.Add(""); errorLines.Add("");
errorLines.Add("EntitySpawner events:"); errorLines.Add("EntitySpawner events:");
try
{
foreach (var entityEvent in entityEventManager.UniqueEvents.ToList()) foreach (var entityEvent in entityEventManager.UniqueEvents.ToList())
{ {
if (entityEvent.Entity is EntitySpawner) if (entityEvent.Entity is EntitySpawner)
@@ -1230,6 +1232,11 @@ namespace Barotrauma.Networking
" (" + spawnData.ID + ", " + spawnData.Entity.ID + ")"); " (" + spawnData.ID + ", " + spawnData.Entity.ID + ")");
} }
} }
}
finally
{
errorLines.Add("Catch event snapshot failed.");
}
errorLines.Add(""); errorLines.Add("");
errorLines.Add("Last debug messages:"); errorLines.Add("Last debug messages:");
@@ -169,6 +169,8 @@ namespace Barotrauma
#if SERVER #if SERVER
if (GameMain.Server != null && Entity.Spawner != null) if (GameMain.Server != null && Entity.Spawner != null)
{
try
{ {
if (GameMain.Server.EntityEventManager.UniqueEvents.ToList().Any(ev => ev.Entity == item)) if (GameMain.Server.EntityEventManager.UniqueEvents.ToList().Any(ev => ev.Entity == item))
{ {
@@ -178,9 +180,13 @@ namespace Barotrauma
GameMain.Server.EntityEventManager.UniqueEvents.RemoveAll(ev => ev.Entity == item); GameMain.Server.EntityEventManager.UniqueEvents.RemoveAll(ev => ev.Entity == item);
GameMain.Server.EntityEventManager.Events.RemoveAll(ev => ev.Entity == item); GameMain.Server.EntityEventManager.Events.RemoveAll(ev => ev.Entity == item);
} }
}
finally
{
Entity.Spawner.CreateNetworkEvent(new EntitySpawner.SpawnEntity(item)); Entity.Spawner.CreateNetworkEvent(new EntitySpawner.SpawnEntity(item));
} }
}
#endif #endif
if (jobItem.Equip) if (jobItem.Equip)