2023-04-07 00:39:32 +02:00
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
2023-07-13 21:22:05 +02:00
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
2023-06-08 10:47:19 +02:00
2023-04-07 00:39:32 +02:00
diff --git a/src/main/java/net/minecraft/world/item/BlockItem.java b/src/main/java/net/minecraft/world/item/BlockItem.java
2024-01-21 17:39:05 +01:00
index 1ac739c92031e80c35e1af4417e6358346079580..8c54b92b65b3d379e14a11370b09d45351ab22e1 100644
2023-04-07 00:39:32 +02:00
--- a/src/main/java/net/minecraft/world/item/BlockItem.java
+++ b/src/main/java/net/minecraft/world/item/BlockItem.java
2023-12-03 04:41:35 +01:00
@@ -130,7 +130,7 @@ public class BlockItem extends Item {
2023-04-07 00:39:32 +02:00
SoundType soundeffecttype = iblockdata1.getSoundType();
- // world.playSound(entityhuman, blockposition, this.getPlaceSound(iblockdata1), SoundCategory.BLOCKS, (soundeffecttype.getVolume() + 1.0F) / 2.0F, soundeffecttype.getPitch() * 0.8F);
2024-01-15 12:38:39 +01:00
+ 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)
2023-04-07 00:39:32 +02:00
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
2024-01-22 21:04:08 +01:00
index 0e9d515381a673e683b63a12c1a9e79a5eedd80b..096eb30dcfdd62b1d946891f7480e9d9c4dbb71d 100644
2023-04-07 00:39:32 +02:00
--- a/src/main/java/net/minecraft/world/item/ItemStack.java
+++ b/src/main/java/net/minecraft/world/item/ItemStack.java
2023-12-06 17:21:56 +01:00
@@ -493,13 +493,7 @@ public final class ItemStack {
2023-04-07 00:39:32 +02:00
if (tileentity instanceof JukeboxBlockEntity) {
JukeboxBlockEntity tileentityjukebox = (JukeboxBlockEntity) tileentity;
- // There can only be one
- ItemStack record = this.copy();
- if (!record.isEmpty()) {
- record.setCount(1);
- }
-
2023-12-06 17:21:56 +01:00
- tileentityjukebox.setTheItem(record);
2024-01-15 12:38:39 +01:00
+ tileentityjukebox.setTheItem(this.copy()); // Paper - Fix block place logic; sync this with record item, jukebox has now an inventory
2023-04-07 00:39:32 +02:00
world.gameEvent(GameEvent.BLOCK_CHANGE, blockposition, GameEvent.Context.of(entityhuman, world.getBlockState(blockposition)));
}
2023-07-13 21:22:05 +02:00
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
2024-01-23 15:43:48 +01:00
index ee1ba73796816e15437a2a2331d86494b3674ce7..24aafda4ec034b5baa544704f8faf5ff6fcd2827 100644
2023-07-13 21:22:05 +02:00
--- a/src/main/java/net/minecraft/world/level/Level.java
+++ b/src/main/java/net/minecraft/world/level/Level.java
2024-01-23 15:43:48 +01:00
@@ -572,17 +572,18 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
2023-07-13 21:22:05 +02:00
// 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();
2024-01-15 12:38:39 +01:00
+ boolean cancelledUpdates = false; // Paper - Fix block place logic
2024-01-23 14:34:17 +01:00
if (world != null && ((ServerLevel)this).hasPhysicsEvent) { // Paper - BlockPhysicsEvent
2023-07-13 21:22:05 +02:00
BlockPhysicsEvent event = new BlockPhysicsEvent(world.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), CraftBlockData.fromData(iblockdata));
this.getCraftServer().getPluginManager().callEvent(event);
- if (event.isCancelled()) {
- return;
- }
2024-01-15 12:38:39 +01:00
+ cancelledUpdates = event.isCancelled(); // Paper - Fix block place logic
2023-07-13 21:22:05 +02:00
}
// CraftBukkit end
2024-01-15 12:38:39 +01:00
+ if (!cancelledUpdates) { // Paper - Fix block place logic
2023-07-13 21:22:05 +02:00
iblockdata.updateNeighbourShapes(this, blockposition, k, j - 1);
iblockdata.updateIndirectNeighbourShapes(this, blockposition, k, j - 1);
2024-01-15 12:38:39 +01:00
+ } // Paper - Fix block place logic
2023-07-13 21:22:05 +02:00
}
// CraftBukkit start - SPIGOT-5710