diff --git a/paper-server/patches/sources/net/minecraft/network/Connection.java.patch b/paper-server/patches/sources/net/minecraft/network/Connection.java.patch index edd58978c..7d2ca35d1 100644 --- a/paper-server/patches/sources/net/minecraft/network/Connection.java.patch +++ b/paper-server/patches/sources/net/minecraft/network/Connection.java.patch @@ -29,11 +29,15 @@ @Nullable private volatile PacketListener disconnectListener; @Nullable -@@ -114,6 +119,19 @@ +@@ -114,6 +119,23 @@ private volatile DisconnectionDetails delayedDisconnect; @Nullable BandwidthDebugMonitor bandwidthDebugMonitor; + public String hostname = ""; // CraftBukkit - add field ++ // Paper start - NetworkClient implementation ++ public int protocolVersion; ++ public java.net.InetSocketAddress virtualHost; ++ // Paper end + + // Paper start - add utility methods + public final net.minecraft.server.level.ServerPlayer getPlayer() { @@ -49,7 +53,7 @@ public Connection(PacketFlow side) { this.receiving = side; -@@ -123,6 +141,9 @@ +@@ -123,6 +145,9 @@ super.channelActive(channelhandlercontext); this.channel = channelhandlercontext.channel(); this.address = this.channel.remoteAddress(); @@ -59,7 +63,7 @@ if (this.delayedDisconnect != null) { this.disconnect(this.delayedDisconnect); } -@@ -176,6 +197,7 @@ +@@ -176,6 +201,7 @@ } } @@ -67,7 +71,7 @@ } protected void channelRead0(ChannelHandlerContext channelhandlercontext, Packet packet) { -@@ -205,7 +227,7 @@ +@@ -205,7 +231,7 @@ } private static void genericsFtw(Packet packet, PacketListener listener) { @@ -76,7 +80,7 @@ } private void validateListener(ProtocolInfo state, PacketListener listener) { -@@ -464,12 +486,15 @@ +@@ -464,12 +490,15 @@ } public void disconnect(DisconnectionDetails disconnectionInfo) { @@ -93,7 +97,7 @@ this.disconnectionDetails = disconnectionInfo; } -@@ -537,7 +562,7 @@ +@@ -537,7 +566,7 @@ } public void configurePacketHandler(ChannelPipeline pipeline) { @@ -102,7 +106,7 @@ public void write(ChannelHandlerContext channelhandlercontext, Object object, ChannelPromise channelpromise) throws Exception { super.write(channelhandlercontext, object, channelpromise); } -@@ -661,6 +686,7 @@ +@@ -661,6 +690,7 @@ packetlistener1.onDisconnect(disconnectiondetails); } diff --git a/paper-server/patches/sources/net/minecraft/server/network/ServerHandshakePacketListenerImpl.java.patch b/paper-server/patches/sources/net/minecraft/server/network/ServerHandshakePacketListenerImpl.java.patch index b87c81155..17a72f605 100644 --- a/paper-server/patches/sources/net/minecraft/server/network/ServerHandshakePacketListenerImpl.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/network/ServerHandshakePacketListenerImpl.java.patch @@ -31,7 +31,15 @@ switch (packet.intention()) { case LOGIN: this.beginLogin(packet, false); -@@ -59,19 +74,112 @@ +@@ -55,23 +70,120 @@ + throw new UnsupportedOperationException("Invalid intention " + String.valueOf(packet.intention())); + } + ++ // Paper start - NetworkClient implementation ++ this.connection.protocolVersion = packet.protocolVersion(); ++ this.connection.virtualHost = com.destroystokyo.paper.network.PaperNetworkClient.prepareVirtualHost(packet.hostName(), packet.port()); ++ // Paper end + } private void beginLogin(ClientIntentionPacket packet, boolean transfer) { this.connection.setupOutboundProtocol(LoginProtocols.CLIENTBOUND); diff --git a/paper-server/src/main/java/com/destroystokyo/paper/network/PaperNetworkClient.java b/paper-server/src/main/java/com/destroystokyo/paper/network/PaperNetworkClient.java new file mode 100644 index 000000000..a5a7624f1 --- /dev/null +++ b/paper-server/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/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index d5aa717e7..88b693dda 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -341,6 +341,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player { this.getHandle().transferCookieConnection.sendPacket(new ClientboundTransferPacket(host, port)); } + // 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) {