Files
RobustToolbox/Robust.Shared/GameObjects/Systems/SharedMapSystem.MapInit.cs
T
Leon FriedrichandGitHub d5c4981648 Partial MapManager refactor (#5042)
* MapManager rejig

* Update Tests

* A
2024-04-18 14:05:02 +10:00

90 lines
2.4 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
{
private List<EntityUid> _toInitialize = new();
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)
{
_toInitialize.Clear();
_toInitialize.Add(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);
}
_toInitialize.Clear();
}
}