Paper/Spigot-Server-Patches/0173-Expose-client-protocol-version-and-virtual-host.patch
Aikar f5265d6688
Updated Upstream (Bukkit/CraftBukkit/Spigot)
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

Bukkit Changes:
6ff65c82 SPIGOT-5908: CompassMeta for new lodestone compass data

CraftBukkit Changes:
3b9cf0f8 Improve code formatting
008f039f SPIGOT-5913: MOTD no longer supports new line character
b8b65eb7 SPIGOT-5908: CompassMeta for new lodestone compass data

Spigot Changes:
4d9262cf Rebuild patches
d27f7952 SPIGOT-5912: Outdated client message shows outdated server message
2020-07-01 02:11:46 -04:00

130 lines
5.3 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Minecrell <minecrell@minecrell.net>
Date: Tue, 10 Oct 2017 18:45:20 +0200
Subject: [PATCH] Expose client protocol version and virtual host
diff --git a/src/main/java/com/destroystokyo/paper/network/PaperNetworkClient.java b/src/main/java/com/destroystokyo/paper/network/PaperNetworkClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..5caca6439d2135e34880d501397fe2ea197d7249
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/network/PaperNetworkClient.java
@@ -0,0 +1,50 @@
+package com.destroystokyo.paper.network;
+
+import net.minecraft.server.NetworkManager;
+
+import java.net.InetSocketAddress;
+
+import javax.annotation.Nullable;
+
+public class PaperNetworkClient implements NetworkClient {
+
+ private final NetworkManager networkManager;
+
+ PaperNetworkClient(NetworkManager networkManager) {
+ this.networkManager = networkManager;
+ }
+
+ @Override
+ public InetSocketAddress getAddress() {
+ return (InetSocketAddress) this.networkManager.getSocketAddress();
+ }
+
+ @Override
+ public int getProtocolVersion() {
+ return this.networkManager.protocolVersion;
+ }
+
+ @Nullable
+ @Override
+ public InetSocketAddress getVirtualHost() {
+ return this.networkManager.virtualHost;
+ }
+
+ public static InetSocketAddress prepareVirtualHost(String host, int port) {
+ int len = host.length();
+
+ // FML appends a marker to the host to recognize FML clients (\0FML\0)
+ int pos = host.indexOf('\0');
+ if (pos >= 0) {
+ len = pos;
+ }
+
+ // When clients connect with a SRV record, their host contains a trailing '.'
+ if (len > 0 && host.charAt(len - 1) == '.') {
+ len--;
+ }
+
+ return InetSocketAddress.createUnresolved(host.substring(0, len), port);
+ }
+
+}
diff --git a/src/main/java/net/minecraft/server/HandshakeListener.java b/src/main/java/net/minecraft/server/HandshakeListener.java
index c0e3d18b0a528d6bca878f354bf8b4b417522c29..12fb251dc96bf179e393046ecc256ea80fdd79de 100644
--- a/src/main/java/net/minecraft/server/HandshakeListener.java
+++ b/src/main/java/net/minecraft/server/HandshakeListener.java
@@ -133,6 +133,10 @@ public class HandshakeListener implements PacketHandshakingInListener {
throw new UnsupportedOperationException("Invalid intention " + packethandshakinginsetprotocol.b());
}
+ // Paper start - NetworkClient implementation
+ this.getNetworkManager().protocolVersion = packethandshakinginsetprotocol.getProtocolVersion();
+ this.getNetworkManager().virtualHost = com.destroystokyo.paper.network.PaperNetworkClient.prepareVirtualHost(packethandshakinginsetprotocol.hostname, packethandshakinginsetprotocol.port);
+ // Paper end
}
@Override
diff --git a/src/main/java/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java
index c2fdccfb9192aa7ec55fd67c169cba71a695075c..33900c22d4123e0f8333b9bdb9601d302e26c972 100644
--- a/src/main/java/net/minecraft/server/NetworkManager.java
+++ b/src/main/java/net/minecraft/server/NetworkManager.java
@@ -60,6 +60,10 @@ public class NetworkManager extends SimpleChannelInboundHandler<Packet<?>> {
private float s;
private int t;
private boolean u;
+ // Paper start - NetworkClient implementation
+ public int protocolVersion;
+ public java.net.InetSocketAddress virtualHost;
+ // Paper end
public NetworkManager(EnumProtocolDirection enumprotocoldirection) {
this.h = enumprotocoldirection;
diff --git a/src/main/java/net/minecraft/server/PacketHandshakingInSetProtocol.java b/src/main/java/net/minecraft/server/PacketHandshakingInSetProtocol.java
index 4f008e4723d2cb0bcabb2d5621203d63c40c4923..8545146fb1f093f821e3b966d9337049575c6773 100644
--- a/src/main/java/net/minecraft/server/PacketHandshakingInSetProtocol.java
+++ b/src/main/java/net/minecraft/server/PacketHandshakingInSetProtocol.java
@@ -35,6 +35,7 @@ public class PacketHandshakingInSetProtocol implements Packet<PacketHandshakingI
return this.d;
}
+ public int getProtocolVersion() { return c(); } // Paper - OBFHELPER
public int c() {
return this.a;
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 8776cfb8b5eda0b407af031747688e582c0c2bff..cc920cb20a7c1c77257e0219137775b362dfe602 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -186,6 +186,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
}
}
+ // Paper start - Implement NetworkClient
+ @Override
+ public int getProtocolVersion() {
+ if (getHandle().playerConnection == null) return -1;
+ return getHandle().playerConnection.networkManager.protocolVersion;
+ }
+
+ @Override
+ public InetSocketAddress getVirtualHost() {
+ if (getHandle().playerConnection == null) return null;
+ return getHandle().playerConnection.networkManager.virtualHost;
+ }
+ // Paper end
+
@Override
public double getEyeHeight(boolean ignorePose) {
if (ignorePose) {