diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index ec0ca247ad..70d7430557 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -575,6 +575,7 @@ info.title = Info error.title = [scarlet]An error has occured error.crashtitle = An error has occured unit.nobuild = [scarlet]Unit can't build +lastaccessed = [lightgray]Last Accessed: {0} blocks.input = Input blocks.output = Output blocks.booster = Booster diff --git a/core/src/mindustry/ai/types/SuicideAI.java b/core/src/mindustry/ai/types/SuicideAI.java index 789fb93f4b..2eae6e409f 100644 --- a/core/src/mindustry/ai/types/SuicideAI.java +++ b/core/src/mindustry/ai/types/SuicideAI.java @@ -28,7 +28,7 @@ public class SuicideAI extends GroundAI{ boolean rotate = false, shoot = false, moveToTarget = false; - if(!Units.invalidateTarget(target, unit, unit.range())){ + if(!Units.invalidateTarget(target, unit, unit.range()) && unit.hasWeapons()){ rotate = true; shoot = unit.within(target, unit.type().weapons.first().bullet.range() + (target instanceof Building ? ((Building)target).block.size * Vars.tilesize / 2f : ((Hitboxc)target).hitSize() / 2f)); @@ -38,7 +38,11 @@ public class SuicideAI extends GroundAI{ } //do not move toward walls or transport blocks - if(!(target instanceof Building build && (build.block.group == BlockGroup.walls || build.block.group == BlockGroup.liquids || build.block.group == BlockGroup.transportation))){ + if(!(target instanceof Building build && ( + build.block.group == BlockGroup.walls || + build.block.group == BlockGroup.liquids || + build.block.group == BlockGroup.transportation + ))){ blockedByBlock = false; //raycast for target diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 4f684b0d2b..51412a7ed2 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -994,7 +994,7 @@ public class Blocks implements ContentList{ router = new Router("router"){{ requirements(Category.distribution, with(Items.copper, 3)); - buildCostMultiplier = 2f; + buildCostMultiplier = 4f; }}; distributor = new Router("distributor"){{ diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index 3a6c0ea8f0..15d79a8942 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -57,6 +57,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, transient int rotation; transient boolean enabled = true; transient float enabledControlTime; + transient String lastAccessed; PowerModule power; ItemModule items; @@ -879,6 +880,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, //null is of type void.class; anonymous classes use their superclass. Class type = value == null ? void.class : value.getClass().isAnonymousClass() ? value.getClass().getSuperclass() : value.getClass(); + if(builder != null && builder.isPlayer()){ + lastAccessed = builder.getPlayer().name; + } + if(block.configurations.containsKey(type)){ block.configurations.get(type).get(this, value); } @@ -1043,6 +1048,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } } + if(net.active() && lastAccessed != null){ + table.row(); + table.add(Core.bundle.format("lastaccessed", lastAccessed)).growX().wrap().left(); + } + table.marginBottom(-5); } } diff --git a/core/src/mindustry/entities/comp/PayloadComp.java b/core/src/mindustry/entities/comp/PayloadComp.java index a27c7721be..ac1f4fa323 100644 --- a/core/src/mindustry/entities/comp/PayloadComp.java +++ b/core/src/mindustry/entities/comp/PayloadComp.java @@ -86,10 +86,10 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ return true; } - if(payload instanceof BuildPayload){ - return dropBlock((BuildPayload)payload); - }else if(payload instanceof UnitPayload){ - return dropUnit((UnitPayload)payload); + if(payload instanceof BuildPayload b){ + return dropBlock(b); + }else if(payload instanceof UnitPayload p){ + return dropUnit(p); } return false; } @@ -126,6 +126,8 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ int rot = (int)((rotation + 45f) / 90f) % 4; payload.place(on, rot); + if(isPlayer()) payload.build.lastAccessed = getPlayer().name; + Fx.unitDrop.at(tile); Fx.placeBlock.at(on.drawx(), on.drawy(), on.block().size); return true; diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 81fb2ff883..eebe40e15b 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -10,7 +10,6 @@ import arc.math.*; import arc.math.geom.*; import arc.scene.*; import arc.scene.event.*; -import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; @@ -257,7 +256,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } @Remote(targets = Loc.both, called = Loc.server, forward = true, unreliable = true) - public static void rotateBlock(Player player, Building tile, boolean direction){ + public static void rotateBlock(@Nullable Player player, Building tile, boolean direction){ if(tile == null) return; if(net.server() && (!Units.canInteract(player, tile) || @@ -265,6 +264,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ throw new ValidateException(player, "Player cannot rotate a block."); } + if(player != null) tile.lastAccessed = player.name; tile.rotation = Mathf.mod(tile.rotation + Mathf.sign(direction), 4); tile.updateProximity(); tile.noSleep(); diff --git a/core/src/mindustry/world/blocks/ConstructBlock.java b/core/src/mindustry/world/blocks/ConstructBlock.java index 8bd9a77c47..304ef07afa 100644 --- a/core/src/mindustry/world/blocks/ConstructBlock.java +++ b/core/src/mindustry/world/blocks/ConstructBlock.java @@ -58,7 +58,7 @@ public class ConstructBlock extends Block{ } @Remote(called = Loc.server) - public static void constructFinish(Tile tile, Block block, Unit builder, byte rotation, Team team, Object config){ + public static void constructFinish(Tile tile, Block block, @Nullable Unit builder, byte rotation, Team team, Object config){ if(tile == null) return; float healthf = tile.build == null ? 1f : tile.build.healthf(); @@ -76,6 +76,10 @@ public class ConstructBlock extends Block{ if(prev != null && prev.size > 0){ tile.build.overwrote(prev); } + + if(builder != null && builder.isPlayer()){ + tile.build.lastAccessed = builder.getPlayer().name; + } } //last builder was this local client player, call placed()