Unit pathfinding

This commit is contained in:
Anuken
2022-02-09 17:13:02 -05:00
parent a24a94d0b0
commit fa79c5e93a
23 changed files with 841 additions and 151 deletions

View File

@@ -14,7 +14,6 @@ import arc.scene.ui.layout.*;
import arc.util.*;
import mindustry.*;
import mindustry.ai.types.*;
import mindustry.content.*;
import mindustry.core.*;
import mindustry.entities.units.*;
import mindustry.game.EventType.*;
@@ -122,14 +121,19 @@ public class DesktopInput extends InputHandler{
CommandAI ai = (CommandAI)unit.controller();
//draw target line
if(ai.targetPos != null){
Tmp.v1.set(ai.targetPos).sub(unit).setLength(unit.hitSize / 2f);
Position lineDest = ai.attackTarget != null ? ai.attackTarget : ai.targetPos;
Drawf.line(Pal.accent, unit.x + Tmp.v1.x, unit.y + Tmp.v1.y, ai.targetPos.x, ai.targetPos.y);
Tmp.v1.set(lineDest).sub(unit).setLength(unit.hitSize / 2f);
Drawf.line(Pal.accent, unit.x + Tmp.v1.x, unit.y + Tmp.v1.y, lineDest.getX(), lineDest.getY());
}
Drawf.square(unit.x, unit.y, unit.hitSize / 1.4f + 1f);
}
if(ai.attackTarget != null){
Drawf.target(ai.attackTarget.getX(), ai.attackTarget.getY(), 6f, Pal.remove);
}
}
if(commandMode && !commandRect){
Unit sel = selectedCommandUnit(input.mouseWorldX(), input.mouseWorldY());
@@ -689,29 +693,20 @@ public class DesktopInput extends InputHandler{
}
}else if(selectedUnits.size > 0){
//move to location - TODO right click instead?
//TODO all this needs to be synced, done with packets, etc
Vec2 target = input.mouseWorld().cpy();
Teamc build = world.buildWorld(target.x, target.y);
Teamc attack = world.buildWorld(target.x, target.y);
if(build == null || build.team() == player.team()){
build = selectedEnemyUnit(target.x, target.y);
if(attack == null || attack.team() == player.team()){
attack = selectedEnemyUnit(target.x, target.y);
}
if(build != null && build.team() != player.team()){
for(var sel : selectedUnits){
((CommandAI)sel.controller()).commandTarget(build);
}
Fx.attackCommand.at(build);
}else{
for(var sel : selectedUnits){
((CommandAI)sel.controller()).commandPosition(target);
}
Fx.moveCommand.at(target);
int[] ids = new int[selectedUnits.size];
for(int i = 0; i < ids.length; i++){
ids[i] = selectedUnits.get(i).id;
}
Call.commandUnits(player, ids, attack instanceof Building b ? b : null, attack instanceof Unit u ? u : null, target);
}

View File

@@ -14,6 +14,7 @@ import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.*;
import mindustry.ai.formations.patterns.*;
import mindustry.ai.types.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*;
import mindustry.core.*;
@@ -189,6 +190,36 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
}
}
@Remote(called = Loc.both, targets = Loc.both, forward = true)
public static void commandUnits(Player player, int[] unitIds, @Nullable Building buildTarget, @Nullable Unit unitTarget, @Nullable Vec2 posTarget){
if(player == null || unitIds == null) return;
if(net.server() && !netServer.admins.allowAction(player, ActionType.commandUnits, event -> {
event.unitIDs = unitIds;
})){
throw new ValidateException(player, "Player cannot command units.");
}
Teamc teamTarget = buildTarget == null ? unitTarget : buildTarget;
for(int id : unitIds){
Unit unit = Groups.unit.getByID(id);
if(unit.team == player.team() && unit.controller() instanceof CommandAI ai){
if(teamTarget != null && teamTarget.team() != player.team()){
ai.commandTarget(teamTarget);
}else if(posTarget != null){
ai.commandPosition(posTarget);
}
}
if(teamTarget != null){
Fx.attackCommand.at(teamTarget);
}else{
Fx.moveCommand.at(posTarget);
}
}
}
@Remote(called = Loc.server, targets = Loc.both, forward = true)
public static void requestItem(Player player, Building build, Item item, int amount){
if(player == null || build == null || !build.interactable(player.team()) || !player.within(build, buildingRange) || player.dead()) return;