Allow commanding units properly even when player is dead

This commit is contained in:
Anuken
2025-07-28 18:04:15 -04:00
parent 1d7b6eb689
commit e95c543fb2
2 changed files with 122 additions and 119 deletions

View File

@@ -113,8 +113,6 @@ public class OverlayRenderer{
}
}
if(player.dead()) return; //dead players don't draw
InputHandler input = control.input;
Sized select = input.selectedUnit();
@@ -150,9 +148,11 @@ public class OverlayRenderer{
tile.drawConfigure();
}
input.drawTop();
if(!player.dead()) input.drawTop();
input.drawUnitSelection();
if(player.dead()) return; //dead players don't draw
buildFade = Mathf.lerpDelta(buildFade, input.isPlacing() || input.isUsingSchematic() ? 1f : 0f, 0.06f);
Draw.reset();

View File

@@ -23,7 +23,6 @@ import mindustry.graphics.*;
import mindustry.ui.*;
import mindustry.world.*;
import static arc.Core.camera;
import static arc.Core.*;
import static mindustry.Vars.*;
import static mindustry.input.PlaceMode.*;
@@ -62,7 +61,7 @@ public class DesktopInput extends InputHandler{
public long lastPayloadKeyHoldMillis;
private float buildPlanMouseOffsetX, buildPlanMouseOffsetY;
private boolean changedCursor;
private boolean changedCursor, pressedCommandRect;
boolean showHint(){
return ui.hudfrag.shown && Core.settings.getBool("hints") && selectPlans.isEmpty() && !player.dead() &&
@@ -438,6 +437,20 @@ public class DesktopInput extends InputHandler{
if(Core.input.keyTap(Binding.minimap)) ui.minimapfrag.toggle();
if(Core.input.keyTap(Binding.planetMap) && state.isCampaign()) ui.planet.toggle();
if(Core.input.keyTap(Binding.research) && state.isCampaign()) ui.research.toggle();
if(Core.input.keyTap(Binding.schematicMenu)) ui.schematics.toggle();
if(Core.input.keyTap(Binding.toggleBlockStatus)){
Core.settings.put("blockstatus", !Core.settings.getBool("blockstatus"));
}
if(Core.input.keyTap(Binding.togglePowerLines)){
if(Core.settings.getInt("lasersopacity") == 0){
Core.settings.put("lasersopacity", Core.settings.getInt("preferredlaseropacity", 100));
}else{
Core.settings.put("preferredlaseropacity", Core.settings.getInt("lasersopacity"));
Core.settings.put("lasersopacity", 0);
}
}
}
if(state.isMenu() || Core.scene.hasDialog()) return;
@@ -456,98 +469,17 @@ public class DesktopInput extends InputHandler{
}
}
if(Core.input.keyRelease(Binding.select) && commandRect){
selectUnitsRect();
}
if(player.dead() || locked){
cursorType = SystemCursor.arrow;
if(!Core.scene.hasMouse()){
Core.graphics.cursor(cursorType);
if(!locked){
pollInputNoPlayer();
}
return;
}
pollInput();
//deselect if not placing
if(!isPlacing() && mode == placing){
mode = none;
}
if(player.shooting && !canShoot()){
player.shooting = false;
}
if(isPlacing() && player.isBuilder()){
cursorType = SystemCursor.hand;
selectScale = Mathf.lerpDelta(selectScale, 1f, 0.2f);
}else{
selectScale = 0f;
}
if(!Core.input.keyDown(Binding.diagonalPlacement) && Math.abs((int)Core.input.axisTap(Binding.rotate)) > 0){
rotation = Mathf.mod(rotation + (int)Core.input.axisTap(Binding.rotate), 4);
if(splan != null){
splan.rotation = Mathf.mod(splan.rotation + (int)Core.input.axisTap(Binding.rotate), 4);
}
if(isPlacing() && mode == placing){
updateLine(selectX, selectY);
}else if(!selectPlans.isEmpty() && !ui.chatfrag.shown()){
rotatePlans(selectPlans, Mathf.sign(Core.input.axisTap(Binding.rotate)));
}
}
Tile cursor = tileAt(Core.input.mouseX(), Core.input.mouseY());
cursorType = SystemCursor.arrow;
if(cursor != null){
if(cursor.build != null && cursor.build.interactable(player.team())){
cursorType = cursor.build.getCursor();
}
if(canRepairDerelict(cursor) && !player.dead() && player.unit().canBuild()){
cursorType = ui.repairCursor;
}
if((isPlacing() && player.isBuilder()) || !selectPlans.isEmpty()){
cursorType = SystemCursor.hand;
}
if(!isPlacing() && canMine(cursor)){
cursorType = ui.drillCursor;
}
if(commandMode && selectedUnits.any()){
boolean canAttack = (cursor.build != null && !cursor.build.inFogTo(player.team()) && cursor.build.team != player.team());
if(!canAttack){
var unit = selectedEnemyUnit(input.mouseWorldX(), input.mouseWorldY());
if(unit != null){
canAttack = selectedUnits.contains(u -> u.canTarget(unit));
}
}
if(canAttack){
cursorType = ui.targetCursor;
}
if(input.keyTap(Binding.commandQueue) && Binding.commandQueue.value.key.type != KeyType.mouse){
commandTap(input.mouseX(), input.mouseY(), true);
}
}
if(getPlan(cursor.x, cursor.y) != null && mode == none){
cursorType = SystemCursor.hand;
}
if(canTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y)){
cursorType = ui.unloadCursor;
}
if(cursor.build != null && cursor.interactable(player.team()) && !isPlacing() && Math.abs(Core.input.axisTap(Binding.rotate)) > 0 && Core.input.keyDown(Binding.rotatePlaced) && cursor.block().rotate && cursor.block().quickRotate){
Call.rotateBlock(player, cursor.build, Core.input.axisTap(Binding.rotate) > 0);
}
pollInputPlayer();
}
if(!Core.scene.hasMouse() && !ui.minimapfrag.shown()){
@@ -560,10 +492,6 @@ public class DesktopInput extends InputHandler{
changedCursor = false;
}
}
if(Core.input.keyRelease(Binding.select)){
player.shooting = false;
}
}
@Override
@@ -603,7 +531,20 @@ public class DesktopInput extends InputHandler{
}).visible(() -> state.isCampaign()).tooltip("@planetmap");
}
void pollInput(){
void pollInputNoPlayer(){
if(Core.input.keyTap(Binding.select) && !Core.scene.hasMouse()){
tappedOne = false;
if(commandMode){
commandRect = true;
commandRectX = input.mouseWorldX();
commandRectY = input.mouseWorldY();
}
}
}
//player input: for controlling the player unit (will crash if the unit is not present)
void pollInputPlayer(){
if(scene.hasField()) return;
Tile selected = tileAt(Core.input.mouseX(), Core.input.mouseY());
@@ -642,14 +583,6 @@ public class DesktopInput extends InputHandler{
schemY = rawCursorY;
}
if(Core.input.keyTap(Binding.schematicMenu) && !Core.scene.hasKeyboard()){
if(ui.schematics.isShown()){
ui.schematics.hide();
}else{
ui.schematics.show();
}
}
if(Core.input.keyTap(Binding.clearBuilding) || isPlacing()){
lastSchematic = null;
selectPlans.clear();
@@ -711,11 +644,6 @@ public class DesktopInput extends InputHandler{
lastLineY = cursorY;
}
//select some units
if(Core.input.keyRelease(Binding.select) && commandRect){
selectUnitsRect();
}
if(Core.input.keyRelease(Binding.select) && !Core.scene.hasMouse()){
BuildPlan plan = getPlan(cursorX, cursorY);
@@ -849,17 +777,92 @@ public class DesktopInput extends InputHandler{
mode = none;
}
if(Core.input.keyTap(Binding.toggleBlockStatus)){
Core.settings.put("blockstatus", !Core.settings.getBool("blockstatus"));
//deselect if not placing
if(!isPlacing() && mode == placing){
mode = none;
}
if(Core.input.keyTap(Binding.togglePowerLines)){
if(Core.settings.getInt("lasersopacity") == 0){
Core.settings.put("lasersopacity", Core.settings.getInt("preferredlaseropacity", 100));
}else{
Core.settings.put("preferredlaseropacity", Core.settings.getInt("lasersopacity"));
Core.settings.put("lasersopacity", 0);
if(player.shooting && !canShoot()){
player.shooting = false;
}
if(isPlacing() && player.isBuilder()){
cursorType = SystemCursor.hand;
selectScale = Mathf.lerpDelta(selectScale, 1f, 0.2f);
}else{
selectScale = 0f;
}
if(!Core.input.keyDown(Binding.diagonalPlacement) && Math.abs((int)Core.input.axisTap(Binding.rotate)) > 0){
rotation = Mathf.mod(rotation + (int)Core.input.axisTap(Binding.rotate), 4);
if(splan != null){
splan.rotation = Mathf.mod(splan.rotation + (int)Core.input.axisTap(Binding.rotate), 4);
}
if(isPlacing() && mode == placing){
updateLine(selectX, selectY);
}else if(!selectPlans.isEmpty() && !ui.chatfrag.shown()){
rotatePlans(selectPlans, Mathf.sign(Core.input.axisTap(Binding.rotate)));
}
}
Tile cursor = tileAt(Core.input.mouseX(), Core.input.mouseY());
cursorType = SystemCursor.arrow;
if(cursor != null){
if(cursor.build != null && cursor.build.interactable(player.team())){
cursorType = cursor.build.getCursor();
}
if(canRepairDerelict(cursor) && !player.dead() && player.unit().canBuild()){
cursorType = ui.repairCursor;
}
if((isPlacing() && player.isBuilder()) || !selectPlans.isEmpty()){
cursorType = SystemCursor.hand;
}
if(!isPlacing() && canMine(cursor)){
cursorType = ui.drillCursor;
}
if(commandMode && selectedUnits.any()){
boolean canAttack = (cursor.build != null && !cursor.build.inFogTo(player.team()) && cursor.build.team != player.team());
if(!canAttack){
var unit = selectedEnemyUnit(input.mouseWorldX(), input.mouseWorldY());
if(unit != null){
canAttack = selectedUnits.contains(u -> u.canTarget(unit));
}
}
if(canAttack){
cursorType = ui.targetCursor;
}
if(input.keyTap(Binding.commandQueue) && Binding.commandQueue.value.key.type != KeyType.mouse){
commandTap(input.mouseX(), input.mouseY(), true);
}
}
if(getPlan(cursor.x, cursor.y) != null && mode == none){
cursorType = SystemCursor.hand;
}
if(canTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y)){
cursorType = ui.unloadCursor;
}
if(cursor.build != null && cursor.interactable(player.team()) && !isPlacing() && Math.abs(Core.input.axisTap(Binding.rotate)) > 0 && Core.input.keyDown(Binding.rotatePlaced) && cursor.block().rotate && cursor.block().quickRotate){
Call.rotateBlock(player, cursor.build, Core.input.axisTap(Binding.rotate) > 0);
}
}
if(Core.input.keyRelease(Binding.select)){
player.shooting = false;
}
}