aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0244-Call-PaperServerListPingEvent-for-legacy-pings.patch
diff options
context:
space:
mode:
Diffstat (limited to 'Spigot-Server-Patches/0244-Call-PaperServerListPingEvent-for-legacy-pings.patch')
-rw-r--r--Spigot-Server-Patches/0244-Call-PaperServerListPingEvent-for-legacy-pings.patch157
1 files changed, 157 insertions, 0 deletions
diff --git a/Spigot-Server-Patches/0244-Call-PaperServerListPingEvent-for-legacy-pings.patch b/Spigot-Server-Patches/0244-Call-PaperServerListPingEvent-for-legacy-pings.patch
new file mode 100644
index 0000000000..0b6cf63357
--- /dev/null
+++ b/Spigot-Server-Patches/0244-Call-PaperServerListPingEvent-for-legacy-pings.patch
@@ -0,0 +1,157 @@
+From 98fa17b2e410c24de48f86b9daaa28e549ceea1e Mon Sep 17 00:00:00 2001
+From: Minecrell <[email protected]>
+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 2a99f34df6..2a30af7def 100644
+--- a/src/main/java/net/minecraft/server/LegacyPingHandler.java
++++ b/src/main/java/net/minecraft/server/LegacyPingHandler.java
+@@ -1,5 +1,7 @@
+ package net.minecraft.server;
+
++import com.destroystokyo.paper.network.PaperLegacyStatusClient;
++
+ import io.netty.buffer.ByteBuf;
+ import io.netty.buffer.Unpooled;
+ import io.netty.channel.ChannelFutureListener;
+@@ -45,12 +47,19 @@ public class LegacyPingHandler extends ChannelInboundHandlerAdapter {
+ MinecraftServer minecraftserver = this.b.d();
+ int i = bytebuf.readableBytes();
+ String s;
+- org.bukkit.event.server.ServerListPingEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callServerListPingEvent(minecraftserver.server, inetsocketaddress.getAddress(), minecraftserver.getMotd(), minecraftserver.getPlayerCount(), minecraftserver.getMaxPlayers()); // CraftBukkit
++ //org.bukkit.event.server.ServerListPingEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callServerListPingEvent(minecraftserver.server, inetsocketaddress.getAddress(), minecraftserver.getMotd(), minecraftserver.getPlayerCount(), minecraftserver.getMaxPlayers()); // CraftBukkit // Paper
++ com.destroystokyo.paper.event.server.PaperServerListPingEvent event; // Paper
+
+ switch (i) {
+ case 0:
+ LegacyPingHandler.a.debug("Ping: (<1.3.x) from {}:{}", inetsocketaddress.getAddress(), inetsocketaddress.getPort());
+- s = String.format("%s\u00a7%d\u00a7%d", event.getMotd(), event.getNumPlayers(), event.getMaxPlayers()); // CraftBukkit
++ // Paper start - Call PaperServerListPingEvent and use results
++ event = PaperLegacyStatusClient.processRequest(minecraftserver, inetsocketaddress, 39, null);
++ if (event == null) {
++ channelhandlercontext.close();
++ break;
++ }
++ s = String.format("%s\u00a7%d\u00a7%d", PaperLegacyStatusClient.getUnformattedMotd(event), event.getNumPlayers(), event.getMaxPlayers());
+ this.a(channelhandlercontext, this.a(s));
+ break;
+ case 1:
+@@ -59,7 +68,14 @@ public class LegacyPingHandler extends ChannelInboundHandlerAdapter {
+ }
+
+ LegacyPingHandler.a.debug("Ping: (1.4-1.5.x) from {}:{}", inetsocketaddress.getAddress(), inetsocketaddress.getPort());
+- s = String.format("\u00a71\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d", 127, minecraftserver.getVersion(), event.getMotd(), event.getNumPlayers(), event.getMaxPlayers()); // CraftBukkit
++ // Paper start - Call PaperServerListPingEvent and use results
++ event = PaperLegacyStatusClient.processRequest(minecraftserver, inetsocketaddress, 127, null); // Paper
++ if (event == null) {
++ channelhandlercontext.close();
++ break;
++ }
++ s = String.format("\u00a71\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d", new Object[] { event.getProtocolVersion(), minecraftserver.getVersion(), event.getMotd(), event.getNumPlayers(), event.getMaxPlayers()}); // CraftBukkit
++ // Paper end
+ this.a(channelhandlercontext, this.a(s));
+ break;
+ default:
+@@ -169,8 +185,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.21.0
+