diff --git a/build.gradle b/build.gradle index 4d7c3491a6..7317fa10cb 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ allprojects { appName = 'Mindustry' gdxVersion = '1.9.8' roboVMVersion = '2.3.0' - uCoreVersion = 'e8b535aa79075670c3478c7d24cacec8c58e8fc2' + uCoreVersion = '367f0b0bab5936ce47155f17a74150451a0cddea' getVersionString = { String buildVersion = getBuildVersion() diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 5e7df87c17..1d82af951c 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -254,18 +254,23 @@ text.fps=FPS: {0} text.tps=TPS: {0} text.ping=Ping: {0}ms text.language.restart=Please restart your game for the language settings to take effect. -text.settings.language=Language text.settings=Settings text.tutorial=Tutorial text.editor=Editor text.mapeditor=Map Editor text.donate=Donate +text.settings.language=Language text.settings.reset=Reset to Defaults text.settings.rebind=Rebind text.settings.controls=Controls text.settings.game=Game text.settings.sound=Sound text.settings.graphics=Graphics +text.settings.cleardata=Clear Game Data... +text.settings.clear.confirm=Are you sure you want to clear your data?\nThis cannot be undone! +text.settings.clearsectors=Clear Sectors +text.settings.clearunlocks=Clear Unlocks +text.settings.clearall=Clear All text.paused=Paused text.yes=Yes text.no=No diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index eb43aaf494..3b3192d63a 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -151,7 +151,7 @@ public class JoinDialog extends FloatingDialog{ String versionString; if(host.version == -1){ - versionString = Bundles.format("text.server.version", Bundles.get("text.server.custombuild")); + versionString = Bundles.format("text.server.version", Bundles.get("text.server.custombuild"), ""); }else if(host.version == 0){ versionString = Bundles.get("text.server.outdated"); }else if(host.version < Version.build && Version.build != -1){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java index 8f5289a319..d209cac9bf 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -5,6 +5,7 @@ import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.utils.Align; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.GameState.State; +import io.anuke.mindustry.game.Saves.SaveSlot; import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.net.Net; import io.anuke.ucore.core.Core; @@ -16,6 +17,7 @@ import io.anuke.ucore.scene.event.InputListener; import io.anuke.ucore.scene.ui.Image; import io.anuke.ucore.scene.ui.ScrollPane; import io.anuke.ucore.scene.ui.SettingsDialog; +import io.anuke.ucore.scene.ui.SettingsDialog.SettingsTable.Setting; import io.anuke.ucore.scene.ui.Slider; import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.util.Bundles; @@ -133,6 +135,44 @@ public class SettingsMenuDialog extends SettingsDialog{ game.checkPref("effects", true); //game.sliderPref("sensitivity", 100, 10, 300, i -> i + "%"); game.sliderPref("saveinterval", 60, 10, 5 * 120, i -> Bundles.format("setting.seconds", i)); + game.pref(new Setting(){ + @Override + public void add(SettingsTable table){ + table.addButton("$text.settings.cleardata", () -> { + FloatingDialog dialog = new FloatingDialog("$text.settings.cleardata"); + dialog.setFillParent(false); + dialog.content().defaults().size(230f, 50f).pad(3); + dialog.addCloseButton(); + dialog.content().addButton("$text.settings.clearsectors", () -> { + ui.showConfirm("$text.confirm", "$text.settings.clear.confirm", () -> { + Settings.putString("sectors", "{}"); + Settings.save(); + }); + }); + dialog.content().row(); + dialog.content().addButton("$text.settings.clearunlocks", () -> { + ui.showConfirm("$text.confirm", "$text.settings.clear.confirm", () -> { + Settings.putString("unlocks", "{}"); + Settings.save(); + }); + }); + dialog.content().row(); + dialog.content().addButton("$text.settings.clearall", () -> { + ui.showConfirm("$text.confirm", "$text.settings.clear.confirm", () -> { + for(SaveSlot slot : control.getSaves().getSaveSlots()){ + slot.delete(); + } + Settings.prefs().clear(); + Settings.save(); + }); + }); + dialog.content().row(); + dialog.show(); + }).size(220f, 60f).pad(6).left(); + table.add(); + table.row(); + } + }); if(!gwt){ graphics.sliderPref("fpscap", 125, 5, 125, 5, s -> (s > 120 ? Bundles.get("setting.fpscap.none") : Bundles.format("setting.fpscap.text", s))); diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index 522f06d469..5ace8becde 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -2,6 +2,8 @@ package io.anuke.mindustry.server; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Timer; +import com.badlogic.gdx.utils.Timer.Task; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.game.Difficulty; @@ -43,6 +45,7 @@ public class ServerControl extends Module{ private int gameOvers; private boolean inExtraRound; private Team winnerTeam; + private Task lastTask; public ServerControl(String[] args){ Settings.defaultList( @@ -161,7 +164,7 @@ public class ServerControl extends Module{ handler.register("stop", "Stop hosting the server.", arg -> { Net.closeServer(); - Timers.clear(); + if(lastTask != null) lastTask.cancel(); state.set(State.menu); netServer.reset(); Log.info("Stopped server."); @@ -173,6 +176,8 @@ public class ServerControl extends Module{ return; } + if(lastTask != null) lastTask.cancel(); + Map result = null; if(arg.length > 0){ @@ -636,6 +641,7 @@ public class ServerControl extends Module{ } info("&lyCore destroyed."); + inExtraRound = false; Events.fire(new GameOverEvent()); }); @@ -849,7 +855,14 @@ public class ServerControl extends Module{ }; if(wait){ - Timers.run(60f * roundExtraTime, r); + lastTask = new Task(){ + @Override + public void run(){ + r.run(); + } + }; + + Timer.schedule(lastTask, roundExtraTime); }else{ r.run(); } @@ -886,7 +899,7 @@ public class ServerControl extends Module{ @Override public void update(){ - if(!inExtraRound){ + if(!inExtraRound && state.mode.isPvp){ checkPvPGameOver(); }