/// </summary>
public float MinimumDistance { get; }
+ /// <summary>
+ /// Maximum distance to spawn away from the station.
+ /// </summary>
+ public float MaximumDistance { get; }
+
/// <inheritdoc />
public ProtoId<DatasetPrototype>? NameDataset { get; }
/// <inheritdoc />
public float MinimumDistance { get; }
+ public float MaximumDistance { get; }
+
/// <inheritdoc />
public ProtoId<DatasetPrototype>? NameDataset { get; }
{
public List<ResPath> Paths = new();
+ /// <inheritdoc />
public float MinimumDistance { get; }
+
+ /// <inheritdoc />
+ public float MaximumDistance { get; }
public ProtoId<DatasetPrototype>? NameDataset { get; }
public int MinCount { get; set; } = 1;
public int MaxCount { get; set; } = 1;
using Content.Shared.Station.Components;
using Robust.Shared.Collections;
using Robust.Shared.Map;
+using Robust.Shared.Map.Components;
using Robust.Shared.Random;
using Robust.Shared.Utility;
_mapManager.DeleteMap(mapId);
}
- private bool TryDungeonSpawn(EntityUid targetGrid, EntityUid stationUid, MapId mapId, DungeonSpawnGroup group, out EntityUid spawned)
+ private bool TryDungeonSpawn(Entity<MapGridComponent?> targetGrid, EntityUid stationUid, MapId mapId, DungeonSpawnGroup group, out EntityUid spawned)
{
spawned = EntityUid.Invalid;
+
+ if (!_gridQuery.Resolve(targetGrid.Owner, ref targetGrid.Comp))
+ {
+ return false;
+ }
+
var dungeonProtoId = _random.Pick(group.Protos);
if (!_protoManager.TryIndex(dungeonProtoId, out var dungeonProto))
return false;
}
- var spawnCoords = new EntityCoordinates(targetGrid, Vector2.Zero);
+ var targetPhysics = _physicsQuery.Comp(targetGrid);
+ var spawnCoords = new EntityCoordinates(targetGrid, targetPhysics.LocalCenter);
if (group.MinimumDistance > 0f)
{
- spawnCoords = spawnCoords.Offset(_random.NextVector2(group.MinimumDistance, group.MinimumDistance * 1.5f));
+ var distancePadding = MathF.Max(targetGrid.Comp.LocalAABB.Width, targetGrid.Comp.LocalAABB.Height);
+ spawnCoords = spawnCoords.Offset(_random.NextVector2(distancePadding + group.MinimumDistance, distancePadding + group.MaximumDistance));
}
var spawnMapCoords = _transform.ToMapCoordinates(spawnCoords);
[Dependency] private readonly ThrusterSystem _thruster = default!;
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
+ private EntityQuery<MapGridComponent> _gridQuery;
+
public const float TileMassMultiplier = 0.5f;
public override void Initialize()
{
base.Initialize();
+ _gridQuery = GetEntityQuery<MapGridComponent>();
+
InitializeFTL();
InitializeGridFills();
InitializeIFF();