Add LootTable to BlockDispenseLootEvent (#12917)

This commit is contained in:
Esophose
2025-08-17 08:53:00 -06:00
committed by GitHub
parent 47f983f430
commit 616a8795ea
4 changed files with 27 additions and 7 deletions
@@ -7,6 +7,7 @@ import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.inventory.ItemStack;
import org.bukkit.loot.LootTable;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -26,14 +27,16 @@ public class BlockDispenseLootEvent extends BlockEvent implements Cancellable {
private final Player player;
private List<ItemStack> dispensedLoot;
private final LootTable lootTable;
private boolean cancelled;
@ApiStatus.Internal
public BlockDispenseLootEvent(@Nullable Player player, @NotNull Block block, @NotNull List<ItemStack> dispensedLoot) {
public BlockDispenseLootEvent(@Nullable Player player, @NotNull Block block, @NotNull List<ItemStack> dispensedLoot, @NotNull LootTable lootTable) {
super(block);
this.player = player;
this.dispensedLoot = dispensedLoot;
this.lootTable = lootTable;
}
/**
@@ -55,6 +58,16 @@ public class BlockDispenseLootEvent extends BlockEvent implements Cancellable {
this.dispensedLoot = dispensedLoot == null ? new ArrayList<>() : dispensedLoot;
}
/**
* Gets the loot table used to generate the initial loot to dispense.
*
* @return the loot table used to generate the initial loot to dispense
*/
@NotNull
public LootTable getLootTable() {
return this.lootTable;
}
/**
* Gets the player associated with this event.
* <br>
@@ -16,7 +16,12 @@
return Optional.empty();
}
@@ -233,6 +_,19 @@
@@ -229,10 +_,24 @@
}
public void ejectReward(ServerLevel level, BlockPos pos, ResourceKey<LootTable> lootTable) {
- LootTable lootTable1 = level.getServer().reloadableRegistries().getLootTable(lootTable);
+ LootTable lootTable1 = level.getServer().reloadableRegistries().getLootTable(lootTable); final LootTable sourceLootTable = lootTable1; // Paper - obfhelper
LootParams lootParams = new LootParams.Builder(level).create(LootContextParamSets.EMPTY);
ObjectArrayList<ItemStack> randomItems = lootTable1.getRandomItems(lootParams);
if (!randomItems.isEmpty()) {
@@ -25,7 +30,8 @@
+ level,
+ pos,
+ null,
+ randomItems
+ randomItems,
+ sourceLootTable
+ );
+ if (spawnerDispenseLootEvent.isCancelled()) {
+ return;
@@ -1,12 +1,13 @@
--- a/net/minecraft/world/level/block/entity/vault/VaultBlockEntity.java
+++ b/net/minecraft/world/level/block/entity/vault/VaultBlockEntity.java
@@ -257,7 +_,12 @@
@@ -257,7 +_,13 @@
if (!list.isEmpty()) {
player.awardStat(Stats.ITEM_USED.get(stack.getItem()));
stack.consume(config.keyItem().getCount(), player);
- unlock(level, state, pos, config, serverData, sharedData, list);
+ // CraftBukkit start
+ org.bukkit.event.block.BlockDispenseLootEvent vaultDispenseLootEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockDispenseLootEvent(level, pos, player, list);
+ LootTable sourceLootTable = level.getServer().reloadableRegistries().getLootTable(config.lootTable());
+ org.bukkit.event.block.BlockDispenseLootEvent vaultDispenseLootEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockDispenseLootEvent(level, pos, player, list, sourceLootTable);
+ if (vaultDispenseLootEvent.isCancelled()) return;
+ list = vaultDispenseLootEvent.getDispensedLoot().stream().map(org.bukkit.craftbukkit.inventory.CraftItemStack::asNMSCopy).toList();
+ // CraftBukkit end
@@ -1700,10 +1700,10 @@ public class CraftEventFactory {
return event;
}
public static BlockDispenseLootEvent callBlockDispenseLootEvent(ServerLevel level, BlockPos pos, net.minecraft.world.entity.player.Player player, List<ItemStack> rewardLoot) {
public static BlockDispenseLootEvent callBlockDispenseLootEvent(ServerLevel level, BlockPos pos, net.minecraft.world.entity.player.Player player, List<ItemStack> rewardLoot, LootTable lootTable) {
List<org.bukkit.inventory.ItemStack> craftItemStacks = rewardLoot.stream().map(CraftItemStack::asBukkitCopy).collect(Collectors.toList());
BlockDispenseLootEvent event = new BlockDispenseLootEvent((player == null) ? null : (Player) player.getBukkitEntity(), CraftBlock.at(level, pos), craftItemStacks);
BlockDispenseLootEvent event = new BlockDispenseLootEvent((player == null) ? null : (Player) player.getBukkitEntity(), CraftBlock.at(level, pos), craftItemStacks, lootTable.craftLootTable);
Bukkit.getPluginManager().callEvent(event);
return event;
}