using Content.Server.Atmos.EntitySystems; using Content.Server.Parallax; using Content.Shared.DeltaV.Planet; using Content.Shared.Parallax.Biomes; using Robust.Shared.EntitySerialization.Systems; using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Prototypes; using Robust.Shared.Utility; namespace Content.Server.DeltaV.Planet; public sealed class PlanetSystem : EntitySystem { [Dependency] private readonly AtmosphereSystem _atmos = default!; [Dependency] private readonly BiomeSystem _biome = default!; [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly MapLoaderSystem _mapLoader = default!; [Dependency] private readonly MetaDataSystem _meta = default!; [Dependency] private readonly SharedMapSystem _map = default!; private readonly List<(Vector2i, Tile)> _setTiles = new(); /// /// Spawn a planet map from a planet prototype. /// public EntityUid SpawnPlanet(ProtoId id, bool runMapInit = true) { var planet = _proto.Index(id); var map = _map.CreateMap(out _, runMapInit: runMapInit); _biome.EnsurePlanet(map, _proto.Index(planet.Biome), mapLight: planet.MapLight); // add each marker layer var biome = Comp(map); foreach (var layer in planet.BiomeMarkerLayers) { _biome.AddMarkerLayer(map, biome, layer); } if (planet.AddedComponents is {} added) EntityManager.AddComponents(map, added); _atmos.SetMapAtmosphere(map, false, planet.Atmosphere); _meta.SetEntityName(map, Loc.GetString(planet.MapName)); return map; } /// /// Spawns an initialized planet map from a planet prototype and loads a grid onto it. /// Returns the map entity if loading succeeded. /// public EntityUid? LoadPlanet(ProtoId id, ResPath path) { var map = SpawnPlanet(id, runMapInit: false); var mapId = Comp(map).MapId; if (!_mapLoader.TryLoadGrid(mapId, path, out var grid)) { Log.Error($"Failed to load planet grid {path} for planet {id}!"); Del(map); return null; } // don't want rocks spawning inside the base _setTiles.Clear(); var aabb = Comp(grid.Value).LocalAABB; _biome.ReserveTiles(map, aabb.Enlarged(0.2f), _setTiles); _map.InitializeMap(map); return map; } }