diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index b9d7cbc00c..247472ef2a 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -932,6 +932,7 @@ setting.logichints.name = Logic Hints setting.backgroundpause.name = Pause In Background setting.buildautopause.name = Auto-Pause Building setting.doubletapmine.name = Double-Tap to Mine +setting.commandmodehold.name = Hold For Command Mode setting.modcrashdisable.name = Disable Mods On Startup Crash setting.animatedwater.name = Animated Surfaces setting.animatedshields.name = Animated Shields diff --git a/core/src/mindustry/content/ErekirTechTree.java b/core/src/mindustry/content/ErekirTechTree.java index 8d7e24bb59..c1978ebd3d 100644 --- a/core/src/mindustry/content/ErekirTechTree.java +++ b/core/src/mindustry/content/ErekirTechTree.java @@ -374,6 +374,10 @@ public class ErekirTechTree{ }); + nodeProduce(Liquids.arkycite, () -> { + + }); + nodeProduce(Items.thorium, () -> { nodeProduce(Items.carbide, () -> { nodeProduce(Items.surgeAlloy, () -> { diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index fe5b5a44d6..285d906642 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -242,7 +242,11 @@ public class DesktopInput extends InputHandler{ if(!locked && block == null && !scene.hasField() && //disable command mode when player unit can boost and command mode binding is the same !(!player.dead() && player.unit().type.canBoost && keybinds.get(Binding.command_mode).key == keybinds.get(Binding.boost).key)){ - commandMode = input.keyDown(Binding.command_mode); + if(settings.getBool("commandmodehold")){ + commandMode = input.keyDown(Binding.command_mode); + }else if(input.keyTap(Binding.command_mode)){ + commandMode = !commandMode; + } }else{ commandMode = false; } @@ -652,26 +656,12 @@ public class DesktopInput extends InputHandler{ //click: select a single unit if(button == KeyCode.mouseLeft){ - Unit unit = selectedCommandUnit(input.mouseWorldX(), input.mouseWorldY()); - Building build = world.buildWorld(input.mouseWorldX(), input.mouseWorldY()); - if(unit != null){ - if(selectedUnits.contains(unit)){ - selectedUnits.remove(unit); - }else{ - selectedUnits.clear(); - selectedUnits.add(unit); - } - commandBuild = null; + if(count >= 2){ + selectTypedUnits(); }else{ - //deselect - selectedUnits.clear(); - - if(build != null && build.team == player.team() && build.block.commandable){ - commandBuild = (commandBuild == build ? null : build); - }else{ - commandBuild = null; - } + tapCommandUnit(); } + } return super.tap(x, y, count, button); diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 6e312b19c4..f286cd58cd 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -725,6 +725,43 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } } + public void selectTypedUnits(){ + if(commandMode){ + Unit unit = selectedCommandUnit(input.mouseWorldX(), input.mouseWorldY()); + if(unit != null){ + selectedUnits.clear(); + camera.bounds(Tmp.r1); + selectedUnits.addAll(selectedCommandUnits(Tmp.r1.x, Tmp.r1.y, Tmp.r1.width, Tmp.r1.height, u -> u.type == unit.type)); + } + } + } + + public void tapCommandUnit(){ + if(commandMode){ + + Unit unit = selectedCommandUnit(input.mouseWorldX(), input.mouseWorldY()); + Building build = world.buildWorld(input.mouseWorldX(), input.mouseWorldY()); + if(unit != null){ + if(selectedUnits.contains(unit)){ + selectedUnits.remove(unit); + }else{ + selectedUnits.clear(); + selectedUnits.add(unit); + } + commandBuild = null; + }else{ + //deselect + selectedUnits.clear(); + + if(build != null && build.team == player.team() && build.block.commandable){ + commandBuild = (commandBuild == build ? null : build); + }else{ + commandBuild = null; + } + } + } + } + public void commandTap(float screenX, float screenY){ if(commandMode){ //right click: move to position @@ -1434,15 +1471,19 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ return tmpUnits.min(u -> !u.inFogTo(player.team()), u -> u.dst(x, y) - u.hitSize/2f); } - public Seq selectedCommandUnits(float x, float y, float w, float h){ + public Seq selectedCommandUnits(float x, float y, float w, float h, Boolf predicate){ var tree = player.team().data().tree(); tmpUnits.clear(); float rad = 4f; tree.intersect(Tmp.r1.set(x - rad/2f, y - rad/2f, rad*2f + w, rad*2f + h).normalize(), tmpUnits); - tmpUnits.removeAll(u -> !u.isCommandable()); + tmpUnits.removeAll(u -> !u.isCommandable() || !predicate.get(u)); return tmpUnits; } + public Seq selectedCommandUnits(float x, float y, float w, float h){ + return selectedCommandUnits(x, y, w, h, u -> true); + } + public void remove(){ Core.input.removeProcessor(this); group.remove(); diff --git a/core/src/mindustry/input/MobileInput.java b/core/src/mindustry/input/MobileInput.java index b95ae49601..6f07dab9fc 100644 --- a/core/src/mindustry/input/MobileInput.java +++ b/core/src/mindustry/input/MobileInput.java @@ -649,6 +649,8 @@ public class MobileInput extends InputHandler implements GestureListener{ }else if(commandMode && selectedUnits.size > 0){ //handle selecting units with command mode commandTap(x, y); + }else if(commandMode){ + tapCommandUnit(); }else{ //control units if(count == 2){ diff --git a/core/src/mindustry/net/CrashSender.java b/core/src/mindustry/net/CrashSender.java index bd91ae74ce..29c54b5222 100644 --- a/core/src/mindustry/net/CrashSender.java +++ b/core/src/mindustry/net/CrashSender.java @@ -58,7 +58,7 @@ public class CrashSender{ }catch(Throwable ignored){} //don't create crash logs for custom builds, as it's expected - if(Version.build == -1 || (OS.username.equals("anuke") && !"steam".equals(Version.modifier))){ + if(OS.username.equals("anuke") && !"steam".equals(Version.modifier)){ ret(); } diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 3b6edecba4..e979002419 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -315,6 +315,7 @@ public class SettingsMenuDialog extends BaseDialog{ } game.checkPref("doubletapmine", false); + game.checkPref("commandmodehold", false); if(!ios){ game.checkPref("modcrashdisable", true);