From a9546de8946396e8f18e7a2460946a50049bb26c Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 10 Jan 2018 14:43:29 -0500 Subject: [PATCH] Crash fixes, additional controller support --- build.gradle | 2 +- core/src/io/anuke/mindustry/core/Control.java | 3 +-- core/src/io/anuke/mindustry/core/NetClient.java | 6 ++++-- .../mindustry/entities/enemies/EnemyType.java | 12 ++++++------ .../io/anuke/mindustry/input/AndroidInput.java | 5 ++++- .../io/anuke/mindustry/input/DesktopInput.java | 16 +++++++++++++--- .../mindustry/mapeditor/MapEditorDialog.java | 5 +++++ .../anuke/mindustry/ui/dialogs/JoinDialog.java | 2 +- .../anuke/mindustry/ui/dialogs/PausedDialog.java | 13 ++++++++----- .../mindustry/ui/fragments/ChatFragment.java | 6 +++++- .../mindustry/ui/fragments/HudFragment.java | 2 +- .../ui/fragments/PlacementFragment.java | 6 +++++- .../blocks/types/distribution/Teleporter.java | 2 +- .../world/blocks/types/production/Generator.java | 2 +- .../blocks/types/production/NuclearReactor.java | 3 ++- .../anuke/mindustry/desktop/DesktopLauncher.java | 6 +++++- 16 files changed, 63 insertions(+), 28 deletions(-) diff --git a/build.gradle b/build.gradle index 8b4ce13f1d..a6f189ac71 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ allprojects { appName = "Mindustry" gdxVersion = '1.9.8' aiVersion = '1.8.1' - uCoreVersion = '2d75159'; + uCoreVersion = '0de709f'; } repositories { diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 9cc1fa23b7..483c5e5487 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -142,7 +142,6 @@ public class Control extends Module{ "select", Input.MOUSE_LEFT, "break", Input.MOUSE_RIGHT, "shoot", Input.MOUSE_LEFT, - "weapon_alt_select", Input.Q, "zoom_hold", Input.CONTROL_LEFT, "zoom", new Axis(Input.SCROLL), "menu", Gdx.app.getType() == ApplicationType.Android ? Input.BACK : Input.ESCAPE, @@ -174,7 +173,7 @@ public class Control extends Module{ "menu", Input.CONTROLLER_X, "pause", Input.CONTROLLER_L_TRIGGER, "dash", Input.CONTROLLER_Y, - "rotate_alt", new Axis(Input.UNSET), + "rotate_alt", new Axis(Input.CONTROLLER_DPAD_RIGHT, Input.CONTROLLER_DPAD_LEFT), "rotate", new Axis(Input.CONTROLLER_A, Input.CONTROLLER_B), "player_list", Input.CONTROLLER_START, "weapon_1", Input.NUM_1, diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index b93fc1b0f2..b6ba0007f7 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -191,8 +191,10 @@ public class NetClient extends Module { Net.handle(BlockDestroyPacket.class, packet -> { Tile tile = Vars.world.tile(packet.position % Vars.world.width(), packet.position / Vars.world.width()); - if(tile.entity != null){ - Gdx.app.postRunnable(() -> tile.entity.onDeath(true)); + if(tile != null && tile.entity != null){ + Gdx.app.postRunnable(() ->{ + if(tile.entity != null) tile.entity.onDeath(true); + }); } }); diff --git a/core/src/io/anuke/mindustry/entities/enemies/EnemyType.java b/core/src/io/anuke/mindustry/entities/enemies/EnemyType.java index 853a773124..c2cc08f22d 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/EnemyType.java +++ b/core/src/io/anuke/mindustry/entities/enemies/EnemyType.java @@ -211,13 +211,13 @@ public class EnemyType { public void onDeath(Enemy enemy){ if(Net.active() && Net.server()){ Vars.netServer.handleEnemyDeath(enemy); - }else if(!Net.active()){ //must be client - Effects.effect(Fx.explosion, enemy); - Effects.shake(3f, 4f, enemy); - Effects.sound("bang2", enemy); - enemy.remove(); - enemy.dead = true; } + + Effects.effect(Fx.explosion, enemy); + Effects.shake(3f, 4f, enemy); + Effects.sound("bang2", enemy); + enemy.remove(); + enemy.dead = true; } public void removed(Enemy enemy){ diff --git a/core/src/io/anuke/mindustry/input/AndroidInput.java b/core/src/io/anuke/mindustry/input/AndroidInput.java index a4f8a0034b..73731f875f 100644 --- a/core/src/io/anuke/mindustry/input/AndroidInput.java +++ b/core/src/io/anuke/mindustry/input/AndroidInput.java @@ -56,7 +56,10 @@ public class AndroidInput extends InputHandler{ @Override public boolean touchDown(int screenX, int screenY, int pointer, int button){ - if(ui.hasMouse()) return false; + if(ui.hasMouse()){ + brokeBlock = true; + return false; + } lmousex = screenX; lmousey = screenY; diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/io/anuke/mindustry/input/DesktopInput.java index a211b27414..8e2f09d1d5 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -10,6 +10,8 @@ import io.anuke.mindustry.resource.Weapon; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Inputs; +import io.anuke.ucore.core.Inputs.DeviceType; +import io.anuke.ucore.core.KeyBinds; import io.anuke.ucore.core.Timers; import io.anuke.ucore.scene.utils.Cursors; import io.anuke.ucore.util.Mathf; @@ -21,7 +23,7 @@ public class DesktopInput extends InputHandler{ int endx, endy; private boolean enableHold = false; private boolean beganBreak; - private boolean rotated = false, rotatedAlt; + private boolean rotated = false, rotatedAlt, zoomed; @Override public float getCursorEndX(){ return endx; } @Override public float getCursorEndY(){ return endy; } @@ -54,9 +56,17 @@ public class DesktopInput extends InputHandler{ endx = Gdx.input.getX(); endy = Gdx.input.getY(); + + boolean controller = KeyBinds.getSection("default").device.type == DeviceType.controller; - if(Inputs.getAxisActive("zoom") && Inputs.keyDown("zoom_hold") && !GameState.is(State.menu) && !ui.hasDialog()){ - renderer.scaleCamera((int)Inputs.getAxis("zoom")); + if(Inputs.getAxisActive("zoom") && (Inputs.keyDown("zoom_hold") || controller) + && !GameState.is(State.menu) && !ui.hasDialog()){ + if((!zoomed || !controller)) { + renderer.scaleCamera((int) Inputs.getAxis("zoom")); + } + zoomed = true; + }else{ + zoomed = false; } if(!rotated) { diff --git a/core/src/io/anuke/mindustry/mapeditor/MapEditorDialog.java b/core/src/io/anuke/mindustry/mapeditor/MapEditorDialog.java index 292dacfffe..ea7eb1af65 100644 --- a/core/src/io/anuke/mindustry/mapeditor/MapEditorDialog.java +++ b/core/src/io/anuke/mindustry/mapeditor/MapEditorDialog.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Texture; +import io.anuke.mindustry.Mindustry; import io.anuke.mindustry.Vars; import io.anuke.mindustry.ui.dialogs.FileChooser; import io.anuke.mindustry.world.Block; @@ -141,7 +142,11 @@ public class MapEditorDialog extends Dialog{ blockgroup.getButtons().get(2).setChecked(true); Core.scene.setScrollFocus(view); view.clearStack(); + + Mindustry.platforms.updateRPC(); }); + + hidden(() -> Mindustry.platforms.updateRPC()); } public MapView getView() { diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index 5cb8d43e77..197836940d 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -31,7 +31,7 @@ public class JoinDialog extends FloatingDialog { Mindustry.platforms.addDialog(join.content().addField(Settings.getString("ip"),text ->{ Settings.putString("ip", text); Settings.save(); - }).size(180f, 54f).get()); + }).size(180f, 54f).get(), 100); join.content().row(); join.content().add("$text.server.port").left(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java index 949105190d..18f0877b1e 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java @@ -51,7 +51,7 @@ public class PausedDialog extends FloatingDialog{ content().row(); content().addButton("$text.loadgame", () -> { load.show(); - }).disabled(Net.active()); + }).disabled(b -> Net.active()); content().row(); @@ -93,16 +93,19 @@ public class PausedDialog extends FloatingDialog{ content().row(); - new imagebutton("icon-load", isize, load::show).text("$text.load").padTop(4f).disabled(Net.active()); + imagebutton lo = new imagebutton("icon-load", isize, load::show); + lo.text("$text.load").padTop(4f); + lo.cell.disabled(b -> Net.active()); - new imagebutton("icon-host", isize, () -> { + imagebutton ho = new imagebutton("icon-host", isize, () -> { if(Vars.world.getMap().custom){ ui.showError("$text.nohost"); }else { ui.host.show(); } - }).text("$text.host") - .disabled(b -> Net.active()).padTop(4f); + }); + ho.text("$text.host").padTop(4f); + ho.cell.disabled(b -> Net.active()); new imagebutton("icon-quit", isize, () -> { Vars.ui.showConfirm("$text.confirm", "$text.quit.confirm", () -> { diff --git a/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java b/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java index 969d615333..a59eb7ae4b 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java @@ -52,6 +52,10 @@ public class ChatFragment extends Table implements Fragment{ if(Net.active() && Inputs.keyTap("chat")){ toggle(); } + + if(GameState.is(State.menu) && messages.size > 0){ + messages.clear(); + } }); setup(); @@ -80,7 +84,7 @@ public class ChatFragment extends Table implements Fragment{ add(chatfield).padBottom(offsety).padLeft(offsetx).growX().padRight(offsetx).height(28); if(Vars.android) { - marginBottom(110f); + marginBottom(105f); marginRight(240f); } diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index 20c28537f0..d2f40c99e2 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -209,7 +209,7 @@ public class HudFragment implements Fragment{ new imagebutton("icon-play", 30f, ()->{ Vars.control.runWave(); }).height(uheight).fillX().right().padTop(-8f).padBottom(-12f).padRight(-36).width(40f).update(l->{ - boolean vis = Vars.control.getMode().toggleWaves && Vars.control.getEnemiesRemaining() <= 0; + boolean vis = Vars.control.getMode().toggleWaves && Vars.control.getEnemiesRemaining() <= 0 && (Net.server() || !Net.active()); boolean paused = GameState.is(State.paused) || !vis; l.setVisible(vis); diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index 6a64598ba0..633707d004 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -131,7 +131,11 @@ public class PlacementFragment implements Fragment{ new imagebutton("icon-" + mode.name(), "toggle", 10 * 3, () -> { control.getInput().resetCursor(); input.breakMode = mode; - if (!mode.both) input.placeMode = mode; + if (!mode.both){ + input.placeMode = mode; + }else{ + input.placeMode = input.lastPlaceMode; + } modeText(Bundles.format("text.mode.break", mode.toString())); }).group(breakGroup).get().setName(mode.name()); } diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Teleporter.java b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Teleporter.java index d47f238e66..0ce2733e2a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Teleporter.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Teleporter.java @@ -30,7 +30,7 @@ public class Teleporter extends PowerBlock{ private Array removal = new Array<>(); private Array returns = new Array<>(); - protected float powerPerItem = 1f; + protected float powerPerItem = 0.8f; static{ for(int i = 0; i < colors; i ++){ diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Generator.java b/core/src/io/anuke/mindustry/world/blocks/types/production/Generator.java index eca92de1df..360d18699c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Generator.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/Generator.java @@ -26,7 +26,7 @@ public class Generator extends PowerBlock{ public int laserRange = 6; public int laserDirections = 4; - public float powerSpeed = 0.1f; + public float powerSpeed = 0.5f; public boolean explosive = true; public boolean hasLasers = true; public boolean outputOnly = false; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/NuclearReactor.java b/core/src/io/anuke/mindustry/world/blocks/types/production/NuclearReactor.java index 2ff9f45c9d..6164de883d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/NuclearReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/NuclearReactor.java @@ -45,6 +45,7 @@ public class NuclearReactor extends LiquidPowerGenerator{ explosionEffect = Fx.nuclearShockwave; explosive = true; powerCapacity = 80f; + powerSpeed = 0.5f; } @Override @@ -63,7 +64,7 @@ public class NuclearReactor extends LiquidPowerGenerator{ if(fuel > 0){ entity.heat += fullness * heating; entity.power += powerMultiplier * fullness * Timers.delta(); - entity.power = Mathf.clamp(entity.power); + entity.power = Mathf.clamp(entity.power, 0f, powerCapacity); if(entity.timer.get(timerFuel, fuelUseTime)){ entity.removeItem(generateItem, 1); } diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index 23bed2e035..1acb94b26b 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -95,7 +95,11 @@ public class DesktopLauncher { presence.state = Strings.capitalize(Vars.control.getMode().toString()); } }else{ - presence.state = "In Menu"; + if(Vars.ui.editor != null && Vars.ui.editor.isShown()){ + presence.state = "In Editor"; + }else { + presence.state = "In Menu"; + } } presence.largeImageKey = "logo";