-using Content.Server.Worldgen.Components.Carvers;
+using Content.Server.Worldgen.Components.Carvers;
using Content.Server.Worldgen.Systems.Debris;
namespace Content.Server.Worldgen.Systems.Carvers;
private void OnPrePlaceDebris(EntityUid uid, NoiseRangeCarverComponent component,
ref PrePlaceDebrisFeatureEvent args)
{
- var coords = WorldGen.WorldToChunkCoords(args.Coords.ToMapPos(EntityManager, _transform));
+ var coords = WorldGen.WorldToChunkCoords(_transform.ToMapCoordinates(args.Coords).Position);
var val = _index.Evaluate(uid, component.NoiseChannel, coords);
foreach (var (low, high) in component.Ranges)
-using System.Linq;
+using System.Linq;
using System.Numerics;
using Content.Server.Worldgen.Components;
using Content.Server.Worldgen.Components.Debris;
private ISawmill _sawmill = default!;
+ private List<Entity<MapGridComponent>> _mapGrids = new();
+
/// <inheritdoc />
public override void Initialize()
{
component.DoSpawns = false; // Don't repeat yourself if this crashes.
- var chunk = Comp<WorldChunkComponent>(args.Chunk);
+ if (!TryComp<WorldChunkComponent>(args.Chunk, out var chunk))
+ return;
+
+ var chunkMap = chunk.Map;
+
+ if (!TryComp<MapComponent>(chunkMap, out var map))
+ return;
+
var densityChannel = component.DensityNoiseChannel;
var density = _noiseIndex.Evaluate(uid, densityChannel, chunk.Coordinates + new Vector2(0.5f, 0.5f));
if (density == 0)
.ToList();
}
- points ??= GeneratePointsInChunk(args.Chunk, density, chunk.Coordinates, chunk.Map);
+ points ??= GeneratePointsInChunk(args.Chunk, density, chunk.Coordinates, chunkMap);
+
+ var mapId = map.MapId;
var safetyBounds = Box2.UnitCentered.Enlarged(component.SafetyZoneRadius);
var failures = 0; // Avoid severe log spam.
if (pointDensity == 0 && component.DensityClip || _random.Prob(component.RandomCancellationChance))
continue;
- var coords = new EntityCoordinates(chunk.Map, point);
+ if (HasCollisions(mapId, safetyBounds.Translated(point)))
+ continue;
- if (_mapManager
- .FindGridsIntersecting(Comp<MapComponent>(chunk.Map).MapId, safetyBounds.Translated(point)).Any())
- continue; // Oops, gonna collide.
+ var coords = new EntityCoordinates(chunkMap, point);
var preEv = new PrePlaceDebrisFeatureEvent(coords, args.Chunk);
RaiseLocalEvent(uid, ref preEv);
_sawmill.Error($"Failed to place {failures} debris at chunk {args.Chunk}");
}
+ /// <summary>
+ /// Checks to see if the potential spawn point is clear
+ /// </summary>
+ /// <param name="mapId"></param>
+ /// <param name="point"></param>
+ /// <returns></returns>
+ private bool HasCollisions(MapId mapId, Box2 point)
+ {
+ _mapGrids.Clear();
+ _mapManager.FindGridsIntersecting(mapId, point, ref _mapGrids);
+ return _mapGrids.Count > 0;
+ }
+
/// <summary>
/// Generates the points to put into a chunk using a poisson disk sampler.
/// </summary>
-using Content.Server.Worldgen.Components.Debris;
+using Content.Server.Worldgen.Components.Debris;
using Robust.Server.GameObjects;
+using Robust.Shared.Physics;
using Robust.Shared.Random;
namespace Content.Server.Worldgen.Systems.Debris;
private void OnSelectDebrisKind(EntityUid uid, NoiseDrivenDebrisSelectorComponent component,
ref TryGetPlaceableDebrisFeatureEvent args)
{
- var coords = WorldGen.WorldToChunkCoords(args.Coords.ToMapPos(EntityManager, _xformSys));
+ var coords = WorldGen.WorldToChunkCoords(_xformSys.ToMapCoordinates(args.Coords).Position);
var prob = _index.Evaluate(uid, component.NoiseChannel, coords);
if (prob is < 0 or > 1)