2024-01-04 21:18:59 +01:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
|
|
|
|
Date: Sat, 30 Dec 2023 15:00:06 -0500
|
|
|
|
Subject: [PATCH] Properly handle experience dropping on block break
|
|
|
|
|
|
|
|
This causes spawnAfterBreak to spawn xp by default, removing the need to manually add xp wherever this method is used.
|
|
|
|
For classes that use custom xp amounts, they can drop the resources with disabling
|
|
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
|
2024-01-13 16:35:59 +01:00
|
|
|
index a7d40d41a332f0612a2f1ff60c7082e4a8825ba1..e0b70ae59ed7ea0543c8cb87b0e7e5f0bc9385b1 100644
|
2024-01-04 21:18:59 +01:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/Level.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/Level.java
|
|
|
|
@@ -1103,7 +1103,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
|
|
|
if (drop) {
|
|
|
|
BlockEntity tileentity = iblockdata.hasBlockEntity() ? this.getBlockEntity(pos) : null;
|
|
|
|
|
|
|
|
- Block.dropResources(iblockdata, this, pos, tileentity, breakingEntity, ItemStack.EMPTY);
|
2024-01-13 16:35:59 +01:00
|
|
|
+ Block.dropResources(iblockdata, this, pos, tileentity, breakingEntity, ItemStack.EMPTY, false); // Paper - Properly handle xp dropping
|
|
|
|
+ iblockdata.getBlock().popExperience((ServerLevel) this, pos, xp, breakingEntity); // Paper - Properly handle xp dropping; custom amount
|
2024-01-04 21:18:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
boolean flag1 = this.setBlock(pos, fluid.createLegacyBlock(), 3, maxUpdateDepth);
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java
|
2024-01-13 16:35:59 +01:00
|
|
|
index c450caed1a8d14f3bd56d0336a9bf72a5adca14f..a4b51821d8bcf9fdb7ff5e200c33ac2c565eece1 100644
|
2024-01-04 21:18:59 +01:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/block/Block.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/block/Block.java
|
|
|
|
@@ -333,23 +333,31 @@ public class Block extends BlockBehaviour implements ItemLike {
|
|
|
|
for (net.minecraft.world.item.ItemStack drop : net.minecraft.world.level.block.Block.getDrops(state, world.getMinecraftWorld(), pos, blockEntity)) {
|
|
|
|
items.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(drop));
|
|
|
|
}
|
2024-01-13 16:35:59 +01:00
|
|
|
+ Block block = state.getBlock(); // Paper - Properly handle xp dropping
|
2024-01-04 21:18:59 +01:00
|
|
|
io.papermc.paper.event.block.BlockBreakBlockEvent event = new io.papermc.paper.event.block.BlockBreakBlockEvent(org.bukkit.craftbukkit.block.CraftBlock.at(world, pos), org.bukkit.craftbukkit.block.CraftBlock.at(world, source), items);
|
2024-01-13 16:35:59 +01:00
|
|
|
+ event.setExpToDrop(block.getExpDrop(state, (ServerLevel) world, pos, net.minecraft.world.item.ItemStack.EMPTY, true)); // Paper - Properly handle xp dropping
|
2024-01-04 21:18:59 +01:00
|
|
|
event.callEvent();
|
|
|
|
for (var drop : event.getDrops()) {
|
|
|
|
popResource(world.getMinecraftWorld(), pos, org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(drop));
|
|
|
|
}
|
|
|
|
- state.spawnAfterBreak(world.getMinecraftWorld(), pos, ItemStack.EMPTY, true);
|
2024-01-13 16:35:59 +01:00
|
|
|
+ state.spawnAfterBreak(world.getMinecraftWorld(), pos, ItemStack.EMPTY, false); // Paper - Properly handle xp dropping
|
|
|
|
+ block.popExperience((ServerLevel) world, pos, event.getExpToDrop()); // Paper - Properly handle xp dropping
|
2024-01-04 21:18:59 +01:00
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
// Paper end
|
|
|
|
|
|
|
|
public static void dropResources(BlockState state, Level world, BlockPos pos, @Nullable BlockEntity blockEntity, @Nullable Entity entity, ItemStack tool) {
|
2024-01-13 16:35:59 +01:00
|
|
|
+ // Paper start - Properly handle xp dropping
|
2024-01-04 21:18:59 +01:00
|
|
|
+ dropResources(state, world, pos, blockEntity, entity, tool, true);
|
|
|
|
+ }
|
|
|
|
+ public static void dropResources(BlockState state, Level world, BlockPos pos, @Nullable BlockEntity blockEntity, @Nullable Entity entity, ItemStack tool, boolean dropExperience) {
|
2024-01-13 16:35:59 +01:00
|
|
|
+ // Paper end - Properly handle xp dropping
|
2024-01-04 21:18:59 +01:00
|
|
|
if (world instanceof ServerLevel) {
|
|
|
|
Block.getDrops(state, (ServerLevel) world, pos, blockEntity, entity, tool).forEach((itemstack1) -> {
|
|
|
|
Block.popResource(world, pos, itemstack1);
|
|
|
|
});
|
|
|
|
- state.spawnAfterBreak((ServerLevel) world, pos, tool, true);
|
2024-01-13 16:35:59 +01:00
|
|
|
+ state.spawnAfterBreak((ServerLevel) world, pos, tool, dropExperience); // Paper - Properly handle xp dropping
|
2024-01-04 21:18:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
@@ -433,7 +441,7 @@ public class Block extends BlockBehaviour implements ItemLike {
|
|
|
|
player.awardStat(Stats.BLOCK_MINED.get(this));
|
|
|
|
player.causeFoodExhaustion(0.005F, org.bukkit.event.entity.EntityExhaustionEvent.ExhaustionReason.BLOCK_MINED); // CraftBukkit - EntityExhaustionEvent
|
|
|
|
if (includeDrops) { // Paper
|
|
|
|
- Block.dropResources(state, world, pos, blockEntity, player, tool);
|
2024-01-13 16:35:59 +01:00
|
|
|
+ Block.dropResources(state, world, pos, blockEntity, player, tool, dropExp); // Paper - Properly handle xp dropping
|
2024-01-04 21:18:59 +01:00
|
|
|
} // Paper
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java
|
2024-01-13 16:35:59 +01:00
|
|
|
index 17d2b90441d7513d7907b988610be8604ac05282..f03fd4bc44fb95cc17cae69dbe3fd684ed562d6f 100644
|
2024-01-04 21:18:59 +01:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java
|
|
|
|
@@ -1286,6 +1286,7 @@ public abstract class BlockBehaviour implements FeatureElement {
|
|
|
|
|
|
|
|
public void spawnAfterBreak(ServerLevel world, BlockPos pos, ItemStack tool, boolean dropExperience) {
|
|
|
|
this.getBlock().spawnAfterBreak(this.asState(), world, pos, tool, dropExperience);
|
2024-01-13 16:35:59 +01:00
|
|
|
+ if (dropExperience) {getBlock().popExperience(world, pos, this.getBlock().getExpDrop(asState(), world, pos, tool, true));} // Paper - Properly handle xp dropping
|
2024-01-04 21:18:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public List<ItemStack> getDrops(LootParams.Builder builder) {
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
|
2024-01-13 16:35:59 +01:00
|
|
|
index e5506a7d074a9f89d41f4d5d7549a458779bef20..4b42ef2a876ea210d948238e63fd7a2b7035bb5b 100644
|
2024-01-04 21:18:59 +01:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
|
|
|
|
@@ -503,7 +503,7 @@ public class CraftBlock implements Block {
|
|
|
|
|
|
|
|
// Modelled off EntityHuman#hasBlock
|
|
|
|
if (block != Blocks.AIR && (item == null || !iblockdata.requiresCorrectToolForDrops() || nmsItem.isCorrectToolForDrops(iblockdata))) {
|
|
|
|
- net.minecraft.world.level.block.Block.dropResources(iblockdata, this.world.getMinecraftWorld(), this.position, this.world.getBlockEntity(this.position), null, nmsItem);
|
2024-01-13 16:35:59 +01:00
|
|
|
+ net.minecraft.world.level.block.Block.dropResources(iblockdata, this.world.getMinecraftWorld(), this.position, this.world.getBlockEntity(this.position), null, nmsItem, false); // Paper - Properly handle xp dropping
|
2024-01-04 21:18:59 +01:00
|
|
|
// Paper start - improve Block#breanNaturally
|
|
|
|
if (triggerEffect) {
|
|
|
|
if (iblockdata.getBlock() instanceof net.minecraft.world.level.block.BaseFireBlock) {
|