diff --git a/core/src/mindustry/ai/types/CommandAI.java b/core/src/mindustry/ai/types/CommandAI.java index 794fd41a3e..fc4b455c14 100644 --- a/core/src/mindustry/ai/types/CommandAI.java +++ b/core/src/mindustry/ai/types/CommandAI.java @@ -49,6 +49,11 @@ public class CommandAI extends AIController{ } } + @Override + public boolean isLogicControllable(){ + return !hasCommand(); + } + public boolean isAttacking(){ return target != null && unit.within(target, unit.range() + 10f); } diff --git a/core/src/mindustry/entities/comp/PlayerComp.java b/core/src/mindustry/entities/comp/PlayerComp.java index fbf24f33f0..6c5d8b1cdf 100644 --- a/core/src/mindustry/entities/comp/PlayerComp.java +++ b/core/src/mindustry/entities/comp/PlayerComp.java @@ -93,6 +93,11 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra return isAdded(); } + @Override + public boolean isLogicControllable(){ + return false; + } + @Replace public float clipSize(){ return unit.isNull() ? 20 : unit.type.hitSize * 2f; diff --git a/core/src/mindustry/entities/units/AIController.java b/core/src/mindustry/entities/units/AIController.java index c46abd48bb..6aef11e104 100644 --- a/core/src/mindustry/entities/units/AIController.java +++ b/core/src/mindustry/entities/units/AIController.java @@ -55,6 +55,11 @@ public class AIController implements UnitController{ return false; } + @Override + public boolean isLogicControllable(){ + return true; + } + public void stopShooting(){ for(var mount : unit.mounts){ //ignore mount controllable stats too, they should not shoot either diff --git a/core/src/mindustry/entities/units/UnitController.java b/core/src/mindustry/entities/units/UnitController.java index bbba6122b9..ff861b805d 100644 --- a/core/src/mindustry/entities/units/UnitController.java +++ b/core/src/mindustry/entities/units/UnitController.java @@ -14,6 +14,11 @@ public interface UnitController{ return true; } + /** @return whether logic AI can take over */ + default boolean isLogicControllable(){ + return false; + } + default void updateUnit(){ } diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index eacf772f83..122369f374 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -361,7 +361,7 @@ public class LExecutor{ /** Checks is a unit is valid for logic AI control, and returns the controller. */ @Nullable public static LogicAI checkLogicAI(LExecutor exec, Object unitObj){ - if(unitObj instanceof Unit unit && unit.isValid() && exec.obj(varUnit) == unit && (unit.team == exec.team || exec.privileged) && !unit.isPlayer() && !(unit.isCommandable() && unit.command().hasCommand())){ + if(unitObj instanceof Unit unit && unit.isValid() && exec.obj(varUnit) == unit && (unit.team == exec.team || exec.privileged) && unit.controller().isLogicControllable()){ if(unit.controller() instanceof LogicAI la){ la.controller = exec.building(varThis); return la;