geforkt von Mirrors/Paper
70ce6ce831
This makes it easier for downstream projects (forks) to replace the version fetching system with their own. It is as simple as implementing an interface and overriding the default implementation of org.bukkit.UnsafeValues#getVersionFetcher() It also makes it easier for us to organize things like the version history feature. Lastly I have updated the paper implementation to check against the site API rather than against jenkins.
158 Zeilen
7.3 KiB
Diff
158 Zeilen
7.3 KiB
Diff
From 968d88906cc479a86a1b297d47455982f3c35f3b 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 06aefcb63..d0bb5496e 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.21.0
|
|
|