Added server version display and compatibility checking

This commit is contained in:
Anuken
2018-03-06 23:18:34 -05:00
parent cd038ba5ad
commit a8ce961268
7 changed files with 84 additions and 48 deletions

View File

@@ -58,6 +58,10 @@ text.server.add=Add Server
text.server.delete=Are you sure you want to delete this server? text.server.delete=Are you sure you want to delete this server?
text.server.hostname=Host: {0} text.server.hostname=Host: {0}
text.server.edit=Edit Server text.server.edit=Edit Server
text.server.outdated=[crimson]Outdated Server![]
text.server.outdated.client=[crimson]Outdated Client![]
text.server.version=[lightgray]Version: {0}
text.server.custombuild=[yellow]Custom Build
text.confirmban=Are you sure you want to ban this player? text.confirmban=Are you sure you want to ban this player?
text.confirmunban=Are you sure you want to unban this player? text.confirmunban=Are you sure you want to unban this player?
text.confirmadmin=Are you sure you want to make this player an admin? text.confirmadmin=Are you sure you want to make this player an admin?

View File

@@ -1,7 +1,7 @@
#Autogenerated file. Do not modify. #Autogenerated file. Do not modify.
#Tue Mar 06 22:28:38 EST 2018 #Tue Mar 06 23:17:50 EST 2018
version=release version=release
androidBuildCode=336 androidBuildCode=337
name=Mindustry name=Mindustry
code=3.4 code=3.4
build=custom build build=custom build

View File

@@ -6,12 +6,14 @@ public class Host {
public final String mapname; public final String mapname;
public final int wave; public final int wave;
public final int players; public final int players;
public final int version;
public Host(String name, String address, String mapname, int wave, int players){ public Host(String name, String address, String mapname, int wave, int players, int version){
this.name = name; this.name = name;
this.address = address; this.address = address;
this.players = players; this.players = players;
this.mapname = mapname; this.mapname = mapname;
this.wave = wave; this.wave = wave;
this.version = version;
} }
} }

View File

@@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.io.Platform; import io.anuke.mindustry.io.Platform;
import io.anuke.mindustry.io.Version;
import io.anuke.mindustry.net.Host; import io.anuke.mindustry.net.Host;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.ucore.core.Settings; import io.anuke.ucore.core.Settings;
@@ -84,7 +85,7 @@ public class JoinDialog extends FloatingDialog {
TextButton button = buttons[0] = remote.addButton("[accent]"+server.ip, "clear", () -> { TextButton button = buttons[0] = remote.addButton("[accent]"+server.ip, "clear", () -> {
if(!buttons[0].childrenPressed()) connect(server.ip, Vars.port); if(!buttons[0].childrenPressed()) connect(server.ip, Vars.port);
}).width(w).height(140f).pad(4f).get(); }).width(w).height(150f).pad(4f).get();
button.getLabel().setWrap(true); button.getLabel().setWrap(true);
@@ -131,16 +132,37 @@ public class JoinDialog extends FloatingDialog {
server.content.label(() -> Bundles.get("text.server.refreshing") + Strings.animated(4, 11, ".")); server.content.label(() -> Bundles.get("text.server.refreshing") + Strings.animated(4, 11, "."));
Net.pingHost(server.ip, server.port, host -> { Net.pingHost(server.ip, server.port, host -> {
String versionString;
if(host.version == -1) {
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){
versionString = Bundles.get("text.server.outdated") + "\n" +
Bundles.format("text.server.version", host.version);
}else if(host.version > Version.build && Version.build != -1){
versionString = Bundles.get("text.server.outdated.client") + "\n" +
Bundles.format("text.server.version", host.version);
}else{
versionString = Bundles.format("text.server.version", host.version);
}
server.content.clear(); server.content.clear();
server.content.add("[lightgray]" + Bundles.format("text.server.hostname", host.name)).left(); server.content.table(t -> {
server.content.row(); t.add(versionString).left();
server.content.add("[lightgray]" + (host.players != 1 ? Bundles.format("text.players", host.players) : t.row();
t.add("[lightgray]" + Bundles.format("text.server.hostname", host.name)).left();
t.row();
t.add("[lightgray]" + (host.players != 1 ? Bundles.format("text.players", host.players) :
Bundles.format("text.players.single", host.players))).left(); Bundles.format("text.players.single", host.players))).left();
server.content.row(); t.row();
server.content.add("[lightgray]" + Bundles.format("text.save.map", host.mapname)).left(); t.add("[lightgray]" + Bundles.format("text.save.map", host.mapname) + " / " + Bundles.format("text.save.wave", host.wave)).left();
server.content.row(); }).expand().left().bottom().padLeft(12f).padBottom(8);
server.content.add("[lightgray]" + Bundles.format("text.save.wave", host.wave)).left();
//server.content.add(versionString).top().expandY().top().expandX();
}, e -> { }, e -> {
server.content.clear(); server.content.clear();
server.content.add("$text.host.invalid"); server.content.add("$text.host.invalid");
@@ -161,7 +183,7 @@ public class JoinDialog extends FloatingDialog {
hosts.add(remote).growX(); hosts.add(remote).growX();
hosts.row(); hosts.row();
hosts.add(local).growX(); hosts.add(local).width(w);
ScrollPane pane = new ScrollPane(hosts, "clear"); ScrollPane pane = new ScrollPane(hosts, "clear");
pane.setFadeScrollBars(false); pane.setFadeScrollBars(false);
@@ -188,10 +210,9 @@ public class JoinDialog extends FloatingDialog {
}); });
}).size(50f, 54f).get(); }).size(50f, 54f).get();
button.update(() -> button.getStyle().imageUpColor = player.getColor()); button.update(() -> button.getStyle().imageUpColor = player.getColor());
}).width(w).height(70f).pad(4); }).width(w).height(70f).pad(4);
content().row(); content().row();
content().add(pane).width(w).pad(0); content().add(pane).width(w + 34).pad(0);
content().row(); content().row();
content().addCenteredImageTextButton("$text.server.add", "icon-add", "clear", 14*3, () -> { content().addCenteredImageTextButton("$text.server.add", "icon-add", "clear", 14*3, () -> {
renaming = null; renaming = null;

View File

@@ -104,9 +104,10 @@ public class WebsocketClient implements ClientProvider {
@Override @Override
public void pingHost(String address, int port, Consumer<Host> valid, Consumer<Exception> failed) { public void pingHost(String address, int port, Consumer<Host> valid, Consumer<Exception> failed) {
if(!Platform.instance.canJoinGame()) { try {
if (!Platform.instance.canJoinGame()) {
failed.accept(new IOException()); failed.accept(new IOException());
}else { } else {
Websocket socket = new Websocket("ws://" + address + ":" + webPort); Websocket socket = new Websocket("ws://" + address + ":" + webPort);
final boolean[] accepted = {false}; final boolean[] accepted = {false};
socket.addListener(new WebsocketListener() { socket.addListener(new WebsocketListener() {
@@ -117,9 +118,10 @@ public class WebsocketClient implements ClientProvider {
@Override @Override
public void onMessage(String msg) { public void onMessage(String msg) {
if(!msg.startsWith("---")) return; if (!msg.startsWith("---")) return;
String[] text = msg.substring(3).split("\\|"); String[] text = msg.substring(3).split("\\|");
Host host = new Host(text[1], address, text[2], Strings.parseInt(text[3]), Strings.parseInt(text[0])); Host host = new Host(text[1], address, text[2], Strings.parseInt(text[3]),
Strings.parseInt(text[0]), Strings.parseInt(text[4]));
valid.accept(host); valid.accept(host);
accepted[0] = true; accepted[0] = true;
socket.close(); socket.close();
@@ -138,6 +140,9 @@ public class WebsocketClient implements ClientProvider {
} }
}); });
} }
}catch (Exception e){
failed.accept(new IOException("Failed to connect to host."));
}
} }
@Override @Override

View File

@@ -2,6 +2,7 @@ package io.anuke.kryonet;
import com.esotericsoftware.minlog.Log; import com.esotericsoftware.minlog.Log;
import com.esotericsoftware.minlog.Log.Logger; import com.esotericsoftware.minlog.Log.Logger;
import io.anuke.mindustry.io.Version;
import io.anuke.mindustry.net.Host; import io.anuke.mindustry.net.Host;
import io.anuke.ucore.util.ColorCodes; import io.anuke.ucore.util.ColorCodes;
@@ -65,6 +66,7 @@ public class KryoRegistrator {
buffer.putInt(playerGroup.size()); buffer.putInt(playerGroup.size());
buffer.putInt(state.wave); buffer.putInt(state.wave);
buffer.putInt(Version.build);
return buffer; return buffer;
} }
@@ -84,7 +86,8 @@ public class KryoRegistrator {
int players = buffer.getInt(); int players = buffer.getInt();
int wave = buffer.getInt(); int wave = buffer.getInt();
int version = buffer.getInt();
return new Host(host, ia.getHostAddress(), map, wave, players); return new Host(host, ia.getHostAddress(), map, wave, players, version);
} }
} }

View File

@@ -10,6 +10,7 @@ import com.esotericsoftware.kryonet.Listener.LagListener;
import com.esotericsoftware.kryonet.Server; import com.esotericsoftware.kryonet.Server;
import com.esotericsoftware.kryonet.util.InputStreamSender; import com.esotericsoftware.kryonet.util.InputStreamSender;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.io.Version;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.Net.SendMode; import io.anuke.mindustry.net.Net.SendMode;
import io.anuke.mindustry.net.Net.ServerProvider; import io.anuke.mindustry.net.Net.ServerProvider;
@@ -475,7 +476,7 @@ public class KryoServer implements ServerProvider {
if(message.equals("_ping_")){ if(message.equals("_ping_")){
conn.send("---" + Vars.playerGroup.size() + "|" + (headless ? "Server" : Vars.player.name) conn.send("---" + Vars.playerGroup.size() + "|" + (headless ? "Server" : Vars.player.name)
+ "|" + world.getMap().name + "|" + state.wave); + "|" + world.getMap().name + "|" + state.wave + "|" + Version.build);
connections.remove(k); connections.remove(k);
}else { }else {
byte[] out = Base64Coder.decode(message); byte[] out = Base64Coder.decode(message);