Disallow tile placement close to grids (#17058)

This commit is contained in:
metalgearsloth
2023-06-26 13:00:17 +10:00
committed by GitHub
parent 06fc0122fe
commit 5b76549b09

View File

@@ -60,13 +60,38 @@ public sealed class FloorTileSystem : EntitySystem
var physicQuery = GetEntityQuery<PhysicsComponent>();
var transformQuery = GetEntityQuery<TransformComponent>();
var tilePos = location.ToMapPos(EntityManager, _transform);
var map = location.ToMap(EntityManager, _transform);
// Disallow placement close to grids.
// FTLing close is okay but this makes alignment too finnicky.
// While you may already have a tile close you want to replace when we get half-tiles that may also be finnicky
// so we're just gon with this for now.
const bool inRange = true;
var state = (inRange, location.EntityId);
_mapManager.FindGridsIntersecting(map.MapId, new Box2(map.Position - 1f, map.Position + 1f), ref state,
static (EntityUid entityUid, MapGridComponent grid, ref (bool weh, EntityUid EntityId) tuple) =>
{
if (tuple.EntityId == entityUid)
return true;
tuple.weh = false;
return false;
});
if (!state.inRange)
{
if (_netManager.IsClient && _timing.IsFirstTimePredicted)
_popup.PopupEntity(Loc.GetString("invalid-floor-placement"), args.User);
return;
}
var userPos = transformQuery.GetComponent(args.User).Coordinates.ToMapPos(EntityManager, _transform);
var dir = userPos - tilePos;
var dir = userPos - map.Position;
var canAccessCenter = false;
if (dir.LengthSquared > 0.01)
{
var ray = new CollisionRay(tilePos, dir.Normalized, (int) CollisionGroup.Impassable);
var ray = new CollisionRay(map.Position, dir.Normalized, (int) CollisionGroup.Impassable);
var results = _physics.IntersectRay(locationMap.MapId, ray, dir.Length, returnOnFirstHit: true);
canAccessCenter = !results.Any();
}