Automatic retreat AI for builders/repair units
This commit is contained in:
@@ -13,9 +13,12 @@ import mindustry.world.blocks.ConstructBlock.*;
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
public class BuilderAI extends AIController{
|
||||
float buildRadius = 1500;
|
||||
public static float buildRadius = 1500, retreatDst = 110f, fleeRange = 370f, retreatDelay = Time.toSeconds * 2f;
|
||||
|
||||
boolean found = false;
|
||||
@Nullable Unit following;
|
||||
@Nullable Teamc enemy;
|
||||
float retreatTimer;
|
||||
|
||||
@Override
|
||||
public void updateMovement(){
|
||||
@@ -27,6 +30,7 @@ public class BuilderAI extends AIController{
|
||||
unit.updateBuilding = true;
|
||||
|
||||
if(following != null){
|
||||
retreatTimer = 0f;
|
||||
//try to follow and mimic someone
|
||||
|
||||
//validate follower
|
||||
@@ -39,9 +43,25 @@ public class BuilderAI extends AIController{
|
||||
//set to follower's first build plan, whatever that is
|
||||
unit.plans.clear();
|
||||
unit.plans.addFirst(following.buildPlan());
|
||||
}else if(unit.buildPlan() == null){
|
||||
//not following anyone or building
|
||||
if(timer.get(timerTarget4, 40)){
|
||||
enemy = target(unit.x, unit.y, fleeRange, true, true);
|
||||
}
|
||||
|
||||
//fly away from enemy when not doing anything, but only after a delay
|
||||
if((retreatTimer += Time.delta) >= retreatDelay){
|
||||
if(enemy != null){
|
||||
var core = unit.closestCore();
|
||||
if(!unit.within(core, retreatDst)){
|
||||
moveTo(core, retreatDst);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(unit.buildPlan() != null){
|
||||
retreatTimer = 0f;
|
||||
//approach request if building
|
||||
BuildPlan req = unit.buildPlan();
|
||||
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
package mindustry.ai.types;
|
||||
|
||||
import arc.util.*;
|
||||
import mindustry.entities.*;
|
||||
import mindustry.entities.units.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.world.blocks.ConstructBlock.*;
|
||||
|
||||
public class RepairAI extends AIController{
|
||||
public static float retreatDst = 160f, fleeRange = 310f, retreatDelay = Time.toSeconds * 3f;
|
||||
|
||||
@Nullable Teamc avoid;
|
||||
float retreatTimer;
|
||||
|
||||
@Override
|
||||
protected void updateMovement(){
|
||||
@@ -29,6 +34,25 @@ public class RepairAI extends AIController{
|
||||
|
||||
unit.lookAt(target);
|
||||
}
|
||||
|
||||
//not repairing
|
||||
if(!(target instanceof Building)){
|
||||
if(timer.get(timerTarget4, 40)){
|
||||
avoid = target(unit.x, unit.y, fleeRange, true, true);
|
||||
}
|
||||
|
||||
if((retreatTimer += Time.delta) >= retreatDelay){
|
||||
//fly away from enemy when not doing anything
|
||||
if(avoid != null){
|
||||
var core = unit.closestCore();
|
||||
if(!unit.within(core, retreatDst)){
|
||||
moveTo(core, retreatDst);
|
||||
}
|
||||
}
|
||||
}
|
||||
}else{
|
||||
retreatTimer = 0f;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -15,7 +15,7 @@ import static mindustry.Vars.*;
|
||||
|
||||
public class AIController implements UnitController{
|
||||
protected static final Vec2 vec = new Vec2();
|
||||
protected static final int timerTarget = 0, timerTarget2 = 1, timerTarget3 = 2;
|
||||
protected static final int timerTarget = 0, timerTarget2 = 1, timerTarget3 = 2, timerTarget4 = 2;
|
||||
|
||||
protected Unit unit;
|
||||
protected Interval timer = new Interval(4);
|
||||
|
||||
Reference in New Issue
Block a user