diff --git a/core/src/mindustry/graphics/OverlayRenderer.java b/core/src/mindustry/graphics/OverlayRenderer.java index 29e76dc7ac..0470ec54fe 100644 --- a/core/src/mindustry/graphics/OverlayRenderer.java +++ b/core/src/mindustry/graphics/OverlayRenderer.java @@ -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(); diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index e000cd482b..311b6a123e 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -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; } }