diff --git a/core/src/mindustry/ai/types/LogicAI.java b/core/src/mindustry/ai/types/LogicAI.java index 06a319e446..2aec41a15d 100644 --- a/core/src/mindustry/ai/types/LogicAI.java +++ b/core/src/mindustry/ai/types/LogicAI.java @@ -22,6 +22,7 @@ public class LogicAI extends AIController{ public float moveX, moveY, moveRad; public float itemTimer, controlTimer = logicControlTimeout, targetTimer; public Building controller; + public BuildPlan plan = new BuildPlan(); //special cache for instruction to store data public ObjectMap execCache = new ObjectMap<>(); @@ -90,6 +91,11 @@ public class LogicAI extends AIController{ } } } + case stop -> { + if(unit instanceof Builderc build){ + build.clearBuilding(); + } + } } if(unit.type().canBoost && !unit.type().flying){ diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index b4b9cd038e..eec8683b8a 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1119,7 +1119,7 @@ public class Blocks implements ContentList{ requirements(Category.power, with(Items.titanium, 7, Items.lead, 10, Items.silicon, 15, Items.surgealloy, 15)); size = 2; maxNodes = 2; - laserRange = 30f; + laserRange = 40f; }}; diode = new PowerDiode("diode"){{ diff --git a/core/src/mindustry/entities/comp/BuilderComp.java b/core/src/mindustry/entities/comp/BuilderComp.java index ccc83e87d8..9d4d4c1bb9 100644 --- a/core/src/mindustry/entities/comp/BuilderComp.java +++ b/core/src/mindustry/entities/comp/BuilderComp.java @@ -208,7 +208,7 @@ abstract class BuilderComp implements Unitc{ BuildPlan plan = buildPlan(); Tile tile = world.tile(plan.x, plan.y); - if(dst(tile) > buildingRange && !state.isEditor()){ + if((dst(tile) > buildingRange && !state.isEditor()) || !plan.initialized){ return; } diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index 92a8026708..69295a9e0d 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -1247,7 +1247,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return switch(sensor){ case type -> block; case firstItem -> items == null ? null : items.first(); - case name -> block.name; + case config -> block.configurations.containsKey(Item.class) || block.configurations.containsKey(Liquid.class) ? config() : null; default -> noSensed; }; diff --git a/core/src/mindustry/entities/comp/MinerComp.java b/core/src/mindustry/entities/comp/MinerComp.java index 41e4994181..6bac9dbd60 100644 --- a/core/src/mindustry/entities/comp/MinerComp.java +++ b/core/src/mindustry/entities/comp/MinerComp.java @@ -35,6 +35,11 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc, Unitc{ return mineTile != null && !(((Object)this) instanceof Builderc && ((Builderc)(Object)this).activelyBuilding()); } + public boolean validMine(Tile tile){ + return !(tile == null || tile.block() != Blocks.air || !within(tile.worldx(), tile.worldy(), miningRange) + || tile.drop() == null || !canMine(tile.drop())); + } + @Override public void update(){ Building core = closestCore(); @@ -49,8 +54,7 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc, Unitc{ } } - if(mineTile == null || core == null || mineTile.block() != Blocks.air || dst(mineTile.worldx(), mineTile.worldy()) > miningRange - || mineTile.drop() == null || !canMine(mineTile.drop())){ + if(core == null || !validMine(mineTile)){ mineTile = null; mineTimer = 0f; }else if(mining()){ diff --git a/core/src/mindustry/entities/comp/UnitComp.java b/core/src/mindustry/entities/comp/UnitComp.java index 6291109f51..3e912fce88 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -104,7 +104,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I public Object senseObject(LAccess sensor){ return switch(sensor){ case type -> type; - case name -> controller instanceof Player p ? p.name : type.name; + case name -> controller instanceof Player p ? p.name : null; case firstItem -> stack().amount == 0 ? null : item(); default -> noSensed; }; diff --git a/core/src/mindustry/logic/LAccess.java b/core/src/mindustry/logic/LAccess.java index 4cb1563ad7..1ff9e808a5 100644 --- a/core/src/mindustry/logic/LAccess.java +++ b/core/src/mindustry/logic/LAccess.java @@ -29,6 +29,7 @@ public enum LAccess{ type, flag, name, + config, //values with parameters are considered controllable enabled("to"), //"to" is standard for single parameter access diff --git a/core/src/mindustry/logic/LAssembler.java b/core/src/mindustry/logic/LAssembler.java index bd3690110b..e355416427 100644 --- a/core/src/mindustry/logic/LAssembler.java +++ b/core/src/mindustry/logic/LAssembler.java @@ -4,6 +4,7 @@ import arc.func.*; import arc.struct.*; import arc.util.*; import mindustry.*; +import mindustry.content.*; import mindustry.gen.*; import mindustry.logic.LExecutor.*; import mindustry.logic.LStatements.*; @@ -51,6 +52,8 @@ public class LAssembler{ } } + putConst("@air", Blocks.air); + for(UnitType type : Vars.content.units()){ putConst("@" + type.name, type); } diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 3473a1a7e9..f0752b49df 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -330,6 +330,16 @@ public class LExecutor{ if(type == LUnitControl.approach){ ai.moveRad = exec.numf(p3); } + + //stop mining/building + if(type == LUnitControl.stop){ + if(unit instanceof Minerc miner){ + miner.mineTile(null); + } + if(unit instanceof Builderc build){ + build.clearBuilding(); + } + } } case within -> { exec.setnum(p4, unit.within(exec.numf(p1), exec.numf(p2), exec.numf(p3)) ? 1 : 0); @@ -357,10 +367,38 @@ public class LExecutor{ case mine -> { Tile tile = world.tileWorld(exec.numf(p1), exec.numf(p2)); if(unit instanceof Minerc miner){ - miner.mineTile(tile); - if(tile != null && (!unit.acceptsItem(tile.drop()) || !miner.canMine(tile.drop()))){ - miner.mineTile(null); + miner.mineTile(miner.validMine(tile) ? tile : null); + } + } + case build -> { + if(unit instanceof Builderc builder && exec.obj(p3) instanceof Block block){ + int x = world.toTile(exec.numf(p1)), y = world.toTile(exec.numf(p2)); + int rot = exec.numi(p4); + + //reset state if: + // + if(ai.plan.x != x || ai.plan.y != y || ai.plan.block != block || builder.plans().isEmpty()){ + ai.plan.progress = 0; + ai.plan.initialized = false; + ai.plan.stuck = false; } + + ai.plan.set(x, y, rot, block); + ai.plan.config = null; + + builder.clearBuilding(); + builder.updateBuilding(true); + builder.addBuild(ai.plan); + } + } + case getBlock -> { + float x = exec.numf(p1), y = exec.numf(p2); + if(unit.within(x, y, unit.range())){ + exec.setobj(p3, null); + }else{ + Tile tile = world.tileWorld(x, y); + Block block = tile == null || !tile.synthetic() ? null : tile.block(); + exec.setobj(p3, block); } } case itemDrop -> { diff --git a/core/src/mindustry/logic/LUnitControl.java b/core/src/mindustry/logic/LUnitControl.java index 755dd34b37..2273fe0575 100644 --- a/core/src/mindustry/logic/LUnitControl.java +++ b/core/src/mindustry/logic/LUnitControl.java @@ -12,6 +12,8 @@ public enum LUnitControl{ itemTake("from", "item", "amount"), mine("x", "y"), flag("value"), + build("x", "y", "block", "rotation"), + getBlock("x", "y", "result"), within("x", "y", "radius", "result"); public final String[] params;