worldAngle = _random.NextAngle();
}
- if (!TryGetSalvagePlacementLocation(mapId, attachedBounds, bounds!.Value, worldAngle, out var spawnLocation, out var spawnAngle))
+ if (!TryGetSalvagePlacementLocation(magnet, mapId, attachedBounds, bounds!.Value, worldAngle, out var spawnLocation, out var spawnAngle))
{
Report(magnet.Owner, MagnetChannel, "salvage-system-announcement-spawn-no-debris-available");
_mapManager.DeleteMap(salvMapXform.MapID);
RaiseLocalEvent(ref active);
}
- private bool TryGetSalvagePlacementLocation(MapId mapId, Box2Rotated attachedBounds, Box2 bounds, Angle worldAngle, out MapCoordinates coords, out Angle angle)
+ private bool TryGetSalvagePlacementLocation(Entity<SalvageMagnetComponent> magnet, MapId mapId, Box2Rotated attachedBounds, Box2 bounds, Angle worldAngle, out MapCoordinates coords, out Angle angle)
{
- // Grid intersection only does AABB atm.
var attachedAABB = attachedBounds.CalcBoundingBox();
-
- var minDistance = (attachedAABB.Height < attachedAABB.Width ? attachedAABB.Width : attachedAABB.Height) / 2f;
- var minActualDistance = bounds.Height < bounds.Width ? minDistance + bounds.Width / 2f : minDistance + bounds.Height / 2f;
-
- var attachedCenter = attachedAABB.Center;
- var fraction = 0.25f;
+ var magnetPos = _transform.GetWorldPosition(magnet) + worldAngle.ToVec() * bounds.MaxDimension;
+ var origin = attachedAABB.ClosestPoint(magnetPos);
+ var fraction = 0.50f;
// Thanks 20kdc
for (var i = 0; i < 20; i++)
{
- var randomPos = attachedCenter +
- worldAngle.ToVec() * (minActualDistance * fraction);
+ var randomPos = origin +
+ worldAngle.ToVec() * (magnet.Comp.MagnetSpawnDistance * fraction) +
+ (worldAngle + Math.PI / 2).ToVec() * _random.NextFloat(-magnet.Comp.LateralOffset, magnet.Comp.LateralOffset);
var finalCoords = new MapCoordinates(randomPos, mapId);
angle = _random.NextAngle();
if (_mapManager.FindGridsIntersecting(finalCoords.MapId, box2Rot).Any())
{
// Bump it further and further just in case.
- fraction += 0.25f;
+ fraction += 0.1f;
continue;
}