From e5496fb09aff55061cef5185b16707d04bfa1240 Mon Sep 17 00:00:00 2001 From: B_Kirill <153602297+B-Kirill@users.noreply.github.com> Date: Fri, 17 Jul 2026 18:00:51 +1000 Subject: [PATCH] Make rect deletion area align with camera rotation instead of world --- Robust.Client/Placement/PlacementManager.cs | 51 ++++++++----------- Robust.Server/Placement/PlacementManager.cs | 9 ++-- .../Network/Messages/MsgPlacement.cs | 3 ++ 3 files changed, 31 insertions(+), 32 deletions(-) diff --git a/Robust.Client/Placement/PlacementManager.cs b/Robust.Client/Placement/PlacementManager.cs index b5ec4a6c9a3..d1066dc835a 100644 --- a/Robust.Client/Placement/PlacementManager.cs +++ b/Robust.Client/Placement/PlacementManager.cs @@ -111,7 +111,7 @@ private set /// /// Holds the selection rectangle for the eraser /// - public Box2? EraserRect { get; set; } + public Box2Rotated? EraserRect { get; set; } /// /// Drawing shader for drawing without being affected by lighting @@ -482,12 +482,16 @@ public void HandleDeletion(EntityUid entity) _networkManager.ClientSendMessage(msg); } - public void HandleRectDeletion(EntityCoordinates start, Box2 rect) + public void HandleRectDeletion(EntityCoordinates start, Box2Rotated rect) { - var msg = new MsgPlacement(); - msg.PlaceType = PlacementManagerMessage.RequestRectRemove; - msg.NetCoordinates = new NetCoordinates(EntityManager.GetNetEntity(StartPoint.EntityId), rect.BottomLeft); - msg.RectSize = rect.Size; + var centerCoords = XformSystem.ToCoordinates(new MapCoordinates(rect.Origin, XformSystem.GetMapId(start))); + var msg = new MsgPlacement + { + PlaceType = PlacementManagerMessage.RequestRectRemove, + NetCoordinates = EntityManager.GetNetCoordinates(centerCoords), + RectSize = rect.Box.Size, + RectRotation = (float)rect.Rotation.Theta + }; _networkManager.ClientSendMessage(msg); } @@ -595,28 +599,15 @@ public void FrameUpdate(FrameEventArgs e) { if (!CurrentEraserMouseCoordinates(out EntityCoordinates end)) return; - float b, l, t, r; - if (StartPoint.X < end.X) - { - l = StartPoint.X; - r = end.X; - } - else - { - l = end.X; - r = StartPoint.X; - } - if (StartPoint.Y < end.Y) - { - b = StartPoint.Y; - t = end.Y; - } - else - { - b = end.Y; - t = StartPoint.Y; - } - EraserRect = new Box2(l, b, r, t); + + var startPos = XformSystem.ToWorldPosition(StartPoint); + var endPos = XformSystem.ToWorldPosition(end); + var eyeRot = _eyeManager.CurrentEye.Rotation; + + var diff = eyeRot.RotateVec(endPos - startPos); + var size = new Vector2(MathF.Abs(diff.X), MathF.Abs(diff.Y)); + var centerPos = (startPos + endPos) / 2f; + EraserRect = new Box2Rotated(Box2.CenteredAround(centerPos, size), -eyeRot, centerPos); } return; } @@ -665,7 +656,9 @@ private void EraseRectMode() return; StartPoint = coordinates; - EraserRect = new Box2(coordinates.Position, Vector2.Zero); + var startPos = XformSystem.ToWorldPosition(coordinates); + var eyeRot = _eyeManager.CurrentEye.Rotation; + EraserRect = new Box2Rotated(new Box2(startPos, startPos), -eyeRot, startPos); } private bool DeactivateSpecialPlacement() diff --git a/Robust.Server/Placement/PlacementManager.cs b/Robust.Server/Placement/PlacementManager.cs index f4d426f669b..15774b1ca79 100644 --- a/Robust.Server/Placement/PlacementManager.cs +++ b/Robust.Server/Placement/PlacementManager.cs @@ -245,10 +245,13 @@ private void HandleEntRemoveReq(MsgPlacement msg) /// private void HandleRectRemoveReq(MsgPlacement msg) { - var start = _entityManager.GetCoordinates(msg.NetCoordinates); - var rectSize = msg.RectSize; + var centerCoords = _xformSystem.ToMapCoordinates(msg.NetCoordinates); + var centerPos = centerCoords.Position; - foreach (var entity in _lookup.GetEntitiesIntersecting(_xformSystem.GetMapId(start), new Box2(start.Position, start.Position + rectSize))) + var box = Box2.CenteredAround(centerPos, msg.RectSize); + var boxRotated = new Box2Rotated(box, msg.RectRotation, centerPos); + + foreach (var entity in _lookup.GetEntitiesIntersecting(centerCoords.MapId, boxRotated)) { if (_entityManager.Deleted(entity) || _entityManager.HasComponent(entity) diff --git a/Robust.Shared/Network/Messages/MsgPlacement.cs b/Robust.Shared/Network/Messages/MsgPlacement.cs index b5b8e0e4d77..093d2852fe6 100644 --- a/Robust.Shared/Network/Messages/MsgPlacement.cs +++ b/Robust.Shared/Network/Messages/MsgPlacement.cs @@ -33,6 +33,7 @@ public sealed class MsgPlacement : NetMessage public string ObjType { get; set; } public string AlignOption { get; set; } public Vector2 RectSize { get; set; } + public float RectRotation { get; set; } /// /// Used to determine tile sprite mirroring @@ -71,6 +72,7 @@ public override void ReadFromBuffer(NetIncomingMessage buffer, IRobustSerializer case PlacementManagerMessage.RequestRectRemove: NetCoordinates = buffer.ReadNetCoordinates(); RectSize = buffer.ReadVector2(); + RectRotation = buffer.ReadFloat(); break; } } @@ -107,6 +109,7 @@ public override void WriteToBuffer(NetOutgoingMessage buffer, IRobustSerializer case PlacementManagerMessage.RequestRectRemove: buffer.Write(NetCoordinates); buffer.Write(RectSize); + buffer.Write(RectRotation); break; } }