Files
RobustToolbox/Robust.Shared/GameObjects/Systems/SharedMapSystem.MapInit.cs
Leon Friedrich 9f913cd2d9 Fix RecursiveMapInit (#5052)
* Fix RecursiveMapInit

* re-use sawmill
2024-04-19 13:15:42 +10:00

84 lines
2.3 KiB
C#

using System;
using System.Collections.Generic;
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Utility;
namespace Robust.Shared.GameObjects;
public abstract partial class SharedMapSystem
{
public bool IsInitialized(MapId mapId)
{
if (mapId == MapId.Nullspace)
return true; // Nullspace is always initialized
if(!Maps.TryGetValue(mapId, out var uid))
throw new ArgumentException($"Map {mapId} does not exist.");
return IsInitialized(uid);
}
public bool IsInitialized(EntityUid? map)
{
if (map == null)
return true; // Nullspace is always initialized
return IsInitialized(map.Value);
}
public bool IsInitialized(Entity<MapComponent?> map)
{
if (!_mapQuery.Resolve(map, ref map.Comp))
return false;
return map.Comp.MapInitialized;
}
private void OnMapInit(EntityUid uid, MapComponent component, MapInitEvent args)
{
DebugTools.Assert(!component.MapInitialized);
component.MapInitialized = true;
EntityManager.Dirty(uid, component);
}
public void InitializeMap(MapId mapId, bool unpause = true)
{
if(!Maps.TryGetValue(mapId, out var uid))
throw new ArgumentException($"Map {mapId} does not exist.");
InitializeMap(uid, unpause);
}
public void InitializeMap(Entity<MapComponent?> map, bool unpause = true)
{
if (!_mapQuery.Resolve(map, ref map.Comp))
return;
if (map.Comp.MapInitialized)
throw new ArgumentException($"Map {ToPrettyString(map)} is already initialized.");
RecursiveMapInit(map.Owner);
if (unpause)
SetPaused(map, false);
}
private void RecursiveMapInit(EntityUid entity)
{
var toInitialize = new List<EntityUid> {entity};
for (var i = 0; i < toInitialize.Count; i++)
{
var uid = toInitialize[i];
// toInitialize might contain deleted entities.
if(!_metaQuery.TryComp(uid, out var meta))
continue;
if (meta.EntityLifeStage == EntityLifeStage.MapInitialized)
continue;
toInitialize.AddRange(Transform(uid)._children);
EntityManager.RunMapInit(uid, meta);
}
}
}