From d22c682e5bfee2a722ca573b73c8c6220dfcbde0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 3 Jan 2018 16:23:18 -0500 Subject: [PATCH] Implemented player menu with kick option (untested) --- core/assets/bundles/bundle.properties | 2 + .../io/anuke/mindustry/core/NetClient.java | 10 ++++ .../io/anuke/mindustry/entities/Player.java | 2 +- .../entities/enemies/StandardEnemy.java | 4 ++ core/src/io/anuke/mindustry/net/Net.java | 11 +++- core/src/io/anuke/mindustry/net/Packets.java | 4 ++ .../io/anuke/mindustry/net/Registrator.java | 1 + .../io/anuke/mindustry/ui/BorderImage.java | 6 ++ .../src/io/anuke/mindustry/ui/MenuDialog.java | 11 +++- .../ui/fragments/PlayerListFragment.java | 57 +++++++++++++++++++ kryonet/src/io/anuke/kryonet/KryoServer.java | 14 +++++ 11 files changed, 117 insertions(+), 5 deletions(-) create mode 100644 core/src/io/anuke/mindustry/entities/enemies/StandardEnemy.java create mode 100644 core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index fe5ce8d53f..7f9ed21ada 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -13,6 +13,8 @@ text.loadgame=Load Game text.joingame=Join Game text.quit=Quit text.name=Name: +text.players={0} players online +text.server.kicked=You have been kicked from the server! text.server.connected=A player has joined. text.server.disconnected={0} has disconnected. text.nohost=Can't host server on a custom map! diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index f46dca0d50..535c71c340 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -37,6 +37,7 @@ import java.util.Arrays; public class NetClient extends Module { boolean connecting = false; boolean gotEntities = false; + boolean kicked = false; float playerSyncTime = 2; float dataTimeout = 60*10; @@ -45,6 +46,7 @@ public class NetClient extends Module { Net.handle(Connect.class, packet -> { connecting = true; gotEntities = false; + kicked = false; Gdx.app.postRunnable(() -> { Vars.ui.hideLoading(); Vars.ui.showLoading("$text.connecting.data"); @@ -65,6 +67,8 @@ public class NetClient extends Module { }); Net.handle(Disconnect.class, packet -> { + if(kicked) return; + Gdx.app.postRunnable(() -> { Timers.runFor(3f, () -> { Vars.ui.hideLoading(); @@ -264,6 +268,12 @@ public class NetClient extends Module { Net.handle(ChatPacket.class, packet -> { //TODO }); + + Net.handle(KickPacket.class, packet -> { + kicked = true; + Net.disconnect(); + Gdx.app.postRunnable(() -> Vars.ui.showError("$text.server.kicked")); + }); } public void update(){ diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index 1d7d8a79fe..81d674aac4 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -21,7 +21,7 @@ public class Player extends DestructibleEntity implements Syncable{ private static final float speed = 1.1f; private static final float dashSpeed = 1.8f; - public String name = "player name"; + public String name = "name"; public transient Weapon weapon = Weapon.blaster; public Mech mech = Mech.standard; public float angle; diff --git a/core/src/io/anuke/mindustry/entities/enemies/StandardEnemy.java b/core/src/io/anuke/mindustry/entities/enemies/StandardEnemy.java new file mode 100644 index 0000000000..02159828f5 --- /dev/null +++ b/core/src/io/anuke/mindustry/entities/enemies/StandardEnemy.java @@ -0,0 +1,4 @@ +package io.anuke.mindustry.entities.enemies; + +public class StandardEnemy { +} diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index c63addab63..ac707ad077 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -65,6 +65,11 @@ public class Net{ }); } + /**Kick a specified connection from the server.*/ + public static void kickConnection(int id){ + serverProvider.kick(id); + } + /**Returns a list of all connections IDs.*/ public static IntArray getConnections(){ return serverProvider.getConnections(); @@ -215,10 +220,12 @@ public class Net{ public void close(); /**Return all connected users.*/ public IntArray getConnections(); - /**Register classes to be sent.*/ - public void register(Class... types); + /**Kick a certain connection.*/ + public void kick(int connection); /**Returns the ping for a certain connection.*/ public int getPingFor(int connection); + /**Register classes to be sent.*/ + public void register(Class... types); /**Close all connections.*/ public void dispose(); } diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index 9416b82135..39db45f568 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -113,4 +113,8 @@ public class Packets { public String name; public String text; } + + public static class KickPacket{ + + } } diff --git a/core/src/io/anuke/mindustry/net/Registrator.java b/core/src/io/anuke/mindustry/net/Registrator.java index ef2969f7b8..6945482f6c 100644 --- a/core/src/io/anuke/mindustry/net/Registrator.java +++ b/core/src/io/anuke/mindustry/net/Registrator.java @@ -34,6 +34,7 @@ public class Registrator { ConnectPacket.class, DisconnectPacket.class, ChatPacket.class, + KickPacket.class, Class.class, byte[].class, diff --git a/core/src/io/anuke/mindustry/ui/BorderImage.java b/core/src/io/anuke/mindustry/ui/BorderImage.java index d76bb762b4..bde48388d0 100644 --- a/core/src/io/anuke/mindustry/ui/BorderImage.java +++ b/core/src/io/anuke/mindustry/ui/BorderImage.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.Colors; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.ucore.core.Draw; import io.anuke.ucore.scene.ui.Image; import io.anuke.ucore.scene.ui.layout.Unit; @@ -21,6 +22,11 @@ public class BorderImage extends Image{ super(texture); thickness = thick; } + + public BorderImage(TextureRegion region, float thick){ + super(region); + thickness = thick; + } @Override public void draw(Batch batch, float alpha){ diff --git a/core/src/io/anuke/mindustry/ui/MenuDialog.java b/core/src/io/anuke/mindustry/ui/MenuDialog.java index c6544c7855..399e7ff0fb 100644 --- a/core/src/io/anuke/mindustry/ui/MenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/MenuDialog.java @@ -62,7 +62,7 @@ public class MenuDialog extends FloatingDialog{ }else { ui.showHostServer(); } - }).disabled(b -> Net.active() || (Net.active() && !Net.server())); + }).disabled(b -> Net.active()); content().row(); @@ -96,7 +96,14 @@ public class MenuDialog extends FloatingDialog{ new imagebutton("icon-load", isize, () -> load.show()).text("$text.load").padTop(4f).disabled(Net.active()); - new imagebutton("icon-host", isize, () -> ui.showHostServer()).text("$text.host").padTop(4f); + new imagebutton("icon-host", isize, () -> { + if(Vars.world.getMap().custom){ + ui.showError("$text.nohost"); + }else { + ui.showHostServer(); + } + }).text("$text.host") + .disabled(b -> Net.active()).padTop(4f); new imagebutton("icon-quit", isize, () -> { Vars.ui.showConfirm("$text.confirm", "$text.quit.confirm", () -> { diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java new file mode 100644 index 0000000000..6e3fe1a9a7 --- /dev/null +++ b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java @@ -0,0 +1,57 @@ +package io.anuke.mindustry.ui.fragments; + +import io.anuke.mindustry.Vars; +import io.anuke.mindustry.entities.Player; +import io.anuke.mindustry.net.Net; +import io.anuke.mindustry.ui.BorderImage; +import io.anuke.ucore.core.Draw; +import io.anuke.ucore.scene.builders.label; +import io.anuke.ucore.scene.builders.table; +import io.anuke.ucore.scene.ui.layout.Table; +import io.anuke.ucore.util.Bundles; + +public class PlayerListFragment implements Fragment{ + Table content = new Table(); + + @Override + public void build(){ + new table(){{ + new table("pane"){{ + new label(() -> Bundles.format("text.players", Vars.control.playerGroup.amount())); + row(); + add(content).grow(); + }}.end(); + }}.end(); + + rebuild(); + } + + public void rebuild(){ + if(!Net.active()) return; + content.clear(); + + float h = 80f; + + for(Player player : Vars.control.playerGroup.all()){ + Table button = new Table("button"); + button.left(); + button.margin(0); + BorderImage image = new BorderImage(Draw.region(player.isAndroid ? "ship-standard" : "mech-standard"), 3f); + button.add(image).size(h); + button.add(player.name).pad(10); + + if(Net.server() && !player.isLocal){ + button.add().growY(); + button.addIButton("icon-cancel", 14*3, () -> + Net.kickConnection(player.clientid) + ).size(h); + } + + content.add(button).padBottom(-5).width(250f); + content.row(); + } + + content.marginBottom(5); + } + +} diff --git a/kryonet/src/io/anuke/kryonet/KryoServer.java b/kryonet/src/io/anuke/kryonet/KryoServer.java index b04b5dfa4a..73e3d6e9e3 100644 --- a/kryonet/src/io/anuke/kryonet/KryoServer.java +++ b/kryonet/src/io/anuke/kryonet/KryoServer.java @@ -9,11 +9,13 @@ import io.anuke.mindustry.net.Net.SendMode; 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.KickPacket; import io.anuke.mindustry.net.Registrator; import io.anuke.mindustry.net.Streamable; import io.anuke.mindustry.net.Streamable.StreamBegin; import io.anuke.mindustry.net.Streamable.StreamChunk; import io.anuke.ucore.UCore; +import io.anuke.ucore.core.Timers; import java.io.IOException; import java.net.InetSocketAddress; @@ -99,6 +101,18 @@ public class KryoServer implements ServerProvider { return connections; } + @Override + public void kick(int connection) { + Connection conn = getByID(connection); + + conn.sendTCP(new KickPacket()); + Timers.runTask(1f, () -> { + if(conn.isConnected()){ + conn.close(); + } + }); + } + @Override public void host(int port) throws IOException { server.bind(port, port);