diff --git a/src/omaloon/ai/drone/UtilityDroneAI.java b/src/omaloon/ai/drone/UtilityDroneAI.java index 10feba6f..b197da3f 100644 --- a/src/omaloon/ai/drone/UtilityDroneAI.java +++ b/src/omaloon/ai/drone/UtilityDroneAI.java @@ -1,135 +1,134 @@ package omaloon.ai.drone; import arc.graphics.g2d.*; -import arc.struct.Queue; -import arc.util.Time; -import arc.util.Tmp; +import arc.struct.*; +import arc.util.*; import arclibrary.graphics.*; import mindustry.*; -import mindustry.content.Fx; -import mindustry.entities.units.BuildPlan; -import mindustry.gen.Call; -import mindustry.gen.Unit; +import mindustry.content.*; +import mindustry.entities.units.*; +import mindustry.gen.*; import mindustry.graphics.*; -import mindustry.type.Item; import mindustry.ui.*; -import mindustry.world.Tile; -import mindustry.world.blocks.ConstructBlock; +import mindustry.world.*; +import mindustry.world.blocks.*; import mindustry.world.blocks.ConstructBlock.*; -import mindustry.world.blocks.storage.CoreBlock; -import ol.gen.OlCall; -import omaloon.ai.DroneAI; +import mindustry.world.blocks.storage.*; +import ol.gen.*; +import omaloon.ai.*; import omaloon.utils.*; -import static mindustry.Vars.mineTransferRange; +import static mindustry.Vars.*; -public class UtilityDroneAI extends DroneAI { +public class UtilityDroneAI extends DroneAI{ public float mineRangeScl = 0.75f; public float buildRangeScl = 0.75f; - public float buildRangeSclInv =1-buildRangeScl; + public float buildRangeSclInv = 1 - buildRangeScl; - public UtilityDroneAI(Unit owner) { + public UtilityDroneAI(Unit owner){ super(owner); } + private static float rangeOrInfinite(float buildRange){ + return state.rules.infiniteResources ? Float.MAX_VALUE : buildRange; + } + @Override - public void updateMovement() { + public void updateMovement(){ unit.updateBuilding = false; unit.mineTile = null; tryTransportItems(); - if (tryBuild()) return; - if (tryMine()) return; + if(tryBuild()) return; + if(tryMine()) return; rally(); } - private void tryTransportItems() { - if (unit.stack.amount <= 0) return; + private void tryTransportItems(){ + if(unit.stack.amount <= 0) return; CoreBlock.CoreBuild core = unit.closestCore(); - if (core != null && !unit.within(core, owner.type.range)) { + if(core != null && !unit.within(core, owner.type.range)){ core = owner.closestCore(); - if(owner.within(core,mineTransferRange)){ - OlCall.chainTransfer(unit.stack.item,unit.x,unit.y,owner,core); + if(owner.within(core, mineTransferRange)){ + OlCall.chainTransfer(unit.stack.item, unit.x, unit.y, owner, core); }else{ - for (int i = 0; i < unit.stack.amount; i++) { + for(int i = 0; i < unit.stack.amount; i++){ Call.transferItemToUnit(unit.stack.item, unit.x, unit.y, owner); } } - } else { + }else{ Call.transferItemTo(unit, unit.stack.item, unit.stack.amount, unit.x, unit.y, core); } unit.clearItem(); } - private boolean tryBuild() { + private boolean tryBuild(){ Queue prev = unit.plans; prev.clear(); Queue plans = owner.plans; - if (plans.isEmpty()) return false; - if (!owner.updateBuilding) return false; + if(plans.isEmpty()) return false; + if(!owner.updateBuilding) return false; CoreBlock.CoreBuild core = unit.team.core(); int totalSkipped = 0; if(DebugDraw.isDraw()){ - DrawText.defaultFont= Fonts.def; - DebugDraw.request(()->{ - Draw.draw(Layer.end,()->{ + DrawText.defaultFont = Fonts.def; + DebugDraw.request(() -> { + Draw.draw(Layer.end, () -> { Draw.color(Pal.heal); - Lines.circle(owner.x,owner.y,owner.type.buildRange); + Lines.circle(owner.x, owner.y, owner.type.buildRange); Draw.color(Pal.berylShot); - Lines.circle(unit.x,unit.y,unit.type.buildRange); - EFill.polyCircle(unit.x,unit.y, Vars.tilesize/4f); + Lines.circle(unit.x, unit.y, unit.type.buildRange); + EFill.polyCircle(unit.x, unit.y, Vars.tilesize / 4f); }); }); for(int i = 0; i < plans.size; i++){ BuildPlan plan = plans.get(i); int i1 = i; - DebugDraw.request(()->{ - Draw.draw(Layer.end,()->{ - DrawText.drawText(plan,""+i1); + DebugDraw.request(() -> { + Draw.draw(Layer.end, () -> { + DrawText.drawText(plan, "" + i1); }); }); } } + final float ownerRange = rangeOrInfinite(owner.type.buildRange); //IMPORTANT unit.plans.size must be 0 - for (int i = 0; i < plans.size; i++) { + for(int i = 0; i < plans.size; i++){ BuildPlan buildPlan = plans.first(); - - if (!unit.shouldSkip(buildPlan, core) && owner.within(buildPlan, owner.type.buildRange)) { -// moveTo(buildPlan.tile(), unit.type.buildRange * buildRangeScl, 30f); + if(!unit.shouldSkip(buildPlan, core) && owner.within(buildPlan, ownerRange)) break; - } plans.removeFirst(); - Fx.fireSmoke.at(buildPlan); - if(buildPlan.stuck){ -// Fx.heal.at(); - } + if(DebugDraw.isDraw()) Fx.fireSmoke.at(buildPlan); plans.addLast(buildPlan); totalSkipped++; } - var currentPlan=plans.first(); + var currentPlan = plans.first(); + - boolean withinOwner= owner.within(currentPlan,owner.type.buildRange); - boolean isConstructing =withinOwner && currentPlan.tile().build instanceof ConstructBuild; - if (totalSkipped == plans.size && !isConstructing) + boolean withinOwner = owner.within(currentPlan, ownerRange); + boolean isConstructing = withinOwner && currentPlan.tile().build instanceof ConstructBuild; + if(totalSkipped == plans.size && !isConstructing) return false; - float myRange = unit.type.buildRange; - moveTo(currentPlan.tile(), myRange * buildRangeScl, 30f); - if(!unit.within(currentPlan, myRange - myRange * buildRangeSclInv / 2)) - return true; + if(!state.rules.infiniteResources){ + float myRange = unit.type.buildRange; + moveTo(currentPlan.tile(), myRange * buildRangeScl, 30f); + if(!unit.within(currentPlan, myRange - Math.min(tilesize * 1.5f, myRange * buildRangeSclInv / 2))) + return true; + } unit.plans = plans; unit.updateBuilding = true; unit.updateBuildLogic(); unit.lookAt(currentPlan); - for (BuildPlan plan : plans) { - if (plan.tile().build instanceof ConstructBlock.ConstructBuild it) { - if (it.progress > 0 && !plan.initialized) { + for(BuildPlan plan : plans){ + if(plan.tile().build instanceof ConstructBlock.ConstructBuild it){ + if(it.progress > 0 && !plan.initialized){ plan.initialized = true; } } @@ -139,15 +138,15 @@ private boolean tryBuild() { return true; } - protected boolean tryMine() { + protected boolean tryMine(){ Tile mineTile = owner.mineTile(); - if (mineTile == null) return false; - if (owner.stack.amount == owner.type.itemCapacity) return false; - if ((owner.getMineResult(owner.mineTile) != owner.stack.item || owner.stack.amount <= 0) && (owner.stack.amount != 0)) + if(mineTile == null) return false; + if(owner.stack.amount == owner.type.itemCapacity) return false; + if((owner.getMineResult(owner.mineTile) != owner.stack.item || owner.stack.amount <= 0) && (owner.stack.amount != 0)) return false; - if (!owner.within(mineTile.worldx(), mineTile.worldy(), owner.type.mineRange)) return false; + if(!owner.within(mineTile.worldx(), mineTile.worldy(), owner.type.mineRange)) return false; unit.mineTile = owner.mineTile; moveTo(Tmp.v1.set(mineTile.worldx(), mineTile.worldy()), unit.type.mineRange * mineRangeScl, 30f); return true;