From ac9ac5e7eadf8a7da8bc2b7abf8ddadd30f335df Mon Sep 17 00:00:00 2001 From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com> Date: Sun, 15 Dec 2024 15:55:13 +0100 Subject: [PATCH] readd debugstick check --- .../world/item/DebugStickItem.java.patch | 9 +++ .../minecraft/world/item/EggItem.java.patch | 48 +++++++------ .../world/item/EnderEyeItem.java.patch | 4 +- .../world/item/EnderpearlItem.java.patch | 22 +++--- .../item/ExperienceBottleItem.java.patch | 10 ++- .../world/item/FireworkRocketItem.java.patch | 12 ++-- .../world/item/HangingEntityItem.java.patch | 4 +- .../minecraft/world/item/ItemStack.java.patch | 71 +++++++------------ .../world/item/MinecartItem.java.patch | 2 +- .../world/item/NameTagItem.java.patch | 5 +- .../world/item/SnowballItem.java.patch | 17 +++-- .../world/item/ThrowablePotionItem.java.patch | 12 ++-- .../world/item/TridentItem.java.patch | 8 +-- 13 files changed, 111 insertions(+), 113 deletions(-) diff --git a/paper-server/patches/sources/net/minecraft/world/item/DebugStickItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/DebugStickItem.java.patch index be32bd3b62..993126f590 100644 --- a/paper-server/patches/sources/net/minecraft/world/item/DebugStickItem.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/item/DebugStickItem.java.patch @@ -5,3 +5,12 @@ package net.minecraft.world.item; import java.util.Collection; +@@ -51,7 +_,7 @@ + public boolean handleInteraction( + Player player, BlockState stateClicked, LevelAccessor accessor, BlockPos pos, boolean shouldCycleState, ItemStack debugStack + ) { +- if (!player.canUseGameMasterBlocks()) { ++ if (!player.canUseGameMasterBlocks() && !(player.getAbilities().instabuild && player.getBukkitEntity().hasPermission("minecraft.debugstick")) && !player.getBukkitEntity().hasPermission("minecraft.debugstick.always")) { // Spigot + return false; + } else { + Holder blockHolder = stateClicked.getBlockHolder(); diff --git a/paper-server/patches/sources/net/minecraft/world/item/EggItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/EggItem.java.patch index 59f5e151a8..c1b9e1c9dd 100644 --- a/paper-server/patches/sources/net/minecraft/world/item/EggItem.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/item/EggItem.java.patch @@ -1,41 +1,49 @@ --- a/net/minecraft/world/item/EggItem.java +++ b/net/minecraft/world/item/EggItem.java -@@ -23,6 +_,28 @@ +@@ -23,22 +_,36 @@ @Override public InteractionResult use(Level level, Player player, InteractionHand hand) { ItemStack itemInHand = player.getItemInHand(hand); -+ if (level instanceof ServerLevel serverLevel) { +- level.playSound( +- null, +- player.getX(), +- player.getY(), +- player.getZ(), +- SoundEvents.EGG_THROW, +- SoundSource.PLAYERS, +- 0.5F, +- 0.4F / (level.getRandom().nextFloat() * 0.4F + 0.8F) +- ); + if (level instanceof ServerLevel serverLevel) { +- Projectile.spawnProjectileFromRotation(ThrownEgg::new, serverLevel, itemInHand, player, 0.0F, PROJECTILE_SHOOT_POWER, 1.0F); + // CraftBukkit start + // Paper start - PlayerLaunchProjectileEvent + final Projectile.Delayed thrownEgg = Projectile.spawnProjectileFromRotationDelayed(ThrownEgg::new, serverLevel, itemInHand, player, 0.0F, EggItem.PROJECTILE_SHOOT_POWER, 1.0F); -+ com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) thrownEgg.projectile().getBukkitEntity()); ++ com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemInHand), (org.bukkit.entity.Projectile) thrownEgg.projectile().getBukkitEntity()); + if (event.callEvent() && thrownEgg.attemptSpawn()) { + if (event.shouldConsume()) { + itemInHand.consume(1, player); -+ } else if (player instanceof net.minecraft.server.level.ServerPlayer) { -+ ((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity().updateInventory(); ++ } else { ++ player.containerMenu.sendAllDataToRemote(); + } -+ level.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.EGG_THROW, SoundSource.PLAYERS, 0.5F, 0.4F / (level.getRandom().nextFloat() * 0.4F + 0.8F)); ++ level.playSound( ++ null, ++ player.getX(), ++ player.getY(), ++ player.getZ(), ++ SoundEvents.EGG_THROW, ++ SoundSource.PLAYERS, ++ 0.5F, ++ 0.4F / (level.getRandom().nextFloat() * 0.4F + 0.8F) ++ ); + player.awardStat(Stats.ITEM_USED.get(this)); + } else { + // Paper end - PlayerLaunchProjectileEvent -+ if (player instanceof net.minecraft.server.level.ServerPlayer) { -+ ((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity().updateInventory(); -+ } ++ player.containerMenu.sendAllDataToRemote(); + return InteractionResult.FAIL; + } + // CraftBukkit end -+ } - level.playSound( - null, - player.getX(), -@@ -33,12 +_,7 @@ - 0.5F, - 0.4F / (level.getRandom().nextFloat() * 0.4F + 0.8F) - ); -- if (level instanceof ServerLevel serverLevel) { -- Projectile.spawnProjectileFromRotation(ThrownEgg::new, serverLevel, itemInHand, player, 0.0F, PROJECTILE_SHOOT_POWER, 1.0F); -- } + } - - player.awardStat(Stats.ITEM_USED.get(this)); - itemInHand.consume(1, player); diff --git a/paper-server/patches/sources/net/minecraft/world/item/EnderEyeItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/EnderEyeItem.java.patch index b2667052ad..1145ec35de 100644 --- a/paper-server/patches/sources/net/minecraft/world/item/EnderEyeItem.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/item/EnderEyeItem.java.patch @@ -32,9 +32,9 @@ + double deltaLength = Math.sqrt(distanceSquared); + double relativeX = player.getX() + (deltaX / deltaLength) * viewDistance; + double relativeZ = player.getZ() + (deltaZ / deltaLength) * viewDistance; -+ player.connection.send(new net.minecraft.network.protocol.game.ClientboundLevelEventPacket(1038, new BlockPos((int) relativeX, (int) soundPos.getY(), (int) relativeZ), 0, true)); ++ player.connection.send(new net.minecraft.network.protocol.game.ClientboundLevelEventPacket(net.minecraft.world.level.block.LevelEvent.SOUND_END_PORTAL_SPAWN, new BlockPos((int) relativeX, (int) soundPos.getY(), (int) relativeZ), 0, true)); + } else { -+ player.connection.send(new net.minecraft.network.protocol.game.ClientboundLevelEventPacket(1038, soundPos, 0, true)); ++ player.connection.send(new net.minecraft.network.protocol.game.ClientboundLevelEventPacket(net.minecraft.world.level.block.LevelEvent.SOUND_END_PORTAL_SPAWN, soundPos, 0, true)); + } + } + // CraftBukkit end diff --git a/paper-server/patches/sources/net/minecraft/world/item/EnderpearlItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/EnderpearlItem.java.patch index 5eccf6e90b..0b1cbebad3 100644 --- a/paper-server/patches/sources/net/minecraft/world/item/EnderpearlItem.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/item/EnderpearlItem.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/EnderpearlItem.java +++ b/net/minecraft/world/item/EnderpearlItem.java -@@ -21,22 +_,32 @@ +@@ -21,22 +_,38 @@ @Override public InteractionResult use(Level level, Player player, InteractionHand hand) { ItemStack itemInHand = player.getItemInHand(hand); @@ -23,21 +23,27 @@ + if (event.callEvent() && thrownEnderpearl.attemptSpawn()) { + if (event.shouldConsume()) { + itemInHand.consume(1, player); -+ } else if (player instanceof net.minecraft.server.level.ServerPlayer) { -+ ((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity().updateInventory(); ++ } else { ++ player.containerMenu.sendAllDataToRemote(); + } + -+ serverLevel.playSound((Player) null, player.getX(), player.getY(), player.getZ(), SoundEvents.ENDER_PEARL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (serverLevel.getRandom().nextFloat() * 0.4F + 0.8F)); ++ level.playSound( ++ null, ++ player.getX(), ++ player.getY(), ++ player.getZ(), ++ SoundEvents.ENDER_PEARL_THROW, ++ SoundSource.NEUTRAL, ++ 0.5F, ++ 0.4F / (level.getRandom().nextFloat() * 0.4F + 0.8F) ++ ); + player.awardStat(Stats.ITEM_USED.get(this)); + } else { + // Paper end - PlayerLaunchProjectileEvent -+ if (player instanceof net.minecraft.server.level.ServerPlayer) { -+ ((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity().updateInventory(); -+ } ++ player.containerMenu.sendAllDataToRemote(); + return InteractionResult.FAIL; + } } -+ level.playSound((Player) null, player.getX(), player.getY(), player.getZ(), SoundEvents.ENDER_PEARL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (level.getRandom().nextFloat() * 0.4F + 0.8F)); + // CraftBukkit end - player.awardStat(Stats.ITEM_USED.get(this)); diff --git a/paper-server/patches/sources/net/minecraft/world/item/ExperienceBottleItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/ExperienceBottleItem.java.patch index 51cfc0c1ed..9ec3ea678d 100644 --- a/paper-server/patches/sources/net/minecraft/world/item/ExperienceBottleItem.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/item/ExperienceBottleItem.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/ExperienceBottleItem.java +++ b/net/minecraft/world/item/ExperienceBottleItem.java -@@ -21,22 +_,38 @@ +@@ -21,22 +_,36 @@ @Override public InteractionResult use(Level level, Player player, InteractionHand hand) { ItemStack itemInHand = player.getItemInHand(hand); @@ -23,8 +23,8 @@ + if (event.callEvent() && thrownExperienceBottle.attemptSpawn()) { + if (event.shouldConsume()) { + itemInHand.consume(1, player); -+ } else if (player instanceof net.minecraft.server.level.ServerPlayer) { -+ ((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity().updateInventory(); ++ } else { ++ player.containerMenu.sendAllDataToRemote(); + } + + level.playSound( @@ -38,9 +38,7 @@ + 0.4F / (level.getRandom().nextFloat() * 0.4F + 0.8F) + ); + } else { -+ if (player instanceof net.minecraft.server.level.ServerPlayer) { -+ ((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity().updateInventory(); -+ } ++ player.containerMenu.sendAllDataToRemote(); + return InteractionResult.FAIL; + } + // Paper end - PlayerLaunchProjectileEvent diff --git a/paper-server/patches/sources/net/minecraft/world/item/FireworkRocketItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/FireworkRocketItem.java.patch index a707470352..d733c3578d 100644 --- a/paper-server/patches/sources/net/minecraft/world/item/FireworkRocketItem.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/item/FireworkRocketItem.java.patch @@ -21,12 +21,12 @@ + com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) context.getPlayer().getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemInHand), (org.bukkit.entity.Firework) fireworkRocketEntity.projectile().getBukkitEntity()); + if (!event.callEvent() || !fireworkRocketEntity.attemptSpawn()) return InteractionResult.PASS; + if (event.shouldConsume() && !context.getPlayer().hasInfiniteMaterials()) itemInHand.shrink(1); -+ else if (context.getPlayer() instanceof net.minecraft.server.level.ServerPlayer) ((net.minecraft.server.level.ServerPlayer) context.getPlayer()).getBukkitEntity().updateInventory(); ++ else context.getPlayer().containerMenu.sendAllDataToRemote(); + // Paper end - PlayerLaunchProjectileEvent } return InteractionResult.SUCCESS; -@@ -56,9 +_,19 @@ +@@ -56,9 +_,21 @@ if (player.isFallFlying()) { ItemStack itemInHand = player.getItemInHand(hand); if (level instanceof ServerLevel serverLevel) { @@ -40,11 +40,13 @@ + player.awardStat(Stats.ITEM_USED.get(this)); // Moved up from below + if (event.shouldConsume() && !player.hasInfiniteMaterials()) { + itemInHand.shrink(1); // Moved up from below -+ } else ((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity().updateInventory(); ++ } else { ++ player.containerMenu.sendAllDataToRemote(); ++ } + } else { -+ ((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity().updateInventory(); ++ player.containerMenu.sendAllDataToRemote(); + } -+ // Moved up consume/stat ++ // Moved up consume and changed consume to shrink + // Paper end - PlayerElytraBoostEvent } diff --git a/paper-server/patches/sources/net/minecraft/world/item/HangingEntityItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/HangingEntityItem.java.patch index f5c2f3dbb7..ae35e0397c 100644 --- a/paper-server/patches/sources/net/minecraft/world/item/HangingEntityItem.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/item/HangingEntityItem.java.patch @@ -5,8 +5,8 @@ if (hangingEntity.survives()) { if (!level.isClientSide) { + // CraftBukkit start - fire HangingPlaceEvent -+ org.bukkit.entity.Player who = (context.getPlayer() == null) ? null : (org.bukkit.entity.Player) context.getPlayer().getBukkitEntity(); -+ org.bukkit.block.Block blockClicked = level.getWorld().getBlockAt(blockPos.getX(), blockPos.getY(), blockPos.getZ()); ++ org.bukkit.entity.Player who = player == null ? null : (org.bukkit.entity.Player) player.getBukkitEntity(); ++ org.bukkit.block.Block blockClicked = org.bukkit.craftbukkit.block.CraftBlock.at(level, blockPos); + org.bukkit.block.BlockFace blockFace = org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(clickedFace); + org.bukkit.inventory.EquipmentSlot hand = org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(context.getHand()); + diff --git a/paper-server/patches/sources/net/minecraft/world/item/ItemStack.java.patch b/paper-server/patches/sources/net/minecraft/world/item/ItemStack.java.patch index 24e6257081..4675b2f09b 100644 --- a/paper-server/patches/sources/net/minecraft/world/item/ItemStack.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/item/ItemStack.java.patch @@ -1,26 +1,5 @@ --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java -@@ -22,6 +_,7 @@ - import net.minecraft.ChatFormatting; - import net.minecraft.advancements.CriteriaTriggers; - import net.minecraft.core.BlockPos; -+import net.minecraft.core.Direction; - import net.minecraft.core.Holder; - import net.minecraft.core.HolderLookup; - import net.minecraft.core.HolderSet; -@@ -45,10 +_,12 @@ - import net.minecraft.network.chat.MutableComponent; - import net.minecraft.network.codec.ByteBufCodecs; - import net.minecraft.network.codec.StreamCodec; -+import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; - import net.minecraft.resources.RegistryOps; - import net.minecraft.server.level.ServerLevel; - import net.minecraft.server.level.ServerPlayer; - import net.minecraft.sounds.SoundEvent; -+import net.minecraft.sounds.SoundSource; - import net.minecraft.stats.Stats; - import net.minecraft.tags.TagKey; - import net.minecraft.util.ExtraCodecs; @@ -136,18 +_,35 @@ } else { Holder holder = ITEM_STREAM_CODEC.decode(buffer); @@ -59,14 +38,13 @@ } } }; -@@ -365,10 +_,180 @@ +@@ -365,10 +_,178 @@ return InteractionResult.PASS; } else { Item item = this.getItem(); - InteractionResult interactionResult = item.useOn(context); -+ // InteractionResult interactionResult = item.useOn(context); + // CraftBukkit start - handle all block place event logic here -+ DataComponentPatch oldData = this.components.asPatch(); ++ DataComponentPatch previousPatch = this.components.asPatch(); + int oldCount = this.getCount(); + ServerLevel serverLevel = (ServerLevel) context.getLevel(); + @@ -83,11 +61,11 @@ + } finally { + serverLevel.captureBlockStates = false; + } -+ DataComponentPatch newData = this.components.asPatch(); ++ DataComponentPatch newPatch = this.components.asPatch(); + int newCount = this.getCount(); + this.setCount(oldCount); -+ this.restorePatch(oldData); -+ if (interactionResult.consumesAction() && serverLevel.captureTreeGeneration && serverLevel.capturedBlockStates.size() > 0) { ++ this.restorePatch(previousPatch); ++ if (interactionResult.consumesAction() && serverLevel.captureTreeGeneration && !serverLevel.capturedBlockStates.isEmpty()) { + serverLevel.captureTreeGeneration = false; + org.bukkit.Location location = org.bukkit.craftbukkit.util.CraftLocation.toBukkit(clickedPos, serverLevel.getWorld()); + org.bukkit.TreeType treeType = net.minecraft.world.level.block.SaplingBlock.treeType; @@ -107,8 +85,8 @@ + + if (!fertilizeEvent.isCancelled()) { + // Change the stack to its new contents if it hasn't been tampered with. -+ if (this.getCount() == oldCount && Objects.equals(this.components.asPatch(), oldData)) { -+ this.restorePatch(newData); ++ if (this.getCount() == oldCount && Objects.equals(this.components.asPatch(), previousPatch)) { ++ this.restorePatch(newPatch); + this.setCount(newCount); + } + for (org.bukkit.craftbukkit.block.CraftBlockState blockstate : blocks) { @@ -125,15 +103,14 @@ + serverLevel.captureTreeGeneration = false; if (player != null && interactionResult instanceof InteractionResult.Success success && success.wasItemInteraction()) { - player.awardStat(Stats.ITEM_USED.get(item)); -+ // player.awardStat(Stats.ITEM_USED.get(item)); -+ InteractionHand enumhand = context.getHand(); ++ InteractionHand hand = context.getHand(); + org.bukkit.event.block.BlockPlaceEvent placeEvent = null; + List blocks = new java.util.ArrayList<>(serverLevel.capturedBlockStates.values()); + serverLevel.capturedBlockStates.clear(); + if (blocks.size() > 1) { -+ placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockMultiPlaceEvent(serverLevel, player, enumhand, blocks, clickedPos.getX(), clickedPos.getY(), clickedPos.getZ()); ++ placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockMultiPlaceEvent(serverLevel, player, hand, blocks, clickedPos.getX(), clickedPos.getY(), clickedPos.getZ()); + } else if (blocks.size() == 1 && item != Items.POWDER_SNOW_BUCKET) { // Paper - Fix cancelled powdered snow bucket placement -+ placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(serverLevel, player, enumhand, blocks.get(0), clickedPos.getX(), clickedPos.getY(), clickedPos.getZ()); ++ placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(serverLevel, player, hand, blocks.getFirst(), clickedPos.getX(), clickedPos.getY(), clickedPos.getZ()); + } + + if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) { @@ -143,11 +120,11 @@ + serverLevel.capturedTileEntities.clear(); // Paper - Allow chests to be placed with NBT data; clear out block entities as chests and such will pop loot + // revert back all captured blocks + serverLevel.preventPoiUpdated = true; // CraftBukkit - SPIGOT-5710 -+ serverLevel.isBlockPlaceCancelled = true; // Paper - prevent calling cleanup logic when undoing a block place upon a cancelled BlockPlaceEvent ++ serverLevel.isBlockPlaceCancelled = true; // Paper - prevent calling cleanup logic when undoing a block place upon a cancelled BlockPlaceEvent + for (org.bukkit.block.BlockState blockstate : blocks) { + blockstate.update(true, false); + } -+ serverLevel.isBlockPlaceCancelled = false; // Paper - prevent calling cleanup logic when undoing a block place upon a cancelled BlockPlaceEvent ++ serverLevel.isBlockPlaceCancelled = false; // Paper - prevent calling cleanup logic when undoing a block place upon a cancelled BlockPlaceEvent + serverLevel.preventPoiUpdated = false; + + // Brute force all possible updates @@ -160,8 +137,8 @@ + SignItem.openSign = null; // SPIGOT-6758 - Reset on early return + } else { + // Change the stack to its new contents if it hasn't been tampered with. -+ if (this.getCount() == oldCount && Objects.equals(this.components.asPatch(), oldData)) { -+ this.restorePatch(newData); ++ if (this.getCount() == oldCount && Objects.equals(this.components.asPatch(), previousPatch)) { ++ this.restorePatch(newPatch); + this.setCount(newCount); + } + @@ -172,14 +149,14 @@ + for (org.bukkit.block.BlockState blockstate : blocks) { + int updateFlag = ((org.bukkit.craftbukkit.block.CraftBlockState) blockstate).getFlag(); + net.minecraft.world.level.block.state.BlockState oldBlock = ((org.bukkit.craftbukkit.block.CraftBlockState) blockstate).getHandle(); -+ BlockPos newblockposition = ((org.bukkit.craftbukkit.block.CraftBlockState) blockstate).getPosition(); -+ net.minecraft.world.level.block.state.BlockState block = serverLevel.getBlockState(newblockposition); ++ BlockPos newPos = ((org.bukkit.craftbukkit.block.CraftBlockState) blockstate).getPosition(); ++ net.minecraft.world.level.block.state.BlockState block = serverLevel.getBlockState(newPos); + + if (!(block.getBlock() instanceof net.minecraft.world.level.block.BaseEntityBlock)) { // Containers get placed automatically -+ block.onPlace(serverLevel, newblockposition, oldBlock, true, context); ++ block.onPlace(serverLevel, newPos, oldBlock, true, context); + } + -+ serverLevel.notifyAndUpdatePhysics(newblockposition, null, oldBlock, block, serverLevel.getBlockState(newblockposition), updateFlag, 512); // send null chunk as chunk.k() returns false by this point ++ serverLevel.notifyAndUpdatePhysics(newPos, null, oldBlock, block, serverLevel.getBlockState(newPos), updateFlag, net.minecraft.world.level.block.Block.UPDATE_LIMIT); // send null chunk as chunk.k() returns false by this point + } + + if (this.item == Items.WITHER_SKELETON_SKULL) { // Special case skulls to allow wither spawns to be cancelled @@ -225,12 +202,12 @@ + + // SPIGOT-1288 - play sound stripped from ItemBlock + if (this.item instanceof BlockItem) { -+ // Paper start - Fix spigot sound playing for BlockItem ItemStacks -+ BlockPos position = new net.minecraft.world.item.context.BlockPlaceContext(context).getClickedPos(); -+ net.minecraft.world.level.block.state.BlockState blockData = serverLevel.getBlockState(position); -+ net.minecraft.world.level.block.SoundType soundeffecttype = blockData.getSoundType(); -+ // Paper end - Fix spigot sound playing for BlockItem ItemStacks -+ serverLevel.playSound(player, clickedPos, soundeffecttype.getPlaceSound(), SoundSource.BLOCKS, (soundeffecttype.getVolume() + 1.0F) / 2.0F, soundeffecttype.getPitch() * 0.8F); ++ // Paper start - Fix spigot sound playing for BlockItem ItemStacks ++ BlockPos position = new net.minecraft.world.item.context.BlockPlaceContext(context).getClickedPos(); ++ net.minecraft.world.level.block.state.BlockState blockData = serverLevel.getBlockState(position); ++ net.minecraft.world.level.block.SoundType soundeffecttype = blockData.getSoundType(); ++ // Paper end - Fix spigot sound playing for BlockItem ItemStacks ++ serverLevel.playSound(player, clickedPos, soundeffecttype.getPlaceSound(), net.minecraft.sounds.SoundSource.BLOCKS, (soundeffecttype.getVolume() + 1.0F) / 2.0F, soundeffecttype.getPitch() * 0.8F); + } + + player.awardStat(Stats.ITEM_USED.get(item)); diff --git a/paper-server/patches/sources/net/minecraft/world/item/MinecartItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/MinecartItem.java.patch index 3af3872029..1513242757 100644 --- a/paper-server/patches/sources/net/minecraft/world/item/MinecartItem.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/item/MinecartItem.java.patch @@ -7,7 +7,7 @@ - serverLevel.addFreshEntity(abstractMinecart); + // CraftBukkit start + if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityPlaceEvent(context, abstractMinecart).isCancelled()) { -+ if (context.getPlayer() != null) context.getPlayer().containerMenu.sendAllDataToRemote(); // Paper - Fix inventory desync ++ if (context.getPlayer() != null) context.getPlayer().containerMenu.sendAllDataToRemote(); // Paper - Fix inventory desync + return InteractionResult.FAIL; + } + // CraftBukkit end diff --git a/paper-server/patches/sources/net/minecraft/world/item/NameTagItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/NameTagItem.java.patch index 37e96e3a20..f3a064fec1 100644 --- a/paper-server/patches/sources/net/minecraft/world/item/NameTagItem.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/item/NameTagItem.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/NameTagItem.java +++ b/net/minecraft/world/item/NameTagItem.java -@@ -18,8 +_,13 @@ +@@ -18,8 +_,14 @@ Component component = stack.get(DataComponents.CUSTOM_NAME); if (component != null && target.getType().canSerialize() && target.canBeNameTagged()) { if (!player.level().isClientSide && target.isAlive()) { @@ -9,10 +9,11 @@ + // Paper start - Add PlayerNameEntityEvent + io.papermc.paper.event.player.PlayerNameEntityEvent event = new io.papermc.paper.event.player.PlayerNameEntityEvent(((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity(), target.getBukkitLivingEntity(), io.papermc.paper.adventure.PaperAdventure.asAdventure(stack.getHoverName()), true); + if (!event.callEvent()) return InteractionResult.PASS; ++ + LivingEntity newEntity = ((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getEntity()).getHandle(); + newEntity.setCustomName(event.getName() != null ? io.papermc.paper.adventure.PaperAdventure.asVanilla(event.getName()) : null); + if (event.isPersistent() && newEntity instanceof Mob mob) { -+ // Paper end - Add PlayerNameEntityEvent ++ // Paper end - Add PlayerNameEntityEvent mob.setPersistenceRequired(); } diff --git a/paper-server/patches/sources/net/minecraft/world/item/SnowballItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/SnowballItem.java.patch index 77ff25b46f..ca1757fbfe 100644 --- a/paper-server/patches/sources/net/minecraft/world/item/SnowballItem.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/item/SnowballItem.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/SnowballItem.java +++ b/net/minecraft/world/item/SnowballItem.java -@@ -23,22 +_,38 @@ +@@ -23,22 +_,41 @@ @Override public InteractionResult use(Level level, Player player, InteractionHand hand) { ItemStack itemInHand = player.getItemInHand(hand); @@ -24,10 +24,10 @@ + player.awardStat(Stats.ITEM_USED.get(this)); + if (event.shouldConsume()) { + itemInHand.consume(1, player); -+ } else if (player instanceof net.minecraft.server.level.ServerPlayer) { -+ ((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity().updateInventory(); ++ } else { ++ player.containerMenu.sendAllDataToRemote(); + } -+ // Paper end - PlayerLaunchProjectileEvent ++ // Paper end - PlayerLaunchProjectileEvent + + level.playSound( + null, @@ -39,9 +39,12 @@ + 0.5F, + 0.4F / (level.getRandom().nextFloat() * 0.4F + 0.8F) + ); -+ } else { if (player instanceof net.minecraft.server.level.ServerPlayer) { // Paper - PlayerLaunchProjectileEvent - return fail -+ ((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity().updateInventory(); -+ } return InteractionResult.FAIL; } // Paper - PlayerLaunchProjectileEvent - return fail ++ // Paper start - PlayerLaunchProjectileEvent - return fail ++ } else { ++ player.containerMenu.sendAllDataToRemote(); ++ return InteractionResult.FAIL; ++ } ++ // Paper end- PlayerLaunchProjectileEvent - return fail + // CraftBukkit end } diff --git a/paper-server/patches/sources/net/minecraft/world/item/ThrowablePotionItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/ThrowablePotionItem.java.patch index b5afefd1a8..220fab6ac3 100644 --- a/paper-server/patches/sources/net/minecraft/world/item/ThrowablePotionItem.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/item/ThrowablePotionItem.java.patch @@ -1,27 +1,23 @@ --- a/net/minecraft/world/item/ThrowablePotionItem.java +++ b/net/minecraft/world/item/ThrowablePotionItem.java -@@ -22,11 +_,29 @@ +@@ -22,11 +_,25 @@ public InteractionResult use(Level level, Player player, InteractionHand hand) { ItemStack itemInHand = player.getItemInHand(hand); if (level instanceof ServerLevel serverLevel) { - Projectile.spawnProjectileFromRotation(ThrownPotion::new, serverLevel, itemInHand, player, -20.0F, PROJECTILE_SHOOT_POWER, 1.0F); -+ // Projectile.spawnProjectileFromRotation(ThrownPotion::new, serverLevel, itemInHand, player, -20.0F, PROJECTILE_SHOOT_POWER, 1.0F); + // Paper start - PlayerLaunchProjectileEvent + final Projectile.Delayed thrownPotion = Projectile.spawnProjectileFromRotationDelayed(ThrownPotion::new, serverLevel, itemInHand, player, -20.0F, PROJECTILE_SHOOT_POWER, 1.0F); -+ // Paper start - PlayerLaunchProjectileEvent + com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemInHand), (org.bukkit.entity.Projectile) thrownPotion.projectile().getBukkitEntity()); + if (event.callEvent() && thrownPotion.attemptSpawn()) { + if (event.shouldConsume()) { + itemInHand.consume(1, player); -+ } else if (player instanceof net.minecraft.server.level.ServerPlayer) { -+ ((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity().updateInventory(); ++ } else { ++ player.containerMenu.sendAllDataToRemote(); + } + + player.awardStat(Stats.ITEM_USED.get(this)); + } else { -+ if (player instanceof net.minecraft.server.level.ServerPlayer) { -+ ((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity().updateInventory(); -+ } ++ player.containerMenu.sendAllDataToRemote(); + return InteractionResult.FAIL; + } + // Paper end - PlayerLaunchProjectileEvent diff --git a/paper-server/patches/sources/net/minecraft/world/item/TridentItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/TridentItem.java.patch index b07462cc0f..1e9f3060b3 100644 --- a/paper-server/patches/sources/net/minecraft/world/item/TridentItem.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/item/TridentItem.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/TridentItem.java +++ b/net/minecraft/world/item/TridentItem.java -@@ -87,19 +_,37 @@ +@@ -87,19 +_,35 @@ .orElse(SoundEvents.TRIDENT_THROW); player.awardStat(Stats.ITEM_USED.get(this)); if (level instanceof ServerLevel serverLevel) { @@ -15,10 +15,8 @@ + com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(stack), (org.bukkit.entity.Projectile) tridentDelayed.projectile().getBukkitEntity()); + if (!event.callEvent() || !tridentDelayed.attemptSpawn()) { + // CraftBukkit start -+ // Paper end - PlayerLaunchProjectileEvent -+ if (player instanceof net.minecraft.server.level.ServerPlayer serverPlayer) { -+ serverPlayer.getBukkitEntity().updateInventory(); -+ } ++ // Paper end - PlayerLaunchProjectileEvent ++ player.containerMenu.sendAllDataToRemote(); + return false; + } + ThrownTrident thrownTrident = tridentDelayed.projectile(); // Paper - PlayerLaunchProjectileEvent