Files
crystall-punk-14/Content.Server/_CP14/Procedural/CP14SpawnProceduralLocationJob.cs
Red 51a3fb53aa God rays (#1803)
* god rays

* fix

* fix?
2025-09-27 22:14:11 +03:00

98 lines
3.3 KiB
C#

using System.Threading;
using System.Threading.Tasks;
using Content.Server.Atmos.EntitySystems;
using Content.Server.Procedural;
using Content.Shared._CP14.Procedural.Prototypes;
using Content.Shared.Atmos;
using Content.Shared.Gravity;
using Content.Shared.Procedural;
using Content.Shared.Procedural.DungeonLayers;
using Robust.Shared.CPUJob.JobQueues;
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Prototypes;
namespace Content.Server._CP14.Procedural;
public sealed class CP14SpawnProceduralLocationJob(
double maxTime,
IEntityManager entManager,
ILogManager logManager,
IPrototypeManager protoManager,
DungeonSystem dungeon,
SharedMapSystem map,
EntityUid mapUid,
MapId mapId,
Vector2i position,
int seed,
ProtoId<CP14ProceduralLocationPrototype> config,
List<ProtoId<CP14ProceduralModifierPrototype>> modifiers,
string? jobName = null,
CancellationToken cancellation = default)
: Job<bool>(maxTime, cancellation)
{
public readonly EntityUid MapUid = mapUid;
public string? JobName = jobName;
private readonly ISawmill _sawmill = logManager.GetSawmill("cp14_procedural_location_job");
protected override async Task<bool> Process()
{
_sawmill.Debug($"Spawning procedural location `{config.Id}` with seed {seed}");
var gridComp = entManager.EnsureComponent<MapGridComponent>(MapUid);
MetaDataComponent? metadata = null;
DungeonConfigPrototype dungeonConfig = new();
//Boilerplate: reserve all old grid tiles
dungeonConfig.Layers.Add(new CP14ReserveGrid());
//Setup location config
var locationConfig = protoManager.Index(config);
var indexedLocation = protoManager.Index(locationConfig.LocationConfig);
dungeonConfig.Layers.AddRange(indexedLocation.Layers);
dungeonConfig.ReserveTiles = indexedLocation.ReserveTiles;
//Apply modifiers
foreach (var modifier in modifiers)
{
if (!protoManager.TryIndex(modifier, out var indexedModifier))
continue;
if (indexedModifier.Layers != null)
dungeonConfig.Layers.AddRange(indexedModifier.Layers);
if (indexedModifier.Components != null)
entManager.AddComponents(MapUid, indexedModifier.Components);
_sawmill.Debug($"Added modifier: {seed} - {modifier.Id}");
}
//Setup gravity
var gravity = entManager.EnsureComponent<GravityComponent>(MapUid);
gravity.Enabled = true;
entManager.Dirty(MapUid, gravity, metadata);
// Setup default atmos
var moles = new float[Atmospherics.AdjustedNumberOfGases];
moles[(int)Gas.Oxygen] = 21.824779f;
moles[(int)Gas.Nitrogen] = 82.10312f;
var mixture = new GasMixture(moles, Atmospherics.T20C);
entManager.System<AtmosphereSystem>().SetMapAtmosphere(MapUid, false, mixture);
map.SetPaused(mapId, false);
//Add map components
entManager.AddComponents(MapUid, locationConfig.Components);
//Spawn modified config
await WaitAsyncTask(dungeon.GenerateDungeonAsync(dungeonConfig,
MapUid,
gridComp,
position,
seed));
return true;
}
}