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;
}
}