From f7c59f914c15de506ea08084093b1074cc043958 Mon Sep 17 00:00:00 2001 From: metabrix Date: Fri, 18 Jul 2025 23:22:28 +0500 Subject: [PATCH] Fix broken resource pack API when configured in configuration stage (#12866) Correctly return the resource pack status from Player#getResourcePackStatus() when the resource pack was send and accepted during the configuration stage. --- ...-Manager-and-add-advanced-packet-sup.patch | 22 +++++++++---------- ...ocity-compression-and-cipher-natives.patch | 6 ++--- .../0016-Moonrise-optimisation-patches.patch | 4 ++-- .../0026-Optional-per-player-mob-spawns.patch | 2 +- ...ng-PreCreatureSpawnEvent-with-per-pl.patch | 2 +- .../minecraft/network/Connection.java.patch | 3 ++- ...ConfigurationPacketListenerImpl.java.patch | 3 ++- .../ServerGamePacketListenerImpl.java.patch | 2 +- .../craftbukkit/entity/CraftPlayer.java | 3 +-- 9 files changed, 24 insertions(+), 23 deletions(-) diff --git a/paper-server/patches/features/0001-Optimize-Network-Manager-and-add-advanced-packet-sup.patch b/paper-server/patches/features/0001-Optimize-Network-Manager-and-add-advanced-packet-sup.patch index b839e8f1b0..281d0a53ec 100644 --- a/paper-server/patches/features/0001-Optimize-Network-Manager-and-add-advanced-packet-sup.patch +++ b/paper-server/patches/features/0001-Optimize-Network-Manager-and-add-advanced-packet-sup.patch @@ -28,7 +28,7 @@ and then catch exceptions and close if they fire. Part of this commit was authored by: Spottedleaf, sandtechnology diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java -index 14a25f4d9c6da9b9d7646cf88b80a04f5b4d0823..682fb4cbf9975b21171ae210defd6e338de3b718 100644 +index fbd98db86677983891a8c6f3582fc189a9be6aa4..d1b9417e936cafaaff17b2988058c866a23399eb 100644 --- a/net/minecraft/network/Connection.java +++ b/net/minecraft/network/Connection.java @@ -85,7 +85,7 @@ public class Connection extends SimpleChannelInboundHandler> { @@ -40,10 +40,10 @@ index 14a25f4d9c6da9b9d7646cf88b80a04f5b4d0823..682fb4cbf9975b21171ae210defd6e33 public Channel channel; public SocketAddress address; // Spigot start -@@ -146,6 +146,10 @@ public class Connection extends SimpleChannelInboundHandler> { - @Nullable public SocketAddress haProxyAddress; // Paper - Add API to get player's proxy address +@@ -147,6 +147,10 @@ public class Connection extends SimpleChannelInboundHandler> { public @Nullable java.util.Optional legacySavedLoginEventResultOverride; // Paper - playerloginevent public @Nullable net.minecraft.server.level.ServerPlayer savedPlayerForLoginEventLegacy; // Paper - playerloginevent + public @Nullable org.bukkit.event.player.PlayerResourcePackStatusEvent.Status resourcePackStatus; // Paper + // Paper start - Optimize network + public boolean isPending = true; + public boolean queueImmunity; @@ -51,7 +51,7 @@ index 14a25f4d9c6da9b9d7646cf88b80a04f5b4d0823..682fb4cbf9975b21171ae210defd6e33 public Connection(PacketFlow receiving) { this.receiving = receiving; -@@ -420,11 +424,38 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -421,11 +425,38 @@ public class Connection extends SimpleChannelInboundHandler> { } public void send(Packet packet, @Nullable ChannelFutureListener channelFutureListener, boolean flag) { @@ -93,7 +93,7 @@ index 14a25f4d9c6da9b9d7646cf88b80a04f5b4d0823..682fb4cbf9975b21171ae210defd6e33 } } -@@ -433,7 +464,7 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -434,7 +465,7 @@ public class Connection extends SimpleChannelInboundHandler> { this.flushQueue(); action.accept(this); } else { @@ -102,7 +102,7 @@ index 14a25f4d9c6da9b9d7646cf88b80a04f5b4d0823..682fb4cbf9975b21171ae210defd6e33 } } -@@ -447,21 +478,41 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -448,21 +479,41 @@ public class Connection extends SimpleChannelInboundHandler> { } private void doSendPacket(Packet packet, @Nullable ChannelFutureListener channelFutureListener, boolean flag) { @@ -148,7 +148,7 @@ index 14a25f4d9c6da9b9d7646cf88b80a04f5b4d0823..682fb4cbf9975b21171ae210defd6e33 } } -@@ -473,16 +524,57 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -474,16 +525,57 @@ public class Connection extends SimpleChannelInboundHandler> { } } @@ -211,7 +211,7 @@ index 14a25f4d9c6da9b9d7646cf88b80a04f5b4d0823..682fb4cbf9975b21171ae210defd6e33 private static final int MAX_PER_TICK = io.papermc.paper.configuration.GlobalConfiguration.get().misc.maxJoinsPerTick; // Paper - Buffer joins to world private static int joinAttemptsThisTick; // Paper - Buffer joins to world -@@ -552,6 +644,7 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -553,6 +645,7 @@ public class Connection extends SimpleChannelInboundHandler> { public void disconnect(DisconnectionDetails disconnectionDetails) { this.preparing = false; // Spigot @@ -219,7 +219,7 @@ index 14a25f4d9c6da9b9d7646cf88b80a04f5b4d0823..682fb4cbf9975b21171ae210defd6e33 if (this.channel == null) { this.delayedDisconnect = disconnectionDetails; } -@@ -740,7 +833,7 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -741,7 +834,7 @@ public class Connection extends SimpleChannelInboundHandler> { public void handleDisconnection() { if (this.channel != null && !this.channel.isOpen()) { if (this.disconnectionHandled) { @@ -228,7 +228,7 @@ index 14a25f4d9c6da9b9d7646cf88b80a04f5b4d0823..682fb4cbf9975b21171ae210defd6e33 } else { this.disconnectionHandled = true; PacketListener packetListener = this.getPacketListener(); -@@ -751,7 +844,7 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -752,7 +845,7 @@ public class Connection extends SimpleChannelInboundHandler> { ); packetListener1.onDisconnect(disconnectionDetails); } @@ -237,7 +237,7 @@ index 14a25f4d9c6da9b9d7646cf88b80a04f5b4d0823..682fb4cbf9975b21171ae210defd6e33 // Paper start - Add PlayerConnectionCloseEvent if (packetListener instanceof net.minecraft.server.network.ServerCommonPacketListenerImpl commonPacketListener) { /* Player was logged in, either game listener or configuration listener */ -@@ -786,4 +879,97 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -787,4 +880,97 @@ public class Connection extends SimpleChannelInboundHandler> { public void setBandwidthLogger(LocalSampleLogger bandwithLogger) { this.bandwidthDebugMonitor = new BandwidthDebugMonitor(bandwithLogger); } diff --git a/paper-server/patches/features/0005-Use-Velocity-compression-and-cipher-natives.patch b/paper-server/patches/features/0005-Use-Velocity-compression-and-cipher-natives.patch index abf97b350c..bc778cf7bf 100644 --- a/paper-server/patches/features/0005-Use-Velocity-compression-and-cipher-natives.patch +++ b/paper-server/patches/features/0005-Use-Velocity-compression-and-cipher-natives.patch @@ -269,10 +269,10 @@ index bc674b08a41d5529fe06c6d3f077051cf4138f73..ea8a894158c44c2e7943dea43ecd8e1f + // Paper end - Use Velocity cipher } diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java -index 682fb4cbf9975b21171ae210defd6e338de3b718..8bab2c26e10e8495fd39be470bcb02917fe56f40 100644 +index d1b9417e936cafaaff17b2988058c866a23399eb..41005f6b9f53a9c1125ad5e08538d9f5aacb3571 100644 --- a/net/minecraft/network/Connection.java +++ b/net/minecraft/network/Connection.java -@@ -763,11 +763,22 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -764,11 +764,22 @@ public class Connection extends SimpleChannelInboundHandler> { return connection; } @@ -299,7 +299,7 @@ index 682fb4cbf9975b21171ae210defd6e338de3b718..8bab2c26e10e8495fd39be470bcb0291 public boolean isEncrypted() { return this.encrypted; -@@ -806,16 +817,17 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -807,16 +818,17 @@ public class Connection extends SimpleChannelInboundHandler> { // Paper end - add proper async disconnect public void setupCompression(int threshold, boolean validateDecompressed) { if (threshold >= 0) { diff --git a/paper-server/patches/features/0016-Moonrise-optimisation-patches.patch b/paper-server/patches/features/0016-Moonrise-optimisation-patches.patch index 4be82944c5..7ffb36f5f0 100644 --- a/paper-server/patches/features/0016-Moonrise-optimisation-patches.patch +++ b/paper-server/patches/features/0016-Moonrise-optimisation-patches.patch @@ -27691,7 +27691,7 @@ index 49008b4cbaead8a66a93d2b0d4b50b335a6c3eed..f9c96bbdc54e68b9216b7f8662bfae03 } diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 2f3b5164356e3a91e63054faac92981d7197d0fb..18439057b996a55833e1bfc60dc293de432d2902 100644 +index 537821a41e4ef4be17b8859a23107cf726569112..514ff8543dbbe1c6ae47c7fd6c1545b87d3b2927 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -193,7 +193,7 @@ import net.minecraft.world.scores.Team; @@ -28333,7 +28333,7 @@ index b30f56fbc1fd17259a1d05dc9155fffcab292ca1..11fed81a4696ba18440e755c3b8a5ca3 this.generatingStep = generatingStep; this.cache = cache; diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 21b7b2f88708eb9e29d4c327b9bca79119b7124d..5a60527c9feb3606d85488b3cf215c451ca033de 100644 +index 12988d4c0b72d0648ba51c7fb07f446a713c559b..4460b0fd4770e93874332fabc63df952f482aed6 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -1312,7 +1312,7 @@ public abstract class PlayerList { diff --git a/paper-server/patches/features/0026-Optional-per-player-mob-spawns.patch b/paper-server/patches/features/0026-Optional-per-player-mob-spawns.patch index 00cec368bd..a6bb05401f 100644 --- a/paper-server/patches/features/0026-Optional-per-player-mob-spawns.patch +++ b/paper-server/patches/features/0026-Optional-per-player-mob-spawns.patch @@ -78,7 +78,7 @@ index 7c9a2eed4441f816723562e0012f918db265912e..cc8638a6dab16ffbdf6951fa10182bd5 profiler.popPush("tickSpawningChunks"); diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 18c0a3de3fd04879f84306e09f5a30502a3d5077..8b0d6efdc6daca8428cdbc8b984441806f7b1a4f 100644 +index 4726c980ad52c1300de16b7607006ea4a13325eb..4d8fb02fa18157dbf805c93422c2c2db7f437e4b 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -406,6 +406,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc diff --git a/paper-server/patches/features/0027-Improve-cancelling-PreCreatureSpawnEvent-with-per-pl.patch b/paper-server/patches/features/0027-Improve-cancelling-PreCreatureSpawnEvent-with-per-pl.patch index 0f5630d3c6..cf35482fb4 100644 --- a/paper-server/patches/features/0027-Improve-cancelling-PreCreatureSpawnEvent-with-per-pl.patch +++ b/paper-server/patches/features/0027-Improve-cancelling-PreCreatureSpawnEvent-with-per-pl.patch @@ -60,7 +60,7 @@ index cc8638a6dab16ffbdf6951fa10182bd5763df90f..2882cd829d4d8e1f8615f085f6908efc spawnState = NaturalSpawner.createState(naturalSpawnChunkCount, this.level.getAllEntities(), this::getFullChunk, null, true); } else { diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 8b0d6efdc6daca8428cdbc8b984441806f7b1a4f..1e28042457905f67ec965853bb1a0049b8b19330 100644 +index 4d8fb02fa18157dbf805c93422c2c2db7f437e4b..37c0a84758a1526791913898358659de202fa19f 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -410,6 +410,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc 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 ef3704f1e0..312e4b4286 100644 --- a/paper-server/patches/sources/net/minecraft/network/Connection.java.patch +++ b/paper-server/patches/sources/net/minecraft/network/Connection.java.patch @@ -29,7 +29,7 @@ @Nullable private volatile PacketListener disconnectListener; @Nullable -@@ -106,6 +_,41 @@ +@@ -106,6 +_,42 @@ private volatile DisconnectionDetails delayedDisconnect; @Nullable BandwidthDebugMonitor bandwidthDebugMonitor; @@ -68,6 +68,7 @@ + @Nullable public SocketAddress haProxyAddress; // Paper - Add API to get player's proxy address + public @Nullable java.util.Optional legacySavedLoginEventResultOverride; // Paper - playerloginevent + public @Nullable net.minecraft.server.level.ServerPlayer savedPlayerForLoginEventLegacy; // Paper - playerloginevent ++ public @Nullable org.bukkit.event.player.PlayerResourcePackStatusEvent.Status resourcePackStatus; // Paper public Connection(PacketFlow receiving) { this.receiving = receiving; diff --git a/paper-server/patches/sources/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java.patch b/paper-server/patches/sources/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java.patch index 26de214826..1d0349772d 100644 --- a/paper-server/patches/sources/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java.patch @@ -65,7 +65,7 @@ this.configurationTasks.add(new JoinWorldTask()); this.startNextTask(); } -@@ -105,12 +_,13 @@ +@@ -105,12 +_,14 @@ @Override public void handleClientInformation(ServerboundClientInformationPacket packet) { this.clientInformation = packet.information(); @@ -76,6 +76,7 @@ public void handleResourcePackResponse(ServerboundResourcePackPacket packet) { super.handleResourcePackResponse(packet); - if (packet.action().isTerminal()) { ++ this.connection.resourcePackStatus = org.bukkit.event.player.PlayerResourcePackStatusEvent.Status.values()[packet.action().ordinal()]; // Paper + if (packet.action().isTerminal() && packet.id().equals(this.server.getServerResourcePack().map(MinecraftServer.ServerResourcePackInfo::id).orElse(null))) { // Paper - Ignore resource pack requests that are not vanilla this.finishCurrentTask(ServerResourcePackConfigurationTask.TYPE); } diff --git a/paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch b/paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch index 9e6732593c..177e789ca8 100644 --- a/paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch @@ -2615,7 +2615,7 @@ + super.handleResourcePackResponse(packet); + // Paper start - store last pack status + org.bukkit.event.player.PlayerResourcePackStatusEvent.Status packStatus = org.bukkit.event.player.PlayerResourcePackStatusEvent.Status.values()[packet.action().ordinal()]; -+ this.player.getBukkitEntity().resourcePackStatus = packStatus; ++ this.connection.resourcePackStatus = packStatus; + this.cserver.getPluginManager().callEvent(new org.bukkit.event.player.PlayerResourcePackStatusEvent(this.getCraftPlayer(), packet.id(), packStatus)); // CraftBukkit + // Paper end - store last pack status + } 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 9d6235390c..d4183bd693 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 @@ -219,7 +219,6 @@ public class CraftPlayer extends CraftHumanEntity implements Player, PluginMessa private final ConversationTracker conversationTracker = new ConversationTracker(); private final Map>> invertedVisibilityEntities = new HashMap<>(); private final Set unlistedEntities = new HashSet<>(); // Paper - Add Listing API for Player - public org.bukkit.event.player.PlayerResourcePackStatusEvent.Status resourcePackStatus; // Paper - more resource pack API private long firstPlayed = 0; private long lastPlayed = 0; private boolean hasPlayedBefore = false; @@ -2630,7 +2629,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player, PluginMessa // Paper start - more resource pack API @Override public org.bukkit.event.player.PlayerResourcePackStatusEvent.Status getResourcePackStatus() { - return this.resourcePackStatus; + return this.getHandle().connection.connection.resourcePackStatus; } @Override