mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-08 03:39:48 +01:00
0708fa363b
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing CraftBukkit Changes:eb2e6578
SPIGOT-5116: Fix concurrent modification exception inside ChunkMapDistance989f9b3d
SPIGOT-4849: Fix server crash when accessing chunks during chunk load/unload/populate eventsf554183c
SPIGOT-5171: Don't fire PlayerTeleportEvent if not actually moving2349feb8
SPIGOT-5163: Cancelling PlayerBucketFillEvent visually removes the targeted block Spigot Changes: 9a643a6a Remove DataWatcher Locking
158 lines
7.4 KiB
Diff
158 lines
7.4 KiB
Diff
From 09533cdd58bffe6c96fe610ab8f9ae065b82d689 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 000000000..74c012fd4
|
|
--- /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 063efe9bb..4a49fe4cc 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.LOGGER.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.LOGGER.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 {
|
|
|
|
LOGGER.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.22.0
|
|
|