From ec6740c8da505b15a844d82c0661120f35f1980b Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 26 Apr 2025 00:04:25 -0400 Subject: [PATCH] Unit payload enter command snapping --- core/src/mindustry/ai/UnitCommand.java | 3 +++ core/src/mindustry/ai/types/CommandAI.java | 6 ++++++ core/src/mindustry/graphics/Drawf.java | 10 ++++++++++ core/src/mindustry/input/InputHandler.java | 9 ++++++--- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/ai/UnitCommand.java b/core/src/mindustry/ai/UnitCommand.java index 23489bfeb7..aab0e04722 100644 --- a/core/src/mindustry/ai/UnitCommand.java +++ b/core/src/mindustry/ai/UnitCommand.java @@ -24,6 +24,8 @@ public class UnitCommand extends MappableContent{ public boolean drawTarget = false; /** Whether to reset targets when switching to or from this command. */ public boolean resetTarget = true; + /** Whether to snap the command destination to ally buildings. */ + public boolean snapToBuilding = false; /** */ public boolean exactArrival = false; /** If true, this command refreshes the list of stances when selected TODO: do not use, this will likely be removed later!*/ @@ -90,6 +92,7 @@ public class UnitCommand extends MappableContent{ switchToMove = false; drawTarget = true; resetTarget = false; + snapToBuilding = true; }}; loadUnitsCommand = new UnitCommand("loadUnits", "upload", Binding.unit_command_load_units, null){{ switchToMove = false; diff --git a/core/src/mindustry/ai/types/CommandAI.java b/core/src/mindustry/ai/types/CommandAI.java index 22150cddce..eae12cd7fd 100644 --- a/core/src/mindustry/ai/types/CommandAI.java +++ b/core/src/mindustry/ai/types/CommandAI.java @@ -501,6 +501,12 @@ public class CommandAI extends AIController{ //this is an allocation, but it's relatively rarely called anyway, and outside mutations must be prevented targetPos = lastTargetPos = pos.cpy(); + if(command != null && command.snapToBuilding){ + var build = world.buildWorld(targetPos.x, targetPos.y); + if(build != null && build.team == unit.team){ + targetPos.set(build); + } + } attackTarget = null; this.stopWhenInRange = stopWhenInRange; } diff --git a/core/src/mindustry/graphics/Drawf.java b/core/src/mindustry/graphics/Drawf.java index caf5a067c6..532939f4ff 100644 --- a/core/src/mindustry/graphics/Drawf.java +++ b/core/src/mindustry/graphics/Drawf.java @@ -394,6 +394,16 @@ public class Drawf{ Draw.reset(); } + public static void cross(float x, float y, float radius, Color color){ + Lines.stroke(3f, Pal.gray.write(Tmp.c3).a(color.a)); + Lines.lineAngleCenter(x, y, 45f, radius + 1f); + Lines.lineAngleCenter(x, y, 135f, radius + 1f); + Lines.stroke(1f, color); + Lines.lineAngleCenter(x, y, 45f, radius + 1f); + Lines.lineAngleCenter(x, y, 135f, radius + 1f); + Draw.reset(); + } + public static void poly(float x, float y, int sides, float radius, float rotation, Color color){ Lines.stroke(3f, Pal.gray); Lines.poly(x, y, sides, radius + 1f, rotation); diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index f4a0586bfa..0c75f6ba26 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -1123,26 +1123,29 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Position lastPos = null; if(unit.controller() instanceof CommandAI ai){ + var cmd = ai.currentCommand(); lastPos = ai.attackTarget != null ? ai.attackTarget : ai.targetPos; - if(flying && ai.attackTarget != null && ai.currentCommand().drawTarget){ + if(flying && ai.attackTarget != null && cmd.drawTarget){ Drawf.target(ai.attackTarget.getX(), ai.attackTarget.getY(), 6f, Pal.remove); } if(unit.isFlying() != flying) continue; //draw target line - if(ai.targetPos != null && ai.currentCommand().drawTarget){ + if(ai.targetPos != null && cmd.drawTarget){ Position lineDest = ai.attackTarget != null ? ai.attackTarget : ai.targetPos; Drawf.limitLine(unit, lineDest, unit.hitSize / unitSelectRadScl + 1f, lineLimit, color.write(Tmp.c1).a(alpha)); if(ai.attackTarget == null){ Drawf.square(lineDest.getX(), lineDest.getY(), 3.5f, color.write(Tmp.c1).a(alpha)); - if(ai.currentCommand() == UnitCommand.enterPayloadCommand){ + if(cmd == UnitCommand.enterPayloadCommand){ var build = world.buildWorld(lineDest.getX(), lineDest.getY()); if(build != null && build.block.acceptsUnitPayloads && build.team == unit.team){ Drawf.selected(build, color); + }else{ + Drawf.cross(lineDest.getX(), lineDest.getY(), 7f, Pal.remove); } } }