net.minecraft.world.level.storage.loot

This commit is contained in:
Jake Potrebic 2024-12-14 10:24:21 -08:00
parent 93c74cf2f4
commit ce87e69d53
No known key found for this signature in database
GPG key ID: ECE0B3C133C016C5
2 changed files with 65 additions and 0 deletions

View file

@ -0,0 +1,20 @@
--- a/net/minecraft/world/level/storage/loot/LootDataType.java
+++ b/net/minecraft/world/level/storage/loot/LootDataType.java
@@ -31,9 +_,14 @@
}
private static LootDataType.Validator<LootTable> createLootTableValidator() {
- return (context, key, value) -> value.validate(
- context.setContextKeySet(value.getParamSet()).enterElement("{" + key.registry() + "/" + key.location() + "}", key)
- );
+ // CraftBukkit start
+ return (context, key, value) -> {
+ value.validate(
+ context.setContextKeySet(value.getParamSet()).enterElement("{" + key.registry() + "/" + key.location() + "}", key)
+ );
+ value.craftLootTable = new org.bukkit.craftbukkit.CraftLootTable(org.bukkit.craftbukkit.util.CraftNamespacedKey.fromMinecraft(key.location()), value);
+ // CraftBukkit end
+ };
}
@FunctionalInterface

View file

@ -0,0 +1,45 @@
--- a/net/minecraft/world/level/storage/loot/LootTable.java
+++ b/net/minecraft/world/level/storage/loot/LootTable.java
@@ -48,6 +_,7 @@
private final List<LootPool> pools;
private final List<LootItemFunction> functions;
private final BiFunction<ItemStack, LootContext, ItemStack> compositeFunction;
+ public org.bukkit.craftbukkit.CraftLootTable craftLootTable; // CraftBukkit
LootTable(ContextKeySet paramSet, Optional<ResourceLocation> randomSequence, List<LootPool> pools, List<LootItemFunction> functions) {
this.paramSet = paramSet;
@@ -58,9 +_,10 @@
}
public static Consumer<ItemStack> createStackSplitter(ServerLevel level, Consumer<ItemStack> output) {
+ boolean skipSplitter = level != null && !level.paperConfig().fixes.splitOverstackedLoot; // Paper - preserve overstacked items
return itemStack -> {
if (itemStack.isItemEnabled(level.enabledFeatures())) {
- if (itemStack.getCount() < itemStack.getMaxStackSize()) {
+ if (skipSplitter || itemStack.getCount() < itemStack.getMaxStackSize()) { // Paper - preserve overstacked items
output.accept(itemStack);
} else {
int count = itemStack.getCount();
@@ -141,9 +_,22 @@
}
public void fill(Container container, LootParams params, long seed) {
+ // CraftBukkit start
+ this.fillInventory(container, params, seed, false);
+ }
+
+ public void fillInventory(Container container, LootParams params, long seed, boolean plugin) {
+ // CraftBukkit end
LootContext lootContext = new LootContext.Builder(params).withOptionalRandomSeed(seed).create(this.randomSequence);
ObjectArrayList<ItemStack> randomItems = this.getRandomItems(lootContext);
RandomSource random = lootContext.getRandom();
+ // CraftBukkit start
+ org.bukkit.event.world.LootGenerateEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callLootGenerateEvent(container, this, lootContext, randomItems, plugin);
+ if (event.isCancelled()) {
+ return;
+ }
+ randomItems = event.getLoot().stream().map(org.bukkit.craftbukkit.inventory.CraftItemStack::asNMSCopy).collect(ObjectArrayList.toList());
+ // CraftBukkit end
List<Integer> availableSlots = this.getAvailableSlots(container, random);
this.shuffleAndSplitItems(randomItems, availableSlots.size(), random);