Merged Unit & Builder components / Cleanup
This commit is contained in:
@@ -14,21 +14,20 @@ import static mindustry.Vars.*;
|
||||
public class BuilderAI extends AIController{
|
||||
float buildRadius = 1500;
|
||||
boolean found = false;
|
||||
@Nullable Builderc following;
|
||||
@Nullable Unit following;
|
||||
|
||||
@Override
|
||||
public void updateMovement(){
|
||||
Builderc builder = (Builderc)unit;
|
||||
|
||||
if(builder.moving()){
|
||||
builder.lookAt(builder.vel().angle());
|
||||
if(unit.moving()){
|
||||
unit.lookAt(unit.vel.angle());
|
||||
}
|
||||
|
||||
if(target != null && shouldShoot()){
|
||||
unit.lookAt(target);
|
||||
}
|
||||
|
||||
builder.updateBuilding(true);
|
||||
unit.updateBuilding = true;
|
||||
|
||||
if(following != null){
|
||||
//try to follow and mimic someone
|
||||
@@ -36,18 +35,18 @@ public class BuilderAI extends AIController{
|
||||
//validate follower
|
||||
if(!following.isValid() || !following.activelyBuilding()){
|
||||
following = null;
|
||||
builder.plans().clear();
|
||||
unit.plans.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
//set to follower's first build plan, whatever that is
|
||||
builder.plans().clear();
|
||||
builder.plans().addFirst(following.buildPlan());
|
||||
unit.plans.clear();
|
||||
unit.plans.addFirst(following.buildPlan());
|
||||
}
|
||||
|
||||
if(builder.buildPlan() != null){
|
||||
if(unit.buildPlan() != null){
|
||||
//approach request if building
|
||||
BuildPlan req = builder.buildPlan();
|
||||
BuildPlan req = unit.buildPlan();
|
||||
|
||||
boolean valid =
|
||||
(req.tile().build instanceof ConstructBuild && req.tile().<ConstructBuild>bc().cblock == req.block) ||
|
||||
@@ -60,7 +59,7 @@ public class BuilderAI extends AIController{
|
||||
moveTo(req.tile(), buildingRange - 20f);
|
||||
}else{
|
||||
//discard invalid request
|
||||
builder.plans().removeFirst();
|
||||
unit.plans.removeFirst();
|
||||
}
|
||||
}else{
|
||||
|
||||
@@ -71,8 +70,8 @@ public class BuilderAI extends AIController{
|
||||
Units.nearby(unit.team, unit.x, unit.y, buildRadius, u -> {
|
||||
if(found) return;
|
||||
|
||||
if(u instanceof Builderc b && u != unit && b.activelyBuilding()){
|
||||
BuildPlan plan = b.buildPlan();
|
||||
if(u.canBuild() && u != unit && u.activelyBuilding()){
|
||||
BuildPlan plan = u.buildPlan();
|
||||
|
||||
Building build = world.build(plan.x, plan.y);
|
||||
if(build instanceof ConstructBuild cons){
|
||||
@@ -80,7 +79,7 @@ public class BuilderAI extends AIController{
|
||||
|
||||
//make sure you can reach the request in time
|
||||
if(dist / unit.speed() < cons.buildCost * 0.9f){
|
||||
following = b;
|
||||
following = u;
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
@@ -98,7 +97,7 @@ public class BuilderAI extends AIController{
|
||||
blocks.removeFirst();
|
||||
}else if(Build.validPlace(content.block(block.block), unit.team(), block.x, block.y, block.rotation)){ //it's valid.
|
||||
//add build request.
|
||||
builder.addBuild(new BuildPlan(block.x, block.y, block.rotation, content.block(block.block), block.config));
|
||||
unit.addBuild(new BuildPlan(block.x, block.y, block.rotation, content.block(block.block), block.config));
|
||||
//shift build plan to tail so next unit builds something else.
|
||||
blocks.addLast(blocks.removeFirst());
|
||||
}else{
|
||||
|
||||
@@ -59,13 +59,13 @@ public class FormationAI extends AIController implements FormationMember{
|
||||
unit.moveAt(realtarget.sub(unit).limit(speed));
|
||||
}
|
||||
|
||||
if(unit instanceof Minerc mine && leader instanceof Minerc com){
|
||||
if(com.mineTile() != null && mine.validMine(com.mineTile())){
|
||||
mine.mineTile(com.mineTile());
|
||||
if(unit.canMine() && leader.canMine()){
|
||||
if(leader.mineTile != null && unit.validMine(leader.mineTile)){
|
||||
unit.mineTile(leader.mineTile);
|
||||
|
||||
CoreBuild core = unit.team.core();
|
||||
|
||||
if(core != null && com.mineTile().drop() != null && unit.within(core, unit.type.range) && !unit.acceptsItem(com.mineTile().drop())){
|
||||
if(core != null && leader.mineTile.drop() != null && unit.within(core, unit.type.range) && !unit.acceptsItem(leader.mineTile.drop())){
|
||||
if(core.acceptStack(unit.stack.item, unit.stack.amount, unit) > 0){
|
||||
Call.transferItemTo(unit.stack.item, unit.stack.amount, unit.x, unit.y, core);
|
||||
|
||||
@@ -73,13 +73,13 @@ public class FormationAI extends AIController implements FormationMember{
|
||||
}
|
||||
}
|
||||
}else{
|
||||
mine.mineTile(null);
|
||||
unit.mineTile(null);
|
||||
}
|
||||
}
|
||||
|
||||
if(unit instanceof Builderc build && leader instanceof Builderc com && com.activelyBuilding()){
|
||||
build.clearBuilding();
|
||||
build.addBuild(com.buildPlan());
|
||||
if(unit.canBuild() && leader.canBuild() && leader.activelyBuilding()){
|
||||
unit.clearBuilding();
|
||||
leader.addBuild(unit.buildPlan());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -92,9 +92,7 @@ public class LogicAI extends AIController{
|
||||
}
|
||||
}
|
||||
case stop -> {
|
||||
if(unit instanceof Builderc build){
|
||||
build.clearBuilding();
|
||||
}
|
||||
unit.clearBuilding();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,21 +17,21 @@ public class MinerAI extends AIController{
|
||||
protected void updateMovement(){
|
||||
Building core = unit.closestCore();
|
||||
|
||||
if(!(unit instanceof Minerc miner) || core == null) return;
|
||||
if(!(unit.canMine()) || core == null) return;
|
||||
|
||||
if(miner.mineTile() != null && !miner.mineTile().within(unit, unit.type.range)){
|
||||
miner.mineTile(null);
|
||||
if(unit.mineTile != null && !unit.mineTile.within(unit, unit.type.range)){
|
||||
unit.mineTile(null);
|
||||
}
|
||||
|
||||
if(mining){
|
||||
if(timer.get(timerTarget2, 60 * 4) || targetItem == null){
|
||||
targetItem = unit.team.data().mineItems.min(i -> indexer.hasOre(i) && miner.canMine(i), i -> core.items.get(i));
|
||||
targetItem = unit.team.data().mineItems.min(i -> indexer.hasOre(i) && unit.canMine(i), i -> core.items.get(i));
|
||||
}
|
||||
|
||||
//core full of the target item, do nothing
|
||||
if(targetItem != null && core.acceptStack(targetItem, 1, unit) == 0){
|
||||
unit.clearItem();
|
||||
miner.mineTile(null);
|
||||
unit.mineTile(null);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ public class MinerAI extends AIController{
|
||||
moveTo(ore, unit.type.range / 2f, 20f);
|
||||
|
||||
if(unit.within(ore, unit.type.range)){
|
||||
miner.mineTile(ore);
|
||||
unit.mineTile = ore;
|
||||
}
|
||||
|
||||
if(ore.block() != Blocks.air){
|
||||
@@ -56,7 +56,7 @@ public class MinerAI extends AIController{
|
||||
}
|
||||
}
|
||||
}else{
|
||||
miner.mineTile(null);
|
||||
unit.mineTile = null;
|
||||
|
||||
if(unit.stack.amount == 0){
|
||||
mining = true;
|
||||
|
||||
Reference in New Issue
Block a user