Paper/patches/server/0161-Expose-client-protocol-version-and-virtual-host.patch

117 Zeilen
4.5 KiB
Diff

2021-06-11 14:02:28 +02:00
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..a5a7624f1f372a26b982836cd31cff15e2589e9b
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/network/PaperNetworkClient.java
@@ -0,0 +1,49 @@
+package com.destroystokyo.paper.network;
+
+import java.net.InetSocketAddress;
+
+import javax.annotation.Nullable;
+import net.minecraft.network.Connection;
+
+public class PaperNetworkClient implements NetworkClient {
+
+ private final Connection networkManager;
+
+ PaperNetworkClient(Connection networkManager) {
+ this.networkManager = networkManager;
+ }
+
+ @Override
+ public InetSocketAddress getAddress() {
+ return (InetSocketAddress) this.networkManager.getRemoteAddress();
+ }
+
+ @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/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java
2023-03-14 19:59:51 +01:00
index da13fd2cde9b54ab5bf87fbb4e90b5da47b6b8f2..07b2d28c5cba543b104ade6a180b0940a794e08c 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/net/minecraft/network/Connection.java
+++ b/src/main/java/net/minecraft/network/Connection.java
2023-03-14 19:59:51 +01:00
@@ -114,6 +114,10 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
Rewrite chunk system (#8177) Patch documentation to come Issues with the old system that are fixed now: - World generation does not scale with cpu cores effectively. - Relies on the main thread for scheduling and maintaining chunk state, dropping chunk load/generate rates at lower tps. - Unreliable prioritisation of chunk gen/load calls that block the main thread. - Shutdown logic is utterly unreliable, as it has to wait for all chunks to unload - is it guaranteed that the chunk system is in a state on shutdown that it can reliably do this? Watchdog shutdown also typically failed due to thread checks, which is now resolved. - Saving of data is not unified (i.e can save chunk data without saving entity data, poses problems for desync if shutdown is really abnormal. - Entities are not loaded with chunks. This caused quite a bit of headache for Chunk#getEntities API, but now the new chunk system loads entities with chunks so that they are ready whenever the chunk loads in. Effectively brings the behavior back to 1.16 era, but still storing entities in their own separate regionfiles. The above list is not complete. The patch documentation will complete it. New chunk system hard relies on starlight and dataconverter, and most importantly the new concurrent utilities in ConcurrentUtil. Some of the old async chunk i/o interface (i.e the old file io thread reroutes _some_ calls to the new file io thread) is kept for plugin compat reasons. It will be removed in the next major version of minecraft. The old legacy chunk system patches have been moved to the removed folder in case we need them again.
2022-09-26 10:02:51 +02:00
}
}
// Paper end - add pending task queue
2021-06-11 14:02:28 +02:00
+ // Paper start - NetworkClient implementation
+ public int protocolVersion;
+ public java.net.InetSocketAddress virtualHost;
+ // Paper end
public Connection(PacketFlow side) {
this.receiving = side;
diff --git a/src/main/java/net/minecraft/server/network/ServerHandshakePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerHandshakePacketListenerImpl.java
2023-03-14 19:59:51 +01:00
index 2be1bd39ee1341128f02e38afe5698b837735827..cca08b8c6e1e15f13326a2a7e33e7f3225ad894b 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/net/minecraft/server/network/ServerHandshakePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerHandshakePacketListenerImpl.java
2023-03-14 19:59:51 +01:00
@@ -157,6 +157,10 @@ public class ServerHandshakePacketListenerImpl implements ServerHandshakePacketL
2021-06-11 14:02:28 +02:00
throw new UnsupportedOperationException("Invalid intention " + packet.getIntention());
}
+ // Paper start - NetworkClient implementation
2021-06-12 14:58:17 +02:00
+ this.connection.protocolVersion = packet.getProtocolVersion();
+ this.connection.virtualHost = com.destroystokyo.paper.network.PaperNetworkClient.prepareVirtualHost(packet.hostName, packet.port);
2021-06-11 14:02:28 +02:00
+ // Paper end
}
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 6a12f14f7433ee13605f8dd8b7e0e8d127b915bd..e08cc548950b3ff14a720da693edc45981a4e964 100644
2021-06-11 14:02:28 +02:00
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -303,6 +303,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
2021-06-11 14:02:28 +02:00
}
}
+ // Paper start - Implement NetworkClient
+ @Override
+ public int getProtocolVersion() {
+ if (getHandle().connection == null) return -1;
+ return getHandle().connection.connection.protocolVersion;
+ }
+
+ @Override
+ public InetSocketAddress getVirtualHost() {
+ if (getHandle().connection == null) return null;
+ return getHandle().connection.connection.virtualHost;
+ }
+ // Paper end
+
@Override
public double getEyeHeight(boolean ignorePose) {
if (ignorePose) {