2022-12-14 19:37:16 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								From: Jake Potrebic <jake.m.potrebic@gmail.com>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Date: Thu, 2 Jan 2020 12:25:07 -0600
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Subject: [PATCH] Improve Block#breakNaturally API
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Adds bool parameter to play world effect on block break
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Adds bool parameter to drop xp from blocks
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Fixes fluid-logged blocks not leaving fluid behind if
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								broken
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Handles special cases for ice and turtle eggs
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								== AT ==
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								public net.minecraft.world.level.block.TurtleEggBlock decreaseEggs(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Co-authored-by: William Blake Galbreath <Blake.Galbreath@GMail.com>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								diff --git a/src/main/java/net/minecraft/world/level/block/IceBlock.java b/src/main/java/net/minecraft/world/level/block/IceBlock.java
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 23:05:14 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								index 46ee66d06c727a3ad6638f09ac97cd0f07676a7b..4bfe53e3a231a7bec461759e78c7a6cbcb8bb625 100644
 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 19:37:16 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								--- a/src/main/java/net/minecraft/world/level/block/IceBlock.java
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+++ b/src/main/java/net/minecraft/world/level/block/IceBlock.java
 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-05 15:55:31 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								@@ -35,6 +35,11 @@ public class IceBlock extends HalfTransparentBlock {
 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 19:37:16 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								     @Override
							 
						 
					
						
							
								
									
										
										
										
											2023-03-14 20:54:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								     public void playerDestroy(Level world, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								         super.playerDestroy(world, player, pos, state, blockEntity, tool);
							 
						 
					
						
							
								
									
										
										
										
											2024-01-21 12:53:04 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								+        // Paper start - Improve Block#breakNaturally API
 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-14 20:54:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								+        this.afterDestroy(world, pos, tool);
 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 19:37:16 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								+    }
 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-14 20:54:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								+    public void afterDestroy(Level world, BlockPos pos, ItemStack tool) {
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-21 12:53:04 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								+        // Paper end - Improve Block#breakNaturally API
 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-14 20:54:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								         if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) == 0) {
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 19:37:16 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								             if (world.dimensionType().ultraWarm()) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                 world.removeBlock(pos, false);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-16 19:27:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								index d4e14ac1514e2d8b87b4667a91c90eded3ba6636..f041b5d80bff9c022b007e04ef1558e9116acc6b 100644
 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 19:37:16 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-05 15:55:31 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								@@ -452,6 +452,18 @@ public class CraftBlock implements Block {
 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 19:37:16 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     @Override
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     public boolean breakNaturally(ItemStack item) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+        // Paper start
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+        return this.breakNaturally(item, false);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+    }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+    @Override
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+    public boolean breakNaturally(boolean triggerEffect, boolean dropExperience) {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+        return this.breakNaturally(null, triggerEffect, dropExperience);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+    }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+    @Override
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+    public boolean breakNaturally(ItemStack item, boolean triggerEffect, boolean dropExperience) {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+        // Paper end
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								         // Order matters here, need to drop before setting to air so skulls can get their data
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								         net.minecraft.world.level.block.state.BlockState iblockdata = this.getNMS();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								         net.minecraft.world.level.block.Block block = iblockdata.getBlock();
							 
						 
					
						
							
								
									
										
										
										
											2023-12-05 15:55:31 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								@@ -461,11 +473,35 @@ public class CraftBlock implements Block {
 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 19:37:16 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								         // Modelled off EntityHuman#hasBlock
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								         if (block != Blocks.AIR && (item == null || !iblockdata.requiresCorrectToolForDrops() || nmsItem.isCorrectToolForDrops(iblockdata))) {
							 
						 
					
						
							
								
									
										
										
										
											2023-10-26 16:34:58 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								             net.minecraft.world.level.block.Block.dropResources(iblockdata, this.world.getMinecraftWorld(), this.position, this.world.getBlockEntity(this.position), null, nmsItem);
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 19:37:16 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								+            // Paper start - improve Block#breanNaturally
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+            if (triggerEffect) {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+                if (iblockdata.getBlock() instanceof net.minecraft.world.level.block.BaseFireBlock) {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+                    this.world.levelEvent(net.minecraft.world.level.block.LevelEvent.SOUND_EXTINGUISH_FIRE, this.position, 0);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+                } else {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+                    this.world.levelEvent(net.minecraft.world.level.block.LevelEvent.PARTICLES_DESTROY_BLOCK, this.position, net.minecraft.world.level.block.Block.getId(iblockdata));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+                }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+            }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+            if (dropExperience) block.popExperience(this.world.getMinecraftWorld(), this.position, block.getExpDrop(iblockdata, this.world.getMinecraftWorld(), this.position, nmsItem, true));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+            // Paper end
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								             result = true;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								         }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								         // SPIGOT-6778: Directly call setBlock instead of setTypeAndData, so that the tile entiy is not removed and custom remove logic is run.
							 
						 
					
						
							
								
									
										
										
										
											2023-10-26 16:34:58 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								-        return this.world.setBlock(this.position, Blocks.AIR.defaultBlockState(), 3) && result;
 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 19:37:16 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								+        // Paper start - improve breakNaturally
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+        boolean destroyed = this.world.removeBlock(this.position, false);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+        if (destroyed) {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+            block.destroy(this.world, this.position, iblockdata);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+        }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+        if (result) {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+            // special cases
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+            if (block instanceof net.minecraft.world.level.block.IceBlock iceBlock) {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+                iceBlock.afterDestroy(this.world.getMinecraftWorld(), this.position, nmsItem);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+            } else if (block instanceof net.minecraft.world.level.block.TurtleEggBlock turtleEggBlock) {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+                turtleEggBlock.decreaseEggs(this.world.getMinecraftWorld(), this.position, iblockdata);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+            }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+        }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+        return destroyed && result;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								+        // Paper end
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     @Override