mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-21 07:09:21 +08:00
d089acb3bd
ForgeFlower is better than Spigots FernFlower at decompiling the source. However, in order to maintain the CraftBukkit patches, we must keep using spigots for the primary. However, for any file that we import on top of Spigots imported files there is nothing stopping us from using better decompiled files. So these changes will use ForgeFlower to maintain a better set of decomped files, so anything we add on top of Paper can start off in a better spot.
156 lines
7.1 KiB
Diff
156 lines
7.1 KiB
Diff
From ab0a6d4deff47bdb159cb413bb4d93ab3dada3de Mon Sep 17 00:00:00 2001
|
|
From: Minecrell <minecrell@minecrell.net>
|
|
Date: Wed, 11 Oct 2017 19:30:51 +0200
|
|
Subject: [PATCH] Call PaperServerListPingEvent for legacy pings
|
|
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/network/PaperLegacyStatusClient.java b/src/main/java/com/destroystokyo/paper/network/PaperLegacyStatusClient.java
|
|
new file mode 100644
|
|
index 0000000000..74c012fd40
|
|
--- /dev/null
|
|
+++ b/src/main/java/com/destroystokyo/paper/network/PaperLegacyStatusClient.java
|
|
@@ -0,0 +1,73 @@
|
|
+package com.destroystokyo.paper.network;
|
|
+
|
|
+import com.destroystokyo.paper.event.server.PaperServerListPingEvent;
|
|
+import net.minecraft.server.MinecraftServer;
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
+import org.bukkit.ChatColor;
|
|
+
|
|
+import java.net.InetSocketAddress;
|
|
+
|
|
+import javax.annotation.Nullable;
|
|
+
|
|
+public final class PaperLegacyStatusClient implements StatusClient {
|
|
+
|
|
+ private final InetSocketAddress address;
|
|
+ private final int protocolVersion;
|
|
+ @Nullable private final InetSocketAddress virtualHost;
|
|
+
|
|
+ private PaperLegacyStatusClient(InetSocketAddress address, int protocolVersion, @Nullable InetSocketAddress virtualHost) {
|
|
+ this.address = address;
|
|
+ this.protocolVersion = protocolVersion;
|
|
+ this.virtualHost = virtualHost;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public InetSocketAddress getAddress() {
|
|
+ return this.address;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public int getProtocolVersion() {
|
|
+ return this.protocolVersion;
|
|
+ }
|
|
+
|
|
+ @Nullable
|
|
+ @Override
|
|
+ public InetSocketAddress getVirtualHost() {
|
|
+ return this.virtualHost;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean isLegacy() {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ public static PaperServerListPingEvent processRequest(MinecraftServer server,
|
|
+ InetSocketAddress address, int protocolVersion, @Nullable InetSocketAddress virtualHost) {
|
|
+
|
|
+ PaperServerListPingEvent event = new PaperServerListPingEventImpl(server,
|
|
+ new PaperLegacyStatusClient(address, protocolVersion, virtualHost), Byte.MAX_VALUE, null);
|
|
+ server.server.getPluginManager().callEvent(event);
|
|
+
|
|
+ if (event.isCancelled()) {
|
|
+ return null;
|
|
+ }
|
|
+
|
|
+ return event;
|
|
+ }
|
|
+
|
|
+ public static String getMotd(PaperServerListPingEvent event) {
|
|
+ return getFirstLine(event.getMotd());
|
|
+ }
|
|
+
|
|
+ public static String getUnformattedMotd(PaperServerListPingEvent event) {
|
|
+ // Strip color codes and all other occurrences of the color char (because it's used as delimiter)
|
|
+ return getFirstLine(StringUtils.remove(ChatColor.stripColor(event.getMotd()), ChatColor.COLOR_CHAR));
|
|
+ }
|
|
+
|
|
+ private static String getFirstLine(String s) {
|
|
+ int pos = s.indexOf('\n');
|
|
+ return pos >= 0 ? s.substring(0, pos) : s;
|
|
+ }
|
|
+
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/LegacyPingHandler.java b/src/main/java/net/minecraft/server/LegacyPingHandler.java
|
|
index aafca9c9c4..860076fc23 100644
|
|
--- a/src/main/java/net/minecraft/server/LegacyPingHandler.java
|
|
+++ b/src/main/java/net/minecraft/server/LegacyPingHandler.java
|
|
@@ -9,6 +9,7 @@ import java.net.InetSocketAddress;
|
|
import java.nio.charset.StandardCharsets;
|
|
import org.apache.logging.log4j.LogManager;
|
|
import org.apache.logging.log4j.Logger;
|
|
+import com.destroystokyo.paper.network.PaperLegacyStatusClient; // Paper
|
|
|
|
public class LegacyPingHandler extends ChannelInboundHandlerAdapter {
|
|
private static final Logger a = LogManager.getLogger();
|
|
@@ -39,10 +40,18 @@ public class LegacyPingHandler extends ChannelInboundHandlerAdapter {
|
|
InetSocketAddress inetsocketaddress = (InetSocketAddress)channelhandlercontext.channel().remoteAddress();
|
|
MinecraftServer minecraftserver = this.b.d();
|
|
int i = bytebuf.readableBytes();
|
|
+ com.destroystokyo.paper.event.server.PaperServerListPingEvent event; // Paper
|
|
switch(i) {
|
|
case 0:
|
|
a.debug("Ping: (<1.3.x) from {}:{}", inetsocketaddress.getAddress(), inetsocketaddress.getPort());
|
|
- String s2 = String.format("%s\u00a7%d\u00a7%d", minecraftserver.getMotd(), minecraftserver.y(), minecraftserver.z());
|
|
+ // Paper start - Call PaperServerListPingEvent and use results
|
|
+ event = PaperLegacyStatusClient.processRequest(minecraftserver, inetsocketaddress, 39, null);
|
|
+ if (event == null) {
|
|
+ channelhandlercontext.close();
|
|
+ break;
|
|
+ }
|
|
+ String s2 = String.format("%s\u00a7%d\u00a7%d", PaperLegacyStatusClient.getUnformattedMotd(event), event.getNumPlayers(), event.getMaxPlayers());
|
|
+ // Paper end
|
|
this.a(channelhandlercontext, this.a(s2));
|
|
break;
|
|
case 1:
|
|
@@ -51,7 +60,14 @@ public class LegacyPingHandler extends ChannelInboundHandlerAdapter {
|
|
}
|
|
|
|
a.debug("Ping: (1.4-1.5.x) from {}:{}", inetsocketaddress.getAddress(), inetsocketaddress.getPort());
|
|
- String s = String.format("\u00a71\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d", 127, minecraftserver.getVersion(), minecraftserver.getMotd(), minecraftserver.y(), minecraftserver.z());
|
|
+ // Paper start - Call PaperServerListPingEvent and use results
|
|
+ event = PaperLegacyStatusClient.processRequest(minecraftserver, inetsocketaddress, 61, null);
|
|
+ if (event == null) {
|
|
+ channelhandlercontext.close();
|
|
+ break;
|
|
+ }
|
|
+ String s = String.format("\u00a71\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d", event.getProtocolVersion(), event.getVersion(), PaperLegacyStatusClient.getMotd(event), event.getNumPlayers(), event.getMaxPlayers());
|
|
+ // Paper end
|
|
this.a(channelhandlercontext, this.a(s));
|
|
break;
|
|
default:
|
|
@@ -161,8 +177,16 @@ public class LegacyPingHandler extends ChannelInboundHandlerAdapter {
|
|
|
|
a.debug("Ping: (1.6) from {}", ctx.channel().remoteAddress());
|
|
|
|
- String response = String.format("\u00a71\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d",
|
|
- Byte.MAX_VALUE, server.getVersion(), server.getMotd(), server.getPlayerCount(), server.getMaxPlayers());
|
|
+ InetSocketAddress virtualHost = com.destroystokyo.paper.network.PaperNetworkClient.prepareVirtualHost(host, port);
|
|
+ com.destroystokyo.paper.event.server.PaperServerListPingEvent event = PaperLegacyStatusClient.processRequest(
|
|
+ server, (InetSocketAddress) ctx.channel().remoteAddress(), protocolVersion, virtualHost);
|
|
+ if (event == null) {
|
|
+ ctx.close();
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ String response = String.format("\u00a71\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d", event.getProtocolVersion(), event.getVersion(),
|
|
+ PaperLegacyStatusClient.getMotd(event), event.getNumPlayers(), event.getMaxPlayers());
|
|
this.a(ctx, this.a(response));
|
|
}
|
|
|
|
--
|
|
2.18.0
|
|
|