From 846c64f4d1852aa0079978c72a71883fd5039ee8 Mon Sep 17 00:00:00 2001 From: Emily Date: Mon, 4 Aug 2025 10:06:52 -0300 Subject: [PATCH] Allow for sending plugin messages during configuration stage (#12915) --- .../connection/PlayerCommonConnection.java | 3 ++- .../0032-Improve-keepalive-ping-system.patch | 4 ++-- .../ServerCommonPacketListenerImpl.java.patch | 2 +- .../PaperPlayerConfigurationConnection.java | 22 +++++++++++++++++++ .../connection/PaperPlayerGameConnection.java | 12 ++++++++++ 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/paper-api/src/main/java/io/papermc/paper/connection/PlayerCommonConnection.java b/paper-api/src/main/java/io/papermc/paper/connection/PlayerCommonConnection.java index cae2e5ba5..7cba94e49 100644 --- a/paper-api/src/main/java/io/papermc/paper/connection/PlayerCommonConnection.java +++ b/paper-api/src/main/java/io/papermc/paper/connection/PlayerCommonConnection.java @@ -4,11 +4,12 @@ import java.util.Map; import com.destroystokyo.paper.ClientOption; import org.bukkit.ServerLinks; +import org.bukkit.plugin.messaging.PluginMessageRecipient; /** * Represents a connection that has properties shared between the GAME and CONFIG stage. */ -public interface PlayerCommonConnection extends WritablePlayerCookieConnection, ReadablePlayerCookieConnection { +public interface PlayerCommonConnection extends WritablePlayerCookieConnection, ReadablePlayerCookieConnection, PluginMessageRecipient { /** * Sends data to appear in this connection's report logs. diff --git a/paper-server/patches/features/0032-Improve-keepalive-ping-system.patch b/paper-server/patches/features/0032-Improve-keepalive-ping-system.patch index 1ba600dca..996640be1 100644 --- a/paper-server/patches/features/0032-Improve-keepalive-ping-system.patch +++ b/paper-server/patches/features/0032-Improve-keepalive-ping-system.patch @@ -100,7 +100,7 @@ index 962084054c0208470d0c3c99c5dca6327c9b8752..2abc21102bbd2da79dc0c50826cff7da } } diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -index 1b42d5e9f9fd07f99009de6f4483648f416db733..08c59d603fca038fc2dde36384eea1b6c971e659 100644 +index 5e074e6b5b8699b5c978a31518775479a43266ac..07c4a25c121676db867e8fb438ba41ad58528a4d 100644 --- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java @@ -38,12 +38,13 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack @@ -120,7 +120,7 @@ index 1b42d5e9f9fd07f99009de6f4483648f416db733..08c59d603fca038fc2dde36384eea1b6 + private final io.papermc.paper.util.KeepAlive keepAlive; // Paper - improve keepalives private volatile boolean suspendFlushingOnServerThread = false; // CraftBukkit start - protected final org.bukkit.craftbukkit.CraftServer cserver; + public final org.bukkit.craftbukkit.CraftServer cserver; @@ -60,13 +61,14 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack public ServerCommonPacketListenerImpl(MinecraftServer server, Connection connection, CommonListenerCookie cookie) { this.server = server; diff --git a/paper-server/patches/sources/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch b/paper-server/patches/sources/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch index af1564a46..e5d39ad79 100644 --- a/paper-server/patches/sources/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch @@ -14,7 +14,7 @@ private int latency; private volatile boolean suspendFlushingOnServerThread = false; + // CraftBukkit start -+ protected final org.bukkit.craftbukkit.CraftServer cserver; ++ public final org.bukkit.craftbukkit.CraftServer cserver; + public boolean processedDisconnect; + // CraftBukkit end + public final java.util.Map packCallbacks = new java.util.concurrent.ConcurrentHashMap<>(); // Paper - adventure resource pack callbacks diff --git a/paper-server/src/main/java/io/papermc/paper/connection/PaperPlayerConfigurationConnection.java b/paper-server/src/main/java/io/papermc/paper/connection/PaperPlayerConfigurationConnection.java index e47d9bdc0..44d6211cd 100644 --- a/paper-server/src/main/java/io/papermc/paper/connection/PaperPlayerConfigurationConnection.java +++ b/paper-server/src/main/java/io/papermc/paper/connection/PaperPlayerConfigurationConnection.java @@ -20,13 +20,18 @@ import net.kyori.adventure.resource.ResourcePackInfo; import net.kyori.adventure.resource.ResourcePackRequest; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.common.ClientboundClearDialogPacket; +import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket; import net.minecraft.network.protocol.common.ClientboundResourcePackPopPacket; import net.minecraft.network.protocol.common.ClientboundResourcePackPushPacket; import net.minecraft.network.protocol.common.ClientboundShowDialogPacket; +import net.minecraft.network.protocol.common.custom.DiscardedPayload; import net.minecraft.network.protocol.configuration.ClientboundResetChatPacket; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ClientInformation; import net.minecraft.server.network.ConfigurationTask; import net.minecraft.server.network.ServerConfigurationPacketListenerImpl; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.messaging.StandardMessenger; import org.jspecify.annotations.Nullable; public class PaperPlayerConfigurationConnection extends PaperCommonConnection implements PlayerConfigurationConnection, Audience, PluginMessageBridgeImpl { @@ -122,4 +127,21 @@ public class PaperPlayerConfigurationConnection extends PaperCommonConnection channels() { return this.handle.pluginMessagerChannels; } + + @Override + public void sendPluginMessage(final Plugin source, final String channel, final byte[] message) { + StandardMessenger.validatePluginMessage(this.handle.cserver.getMessenger(), source, channel, message); + + if (this.channels().contains(channel)) { + @SuppressWarnings("deprecation") // "not an API method" does not apply to us + ResourceLocation id = ResourceLocation.parse(StandardMessenger.validateAndCorrectChannel(channel)); + ClientboundCustomPayloadPacket packet = new ClientboundCustomPayloadPacket(new DiscardedPayload(id, message)); + this.handle.send(packet); + } + } + + @Override + public Set getListeningPluginChannels() { + return Set.copyOf(this.channels()); + } } diff --git a/paper-server/src/main/java/io/papermc/paper/connection/PaperPlayerGameConnection.java b/paper-server/src/main/java/io/papermc/paper/connection/PaperPlayerGameConnection.java index 452d7229b..68f640e3d 100644 --- a/paper-server/src/main/java/io/papermc/paper/connection/PaperPlayerGameConnection.java +++ b/paper-server/src/main/java/io/papermc/paper/connection/PaperPlayerGameConnection.java @@ -3,6 +3,8 @@ package io.papermc.paper.connection; import net.minecraft.server.level.ClientInformation; import net.minecraft.server.network.ServerGamePacketListenerImpl; import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import java.util.Set; public class PaperPlayerGameConnection extends PaperCommonConnection implements PlayerGameConnection { @@ -28,4 +30,14 @@ public class PaperPlayerGameConnection extends PaperCommonConnection getListeningPluginChannels() { + return getPlayer().getListeningPluginChannels(); + } }