mirror of
https://github.com/PaperMC/Paper.git
synced 2024-10-29 23:09:33 +01:00
9147456fc9
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing CraftBukkit Changes: ab8ace685 SPIGOT-7236: Bone meal doesn't increase use statistic 7dcb59b8e Avoid switch on material in previous commit Spigot Changes: 19641c75 SPIGOT-7235: World.Spigot#strikeLightningEffect doesn't do anything
62 lines
3.6 KiB
Diff
62 lines
3.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: lexikiq <noellekiq@gmail.com>
|
|
Date: Mon, 21 Jun 2021 23:21:58 -0400
|
|
Subject: [PATCH] Preserve overstacked loot
|
|
|
|
Preserves overstacked items in loot tables, such as shulker box drops, to prevent the items
|
|
from being deleted (as they'd overflow past the bounds of the container)-- or worse, causing
|
|
chunk bans via the large amount of NBT created by unstacking the items.
|
|
|
|
Fixes GH-5140 and GH-4748.
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/storage/loot/LootTable.java b/src/main/java/net/minecraft/world/level/storage/loot/LootTable.java
|
|
index 1326539c88aabfbe1bbaf2905268abfa729d8167..3bc13092873609af9c6f412190dd989d39f1df23 100644
|
|
--- a/src/main/java/net/minecraft/world/level/storage/loot/LootTable.java
|
|
+++ b/src/main/java/net/minecraft/world/level/storage/loot/LootTable.java
|
|
@@ -56,14 +56,22 @@ public class LootTable {
|
|
this.compositeFunction = LootItemFunctions.compose(functions);
|
|
}
|
|
|
|
+ // Paper start - preserve overstacked items
|
|
+ @Deprecated
|
|
public static Consumer<ItemStack> createStackSplitter(LootContext context, Consumer<ItemStack> consumer) {
|
|
+ return createStackSplitter(context, consumer, null);
|
|
+ }
|
|
+ public static Consumer<ItemStack> createStackSplitter(LootContext context, Consumer<ItemStack> consumer, @org.jetbrains.annotations.Nullable net.minecraft.server.level.ServerLevel level) {
|
|
+ boolean skipSplitter = level != null && !level.paperConfig().fixes.splitOverstackedLoot;
|
|
+ // Paper end
|
|
return (itemstack) -> {
|
|
if (itemstack.isItemEnabled(context.getLevel().enabledFeatures())) {
|
|
- if (itemstack.getCount() < itemstack.getMaxStackSize()) {
|
|
+ if (skipSplitter || itemstack.getCount() < itemstack.getMaxStackSize()) { // Paper - preserve overstacked items
|
|
consumer.accept(itemstack);
|
|
} else {
|
|
int i = itemstack.getCount();
|
|
|
|
+
|
|
while (i > 0) {
|
|
ItemStack itemstack1 = itemstack.copy();
|
|
|
|
@@ -97,7 +105,7 @@ public class LootTable {
|
|
}
|
|
|
|
public void getRandomItems(LootContext context, Consumer<ItemStack> lootConsumer) {
|
|
- this.getRandomItemsRaw(context, LootTable.createStackSplitter(context, lootConsumer));
|
|
+ this.getRandomItemsRaw(context, LootTable.createStackSplitter(context, lootConsumer, context.getLevel())); // Paper - preserve overstacked items
|
|
}
|
|
|
|
public ObjectArrayList<ItemStack> getRandomItems(LootContext context) {
|
|
diff --git a/src/main/java/net/minecraft/world/level/storage/loot/functions/SetContainerContents.java b/src/main/java/net/minecraft/world/level/storage/loot/functions/SetContainerContents.java
|
|
index 880a0686519dc033b3c3b2bf0126f49af6fb48de..eddad9593bccd9e91fbb6d79fa2bdd766b004690 100644
|
|
--- a/src/main/java/net/minecraft/world/level/storage/loot/functions/SetContainerContents.java
|
|
+++ b/src/main/java/net/minecraft/world/level/storage/loot/functions/SetContainerContents.java
|
|
@@ -46,7 +46,7 @@ public class SetContainerContents extends LootItemConditionalFunction {
|
|
NonNullList<ItemStack> nonNullList = NonNullList.create();
|
|
this.entries.forEach((entry) -> {
|
|
entry.expand(context, (choice) -> {
|
|
- choice.createItemStack(LootTable.createStackSplitter(context, nonNullList::add), context);
|
|
+ choice.createItemStack(LootTable.createStackSplitter(context, nonNullList::add, context.getLevel()), context); // Paper - preserve overstacked items
|
|
});
|
|
});
|
|
CompoundTag compoundTag = new CompoundTag();
|