diff --git a/paper-server/nms-patches/net/minecraft/server/network/PlayerConnection.patch b/paper-server/nms-patches/net/minecraft/server/network/PlayerConnection.patch index f041f77279..2df5fd4a8b 100644 --- a/paper-server/nms-patches/net/minecraft/server/network/PlayerConnection.patch +++ b/paper-server/nms-patches/net/minecraft/server/network/PlayerConnection.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/network/PlayerConnection.java +++ b/net/minecraft/server/network/PlayerConnection.java -@@ -185,6 +185,69 @@ +@@ -185,6 +185,70 @@ import net.minecraft.world.phys.shapes.VoxelShapes; import org.slf4j.Logger; @@ -25,6 +25,7 @@ +import net.minecraft.world.level.RayTrace; +import net.minecraft.world.phys.MovingObjectPosition; +import org.bukkit.Location; ++import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.craftbukkit.inventory.CraftItemStack; @@ -70,7 +71,7 @@ public class PlayerConnection implements ServerPlayerConnection, TickablePacketListener, PacketListenerPlayIn { static final Logger LOGGER = LogUtils.getLogger(); -@@ -201,7 +264,9 @@ +@@ -201,7 +265,9 @@ private long keepAliveTime; private boolean keepAlivePending; private long keepAliveChallenge; @@ -81,7 +82,7 @@ private int dropSpamTickCount; private double firstGoodX; private double firstGoodY; -@@ -247,8 +312,31 @@ +@@ -247,8 +313,31 @@ this.keepAliveTime = SystemUtils.getMillis(); entityplayer.getTextFilter().join(); this.signedMessageDecoder = minecraftserver.enforceSecureProfile() ? SignedMessageChain.b.REJECT_ALL : SignedMessageChain.b.unsigned(entityplayer.getUUID()); @@ -114,7 +115,7 @@ @Override public void tick() { -@@ -303,7 +391,7 @@ +@@ -303,7 +392,7 @@ this.server.getProfiler().push("keepAlive"); long i = SystemUtils.getMillis(); @@ -123,7 +124,7 @@ if (this.keepAlivePending) { this.disconnect(IChatBaseComponent.translatable("disconnect.timeout")); } else { -@@ -315,15 +403,21 @@ +@@ -315,15 +404,21 @@ } this.server.getProfiler().pop(); @@ -145,7 +146,7 @@ this.disconnect(IChatBaseComponent.translatable("multiplayer.disconnect.idling")); } -@@ -347,16 +441,67 @@ +@@ -347,16 +442,67 @@ return this.server.isSingleplayerOwner(this.player.getGameProfile()); } @@ -214,7 +215,7 @@ } private CompletableFuture filterTextPacket(T t0, BiFunction> bifunction) { -@@ -420,7 +565,34 @@ +@@ -420,7 +566,34 @@ double d9 = entity.getDeltaMovement().lengthSqr(); double d10 = d6 * d6 + d7 * d7 + d8 * d8; @@ -250,7 +251,7 @@ PlayerConnection.LOGGER.warn("{} (vehicle of {}) moved too quickly! {},{},{}", new Object[]{entity.getName().getString(), this.player.getName().getString(), d6, d7, d8}); this.connection.send(new PacketPlayOutVehicleMove(entity)); return; -@@ -460,14 +632,72 @@ +@@ -460,14 +633,72 @@ } entity.absMoveTo(d3, d4, d5, f, f1); @@ -323,7 +324,7 @@ this.player.serverLevel().getChunkSource().move(this.player); this.player.checkMovementStatistics(this.player.getX() - d0, this.player.getY() - d1, this.player.getZ() - d2); this.clientVehicleIsFloating = d11 >= -0.03125D && !flag1 && !this.server.isFlightAllowed() && !entity.isNoGravity() && this.noBlocksAround(entity); -@@ -501,6 +731,7 @@ +@@ -501,6 +732,7 @@ } this.awaitingPositionFromClient = null; @@ -331,7 +332,7 @@ } } -@@ -508,7 +739,7 @@ +@@ -508,7 +740,7 @@ @Override public void handleRecipeBookSeenRecipePacket(PacketPlayInRecipeDisplayed packetplayinrecipedisplayed) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinrecipedisplayed, this, this.player.serverLevel()); @@ -340,7 +341,7 @@ RecipeBookServer recipebookserver = this.player.getRecipeBook(); Objects.requireNonNull(recipebookserver); -@@ -538,6 +769,12 @@ +@@ -538,6 +770,12 @@ @Override public void handleCustomCommandSuggestions(PacketPlayInTabComplete packetplayintabcomplete) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayintabcomplete, this, this.player.serverLevel()); @@ -353,7 +354,7 @@ StringReader stringreader = new StringReader(packetplayintabcomplete.getCommand()); if (stringreader.canRead() && stringreader.peek() == '/') { -@@ -547,6 +784,7 @@ +@@ -547,6 +785,7 @@ ParseResults parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack()); this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> { @@ -361,7 +362,7 @@ this.connection.send(new PacketPlayOutTabComplete(packetplayintabcomplete.getId(), suggestions)); }); } -@@ -792,6 +1030,13 @@ +@@ -792,6 +1031,13 @@ if (container instanceof ContainerMerchant) { ContainerMerchant containermerchant = (ContainerMerchant) container; @@ -375,7 +376,7 @@ if (!containermerchant.stillValid(this.player)) { PlayerConnection.LOGGER.debug("Player {} interacted with invalid menu {}", this.player, containermerchant); -@@ -806,6 +1051,13 @@ +@@ -806,6 +1052,13 @@ @Override public void handleEditBook(PacketPlayInBEdit packetplayinbedit) { @@ -389,7 +390,7 @@ int i = packetplayinbedit.getSlot(); if (PlayerInventory.isHotbarSlot(i) || i == 40) { -@@ -814,7 +1066,7 @@ +@@ -814,7 +1067,7 @@ Objects.requireNonNull(list); optional.ifPresent(list::add); @@ -398,7 +399,7 @@ Objects.requireNonNull(list); stream.forEach(list::add); -@@ -832,7 +1084,7 @@ +@@ -832,7 +1085,7 @@ ItemStack itemstack = this.player.getInventory().getItem(i); if (itemstack.is(Items.WRITABLE_BOOK)) { @@ -407,7 +408,7 @@ } } -@@ -857,16 +1109,16 @@ +@@ -857,16 +1110,16 @@ this.updateBookPages(list, (s) -> { return IChatBaseComponent.ChatSerializer.toJson(IChatBaseComponent.literal(s)); @@ -428,7 +429,7 @@ return NBTTagString.valueOf((String) unaryoperator.apply(filteredtext.filteredOrEmpty())); }); -@@ -892,6 +1144,7 @@ +@@ -892,6 +1145,7 @@ } itemstack.addTagElement("pages", nbttaglist); @@ -436,7 +437,7 @@ } @Override -@@ -928,7 +1181,7 @@ +@@ -928,7 +1182,7 @@ } else { WorldServer worldserver = this.player.serverLevel(); @@ -445,7 +446,7 @@ if (this.tickCount == 0) { this.resetPosition(); } -@@ -938,7 +1191,7 @@ +@@ -938,7 +1192,7 @@ this.awaitingTeleportTime = this.tickCount; this.teleport(this.awaitingPositionFromClient.x, this.awaitingPositionFromClient.y, this.awaitingPositionFromClient.z, this.player.getYRot(), this.player.getXRot()); } @@ -454,7 +455,7 @@ } else { this.awaitingTeleportTime = this.tickCount; double d0 = clampHorizontal(packetplayinflying.getX(this.player.getX())); -@@ -950,7 +1203,15 @@ +@@ -950,7 +1204,15 @@ if (this.player.isPassenger()) { this.player.absMoveTo(this.player.getX(), this.player.getY(), this.player.getZ(), f, f1); this.player.serverLevel().getChunkSource().move(this.player); @@ -470,7 +471,7 @@ double d3 = this.player.getX(); double d4 = this.player.getY(); double d5 = this.player.getZ(); -@@ -969,15 +1230,33 @@ +@@ -969,15 +1231,33 @@ ++this.receivedMovePacketCount; int i = this.receivedMovePacketCount - this.knownMovePacketCount; @@ -506,7 +507,7 @@ PlayerConnection.LOGGER.warn("{} moved too quickly! {},{},{}", new Object[]{this.player.getName().getString(), d6, d7, d8}); this.teleport(this.player.getX(), this.player.getY(), this.player.getZ(), this.player.getYRot(), this.player.getXRot()); return; -@@ -998,6 +1277,7 @@ +@@ -998,6 +1278,7 @@ boolean flag1 = this.player.verticalCollisionBelow; this.player.move(EnumMoveType.PLAYER, new Vec3D(d6, d7, d8)); @@ -514,7 +515,7 @@ double d11 = d7; d6 = d0 - this.player.getX(); -@@ -1016,9 +1296,70 @@ +@@ -1016,9 +1297,70 @@ } if (!this.player.noPhysics && !this.player.isSleeping() && (flag2 && worldserver.noCollision(this.player, axisalignedbb) || this.isPlayerCollidingWithAnythingNew(worldserver, axisalignedbb, d0, d1, d2))) { @@ -586,7 +587,7 @@ this.player.absMoveTo(d0, d1, d2, f, f1); this.clientIsFloating = d11 >= -0.03125D && !flag1 && this.player.gameMode.getGameModeForPlayer() != EnumGamemode.SPECTATOR && !this.server.isFlightAllowed() && !this.player.getAbilities().mayfly && !this.player.hasEffect(MobEffects.LEVITATION) && !this.player.isFallFlying() && !this.player.isAutoSpinAttack() && this.noBlocksAround(this.player); this.player.serverLevel().getChunkSource().move(this.player); -@@ -1059,11 +1400,68 @@ +@@ -1059,11 +1401,68 @@ return true; } @@ -656,7 +657,7 @@ double d3 = set.contains(RelativeMovement.X) ? this.player.getX() : 0.0D; double d4 = set.contains(RelativeMovement.Y) ? this.player.getY() : 0.0D; double d5 = set.contains(RelativeMovement.Z) ? this.player.getZ() : 0.0D; -@@ -1075,6 +1473,14 @@ +@@ -1075,6 +1474,14 @@ this.awaitingTeleport = 0; } @@ -671,7 +672,7 @@ this.awaitingTeleportTime = this.tickCount; this.player.absMoveTo(d0, d1, d2, f, f1); this.player.connection.send(new PacketPlayOutPosition(d0 - d3, d1 - d4, d2 - d5, f - f2, f1 - f3, set, this.awaitingTeleport)); -@@ -1083,6 +1489,7 @@ +@@ -1083,6 +1490,7 @@ @Override public void handlePlayerAction(PacketPlayInBlockDig packetplayinblockdig) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinblockdig, this, this.player.serverLevel()); @@ -679,7 +680,7 @@ BlockPosition blockposition = packetplayinblockdig.getPos(); this.player.resetLastActionTime(); -@@ -1093,14 +1500,46 @@ +@@ -1093,14 +1501,46 @@ if (!this.player.isSpectator()) { ItemStack itemstack = this.player.getItemInHand(EnumHand.OFF_HAND); @@ -728,7 +729,7 @@ this.player.drop(false); } -@@ -1138,6 +1577,7 @@ +@@ -1138,6 +1578,7 @@ @Override public void handleUseItemOn(PacketPlayInUseItem packetplayinuseitem) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinuseitem, this, this.player.serverLevel()); @@ -736,7 +737,7 @@ this.player.connection.ackBlockChangesUpTo(packetplayinuseitem.getSequence()); WorldServer worldserver = this.player.serverLevel(); EnumHand enumhand = packetplayinuseitem.getHand(); -@@ -1161,6 +1601,7 @@ +@@ -1161,6 +1602,7 @@ if (blockposition.getY() < i) { if (this.awaitingPositionFromClient == null && this.player.distanceToSqr((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D) < 64.0D && worldserver.mayInteract(this.player, blockposition)) { @@ -744,7 +745,7 @@ EnumInteractionResult enuminteractionresult = this.player.gameMode.useItemOn(this.player, worldserver, itemstack, enumhand, movingobjectpositionblock); if (enumdirection == EnumDirection.UP && !enuminteractionresult.consumesAction() && blockposition.getY() >= i - 1 && wasBlockPlacementAttempt(this.player, itemstack)) { -@@ -1189,6 +1630,7 @@ +@@ -1189,6 +1631,7 @@ @Override public void handleUseItem(PacketPlayInBlockPlace packetplayinblockplace) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinblockplace, this, this.player.serverLevel()); @@ -752,7 +753,7 @@ this.ackBlockChangesUpTo(packetplayinblockplace.getSequence()); WorldServer worldserver = this.player.serverLevel(); EnumHand enumhand = packetplayinblockplace.getHand(); -@@ -1196,6 +1638,49 @@ +@@ -1196,6 +1639,49 @@ this.player.resetLastActionTime(); if (!itemstack.isEmpty() && itemstack.isItemEnabled(worldserver.enabledFeatures())) { @@ -802,7 +803,7 @@ EnumInteractionResult enuminteractionresult = this.player.gameMode.useItem(this.player, worldserver, itemstack, enumhand); if (enuminteractionresult.shouldSwing()) { -@@ -1216,7 +1701,7 @@ +@@ -1216,7 +1702,7 @@ Entity entity = packetplayinspectate.getEntity(worldserver); if (entity != null) { @@ -811,7 +812,7 @@ return; } } -@@ -1231,6 +1716,7 @@ +@@ -1231,6 +1717,7 @@ PlayerConnection.LOGGER.info("Disconnecting {} due to resource pack rejection", this.player.getName()); this.disconnect(IChatBaseComponent.translatable("multiplayer.requiredTexturePrompt.disconnect")); } @@ -819,7 +820,7 @@ } -@@ -1252,12 +1738,27 @@ +@@ -1252,12 +1739,27 @@ @Override public void onDisconnect(IChatBaseComponent ichatbasecomponent) { @@ -848,7 +849,7 @@ this.player.getTextFilter().leave(); if (this.isSingleplayerOwner()) { PlayerConnection.LOGGER.info("Stopping singleplayer server as player logged out"); -@@ -1280,6 +1781,15 @@ +@@ -1280,6 +1782,15 @@ } public void send(Packet packet, @Nullable PacketSendListener packetsendlistener) { @@ -864,7 +865,7 @@ try { this.connection.send(packet, packetsendlistener); } catch (Throwable throwable) { -@@ -1296,7 +1806,16 @@ +@@ -1296,7 +1807,16 @@ @Override public void handleSetCarriedItem(PacketPlayInHeldItemSlot packetplayinhelditemslot) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinhelditemslot, this, this.player.serverLevel()); @@ -881,7 +882,7 @@ if (this.player.getInventory().selected != packetplayinhelditemslot.getSlot() && this.player.getUsedItemHand() == EnumHand.MAIN_HAND) { this.player.stopUsingItem(); } -@@ -1305,18 +1824,25 @@ +@@ -1305,18 +1825,25 @@ this.player.resetLastActionTime(); } else { PlayerConnection.LOGGER.warn("{} tried to set an invalid carried item", this.player.getName().getString()); @@ -908,7 +909,7 @@ PlayerChatMessage playerchatmessage; try { -@@ -1334,9 +1860,9 @@ +@@ -1334,9 +1861,9 @@ PlayerChatMessage playerchatmessage1 = playerchatmessage.withUnsignedContent((IChatBaseComponent) completablefuture1.join()).filter(((FilteredText) completablefuture.join()).mask()); this.broadcastChatMessage(playerchatmessage1); @@ -920,7 +921,7 @@ } } -@@ -1351,6 +1877,12 @@ +@@ -1351,6 +1878,12 @@ if (optional.isPresent()) { this.server.submit(() -> { @@ -933,7 +934,7 @@ this.performChatCommand(serverboundchatcommandpacket, (LastSeenMessages) optional.get()); this.detectRateSpam(); }); -@@ -1360,12 +1892,25 @@ +@@ -1360,12 +1893,25 @@ } private void performChatCommand(ServerboundChatCommandPacket serverboundchatcommandpacket, LastSeenMessages lastseenmessages) { @@ -961,7 +962,7 @@ } catch (SignedMessageChain.a signedmessagechain_a) { this.handleMessageDecodeFailure(signedmessagechain_a); return; -@@ -1373,10 +1918,10 @@ +@@ -1373,10 +1919,10 @@ CommandSigningContext.a commandsigningcontext_a = new CommandSigningContext.a(map); @@ -974,7 +975,7 @@ } private void handleMessageDecodeFailure(SignedMessageChain.a signedmessagechain_a) { -@@ -1417,7 +1962,7 @@ +@@ -1417,7 +1963,7 @@ } else { Optional optional = this.unpackAndApplyLastSeen(lastseenmessages_b); @@ -983,7 +984,7 @@ this.send(new ClientboundSystemChatPacket(IChatBaseComponent.translatable("chat.disabled.options").withStyle(EnumChatFormat.RED), false)); return Optional.empty(); } else { -@@ -1465,6 +2010,122 @@ +@@ -1465,6 +2011,122 @@ return false; } @@ -1106,7 +1107,7 @@ private PlayerChatMessage getSignedMessage(PacketPlayInChat packetplayinchat, LastSeenMessages lastseenmessages) throws SignedMessageChain.a { SignedMessageBody signedmessagebody = new SignedMessageBody(packetplayinchat.message(), packetplayinchat.timeStamp(), packetplayinchat.salt(), lastseenmessages); -@@ -1472,13 +2133,33 @@ +@@ -1472,13 +2134,33 @@ } private void broadcastChatMessage(PlayerChatMessage playerchatmessage) { @@ -1143,7 +1144,7 @@ this.disconnect(IChatBaseComponent.translatable("disconnect.spam")); } -@@ -1500,13 +2181,59 @@ +@@ -1500,13 +2182,62 @@ @Override public void handleAnimate(PacketPlayInArmAnimation packetplayinarmanimation) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinarmanimation, this, this.player.serverLevel()); @@ -1159,8 +1160,11 @@ + + double d3 = player.gameMode.getGameModeForPlayer() == EnumGamemode.CREATIVE ? 5.0D : 4.5D; + // SPIGOT-5607: Only call interact event if no block or entity is being clicked. Use bukkit ray trace method, because it handles blocks and entities at the same time -+ org.bukkit.util.RayTraceResult result = this.player.level().getWorld().rayTrace(origin, origin.getDirection(), d3, org.bukkit.FluidCollisionMode.NEVER, false, 0.1, entity -> entity != this.player.getBukkitEntity() && this.player.getBukkitEntity().canSee(entity)); -+ ++ // SPIGOT-7429: Make sure to call PlayerInteractEvent for spectators and non-pickable entities ++ org.bukkit.util.RayTraceResult result = this.player.level().getWorld().rayTrace(origin, origin.getDirection(), d3, org.bukkit.FluidCollisionMode.NEVER, false, 0.1, entity -> { ++ Entity handle = ((CraftEntity) entity).getHandle(); ++ return entity != this.player.getBukkitEntity() && this.player.getBukkitEntity().canSee(entity) && !handle.isSpectator() && handle.isPickable() && !handle.isPassengerOfSameVehicle(player); ++ }); + if (result == null) { + CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_AIR, this.player.getInventory().getSelected(), EnumHand.MAIN_HAND); + } @@ -1203,7 +1207,7 @@ this.player.resetLastActionTime(); Entity entity; IJumpable ijumpable; -@@ -1588,6 +2315,12 @@ +@@ -1588,6 +2319,12 @@ } public void sendPlayerChatMessage(PlayerChatMessage playerchatmessage, ChatMessageType.a chatmessagetype_a) { @@ -1216,7 +1220,7 @@ this.send(new ClientboundPlayerChatPacket(playerchatmessage.link().sender(), playerchatmessage.link().index(), playerchatmessage.signature(), playerchatmessage.signedBody().pack(this.messageSignatureCache), playerchatmessage.unsignedContent(), playerchatmessage.filterMask(), chatmessagetype_a.toNetwork(this.player.level().registryAccess()))); this.addPendingMessage(playerchatmessage); } -@@ -1603,6 +2336,7 @@ +@@ -1603,6 +2340,7 @@ @Override public void handleInteract(PacketPlayInUseEntity packetplayinuseentity) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinuseentity, this, this.player.serverLevel()); @@ -1224,7 +1228,7 @@ final WorldServer worldserver = this.player.serverLevel(); final Entity entity = packetplayinuseentity.getTarget(worldserver); -@@ -1617,13 +2351,51 @@ +@@ -1617,13 +2355,51 @@ if (axisalignedbb.distanceToSqr(this.player.getEyePosition()) < PlayerConnection.MAX_INTERACTION_DISTANCE) { packetplayinuseentity.dispatch(new PacketPlayInUseEntity.c() { @@ -1277,7 +1281,7 @@ if (enuminteractionresult.consumesAction()) { CriterionTriggers.PLAYER_INTERACTED_WITH_ENTITY.trigger(PlayerConnection.this.player, itemstack1, entity); if (enuminteractionresult.shouldSwing()) { -@@ -1636,23 +2408,29 @@ +@@ -1636,23 +2412,29 @@ @Override public void onInteraction(EnumHand enumhand) { @@ -1310,7 +1314,7 @@ } } else { PlayerConnection.this.disconnect(IChatBaseComponent.translatable("multiplayer.disconnect.invalid_entity_attacked")); -@@ -1675,14 +2453,14 @@ +@@ -1675,14 +2457,14 @@ case PERFORM_RESPAWN: if (this.player.wonGame) { this.player.wonGame = false; @@ -1327,7 +1331,7 @@ if (this.server.isHardcore()) { this.player.setGameMode(EnumGamemode.SPECTATOR); ((GameRules.GameRuleBoolean) this.player.level().getGameRules().getRule(GameRules.RULE_SPECTATORSGENERATECHUNKS)).set(false, this.server); -@@ -1698,15 +2476,21 @@ +@@ -1698,15 +2480,21 @@ @Override public void handleContainerClose(PacketPlayInCloseWindow packetplayinclosewindow) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinclosewindow, this, this.player.serverLevel()); @@ -1351,7 +1355,7 @@ this.player.containerMenu.sendAllDataToRemote(); } else if (!this.player.containerMenu.stillValid(this.player)) { PlayerConnection.LOGGER.debug("Player {} interacted with invalid menu {}", this.player, this.player.containerMenu); -@@ -1719,7 +2503,284 @@ +@@ -1719,7 +2507,284 @@ boolean flag = packetplayinwindowclick.getStateId() != this.player.containerMenu.getStateId(); this.player.containerMenu.suppressRemoteUpdates(); @@ -1637,7 +1641,7 @@ ObjectIterator objectiterator = Int2ObjectMaps.fastIterable(packetplayinwindowclick.getChangedSlots()).iterator(); while (objectiterator.hasNext()) { -@@ -1759,6 +2820,7 @@ +@@ -1759,6 +2824,7 @@ @Override public void handleContainerButtonClick(PacketPlayInEnchantItem packetplayinenchantitem) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinenchantitem, this, this.player.serverLevel()); @@ -1645,7 +1649,7 @@ this.player.resetLastActionTime(); if (this.player.containerMenu.containerId == packetplayinenchantitem.getContainerId() && !this.player.isSpectator()) { if (!this.player.containerMenu.stillValid(this.player)) { -@@ -1801,6 +2863,43 @@ +@@ -1801,6 +2867,43 @@ boolean flag1 = packetplayinsetcreativeslot.getSlotNum() >= 1 && packetplayinsetcreativeslot.getSlotNum() <= 45; boolean flag2 = itemstack.isEmpty() || itemstack.getDamageValue() >= 0 && itemstack.getCount() <= 64 && !itemstack.isEmpty(); @@ -1689,7 +1693,7 @@ if (flag1 && flag2) { this.player.inventoryMenu.getSlot(packetplayinsetcreativeslot.getSlotNum()).setByPlayer(itemstack); -@@ -1823,6 +2922,7 @@ +@@ -1823,6 +2926,7 @@ } private void updateSignText(PacketPlayInUpdateSign packetplayinupdatesign, List list) { @@ -1697,7 +1701,7 @@ this.player.resetLastActionTime(); WorldServer worldserver = this.player.serverLevel(); BlockPosition blockposition = packetplayinupdatesign.getPos(); -@@ -1843,6 +2943,7 @@ +@@ -1843,6 +2947,7 @@ @Override public void handleKeepAlive(PacketPlayInKeepAlive packetplayinkeepalive) { @@ -1705,7 +1709,7 @@ if (this.keepAlivePending && packetplayinkeepalive.getId() == this.keepAliveChallenge) { int i = (int) (SystemUtils.getMillis() - this.keepAliveTime); -@@ -1857,7 +2958,17 @@ +@@ -1857,7 +2962,17 @@ @Override public void handlePlayerAbilities(PacketPlayInAbilities packetplayinabilities) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinabilities, this, this.player.serverLevel()); @@ -1724,7 +1728,7 @@ } @Override -@@ -1866,8 +2977,50 @@ +@@ -1866,8 +2981,50 @@ this.player.updateOptions(packetplayinsettings); }