Added server version display and compatibility checking
This commit is contained in:
@@ -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?
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
Bundles.format("text.players.single", host.players))).left();
|
t.add("[lightgray]" + Bundles.format("text.server.hostname", host.name)).left();
|
||||||
server.content.row();
|
t.row();
|
||||||
server.content.add("[lightgray]" + Bundles.format("text.save.map", host.mapname)).left();
|
t.add("[lightgray]" + (host.players != 1 ? Bundles.format("text.players", host.players) :
|
||||||
server.content.row();
|
Bundles.format("text.players.single", host.players))).left();
|
||||||
server.content.add("[lightgray]" + Bundles.format("text.save.wave", host.wave)).left();
|
t.row();
|
||||||
|
t.add("[lightgray]" + Bundles.format("text.save.map", host.mapname) + " / " + Bundles.format("text.save.wave", host.wave)).left();
|
||||||
|
}).expand().left().bottom().padLeft(12f).padBottom(8);
|
||||||
|
|
||||||
|
//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;
|
||||||
|
|||||||
@@ -104,39 +104,44 @@ 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 {
|
||||||
failed.accept(new IOException());
|
if (!Platform.instance.canJoinGame()) {
|
||||||
}else {
|
failed.accept(new IOException());
|
||||||
Websocket socket = new Websocket("ws://" + address + ":" + webPort);
|
} else {
|
||||||
final boolean[] accepted = {false};
|
Websocket socket = new Websocket("ws://" + address + ":" + webPort);
|
||||||
socket.addListener(new WebsocketListener() {
|
final boolean[] accepted = {false};
|
||||||
@Override
|
socket.addListener(new WebsocketListener() {
|
||||||
public void onClose() {
|
@Override
|
||||||
if (!accepted[0]) failed.accept(new IOException("Failed to connect to host."));
|
public void onClose() {
|
||||||
}
|
if (!accepted[0]) failed.accept(new IOException("Failed to connect to host."));
|
||||||
|
}
|
||||||
|
|
||||||
@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]),
|
||||||
valid.accept(host);
|
Strings.parseInt(text[0]), Strings.parseInt(text[4]));
|
||||||
accepted[0] = true;
|
valid.accept(host);
|
||||||
socket.close();
|
accepted[0] = true;
|
||||||
}
|
socket.close();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onOpen() {
|
public void onOpen() {
|
||||||
socket.send("_ping_");
|
socket.send("_ping_");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
socket.open();
|
socket.open();
|
||||||
Timers.runTask(60f * 5, () -> {
|
Timers.runTask(60f * 5, () -> {
|
||||||
if (!accepted[0]) {
|
if (!accepted[0]) {
|
||||||
failed.accept(new IOException("Failed to connect to host."));
|
failed.accept(new IOException("Failed to connect to host."));
|
||||||
socket.close();
|
socket.close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
failed.accept(new IOException("Failed to connect to host."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user