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.
This commit is contained in:
metabrix
2025-07-18 23:22:28 +05:00
committed by GitHub
parent aa4ef06748
commit f7c59f914c
9 changed files with 24 additions and 23 deletions

View File

@@ -28,7 +28,7 @@ and then catch exceptions and close if they fire.
Part of this commit was authored by: Spottedleaf, sandtechnology Part of this commit was authored by: Spottedleaf, sandtechnology
diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java 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 --- a/net/minecraft/network/Connection.java
+++ b/net/minecraft/network/Connection.java +++ b/net/minecraft/network/Connection.java
@@ -85,7 +85,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> { @@ -85,7 +85,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
@@ -40,10 +40,10 @@ index 14a25f4d9c6da9b9d7646cf88b80a04f5b4d0823..682fb4cbf9975b21171ae210defd6e33
public Channel channel; public Channel channel;
public SocketAddress address; public SocketAddress address;
// Spigot start // Spigot start
@@ -146,6 +146,10 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> { @@ -147,6 +147,10 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
@Nullable public SocketAddress haProxyAddress; // Paper - Add API to get player's proxy address
public @Nullable java.util.Optional<net.minecraft.network.chat.Component> legacySavedLoginEventResultOverride; // Paper - playerloginevent public @Nullable java.util.Optional<net.minecraft.network.chat.Component> legacySavedLoginEventResultOverride; // Paper - playerloginevent
public @Nullable net.minecraft.server.level.ServerPlayer savedPlayerForLoginEventLegacy; // 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 + // Paper start - Optimize network
+ public boolean isPending = true; + public boolean isPending = true;
+ public boolean queueImmunity; + public boolean queueImmunity;
@@ -51,7 +51,7 @@ index 14a25f4d9c6da9b9d7646cf88b80a04f5b4d0823..682fb4cbf9975b21171ae210defd6e33
public Connection(PacketFlow receiving) { public Connection(PacketFlow receiving) {
this.receiving = receiving; this.receiving = receiving;
@@ -420,11 +424,38 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> { @@ -421,11 +425,38 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
} }
public void send(Packet<?> packet, @Nullable ChannelFutureListener channelFutureListener, boolean flag) { 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<Packet<?>> { @@ -434,7 +465,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
this.flushQueue(); this.flushQueue();
action.accept(this); action.accept(this);
} else { } else {
@@ -102,7 +102,7 @@ index 14a25f4d9c6da9b9d7646cf88b80a04f5b4d0823..682fb4cbf9975b21171ae210defd6e33
} }
} }
@@ -447,21 +478,41 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> { @@ -448,21 +479,41 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
} }
private void doSendPacket(Packet<?> packet, @Nullable ChannelFutureListener channelFutureListener, boolean flag) { 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<Packet<?>> { @@ -474,16 +525,57 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
} }
} }
@@ -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 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 private static int joinAttemptsThisTick; // Paper - Buffer joins to world
@@ -552,6 +644,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> { @@ -553,6 +645,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
public void disconnect(DisconnectionDetails disconnectionDetails) { public void disconnect(DisconnectionDetails disconnectionDetails) {
this.preparing = false; // Spigot this.preparing = false; // Spigot
@@ -219,7 +219,7 @@ index 14a25f4d9c6da9b9d7646cf88b80a04f5b4d0823..682fb4cbf9975b21171ae210defd6e33
if (this.channel == null) { if (this.channel == null) {
this.delayedDisconnect = disconnectionDetails; this.delayedDisconnect = disconnectionDetails;
} }
@@ -740,7 +833,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> { @@ -741,7 +834,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
public void handleDisconnection() { public void handleDisconnection() {
if (this.channel != null && !this.channel.isOpen()) { if (this.channel != null && !this.channel.isOpen()) {
if (this.disconnectionHandled) { if (this.disconnectionHandled) {
@@ -228,7 +228,7 @@ index 14a25f4d9c6da9b9d7646cf88b80a04f5b4d0823..682fb4cbf9975b21171ae210defd6e33
} else { } else {
this.disconnectionHandled = true; this.disconnectionHandled = true;
PacketListener packetListener = this.getPacketListener(); PacketListener packetListener = this.getPacketListener();
@@ -751,7 +844,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> { @@ -752,7 +845,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
); );
packetListener1.onDisconnect(disconnectionDetails); packetListener1.onDisconnect(disconnectionDetails);
} }
@@ -237,7 +237,7 @@ index 14a25f4d9c6da9b9d7646cf88b80a04f5b4d0823..682fb4cbf9975b21171ae210defd6e33
// Paper start - Add PlayerConnectionCloseEvent // Paper start - Add PlayerConnectionCloseEvent
if (packetListener instanceof net.minecraft.server.network.ServerCommonPacketListenerImpl commonPacketListener) { if (packetListener instanceof net.minecraft.server.network.ServerCommonPacketListenerImpl commonPacketListener) {
/* Player was logged in, either game listener or configuration listener */ /* Player was logged in, either game listener or configuration listener */
@@ -786,4 +879,97 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> { @@ -787,4 +880,97 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
public void setBandwidthLogger(LocalSampleLogger bandwithLogger) { public void setBandwidthLogger(LocalSampleLogger bandwithLogger) {
this.bandwidthDebugMonitor = new BandwidthDebugMonitor(bandwithLogger); this.bandwidthDebugMonitor = new BandwidthDebugMonitor(bandwithLogger);
} }

View File

@@ -269,10 +269,10 @@ index bc674b08a41d5529fe06c6d3f077051cf4138f73..ea8a894158c44c2e7943dea43ecd8e1f
+ // Paper end - Use Velocity cipher + // Paper end - Use Velocity cipher
} }
diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java 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 --- a/net/minecraft/network/Connection.java
+++ b/net/minecraft/network/Connection.java +++ b/net/minecraft/network/Connection.java
@@ -763,11 +763,22 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> { @@ -764,11 +764,22 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
return connection; return connection;
} }
@@ -299,7 +299,7 @@ index 682fb4cbf9975b21171ae210defd6e338de3b718..8bab2c26e10e8495fd39be470bcb0291
public boolean isEncrypted() { public boolean isEncrypted() {
return this.encrypted; return this.encrypted;
@@ -806,16 +817,17 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> { @@ -807,16 +818,17 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
// Paper end - add proper async disconnect // Paper end - add proper async disconnect
public void setupCompression(int threshold, boolean validateDecompressed) { public void setupCompression(int threshold, boolean validateDecompressed) {
if (threshold >= 0) { if (threshold >= 0) {

View File

@@ -27691,7 +27691,7 @@ index 49008b4cbaead8a66a93d2b0d4b50b335a6c3eed..f9c96bbdc54e68b9216b7f8662bfae03
} }
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java 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 --- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java
@@ -193,7 +193,7 @@ import net.minecraft.world.scores.Team; @@ -193,7 +193,7 @@ import net.minecraft.world.scores.Team;
@@ -28333,7 +28333,7 @@ index b30f56fbc1fd17259a1d05dc9155fffcab292ca1..11fed81a4696ba18440e755c3b8a5ca3
this.generatingStep = generatingStep; this.generatingStep = generatingStep;
this.cache = cache; this.cache = cache;
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java 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 --- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java
@@ -1312,7 +1312,7 @@ public abstract class PlayerList { @@ -1312,7 +1312,7 @@ public abstract class PlayerList {

View File

@@ -78,7 +78,7 @@ index 7c9a2eed4441f816723562e0012f918db265912e..cc8638a6dab16ffbdf6951fa10182bd5
profiler.popPush("tickSpawningChunks"); profiler.popPush("tickSpawningChunks");
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java 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 --- a/net/minecraft/server/level/ServerPlayer.java
+++ b/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 @@ -406,6 +406,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc

View File

@@ -60,7 +60,7 @@ index cc8638a6dab16ffbdf6951fa10182bd5763df90f..2882cd829d4d8e1f8615f085f6908efc
spawnState = NaturalSpawner.createState(naturalSpawnChunkCount, this.level.getAllEntities(), this::getFullChunk, null, true); spawnState = NaturalSpawner.createState(naturalSpawnChunkCount, this.level.getAllEntities(), this::getFullChunk, null, true);
} else { } else {
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java 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 --- a/net/minecraft/server/level/ServerPlayer.java
+++ b/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 @@ -410,6 +410,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc

View File

@@ -29,7 +29,7 @@
@Nullable @Nullable
private volatile PacketListener disconnectListener; private volatile PacketListener disconnectListener;
@Nullable @Nullable
@@ -106,6 +_,41 @@ @@ -106,6 +_,42 @@
private volatile DisconnectionDetails delayedDisconnect; private volatile DisconnectionDetails delayedDisconnect;
@Nullable @Nullable
BandwidthDebugMonitor bandwidthDebugMonitor; BandwidthDebugMonitor bandwidthDebugMonitor;
@@ -68,6 +68,7 @@
+ @Nullable public SocketAddress haProxyAddress; // Paper - Add API to get player's proxy address + @Nullable public SocketAddress haProxyAddress; // Paper - Add API to get player's proxy address
+ public @Nullable java.util.Optional<net.minecraft.network.chat.Component> legacySavedLoginEventResultOverride; // Paper - playerloginevent + public @Nullable java.util.Optional<net.minecraft.network.chat.Component> legacySavedLoginEventResultOverride; // Paper - playerloginevent
+ public @Nullable net.minecraft.server.level.ServerPlayer savedPlayerForLoginEventLegacy; // 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) { public Connection(PacketFlow receiving) {
this.receiving = receiving; this.receiving = receiving;

View File

@@ -65,7 +65,7 @@
this.configurationTasks.add(new JoinWorldTask()); this.configurationTasks.add(new JoinWorldTask());
this.startNextTask(); this.startNextTask();
} }
@@ -105,12 +_,13 @@ @@ -105,12 +_,14 @@
@Override @Override
public void handleClientInformation(ServerboundClientInformationPacket packet) { public void handleClientInformation(ServerboundClientInformationPacket packet) {
this.clientInformation = packet.information(); this.clientInformation = packet.information();
@@ -76,6 +76,7 @@
public void handleResourcePackResponse(ServerboundResourcePackPacket packet) { public void handleResourcePackResponse(ServerboundResourcePackPacket packet) {
super.handleResourcePackResponse(packet); super.handleResourcePackResponse(packet);
- if (packet.action().isTerminal()) { - 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 + 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); this.finishCurrentTask(ServerResourcePackConfigurationTask.TYPE);
} }

View File

@@ -2615,7 +2615,7 @@
+ super.handleResourcePackResponse(packet); + super.handleResourcePackResponse(packet);
+ // Paper start - store last pack status + // Paper start - store last pack status
+ org.bukkit.event.player.PlayerResourcePackStatusEvent.Status packStatus = org.bukkit.event.player.PlayerResourcePackStatusEvent.Status.values()[packet.action().ordinal()]; + 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 + this.cserver.getPluginManager().callEvent(new org.bukkit.event.player.PlayerResourcePackStatusEvent(this.getCraftPlayer(), packet.id(), packStatus)); // CraftBukkit
+ // Paper end - store last pack status + // Paper end - store last pack status
+ } + }

View File

@@ -219,7 +219,6 @@ public class CraftPlayer extends CraftHumanEntity implements Player, PluginMessa
private final ConversationTracker conversationTracker = new ConversationTracker(); private final ConversationTracker conversationTracker = new ConversationTracker();
private final Map<UUID, Set<WeakReference<Plugin>>> invertedVisibilityEntities = new HashMap<>(); private final Map<UUID, Set<WeakReference<Plugin>>> invertedVisibilityEntities = new HashMap<>();
private final Set<UUID> unlistedEntities = new HashSet<>(); // Paper - Add Listing API for Player private final Set<UUID> 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 firstPlayed = 0;
private long lastPlayed = 0; private long lastPlayed = 0;
private boolean hasPlayedBefore = false; private boolean hasPlayedBefore = false;
@@ -2630,7 +2629,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player, PluginMessa
// Paper start - more resource pack API // Paper start - more resource pack API
@Override @Override
public org.bukkit.event.player.PlayerResourcePackStatusEvent.Status getResourcePackStatus() { public org.bukkit.event.player.PlayerResourcePackStatusEvent.Status getResourcePackStatus() {
return this.resourcePackStatus; return this.getHandle().connection.connection.resourcePackStatus;
} }
@Override @Override