From bd4ae0639d7d28ffea3dec3824494b7d9f841a56 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 22 Jan 2024 16:41:43 -0500 Subject: [PATCH] Added allowRectanglePlacement for 1x1 blocks --- core/src/mindustry/input/InputHandler.java | 4 +++- core/src/mindustry/input/Placement.java | 16 ++++++++++++++++ core/src/mindustry/world/Block.java | 4 ++++ core/src/mindustry/world/Build.java | 8 ++++++++ .../mindustry/world/blocks/ConstructBlock.java | 10 +++++----- .../world/blocks/environment/Floor.java | 2 ++ .../world/blocks/environment/StaticWall.java | 2 ++ 7 files changed, 40 insertions(+), 6 deletions(-) diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 9472028766..3e17870597 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -1973,11 +1973,13 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ var end = world.build(endX, endY); if(diagonal && (block == null || block.allowDiagonal)){ if(block != null && start instanceof ChainedBuilding && end instanceof ChainedBuilding - && block.canReplace(end.block) && block.canReplace(start.block)){ + && block.canReplace(end.block) && block.canReplace(start.block)){ points = Placement.upgradeLine(startX, startY, endX, endY); }else{ points = Placement.pathfindLine(block != null && block.conveyorPlacement, startX, startY, endX, endY); } + }else if(block != null && block.size == 1 && block.allowRectanglePlacement){ + points = Placement.normalizeRectangle(startX, startY, endX, endY, block.size); }else{ points = Placement.normalizeLine(startX, startY, endX, endY); } diff --git a/core/src/mindustry/input/Placement.java b/core/src/mindustry/input/Placement.java index 09935e4e5c..d6c8b4a7c4 100644 --- a/core/src/mindustry/input/Placement.java +++ b/core/src/mindustry/input/Placement.java @@ -58,6 +58,22 @@ public class Placement{ return points; } + /** Normalize two points into a rectangle. */ + public static Seq normalizeRectangle(int startX, int startY, int endX, int endY, int blockSize){ + Pools.freeAll(points); + points.clear(); + + int minX = Math.min(startX, endX), minY = Math.min(startY, endY), maxX = Math.max(startX, endX), maxY = Math.max(startY, endY); + + for(int y = minY; y <= maxY; y += blockSize){ + for(int x = minX; x <= maxX; x += blockSize){ + points.add(Pools.obtain(Point2.class, Point2::new).set(x, y)); + } + } + + return points; + } + public static Seq upgradeLine(int startX, int startY, int endX, int endY){ closed.clear(); Pools.freeAll(points); diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index 60d6b63d19..cbbf969d1c 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -245,6 +245,8 @@ public class Block extends UnlockableContent implements Senseable{ public boolean allowDiagonal = true; /** Whether to swap the diagonal placement modes. */ public boolean swapDiagonalPlacement; + /** Whether to allow rectangular placement, as opposed to a line. Only supported for 1x1 blocks currently! */ + public boolean allowRectanglePlacement = false; /** Build queue priority in schematics. */ public int schematicPriority = 0; /** @@ -322,6 +324,8 @@ public class Block extends UnlockableContent implements Senseable{ public float deconstructThreshold = 0f; /** If true, this block deconstructs immediately. Instant deconstruction implies no resource refund. */ public boolean instantDeconstruct = false; + /** If true, this block constructs immediately. This implies no resource requirement, and ignores configs - do not use, this is for performance only! */ + public boolean instantBuild = false; /** Effect for placing the block. Passes size as rotation. */ public Effect placeEffect = Fx.placeBlock; /** Effect for breaking the block. Passes size as rotation. */ diff --git a/core/src/mindustry/world/Build.java b/core/src/mindustry/world/Build.java index 5ae2afb151..03a3db970b 100644 --- a/core/src/mindustry/world/Build.java +++ b/core/src/mindustry/world/Build.java @@ -122,6 +122,14 @@ public class Build{ } }); + //complete it immediately + if(result.instantBuild){ + Events.fire(new BlockBuildBeginEvent(tile, team, unit, false)); + result.placeBegan(tile, tile.block, unit); + ConstructBlock.constructFinish(tile, result, unit, (byte)rotation, team, null); + return; + } + Block previous = tile.block(); Block sub = ConstructBlock.get(result.size); var prevBuild = new Seq(9); diff --git a/core/src/mindustry/world/blocks/ConstructBlock.java b/core/src/mindustry/world/blocks/ConstructBlock.java index df459ae6d8..9e4ac3e719 100644 --- a/core/src/mindustry/world/blocks/ConstructBlock.java +++ b/core/src/mindustry/world/blocks/ConstructBlock.java @@ -83,7 +83,7 @@ public class ConstructBlock extends Block{ tile.setBlock(block, team, rotation); } - if(tile.build != null){ + if(tile.build != null && tile.build.block == block){ tile.build.health = block.health * healthf; if(config != null){ @@ -100,11 +100,11 @@ public class ConstructBlock extends Block{ //make sure block indexer knows it's damaged indexer.notifyHealthChanged(tile.build); - } - //last builder was this local client player, call placed() - if(tile.build != null && !headless && builder == player.unit()){ - tile.build.playerPlaced(config); + //last builder was this local client player, call placed() + if(!headless && builder == player.unit()){ + tile.build.playerPlaced(config); + } } if(fogControl.isVisibleTile(team, tile.x, tile.y)){ diff --git a/core/src/mindustry/world/blocks/environment/Floor.java b/core/src/mindustry/world/blocks/environment/Floor.java index 26631119e8..c1c839887b 100644 --- a/core/src/mindustry/world/blocks/environment/Floor.java +++ b/core/src/mindustry/world/blocks/environment/Floor.java @@ -90,6 +90,8 @@ public class Floor extends Block{ super(name); this.variants = variants; placeableLiquid = true; + allowRectanglePlacement = true; + instantBuild = true; } @Override diff --git a/core/src/mindustry/world/blocks/environment/StaticWall.java b/core/src/mindustry/world/blocks/environment/StaticWall.java index 464df26ec6..56fc569b24 100644 --- a/core/src/mindustry/world/blocks/environment/StaticWall.java +++ b/core/src/mindustry/world/blocks/environment/StaticWall.java @@ -20,6 +20,8 @@ public class StaticWall extends Prop{ solid = true; variants = 2; cacheLayer = CacheLayer.walls; + allowRectanglePlacement = true; + instantBuild = true; } @Override