Allow for sending plugin messages during configuration stage (#12915)

This commit is contained in:
Emily
2025-08-04 10:06:52 -03:00
committed by GitHub
parent e9380882f2
commit 846c64f4d1
5 changed files with 39 additions and 4 deletions
@@ -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.
@@ -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;
@@ -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<java.util.UUID, net.kyori.adventure.resource.ResourcePackCallback> packCallbacks = new java.util.concurrent.ConcurrentHashMap<>(); // Paper - adventure resource pack callbacks
@@ -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<ServerConfigurationPacketListenerImpl> implements PlayerConfigurationConnection, Audience, PluginMessageBridgeImpl {
@@ -122,4 +127,21 @@ public class PaperPlayerConfigurationConnection extends PaperCommonConnection<Se
public Set<String> 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<String> getListeningPluginChannels() {
return Set.copyOf(this.channels());
}
}
@@ -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<ServerGamePacketListenerImpl> implements PlayerGameConnection {
@@ -28,4 +30,14 @@ public class PaperPlayerGameConnection extends PaperCommonConnection<ServerGameP
public Player getPlayer() {
return this.handle.getCraftPlayer();
}
@Override
public void sendPluginMessage(final Plugin source, final String channel, final byte[] message) {
getPlayer().sendPluginMessage(source, channel, message);
}
@Override
public Set<String> getListeningPluginChannels() {
return getPlayer().getListeningPluginChannels();
}
}