diff --git a/core/src/mindustry/entities/comp/BuilderComp.java b/core/src/mindustry/entities/comp/BuilderComp.java index a546637544..5b7afb3c9b 100644 --- a/core/src/mindustry/entities/comp/BuilderComp.java +++ b/core/src/mindustry/entities/comp/BuilderComp.java @@ -81,12 +81,12 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{ boolean hasAll = infinite || !Structs.contains(current.block.requirements, i -> core != null && !core.items.has(i.item)); if(hasAll){ - Call.beginPlace(current.block, team, current.x, current.y, current.rotation); + Call.beginPlace(self(), current.block, team, current.x, current.y, current.rotation); }else{ current.stuck = true; } }else if(!current.initialized && current.breaking && Build.validBreak(team, current.x, current.y)){ - Call.beginBreak(team, current.x, current.y); + Call.beginBreak(self(), team, current.x, current.y); }else{ plans.removeFirst(); return; diff --git a/core/src/mindustry/world/Build.java b/core/src/mindustry/world/Build.java index 70e6bb653b..2ea4478655 100644 --- a/core/src/mindustry/world/Build.java +++ b/core/src/mindustry/world/Build.java @@ -20,7 +20,7 @@ public class Build{ private static final IntSet tmp = new IntSet(); @Remote(called = Loc.server) - public static void beginBreak(Team team, int x, int y){ + public static void beginBreak(@Nullable Unit unit, Team team, int x, int y){ if(!validBreak(team, x, y)){ return; } @@ -40,14 +40,14 @@ public class Build{ tile.setBlock(sub, team, rotation); tile.bc().setDeconstruct(previous); tile.build.health = tile.build.maxHealth * prevPercent; - + if(unit != null && unit.isPlayer()) tile.build.lastAccessed = unit.getPlayer().name; Core.app.post(() -> Events.fire(new BlockBuildBeginEvent(tile, team, true))); } /** Places a ConstructBlock at this location. */ @Remote(called = Loc.server) - public static void beginPlace(Block result, Team team, int x, int y, int rotation){ + public static void beginPlace(@Nullable Unit unit, Block result, Team team, int x, int y, int rotation){ if(!validPlace(result, team, x, y, rotation)){ return; } @@ -57,6 +57,15 @@ public class Build{ //just in case if(tile == null) return; + //auto-rotate the block to the correct orientation and bail out + if(tile.team() == team && tile.block == result && tile.build != null){ + if(unit != null && unit.isPlayer()) tile.build.lastAccessed = unit.getPlayer().name; + tile.build.rotation = Mathf.mod(rotation, 4); + tile.build.updateProximity(); + tile.build.noSleep(); + return; + } + Block previous = tile.block(); Block sub = ConstructBlock.get(result.size); Seq prevBuild = new Seq<>(9); @@ -76,6 +85,7 @@ public class Build{ build.setConstruct(previous.size == sub.size ? previous : Blocks.air, result); build.prevBuild = prevBuild; + if(unit != null && unit.isPlayer()) build.lastAccessed = unit.getPlayer().name; result.placeBegan(tile, previous);