aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0918-Fix-block-place-logic.patch
blob: 051d3982dbf20bd57c9e86ac4f4f9b900ddd145e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com>
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 daf093518f1daf598c858cfaf48357255a1fb0cf..c06e4b0683f0f125b79a4afce7daf909530d7bbf 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 63cd9cd79217a9bcedb6647e6f61d9bccc28d9f0..6070711b9825612fbc485d840ed3ed80cf912493 100644
--- a/src/main/java/net/minecraft/world/item/ItemStack.java
+++ b/src/main/java/net/minecraft/world/item/ItemStack.java
@@ -493,13 +493,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 6f828ff4c54c2ddd4cc03c0e368afda2521e24dd..a57b7e85f068c3131c6fc41cd8e79dec2f053748 100644
--- a/src/main/java/net/minecraft/world/level/Level.java
+++ b/src/main/java/net/minecraft/world/level/Level.java
@@ -1038,17 +1038,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 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