diff --git a/pom.xml b/pom.xml index 44996ea..be90d37 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,6 @@ - ${project.artifactId} @@ -65,11 +64,6 @@ NBT 5.5 - - com.google.code.gson - gson - 2.8.5 - org.yaml snakeyaml diff --git a/src/com/loohp/limbo/Events/StatusPingEvent.java b/src/com/loohp/limbo/Events/StatusPingEvent.java deleted file mode 100644 index 5784212..0000000 --- a/src/com/loohp/limbo/Events/StatusPingEvent.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.loohp.limbo.Events; - -import java.awt.image.BufferedImage; - -import com.loohp.limbo.Server.ClientConnection; - -import net.md_5.bungee.api.chat.BaseComponent; - -public class StatusPingEvent extends Event { - - private ClientConnection connection; - private String version; - private int protocol; - private BaseComponent[] motd; - private int maxPlayers; - private int playersOnline; - private BufferedImage favicon; - - public StatusPingEvent(ClientConnection connection, String version, int protocol, BaseComponent[] motd, int maxPlayers, int playersOnline, BufferedImage favicon) { - this.connection = connection; - this.version = version; - this.protocol = protocol; - this.motd = motd; - this.maxPlayers = maxPlayers; - this.playersOnline = playersOnline; - this.favicon = favicon; - } - - public ClientConnection getConnection() { - return connection; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public int getProtocol() { - return protocol; - } - - public void setProtocol(int protocol) { - this.protocol = protocol; - } - - public BaseComponent[] getMotd() { - return motd; - } - - public void setMotd(BaseComponent[] motd) { - this.motd = motd; - } - - public int getMaxPlayers() { - return maxPlayers; - } - - public void setMaxPlayers(int maxPlayers) { - this.maxPlayers = maxPlayers; - } - - public int getPlayersOnline() { - return playersOnline; - } - - public void setPlayersOnline(int playersOnline) { - this.playersOnline = playersOnline; - } - - public BufferedImage getFavicon() { - return favicon; - } - - public void setFavicon(BufferedImage favicon) { - this.favicon = favicon; - } - -} diff --git a/src/com/loohp/limbo/Limbo.java b/src/com/loohp/limbo/Limbo.java index a029c3b..1aace45 100644 --- a/src/com/loohp/limbo/Limbo.java +++ b/src/com/loohp/limbo/Limbo.java @@ -1,7 +1,6 @@ package com.loohp.limbo; import java.awt.GraphicsEnvironment; -import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; @@ -12,25 +11,19 @@ import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import java.nio.file.Files; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.TreeMap; import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; -import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.loohp.limbo.Commands.CommandSender; import com.loohp.limbo.Events.EventsManager; import com.loohp.limbo.File.ServerProperties; @@ -51,8 +44,6 @@ import com.loohp.limbo.World.Schematic; import com.loohp.limbo.World.World; import com.loohp.limbo.World.World.Environment; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.chat.ComponentSerializer; import net.querz.nbt.io.NBTUtil; import net.querz.nbt.tag.CompoundTag; @@ -349,48 +340,22 @@ public class Limbo { return null; } - @SuppressWarnings("unchecked") - public String buildServerListResponseJson(String version, int protocol, BaseComponent[] motd, int maxPlayers, int playersOnline, BufferedImage favicon) throws IOException { - JSONObject json = new JSONObject(); - - JSONObject versionJson = new JSONObject(); - versionJson.put("name", version); - versionJson.put("protocol", protocol); - json.put("version", versionJson); + public String getServerListResponseJson() throws IOException { + String base = ServerProperties.JSON_BASE_RESPONSE; + base = base.replace("%VERSION%", properties.getVersionString()); + base = base.replace("%PROTOCOL%", String.valueOf(properties.getProtocol())); + base = base.replace("%MOTD%", properties.getMotdJson()); + base = base.replace("%MAXPLAYERS%", String.valueOf(properties.getMaxPlayers())); + base = base.replace("%ONLINECLIENTS%", String.valueOf(getPlayers().size())); - JSONObject playersJson = new JSONObject(); - playersJson.put("max", maxPlayers); - playersJson.put("online", playersOnline); - json.put("players", playersJson); - - json.put("description", "%MOTD%"); - - if (favicon != null) { - if (favicon.getWidth() == 64 && favicon.getHeight() == 64) { - String base64 = "data:image/png;base64," + ImageUtils.imgToBase64String(favicon, "png"); - json.put("favicon", base64); - } else { - console.sendMessage("Server List Favicon must be 64 x 64 in size!"); - } + if (properties.getFavicon().isPresent()) { + String icon = "\"favicon\":\"data:image/png;base64," + ImageUtils.imgToBase64String(properties.getFavicon().get(), "png") + "\","; + base = base.replace("%FAVICON%", icon); + } else { + base = base.replace("%FAVICON%", ""); } - JSONObject modInfoJson = new JSONObject(); - modInfoJson.put("type", "FML"); - modInfoJson.put("modList", new JSONArray()); - json.put("modinfo", modInfoJson); - - - TreeMap treeMap = new TreeMap(String.CASE_INSENSITIVE_ORDER); - treeMap.putAll(json); - - Gson g = new GsonBuilder().create(); - - return g.toJson(treeMap).replace("\"%MOTD%\"", ComponentSerializer.toString(motd)); - } - - public String buildLegacyPingResponse(String version, BaseComponent[] motd, int maxPlayers, int playersOnline) { - String begin = "§1"; - return String.join("\00", begin, "127", version, String.join("", Arrays.asList(motd).stream().map(each -> each.toLegacyText()).collect(Collectors.toList())), String.valueOf(playersOnline), String.valueOf(maxPlayers)); + return base; } public void stopServer() { diff --git a/src/com/loohp/limbo/Server/ClientConnection.java b/src/com/loohp/limbo/Server/ClientConnection.java index 0ee20cd..aef5c0b 100644 --- a/src/com/loohp/limbo/Server/ClientConnection.java +++ b/src/com/loohp/limbo/Server/ClientConnection.java @@ -18,7 +18,6 @@ import com.loohp.limbo.Limbo; import com.loohp.limbo.Events.PlayerJoinEvent; import com.loohp.limbo.Events.PlayerLoginEvent; import com.loohp.limbo.Events.PlayerQuitEvent; -import com.loohp.limbo.Events.StatusPingEvent; import com.loohp.limbo.File.ServerProperties; import com.loohp.limbo.Location.Location; import com.loohp.limbo.Player.Player; @@ -72,7 +71,6 @@ import net.querz.mca.Chunk; public class ClientConnection extends Thread { public enum ClientState { - LEGACY, HANDSHAKE, STATUS, LOGIN, @@ -166,26 +164,10 @@ public class ClientConnection extends Thread { client_socket.setKeepAlive(true); input = new DataInputStream(client_socket.getInputStream()); output = new DataOutputStream(client_socket.getOutputStream()); - int handShakeSize = DataTypeIO.readVarInt(input); - - //legacy ping - if (handShakeSize == 0xFE) { - state = ClientState.LEGACY; - output.writeByte(255); - ServerProperties p = Limbo.getInstance().getServerProperties(); - StatusPingEvent event = (StatusPingEvent) Limbo.getInstance().getEventsManager().callEvent(new StatusPingEvent(this, p.getVersionString(), p.getProtocol(), ComponentSerializer.parse(p.getMotdJson()), p.getMaxPlayers(), Limbo.getInstance().getPlayers().size(), p.getFavicon().orElse(null))); - String response = Limbo.getInstance().buildLegacyPingResponse(event.getVersion(), event.getMotd(), event.getMaxPlayers(), event.getPlayersOnline()); - System.out.println(response); - byte[] bytes = response.getBytes(StandardCharsets.UTF_16BE); - output.writeShort(response.length()); - output.write(bytes); - - client_socket.close(); - state = ClientState.DISCONNECTED; - } + DataTypeIO.readVarInt(input); - @SuppressWarnings("unused") - int handShakeId = DataTypeIO.readVarInt(input); + //int handShakeId = DataTypeIO.readVarInt(input); + DataTypeIO.readVarInt(input); PacketHandshakingIn handshake = new PacketHandshakingIn(input); @@ -206,9 +188,7 @@ public class ClientConnection extends Thread { } else if (packetType.equals(PacketStatusInRequest.class)) { String str = client_socket.getInetAddress().getHostName() + ":" + client_socket.getPort(); Limbo.getInstance().getConsole().sendMessage("[/" + str + "] <-> Handshake Status has pinged"); - ServerProperties p = Limbo.getInstance().getServerProperties(); - StatusPingEvent event = (StatusPingEvent) Limbo.getInstance().getEventsManager().callEvent(new StatusPingEvent(this, p.getVersionString(), p.getProtocol(), ComponentSerializer.parse(p.getMotdJson()), p.getMaxPlayers(), Limbo.getInstance().getPlayers().size(), p.getFavicon().orElse(null))); - PacketStatusOutResponse packet = new PacketStatusOutResponse(Limbo.getInstance().buildServerListResponseJson(event.getVersion(), event.getProtocol(), event.getMotd(), event.getMaxPlayers(), event.getPlayersOnline(), event.getFavicon())); + PacketStatusOutResponse packet = new PacketStatusOutResponse(Limbo.getInstance().getServerListResponseJson()); sendPacket(packet); } else if (packetType.equals(PacketStatusInPing.class)) { PacketStatusInPing ping = new PacketStatusInPing(input);