Nondestructive unit cap enforcement
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:baseRotation,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:baseRotation,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:payloads,type:arc.struct.Seq<mindustry.world.blocks.payloads.Payload>,size:-1},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}
|
||||||
1
annotations/src/main/resources/revisions/LegsUnit/2.json
Normal file
1
annotations/src/main/resources/revisions/LegsUnit/2.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}
|
||||||
1
annotations/src/main/resources/revisions/MechUnit/2.json
Normal file
1
annotations/src/main/resources/revisions/MechUnit/2.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:baseRotation,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{version:2,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]}
|
||||||
@@ -600,6 +600,7 @@ bar.poweroutput = Power Output: {0}
|
|||||||
bar.items = Items: {0}
|
bar.items = Items: {0}
|
||||||
bar.capacity = Capacity: {0}
|
bar.capacity = Capacity: {0}
|
||||||
bar.unitcap = {0} {1}/{2}
|
bar.unitcap = {0} {1}/{2}
|
||||||
|
bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[unit disabled]
|
||||||
bar.liquid = Liquid
|
bar.liquid = Liquid
|
||||||
bar.heat = Heat
|
bar.heat = Heat
|
||||||
bar.power = Power
|
bar.power = Power
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ public class TeamIndexProcess implements AsyncProcess{
|
|||||||
private QuadTree<Unit>[] trees = new QuadTree[Team.all.length];
|
private QuadTree<Unit>[] trees = new QuadTree[Team.all.length];
|
||||||
private int[] counts = new int[Team.all.length];
|
private int[] counts = new int[Team.all.length];
|
||||||
private int[][] typeCounts = new int[Team.all.length][0];
|
private int[][] typeCounts = new int[Team.all.length][0];
|
||||||
|
private int[][] activeCounts = new int[Team.all.length][0];
|
||||||
|
|
||||||
public QuadTree<Unit> tree(Team team){
|
public QuadTree<Unit> tree(Team team){
|
||||||
if(trees[team.id] == null) trees[team.id] = new QuadTree<>(Vars.world.getQuadBounds(new Rect()));
|
if(trees[team.id] == null) trees[team.id] = new QuadTree<>(Vars.world.getQuadBounds(new Rect()));
|
||||||
@@ -28,8 +29,11 @@ public class TeamIndexProcess implements AsyncProcess{
|
|||||||
return typeCounts[team.id].length <= type.id ? 0 : typeCounts[team.id][type.id];
|
return typeCounts[team.id].length <= type.id ? 0 : typeCounts[team.id][type.id];
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateCount(Team team, UnitType type, int amount){
|
public int countActive(Team team, UnitType type){
|
||||||
|
return activeCounts[team.id].length <= type.id ? 0 : activeCounts[team.id][type.id];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateCount(Team team, UnitType type, int amount){
|
||||||
counts[team.id] += amount;
|
counts[team.id] += amount;
|
||||||
if(typeCounts[team.id].length <= type.id){
|
if(typeCounts[team.id].length <= type.id){
|
||||||
typeCounts[team.id] = new int[Vars.content.units().size];
|
typeCounts[team.id] = new int[Vars.content.units().size];
|
||||||
@@ -37,6 +41,13 @@ public class TeamIndexProcess implements AsyncProcess{
|
|||||||
typeCounts[team.id][type.id] += amount;
|
typeCounts[team.id][type.id] += amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateActiveCount(Team team, UnitType type, int amount){
|
||||||
|
if(activeCounts[team.id].length <= type.id){
|
||||||
|
activeCounts[team.id] = new int[Vars.content.units().size];
|
||||||
|
}
|
||||||
|
activeCounts[team.id][type.id] += amount;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reset(){
|
public void reset(){
|
||||||
counts = new int[Team.all.length];
|
counts = new int[Team.all.length];
|
||||||
@@ -52,6 +63,7 @@ public class TeamIndexProcess implements AsyncProcess{
|
|||||||
}
|
}
|
||||||
|
|
||||||
Arrays.fill(typeCounts[team.id], 0);
|
Arrays.fill(typeCounts[team.id], 0);
|
||||||
|
Arrays.fill(activeCounts[team.id], 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Arrays.fill(counts, 0);
|
Arrays.fill(counts, 0);
|
||||||
@@ -60,6 +72,7 @@ public class TeamIndexProcess implements AsyncProcess{
|
|||||||
tree(unit.team).insert(unit);
|
tree(unit.team).insert(unit);
|
||||||
|
|
||||||
updateCount(unit.team, unit.type(), 1);
|
updateCount(unit.team, unit.type(), 1);
|
||||||
|
if(!unit.deactivated) updateActiveCount(unit.team, unit.type(), 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,10 @@ public class Units{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static int getCap(Team team){
|
public static int getCap(Team team){
|
||||||
|
//wave team has no cap
|
||||||
|
if((team == state.rules.waveTeam && state.rules.waves) || (state.isCampaign() && team == state.rules.waveTeam)){
|
||||||
|
return Integer.MAX_VALUE;
|
||||||
|
}
|
||||||
return state.rules.unitCap + indexer.getExtraUnits(team);
|
return state.rules.unitCap + indexer.getExtraUnits(team);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
|
|||||||
|
|
||||||
private UnitController controller;
|
private UnitController controller;
|
||||||
private UnitType type;
|
private UnitType type;
|
||||||
boolean spawnedByCore;
|
boolean spawnedByCore, deactivated;
|
||||||
|
|
||||||
transient float timer1, timer2;
|
transient float timer1, timer2;
|
||||||
|
|
||||||
@@ -118,6 +118,14 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
|
|||||||
return controller instanceof AIController;
|
return controller instanceof AIController;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int count(){
|
||||||
|
return teamIndex.countType(team, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int cap(){
|
||||||
|
return Units.getCap(team);
|
||||||
|
}
|
||||||
|
|
||||||
private void setStats(UnitType type){
|
private void setStats(UnitType type){
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.maxHealth = type.health;
|
this.maxHealth = type.health;
|
||||||
@@ -150,11 +158,10 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
|
|||||||
teamIndex.updateCount(team, type, 1);
|
teamIndex.updateCount(team, type, 1);
|
||||||
|
|
||||||
//check if over unit cap
|
//check if over unit cap
|
||||||
if(teamIndex.countType(team, type) > Units.getCap(team)
|
if(count() > cap() && !spawnedByCore){
|
||||||
&& !(team == state.rules.waveTeam && state.rules.waves) //can't be wave team on wave mode
|
deactivated = true;
|
||||||
&& !(state.isCampaign() && team == state.rules.waveTeam)){ //can't be campaign wave team
|
}else{
|
||||||
Fx.unitCapKill.at(this);
|
teamIndex.updateActiveCount(team, type, 1);
|
||||||
kill();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,8 +182,13 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(){
|
public void update(){
|
||||||
|
//activate the unit when possible
|
||||||
|
if(!net.client() && deactivated && teamIndex.countActive(team, type) < Units.getCap(team)){
|
||||||
|
teamIndex.updateActiveCount(team, type, 1);
|
||||||
|
deactivated = false;
|
||||||
|
}
|
||||||
|
|
||||||
type.update(base());
|
if(!deactivated) type.update(base());
|
||||||
|
|
||||||
drag = type.drag * (isGrounded() ? (floorOn().dragMultiplier) : 1f);
|
drag = type.drag * (isGrounded() ? (floorOn().dragMultiplier) : 1f);
|
||||||
|
|
||||||
@@ -236,10 +248,15 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
|
|||||||
}
|
}
|
||||||
|
|
||||||
//AI only updates on the server
|
//AI only updates on the server
|
||||||
if(!net.client() && !dead){
|
if(!net.client() && !dead && !deactivated){
|
||||||
controller.updateUnit();
|
controller.updateUnit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//do not control anything when deactivated
|
||||||
|
if(deactivated){
|
||||||
|
controlWeapons(false, false);
|
||||||
|
}
|
||||||
|
|
||||||
//remove units spawned by the core
|
//remove units spawned by the core
|
||||||
if(spawnedByCore && !isPlayer()){
|
if(spawnedByCore && !isPlayer()){
|
||||||
Call.unitDespawn(base());
|
Call.unitDespawn(base());
|
||||||
|
|||||||
@@ -233,7 +233,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
}else if(unit == null){ //just clear the unit (is this used?)
|
}else if(unit == null){ //just clear the unit (is this used?)
|
||||||
player.clearUnit();
|
player.clearUnit();
|
||||||
//make sure it's AI controlled, so players can't overwrite each other
|
//make sure it's AI controlled, so players can't overwrite each other
|
||||||
}else if(unit.isAI() && unit.team == player.team()){
|
}else if(unit.isAI() && unit.team == player.team() && !unit.deactivated){
|
||||||
player.unit(unit);
|
player.unit(unit);
|
||||||
Time.run(Fx.unitSpirit.lifetime, () -> Fx.unitControl.at(unit.x, unit.y, 0f, unit));
|
Time.run(Fx.unitSpirit.lifetime, () -> Fx.unitControl.at(unit.x, unit.y, 0f, unit));
|
||||||
if(!player.dead()){
|
if(!player.dead()){
|
||||||
@@ -310,7 +310,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(controlledType != null && player.dead()){
|
if(controlledType != null && player.dead()){
|
||||||
Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type() == controlledType);
|
Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type() == controlledType && !u.deactivated);
|
||||||
|
|
||||||
if(unit != null){
|
if(unit != null){
|
||||||
Call.unitControl(player, unit);
|
Call.unitControl(player, unit);
|
||||||
@@ -320,7 +320,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
|
|
||||||
public void checkUnit(){
|
public void checkUnit(){
|
||||||
if(controlledType != null){
|
if(controlledType != null){
|
||||||
Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type() == controlledType);
|
Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type() == controlledType && !u.deactivated);
|
||||||
if(unit == null && controlledType == UnitTypes.block){
|
if(unit == null && controlledType == UnitTypes.block){
|
||||||
unit = world.buildWorld(player.x, player.y) instanceof ControlBlock ? ((ControlBlock)world.buildWorld(player.x, player.y)).unit() : null;
|
unit = world.buildWorld(player.x, player.y) instanceof ControlBlock ? ((ControlBlock)world.buildWorld(player.x, player.y)).unit() : null;
|
||||||
}
|
}
|
||||||
@@ -843,7 +843,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public @Nullable Unit selectedUnit(){
|
public @Nullable Unit selectedUnit(){
|
||||||
Unit unit = Units.closest(player.team(), Core.input.mouseWorld().x, Core.input.mouseWorld().y, 40f, Unit::isAI);
|
Unit unit = Units.closest(player.team(), Core.input.mouseWorld().x, Core.input.mouseWorld().y, 40f, u -> u.isAI() && !u.deactivated);
|
||||||
if(unit != null){
|
if(unit != null){
|
||||||
unit.hitbox(Tmp.r1);
|
unit.hitbox(Tmp.r1);
|
||||||
Tmp.r1.grow(6f);
|
Tmp.r1.grow(6f);
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ public class UnitType extends UnlockableContent{
|
|||||||
|
|
||||||
public void update(Unit unit){
|
public void update(Unit unit){
|
||||||
if(abilities.size > 0){
|
if(abilities.size > 0){
|
||||||
for(mindustry.entities.abilities.Ability a : abilities){
|
for(Ability a : abilities){
|
||||||
a.update(unit);
|
a.update(unit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -135,10 +135,20 @@ public class UnitType extends UnlockableContent{
|
|||||||
bars.row();
|
bars.row();
|
||||||
|
|
||||||
if(state.rules.unitAmmo){
|
if(state.rules.unitAmmo){
|
||||||
bars.add(new Bar("blocks.ammo", Pal.ammo, () -> (float)unit.ammo / ammoCapacity));
|
bars.add(new Bar("blocks.ammo", Pal.ammo, () -> unit.ammo / ammoCapacity));
|
||||||
bars.row();
|
bars.row();
|
||||||
}
|
}
|
||||||
}).growX();
|
}).growX();
|
||||||
|
|
||||||
|
table.row();
|
||||||
|
if(unit.deactivated){
|
||||||
|
table.table(d -> {
|
||||||
|
d.left();
|
||||||
|
|
||||||
|
d.label(() -> Core.bundle.format("bar.limitreached", unit.count(), unit.cap(), Fonts.getUnicodeStr(name)));
|
||||||
|
}).left().visible(() -> unit.deactivated);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -271,6 +281,10 @@ public class UnitType extends UnlockableContent{
|
|||||||
unit.trns(-legOffset.x, -legOffset.y);
|
unit.trns(-legOffset.x, -legOffset.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(unit.deactivated){
|
||||||
|
drawDeactive(unit);
|
||||||
|
}
|
||||||
|
|
||||||
if(abilities.size > 0){
|
if(abilities.size > 0){
|
||||||
for(Ability a : abilities){
|
for(Ability a : abilities){
|
||||||
a.draw(unit);
|
a.draw(unit);
|
||||||
@@ -279,6 +293,16 @@ public class UnitType extends UnlockableContent{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void drawDeactive(Unit unit){
|
||||||
|
Draw.color(Color.scarlet);
|
||||||
|
Draw.alpha(0.8f);
|
||||||
|
|
||||||
|
float size = 8f;
|
||||||
|
Draw.rect(Icon.warning.getRegion(), unit.x, unit.y, size, size);
|
||||||
|
|
||||||
|
Draw.reset();
|
||||||
|
}
|
||||||
|
|
||||||
public <T extends Unit & Payloadc> void drawPayload(T unit){
|
public <T extends Unit & Payloadc> void drawPayload(T unit){
|
||||||
if(unit.hasPayload()){
|
if(unit.hasPayload()){
|
||||||
Payload pay = unit.payloads().first();
|
Payload pay = unit.payloads().first();
|
||||||
|
|||||||
Reference in New Issue
Block a user