From b6c28bc27deaff0fa8d139aa7ebec70e55e7ed36 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 22 Sep 2023 18:22:19 -0400 Subject: [PATCH] Added stances for payloads --- core/assets/bundles/bundle.properties | 3 ++ core/src/mindustry/ai/UnitCommand.java | 8 ----- core/src/mindustry/ai/UnitStance.java | 5 ++- core/src/mindustry/ai/types/CommandAI.java | 36 ++++++++++++++++++++++ core/src/mindustry/entities/Units.java | 6 ++-- core/src/mindustry/type/UnitType.java | 3 ++ 6 files changed, 49 insertions(+), 12 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 0987cf2ad7..9291a3bbe2 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -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 diff --git a/core/src/mindustry/ai/UnitCommand.java b/core/src/mindustry/ai/UnitCommand.java index a49078bfa6..20cec778bd 100644 --- a/core/src/mindustry/ai/UnitCommand.java +++ b/core/src/mindustry/ai/UnitCommand.java @@ -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. */ diff --git a/core/src/mindustry/ai/UnitStance.java b/core/src/mindustry/ai/UnitStance.java index 5f955c6762..53153b87db 100644 --- a/core/src/mindustry/ai/UnitStance.java +++ b/core/src/mindustry/ai/UnitStance.java @@ -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; diff --git a/core/src/mindustry/ai/types/CommandAI.java b/core/src/mindustry/ai/types/CommandAI.java index 350dc79870..d26a2b7d29 100644 --- a/core/src/mindustry/ai/types/CommandAI.java +++ b/core/src/mindustry/ai/types/CommandAI.java @@ -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(); diff --git a/core/src/mindustry/entities/Units.java b/core/src/mindustry/entities/Units.java index e819482846..d3d3d00a4f 100644 --- a/core/src/mindustry/entities/Units.java +++ b/core/src/mindustry/entities/Units.java @@ -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){ diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 21454ed87c..e8a01694c5 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -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};