using Robust.Shared.Collections; using Robust.Shared.Prototypes; namespace Content.Shared.Maps; /// /// Tile definition registration and reload handling for . /// /// /// Tile IDs are assigned by registration order and are used directly by map chunks. Keep this initialization in a /// TurfSystem partial so the tile atmosphere cache is always built after registration. /// public sealed partial class TurfSystem { [Dependency] private IPrototypeManager _prototypeManager = default!; private void RegisterTileDefinitions() { if (_tileDefinitions.Count > 0) return; // Register space first because ID 0 is assumed by a few map/tile paths. var spaceDef = _prototypeManager.Index(ContentTileDefinition.SpaceID); _tileDefinitions.Register(spaceDef); var prototypeList = new ValueList(); foreach (var tileDef in _prototypeManager.EnumeratePrototypes()) { if (tileDef.ID == ContentTileDefinition.SpaceID) continue; prototypeList.Add(tileDef); } // Sort ordinal to ensure tile IDs are deterministic and match between client and server. prototypeList.Sort((a, b) => string.Compare(a.ID, b.ID, StringComparison.Ordinal)); foreach (var tileDef in prototypeList) { _tileDefinitions.Register(tileDef); } _tileDefinitions.Initialize(); } private void PreserveTileIds() { // TileDefinitionManager does not re-register definitions on prototype reload. Preserve the IDs assigned during // initial registration so reloaded tile prototypes continue to match map chunk tile IDs. foreach (var def in _prototypeManager.EnumeratePrototypes()) { if (_tileDefinitions.TryGetDefinition(def.ID, out var registered)) def.AssignTileId(registered.TileId); } } }