From c14e2337231c3965c9ee185e6a8dab05ccaae403 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 30 Dec 2017 13:39:37 -0500 Subject: [PATCH] Basic server hosting done --- core/assets/bundles/bundle.properties | 4 +++ core/src/io/anuke/mindustry/Mindustry.java | 1 + core/src/io/anuke/mindustry/Vars.java | 4 +++ core/src/io/anuke/mindustry/core/Network.java | 31 ++++++++++++++++++- core/src/io/anuke/mindustry/core/UI.java | 9 ++++-- core/src/io/anuke/mindustry/net/Net.java | 11 +++++++ core/src/io/anuke/mindustry/net/Packets.java | 16 ++++++++++ .../anuke/mindustry/net/packets/Connect.java | 6 ---- .../mindustry/net/packets/Disconnect.java | 6 ---- .../anuke/mindustry/net/packets/Packets.java | 4 --- .../src/io/anuke/mindustry/ui/MenuDialog.java | 23 ++++++++++++++ .../mindustry/desktop/DesktopLauncher.java | 13 ++++++-- 12 files changed, 106 insertions(+), 22 deletions(-) create mode 100644 core/src/io/anuke/mindustry/net/Packets.java delete mode 100644 core/src/io/anuke/mindustry/net/packets/Connect.java delete mode 100644 core/src/io/anuke/mindustry/net/packets/Disconnect.java delete mode 100644 core/src/io/anuke/mindustry/net/packets/Packets.java diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 7a49495043..493efeb7dc 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -11,6 +11,10 @@ text.level.mode=Gamemode: text.savegame=Save Game text.loadgame=Load Game text.quit=Quit +text.hostserver=Host Server +text.server.port=Port: +text.server.invalidport=Invalid port number! +text.server.error=[crimson]Error hosting server: [orange]{0} text.tutorial.back=< Prev text.tutorial.next=Next > text.save.new=New Save diff --git a/core/src/io/anuke/mindustry/Mindustry.java b/core/src/io/anuke/mindustry/Mindustry.java index a36a546a88..69d41d5d89 100644 --- a/core/src/io/anuke/mindustry/Mindustry.java +++ b/core/src/io/anuke/mindustry/Mindustry.java @@ -41,6 +41,7 @@ public class Mindustry extends ModuleCore { module(Vars.control = new Control()); module(Vars.renderer = new Renderer()); module(Vars.ui = new UI()); + module(Vars.network = new Network()); } public void loadBundle(){ diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 7cd08e69d1..103882e98e 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -72,11 +72,15 @@ public class Vars{ public static final float multiplier = android ? 3 : 2; public static final int tilesize = 8; + + //server port + public static final int port = 6567; public static Control control; public static Renderer renderer; public static UI ui; public static World world; + public static Network network; public static Player player; diff --git a/core/src/io/anuke/mindustry/core/Network.java b/core/src/io/anuke/mindustry/core/Network.java index 8b0de963ea..23e87f1061 100644 --- a/core/src/io/anuke/mindustry/core/Network.java +++ b/core/src/io/anuke/mindustry/core/Network.java @@ -1,7 +1,36 @@ package io.anuke.mindustry.core; +import io.anuke.mindustry.Vars; +import io.anuke.mindustry.core.GameState.State; +import io.anuke.mindustry.net.Net; import io.anuke.ucore.modules.Module; +import java.io.IOException; + public class Network extends Module{ - //TODO implementation + private boolean isHosting; + + public Network(){ + + } + + public void update(){ + if(isHosting && GameState.is(State.menu)){ + Net.closeServer(); + isHosting = false; + } + } + + public void hostServer(int port) throws IOException{ + if(isHosting){ + throw new IOException("Already hosting a server!"); + } + + Net.host(port); + isHosting = true; + } + + public boolean isHosting(){ + return isHosting; + } } diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index b05fab525f..58871645c9 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -42,6 +42,7 @@ import io.anuke.ucore.scene.builders.label; import io.anuke.ucore.scene.builders.table; import io.anuke.ucore.scene.event.Touchable; import io.anuke.ucore.scene.ui.*; +import io.anuke.ucore.scene.ui.TextField.TextFieldFilter; import io.anuke.ucore.scene.ui.Window.WindowStyle; import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.ui.layout.Unit; @@ -371,12 +372,12 @@ public class UI extends SceneModule{ configtable.setVisible(false); } - public void showTextInput(String title, String text, String def, Consumer confirmed){ + public void showTextInput(String title, String text, String def, TextFieldFilter filter, Consumer confirmed){ new Dialog(title, "dialog"){{ content().margin(30); content().add(text).padRight(6f); TextField field = content().addField(def, t->{}).size(170f, 50f).get(); - field.setTextFieldFilter((f, c) -> field.getText().length() < 12); + field.setTextFieldFilter((f, c) -> field.getText().length() < 12 && filter.acceptChar(f, c)); Mindustry.platforms.addDialog(field); buttons().defaults().size(120, 54).pad(4); buttons().addButton("$text.ok", () -> { @@ -387,6 +388,10 @@ public class UI extends SceneModule{ }}.show(); } + public void showTextInput(String title, String text, String def, Consumer confirmed){ + showTextInput(title, text, def, (field, c) -> true, confirmed); + } + public void showError(String text){ new Dialog("$text.error.title", "dialog"){{ content().margin(15); diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index c2b8afe1c1..13ea87b4aa 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -23,8 +23,17 @@ public class Net{ /**Host a server at an address*/ public static void host(int port) throws IOException{ + active = true; + server = true; serverProvider.host(port); } + + /**Closes the server.*/ + public static void closeServer(){ + serverProvider.close(); + server = false; + active = false; + } /**Send an object to all connected clients, or to the server if this is a client.*/ public static void send(Object object, SendMode mode){ @@ -113,6 +122,8 @@ public class Net{ public void sendTo(int id, Object object, SendMode mode); /**Send an object to everyone except a client ID.*/ public void sendExcept(int id, Object object, SendMode mode); + /**Close the server connection.*/ + public void close(); /**Register classes to be sent.*/ public void register(Class... types); } diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java new file mode 100644 index 0000000000..5d88a12967 --- /dev/null +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -0,0 +1,16 @@ +package io.anuke.mindustry.net; + +/**Class for storing all packets.*/ +public class Packets { + + public static class Connect { + public int id; + public String addressTCP; + } + + public static class Disconnect { + public int id; + public String addressTCP; + } + +} diff --git a/core/src/io/anuke/mindustry/net/packets/Connect.java b/core/src/io/anuke/mindustry/net/packets/Connect.java deleted file mode 100644 index 6c0c2280d5..0000000000 --- a/core/src/io/anuke/mindustry/net/packets/Connect.java +++ /dev/null @@ -1,6 +0,0 @@ -package io.anuke.mindustry.net.packets; - -public class Connect { - public int id; - public String addressTCP; -} diff --git a/core/src/io/anuke/mindustry/net/packets/Disconnect.java b/core/src/io/anuke/mindustry/net/packets/Disconnect.java deleted file mode 100644 index 990254d998..0000000000 --- a/core/src/io/anuke/mindustry/net/packets/Disconnect.java +++ /dev/null @@ -1,6 +0,0 @@ -package io.anuke.mindustry.net.packets; - -public class Disconnect { - public int id; - public String addressTCP; -} diff --git a/core/src/io/anuke/mindustry/net/packets/Packets.java b/core/src/io/anuke/mindustry/net/packets/Packets.java deleted file mode 100644 index c980d0f1ab..0000000000 --- a/core/src/io/anuke/mindustry/net/packets/Packets.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.anuke.mindustry.net.packets; - -public class Packets { -} diff --git a/core/src/io/anuke/mindustry/ui/MenuDialog.java b/core/src/io/anuke/mindustry/ui/MenuDialog.java index 05846f0337..0160fad481 100644 --- a/core/src/io/anuke/mindustry/ui/MenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/MenuDialog.java @@ -10,7 +10,12 @@ import io.anuke.ucore.scene.builders.build; import io.anuke.ucore.scene.builders.imagebutton; import io.anuke.ucore.scene.ui.ConfirmDialog; import io.anuke.ucore.scene.ui.ImageButton; +import io.anuke.ucore.scene.ui.TextField.TextFieldFilter.DigitsOnlyFilter; import io.anuke.ucore.scene.ui.layout.Cell; +import io.anuke.ucore.util.Bundles; +import io.anuke.ucore.util.Strings; + +import java.io.IOException; public class MenuDialog extends FloatingDialog{ private SaveDialog save = new SaveDialog(); @@ -55,6 +60,24 @@ public class MenuDialog extends FloatingDialog{ } content().row(); + + content().addButton("$text.hostserver", () -> { + Vars.ui.showTextInput("$text.hostserver", "$text.server.port", Vars.port + "", new DigitsOnlyFilter(), text -> { + int result = Strings.parseInt(text); + if(result == Integer.MIN_VALUE || result >= 65535){ + Vars.ui.showError("$text.server.invalidport"); + }else{ + try{ + Vars.network.hostServer(result); + }catch (IOException e){ + Vars.ui.showError(Bundles.format("text.server.error", Strings.parseException(e, false))); + } + } + }); + }).disabled(b -> Vars.network.isHosting()); + + content().row(); + content().addButton("$text.quit", () -> { new ConfirmDialog("$text.confirm", "$text.quit.confirm", () -> { hide(); diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index c0178ce039..88b2257356 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -23,8 +23,8 @@ import io.anuke.mindustry.net.Net.SendMode; import io.anuke.mindustry.Vars; import io.anuke.mindustry.io.PlatformFunction; import io.anuke.mindustry.net.Net.ServerProvider; -import io.anuke.mindustry.net.packets.Connect; -import io.anuke.mindustry.net.packets.Disconnect; +import io.anuke.mindustry.net.Packets.Connect; +import io.anuke.mindustry.net.Packets.Disconnect; import io.anuke.ucore.scene.ui.TextField; public class DesktopLauncher { @@ -133,7 +133,9 @@ public class DesktopLauncher { { server = new Server(); - server.start(); + Thread thread = new Thread(server, "Kryonet Server"); + thread.setDaemon(true); + thread.start(); server.addListener(new Listener(){ @Override public void connected (Connection connection) { @@ -163,6 +165,11 @@ public class DesktopLauncher { server.bind(port, port); } + @Override + public void close() { + server.close(); + } + @Override public void send(Object object, SendMode mode) { if(mode == SendMode.tcp){