aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0870-Fix-block-place-logic.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0870-Fix-block-place-logic.patch')
-rw-r--r--patches/server/0870-Fix-block-place-logic.patch68
1 files changed, 68 insertions, 0 deletions
diff --git a/patches/server/0870-Fix-block-place-logic.patch b/patches/server/0870-Fix-block-place-logic.patch
new file mode 100644
index 0000000000..10b444c4dc
--- /dev/null
+++ b/patches/server/0870-Fix-block-place-logic.patch
@@ -0,0 +1,68 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Lulu13022002 <[email protected]>
+Date: Mon, 3 Apr 2023 18:46:49 +0200
+Subject: [PATCH] Fix block place logic
+
+Fix several issues when a player interact with a block:
+* the place sound isn't played for the dispensed shulker block
+* desync of the jukebox blocks between bukkit handler and the vanilla interaction
+* poi can desync when the BlockPhysicsEvent is cancelled
+
+diff --git a/src/main/java/net/minecraft/world/item/BlockItem.java b/src/main/java/net/minecraft/world/item/BlockItem.java
+index 1ac739c92031e80c35e1af4417e6358346079580..8c54b92b65b3d379e14a11370b09d45351ab22e1 100644
+--- a/src/main/java/net/minecraft/world/item/BlockItem.java
++++ b/src/main/java/net/minecraft/world/item/BlockItem.java
+@@ -130,7 +130,7 @@ public class BlockItem extends Item {
+
+ SoundType soundeffecttype = iblockdata1.getSoundType();
+
+- // world.playSound(entityhuman, blockposition, this.getPlaceSound(iblockdata1), SoundCategory.BLOCKS, (soundeffecttype.getVolume() + 1.0F) / 2.0F, soundeffecttype.getPitch() * 0.8F);
++ if (entityhuman == null) world.playSound(entityhuman, blockposition, this.getPlaceSound(iblockdata1), net.minecraft.sounds.SoundSource.BLOCKS, (soundeffecttype.getVolume() + 1.0F) / 2.0F, soundeffecttype.getPitch() * 0.8F); // Paper - Fix block place logic; reintroduce this for the dispenser (i.e the shulker)
+ world.gameEvent(GameEvent.BLOCK_PLACE, blockposition, GameEvent.Context.of(entityhuman, iblockdata1));
+ if ((entityhuman == null || !entityhuman.getAbilities().instabuild) && itemstack != ItemStack.EMPTY) { // CraftBukkit
+ itemstack.shrink(1);
+diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java
+index 59c4550b4cb8b0317f5256efc9376265f4583b60..964d6af9eb9752b9e08f712c80b67bd9410d1554 100644
+--- a/src/main/java/net/minecraft/world/item/ItemStack.java
++++ b/src/main/java/net/minecraft/world/item/ItemStack.java
+@@ -494,13 +494,7 @@ public final class ItemStack {
+ if (tileentity instanceof JukeboxBlockEntity) {
+ JukeboxBlockEntity tileentityjukebox = (JukeboxBlockEntity) tileentity;
+
+- // There can only be one
+- ItemStack record = this.copy();
+- if (!record.isEmpty()) {
+- record.setCount(1);
+- }
+-
+- tileentityjukebox.setTheItem(record);
++ tileentityjukebox.setTheItem(this.copy()); // Paper - Fix block place logic; sync this with record item, jukebox has now an inventory
+ world.gameEvent(GameEvent.BLOCK_CHANGE, blockposition, GameEvent.Context.of(entityhuman, world.getBlockState(blockposition)));
+ }
+
+diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
+index 5fcdb88dd2aa8c8c57d57935d15ea92c1015670e..4fe0f8ba4a2b089f44808063e72dd994d6c73e0a 100644
+--- a/src/main/java/net/minecraft/world/level/Level.java
++++ b/src/main/java/net/minecraft/world/level/Level.java
+@@ -560,17 +560,18 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+ // CraftBukkit start
+ iblockdata1.updateIndirectNeighbourShapes(this, blockposition, k, j - 1); // Don't call an event for the old block to limit event spam
+ CraftWorld world = ((ServerLevel) this).getWorld();
++ boolean cancelledUpdates = false; // Paper - Fix block place logic
+ if (world != null && ((ServerLevel)this).hasPhysicsEvent) { // Paper - BlockPhysicsEvent
+ BlockPhysicsEvent event = new BlockPhysicsEvent(world.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), CraftBlockData.fromData(iblockdata));
+ this.getCraftServer().getPluginManager().callEvent(event);
+
+- if (event.isCancelled()) {
+- return;
+- }
++ cancelledUpdates = event.isCancelled(); // Paper - Fix block place logic
+ }
+ // CraftBukkit end
++ if (!cancelledUpdates) { // Paper - Fix block place logic
+ iblockdata.updateNeighbourShapes(this, blockposition, k, j - 1);
+ iblockdata.updateIndirectNeighbourShapes(this, blockposition, k, j - 1);
++ } // Paper - Fix block place logic
+ }
+
+ // CraftBukkit start - SPIGOT-5710