diff --git a/paper-api/src/main/java/org/bukkit/event/block/BlockDispenseLootEvent.java b/paper-api/src/main/java/org/bukkit/event/block/BlockDispenseLootEvent.java index 651a9f9e7..e11693f67 100644 --- a/paper-api/src/main/java/org/bukkit/event/block/BlockDispenseLootEvent.java +++ b/paper-api/src/main/java/org/bukkit/event/block/BlockDispenseLootEvent.java @@ -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 dispensedLoot; + private final LootTable lootTable; private boolean cancelled; @ApiStatus.Internal - public BlockDispenseLootEvent(@Nullable Player player, @NotNull Block block, @NotNull List dispensedLoot) { + public BlockDispenseLootEvent(@Nullable Player player, @NotNull Block block, @NotNull List 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. *
diff --git a/paper-server/patches/sources/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch b/paper-server/patches/sources/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch index ea3f2309d..d423dfb6b 100644 --- a/paper-server/patches/sources/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch @@ -16,7 +16,12 @@ return Optional.empty(); } -@@ -233,6 +_,19 @@ +@@ -229,10 +_,24 @@ + } + + public void ejectReward(ServerLevel level, BlockPos pos, ResourceKey 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 randomItems = lootTable1.getRandomItems(lootParams); if (!randomItems.isEmpty()) { @@ -25,7 +30,8 @@ + level, + pos, + null, -+ randomItems ++ randomItems, ++ sourceLootTable + ); + if (spawnerDispenseLootEvent.isCancelled()) { + return; diff --git a/paper-server/patches/sources/net/minecraft/world/level/block/entity/vault/VaultBlockEntity.java.patch b/paper-server/patches/sources/net/minecraft/world/level/block/entity/vault/VaultBlockEntity.java.patch index 15447e612..1982d2831 100644 --- a/paper-server/patches/sources/net/minecraft/world/level/block/entity/vault/VaultBlockEntity.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/level/block/entity/vault/VaultBlockEntity.java.patch @@ -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 diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index 183d83f02..08db922da 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -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 rewardLoot) { + public static BlockDispenseLootEvent callBlockDispenseLootEvent(ServerLevel level, BlockPos pos, net.minecraft.world.entity.player.Player player, List rewardLoot, LootTable lootTable) { List 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; }