mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-02-06 08:57:45 +07:00
Added stances for payloads
This commit is contained in:
parent
f633fb0af5
commit
b6c28bc27d
@ -360,6 +360,9 @@ stance.holdfire = Stance: Hold Fire
|
||||
stance.pursuetarget = Stance: Pursue Target
|
||||
stance.patrol = Stance: Patrol Path
|
||||
stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding
|
||||
stance.loadPayload = Stance: Load Units
|
||||
stance.loadBlocks = Stance: Load Blocks
|
||||
stance.unloadPayload = Stance: Unload Payload
|
||||
openlink = Open Link
|
||||
copylink = Copy Link
|
||||
back = Back
|
||||
|
@ -31,14 +31,6 @@ public class UnitCommand{
|
||||
switchToMove = false;
|
||||
drawTarget = true;
|
||||
resetTarget = false;
|
||||
}},
|
||||
loadPayloadCommand = new UnitCommand("loadPayload", "download", u -> null){{
|
||||
switchToMove = false;
|
||||
drawTarget = true;
|
||||
}},
|
||||
unloadPayloadCommand = new UnitCommand("unloadPayload", "upload", u -> null){{
|
||||
switchToMove = false;
|
||||
drawTarget = true;
|
||||
}};
|
||||
|
||||
/** Unique ID number. */
|
||||
|
@ -16,7 +16,10 @@ public class UnitStance{
|
||||
holdFire = new UnitStance("holdfire", "none"),
|
||||
pursueTarget = new UnitStance("pursuetarget", "right"),
|
||||
patrol = new UnitStance("patrol", "refresh"),
|
||||
ram = new UnitStance("ram", "rightOpen");
|
||||
ram = new UnitStance("ram", "rightOpen"),
|
||||
loadPayload = new UnitStance("loadPayload", "download"),
|
||||
loadBlocks = new UnitStance("loadBlocks", "down"),
|
||||
unloadPayload = new UnitStance("unloadPayload", "upload");
|
||||
|
||||
/** Unique ID number. */
|
||||
public final int id;
|
||||
|
@ -11,6 +11,10 @@ import mindustry.entities.*;
|
||||
import mindustry.entities.units.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.blocks.payloads.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
public class CommandAI extends AIController{
|
||||
protected static final int maxCommandQueueSize = 50;
|
||||
@ -67,6 +71,7 @@ public class CommandAI extends AIController{
|
||||
//this should not be possible
|
||||
if(stance == UnitStance.stop) stance = UnitStance.shoot;
|
||||
|
||||
//pursue the target if relevant
|
||||
if(stance == UnitStance.pursueTarget && target != null && attackTarget == null && targetPos == null){
|
||||
commandTarget(target, false);
|
||||
}
|
||||
@ -107,6 +112,37 @@ public class CommandAI extends AIController{
|
||||
|
||||
public void defaultBehavior(){
|
||||
|
||||
if(!net.client() && unit instanceof Payloadc pay){
|
||||
//auto-drop everything
|
||||
if(stance == UnitStance.unloadPayload && pay.hasPayload()){
|
||||
Call.payloadDropped(unit, unit.x, unit.y);
|
||||
}
|
||||
|
||||
//try to pick up what's under it
|
||||
if(stance == UnitStance.loadPayload){
|
||||
Unit target = Units.closest(unit.team, unit.x, unit.y, unit.type.hitSize * 2f, u -> u.isAI() && u != unit && u.isGrounded() && pay.canPickup(u) && u.within(unit, u.hitSize + unit.hitSize));
|
||||
if(target != null){
|
||||
Call.pickedUnitPayload(unit, target);
|
||||
}
|
||||
}
|
||||
|
||||
//try to pick up a block
|
||||
if(stance == UnitStance.loadBlocks && (targetPos == null || unit.within(targetPos, 1f))){
|
||||
Building build = world.buildWorld(unit.x, unit.y);
|
||||
|
||||
if(build != null && state.teams.canInteract(unit.team, build.team)){
|
||||
//pick up block's payload
|
||||
Payload current = build.getPayload();
|
||||
if(current != null && pay.canPickupPayload(current)){
|
||||
Call.pickedBuildPayload(unit, build, false);
|
||||
//pick up whole building directly
|
||||
}else if(build.block.buildVisibility != BuildVisibility.hidden && build.canPickup() && pay.canPickup(build)){
|
||||
Call.pickedBuildPayload(unit, build, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//acquiring naval targets isn't supported yet, so use the fallback dumb AI
|
||||
if(unit.team.isAI() && unit.team.rules().rtsAi && unit.type.naval){
|
||||
if(fallback == null) fallback = new GroundAI();
|
||||
|
@ -333,7 +333,7 @@ public class Units{
|
||||
cdist = 0f;
|
||||
|
||||
nearby(team, x, y, range, e -> {
|
||||
if(!predicate.get(e)) return;
|
||||
if(!e.isValid() || !predicate.get(e)) return;
|
||||
|
||||
float dist = e.dst2(x, y);
|
||||
if(result == null || dist < cdist){
|
||||
@ -351,7 +351,7 @@ public class Units{
|
||||
cdist = 0f;
|
||||
|
||||
nearby(team, x, y, range, e -> {
|
||||
if(!predicate.get(e)) return;
|
||||
if(!e.isValid() || !predicate.get(e)) return;
|
||||
|
||||
float dist = sort.cost(e, x, y);
|
||||
if(result == null || dist < cdist){
|
||||
@ -370,7 +370,7 @@ public class Units{
|
||||
cdist = 0f;
|
||||
|
||||
nearby(team, x - range, y - range, range*2f, range*2f, e -> {
|
||||
if(!predicate.get(e)) return;
|
||||
if(!e.isValid() || !predicate.get(e)) return;
|
||||
|
||||
float dist = e.dst2(x, y);
|
||||
if(result == null || dist < cdist){
|
||||
|
@ -840,6 +840,9 @@ public class UnitType extends UnlockableContent implements Senseable{
|
||||
if(crushDamage > 0){
|
||||
seq.add(UnitStance.ram);
|
||||
}
|
||||
if(example instanceof Payloadc){
|
||||
seq.addAll(UnitStance.loadPayload, UnitStance.loadBlocks, UnitStance.unloadPayload);
|
||||
}
|
||||
stances = seq.toArray(UnitStance.class);
|
||||
}else{
|
||||
stances = new UnitStance[]{UnitStance.stop};
|
||||
|
Loading…
Reference in New Issue
Block a user