Revert "StatusPingEvent, support Legacy Ping"

This reverts commit 9c760b88ce.
This commit is contained in:
LOOHP 2020-08-08 19:34:22 +08:00
parent 945e5c0252
commit f1ee9fb078
4 changed files with 17 additions and 159 deletions

View File

@ -49,7 +49,6 @@
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
<finalName>${project.artifactId}</finalName>
</build> </build>
<repositories> <repositories>
@ -65,11 +64,6 @@
<artifactId>NBT</artifactId> <artifactId>NBT</artifactId>
<version>5.5</version> <version>5.5</version>
</dependency> </dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<dependency> <dependency>
<groupId>org.yaml</groupId> <groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId> <artifactId>snakeyaml</artifactId>

View File

@ -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;
}
}

View File

@ -1,7 +1,6 @@
package com.loohp.limbo; package com.loohp.limbo;
import java.awt.GraphicsEnvironment; import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.FileReader; import java.io.FileReader;
@ -12,25 +11,19 @@ import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel; import java.nio.channels.ReadableByteChannel;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.TreeMap;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; 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.JSONObject;
import org.json.simple.parser.JSONParser; import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException; 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.Commands.CommandSender;
import com.loohp.limbo.Events.EventsManager; import com.loohp.limbo.Events.EventsManager;
import com.loohp.limbo.File.ServerProperties; 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;
import com.loohp.limbo.World.World.Environment; 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.io.NBTUtil;
import net.querz.nbt.tag.CompoundTag; import net.querz.nbt.tag.CompoundTag;
@ -349,48 +340,22 @@ public class Limbo {
return null; return null;
} }
@SuppressWarnings("unchecked") public String getServerListResponseJson() throws IOException {
public String buildServerListResponseJson(String version, int protocol, BaseComponent[] motd, int maxPlayers, int playersOnline, BufferedImage favicon) throws IOException { String base = ServerProperties.JSON_BASE_RESPONSE;
JSONObject json = new JSONObject(); 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 versionJson = new JSONObject(); if (properties.getFavicon().isPresent()) {
versionJson.put("name", version); String icon = "\"favicon\":\"data:image/png;base64," + ImageUtils.imgToBase64String(properties.getFavicon().get(), "png") + "\",";
versionJson.put("protocol", protocol); base = base.replace("%FAVICON%", icon);
json.put("version", versionJson); } else {
base = base.replace("%FAVICON%", "");
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!");
}
} }
JSONObject modInfoJson = new JSONObject(); return base;
modInfoJson.put("type", "FML");
modInfoJson.put("modList", new JSONArray());
json.put("modinfo", modInfoJson);
TreeMap<String, Object> treeMap = new TreeMap<String, Object>(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));
} }
public void stopServer() { public void stopServer() {

View File

@ -18,7 +18,6 @@ import com.loohp.limbo.Limbo;
import com.loohp.limbo.Events.PlayerJoinEvent; import com.loohp.limbo.Events.PlayerJoinEvent;
import com.loohp.limbo.Events.PlayerLoginEvent; import com.loohp.limbo.Events.PlayerLoginEvent;
import com.loohp.limbo.Events.PlayerQuitEvent; import com.loohp.limbo.Events.PlayerQuitEvent;
import com.loohp.limbo.Events.StatusPingEvent;
import com.loohp.limbo.File.ServerProperties; import com.loohp.limbo.File.ServerProperties;
import com.loohp.limbo.Location.Location; import com.loohp.limbo.Location.Location;
import com.loohp.limbo.Player.Player; import com.loohp.limbo.Player.Player;
@ -72,7 +71,6 @@ import net.querz.mca.Chunk;
public class ClientConnection extends Thread { public class ClientConnection extends Thread {
public enum ClientState { public enum ClientState {
LEGACY,
HANDSHAKE, HANDSHAKE,
STATUS, STATUS,
LOGIN, LOGIN,
@ -166,26 +164,10 @@ public class ClientConnection extends Thread {
client_socket.setKeepAlive(true); client_socket.setKeepAlive(true);
input = new DataInputStream(client_socket.getInputStream()); input = new DataInputStream(client_socket.getInputStream());
output = new DataOutputStream(client_socket.getOutputStream()); output = new DataOutputStream(client_socket.getOutputStream());
int handShakeSize = DataTypeIO.readVarInt(input); DataTypeIO.readVarInt(input);
//legacy ping //int handShakeId = DataTypeIO.readVarInt(input);
if (handShakeSize == 0xFE) { DataTypeIO.readVarInt(input);
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;
}
@SuppressWarnings("unused")
int handShakeId = DataTypeIO.readVarInt(input);
PacketHandshakingIn handshake = new PacketHandshakingIn(input); PacketHandshakingIn handshake = new PacketHandshakingIn(input);
@ -206,9 +188,7 @@ public class ClientConnection extends Thread {
} else if (packetType.equals(PacketStatusInRequest.class)) { } else if (packetType.equals(PacketStatusInRequest.class)) {
String str = client_socket.getInetAddress().getHostName() + ":" + client_socket.getPort(); String str = client_socket.getInetAddress().getHostName() + ":" + client_socket.getPort();
Limbo.getInstance().getConsole().sendMessage("[/" + str + "] <-> Handshake Status has pinged"); Limbo.getInstance().getConsole().sendMessage("[/" + str + "] <-> Handshake Status has pinged");
ServerProperties p = Limbo.getInstance().getServerProperties(); PacketStatusOutResponse packet = new PacketStatusOutResponse(Limbo.getInstance().getServerListResponseJson());
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()));
sendPacket(packet); sendPacket(packet);
} else if (packetType.equals(PacketStatusInPing.class)) { } else if (packetType.equals(PacketStatusInPing.class)) {
PacketStatusInPing ping = new PacketStatusInPing(input); PacketStatusInPing ping = new PacketStatusInPing(input);