mirror of
https://github.com/LeavesMC/Leaves.git
synced 2025-12-19 14:59:32 +00:00
411 lines
26 KiB
Diff
411 lines
26 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: violetc <58360096+s-yh-china@users.noreply.github.com>
|
|
Date: Wed, 14 Dec 2022 14:47:06 +0800
|
|
Subject: [PATCH] Stackable ShulkerBoxes
|
|
|
|
This patch is Powered by fabric-carpet(https://github.com/gnembon/fabric-carpet) and plusls-carpet-addition(https://github.com/plusls/plusls-carpet-addition)
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
index 60ff21c8df4168f14da04a12073bde47cd4693c4..29499366e2a76b1b676cba49c7903e2f0e2e8faf 100644
|
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
@@ -3308,7 +3308,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
}
|
|
|
|
boolean flag1 = packet.slotNum() >= 1 && packet.slotNum() <= 45;
|
|
- boolean flag2 = itemstack.isEmpty() || itemstack.getCount() <= itemstack.getMaxStackSize();
|
|
+ boolean flag2 = itemstack.isEmpty() || itemstack.getCount() <= org.leavesmc.leaves.util.ShulkerBoxUtils.getItemStackMaxCount(itemstack); // Leaves - stackable shulker boxes
|
|
if (flag || (flag1 && !ItemStack.matches(this.player.inventoryMenu.getSlot(packet.slotNum()).getItem(), packet.itemStack()))) { // Insist on valid slot
|
|
// CraftBukkit start - Call click event
|
|
InventoryView inventory = this.player.inventoryMenu.getBukkitView();
|
|
diff --git a/src/main/java/net/minecraft/world/Container.java b/src/main/java/net/minecraft/world/Container.java
|
|
index 5db5ba026462ca642dcee718af732f80fadabef5..bca47bc78a444011b7e549aba949fea799e50c99 100644
|
|
--- a/src/main/java/net/minecraft/world/Container.java
|
|
+++ b/src/main/java/net/minecraft/world/Container.java
|
|
@@ -35,6 +35,12 @@ public interface Container extends Clearable {
|
|
return Math.min(this.getMaxStackSize(), stack.getMaxStackSize());
|
|
}
|
|
|
|
+ // Leaves start - stackable shulker boxes
|
|
+ default int getMaxStackLeaves(ItemStack stack) {
|
|
+ return Math.min(this.getMaxStackSize(), org.leavesmc.leaves.util.ShulkerBoxUtils.getItemStackMaxCount(stack));
|
|
+ }
|
|
+ // Leaves end - stackable shulker boxes
|
|
+
|
|
void setChanged();
|
|
|
|
boolean stillValid(Player player);
|
|
diff --git a/src/main/java/net/minecraft/world/SimpleContainer.java b/src/main/java/net/minecraft/world/SimpleContainer.java
|
|
index d04bf7d06855022c973073fb84c5d3d65f2553e1..9bedd76330e71ca7f3feecf0b90ec960c35d1a6f 100644
|
|
--- a/src/main/java/net/minecraft/world/SimpleContainer.java
|
|
+++ b/src/main/java/net/minecraft/world/SimpleContainer.java
|
|
@@ -222,7 +222,7 @@ public class SimpleContainer implements Container, StackedContentsCompatible {
|
|
@Override
|
|
public void setItem(int slot, ItemStack stack) {
|
|
this.items.set(slot, stack);
|
|
- stack.limitSize(this.getMaxStackSize(stack));
|
|
+ stack.limitSize(this.getMaxStackLeaves(stack));
|
|
this.setChanged();
|
|
}
|
|
|
|
@@ -318,7 +318,7 @@ public class SimpleContainer implements Container, StackedContentsCompatible {
|
|
}
|
|
|
|
private void moveItemsBetweenStacks(ItemStack source, ItemStack target) {
|
|
- int i = this.getMaxStackSize(target);
|
|
+ int i = this.getMaxStackLeaves(target); // Leaves - stackable shulker boxes
|
|
int j = Math.min(source.getCount(), i - target.getCount());
|
|
|
|
if (j > 0) {
|
|
diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
|
|
index 607f1a9802eb0ff4865af4c53f302128a6e6fe02..929a9bee808e8216dacb74dc58dbeee612126afe 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
|
|
@@ -22,10 +22,12 @@ import net.minecraft.world.entity.EntityType;
|
|
import net.minecraft.world.entity.MoverType;
|
|
import net.minecraft.world.entity.SlotAccess;
|
|
import net.minecraft.world.entity.TraceableEntity;
|
|
+import net.minecraft.world.item.BlockItem;
|
|
import net.minecraft.world.item.Item;
|
|
import net.minecraft.world.item.ItemStack;
|
|
import net.minecraft.world.item.Items;
|
|
import net.minecraft.world.level.Level;
|
|
+import net.minecraft.world.level.block.ShulkerBoxBlock;
|
|
import net.minecraft.world.level.gameevent.GameEvent;
|
|
import net.minecraft.world.level.portal.DimensionTransition;
|
|
import net.minecraft.world.phys.Vec3;
|
|
@@ -36,6 +38,7 @@ import net.minecraft.sounds.SoundSource;
|
|
import net.minecraft.stats.Stats;
|
|
import org.bukkit.craftbukkit.event.CraftEventFactory;
|
|
import org.bukkit.entity.Player;
|
|
+import org.bukkit.block.ShulkerBox;
|
|
import org.bukkit.event.entity.EntityPickupItemEvent;
|
|
import org.bukkit.event.entity.EntityRemoveEvent;
|
|
import org.bukkit.event.player.PlayerPickupItemEvent;
|
|
@@ -315,10 +318,49 @@ public class ItemEntity extends Entity implements TraceableEntity {
|
|
private boolean isMergable() {
|
|
ItemStack itemstack = this.getItem();
|
|
|
|
- return this.isAlive() && this.pickupDelay != 32767 && this.age != -32768 && this.age < this.despawnRate && itemstack.getCount() < itemstack.getMaxStackSize(); // Paper - Alternative item-despawn-rate
|
|
+ return this.isAlive() && this.pickupDelay != 32767 && this.age != -32768 && this.age < this.despawnRate && itemstack.getCount() < org.leavesmc.leaves.util.ShulkerBoxUtils.getItemStackMaxCount(itemstack); // Paper - Alternative item-despawn-rate // Leaves - stackable shulker boxes
|
|
}
|
|
|
|
+ // Leaves end - stackable shulker boxes
|
|
+ private boolean tryStackShulkerBoxes(ItemEntity other) {
|
|
+ ItemStack selfStack = this.getItem();
|
|
+ if (org.leavesmc.leaves.LeavesConfig.shulkerBoxStackSize == 1 || !(selfStack.getItem() instanceof BlockItem bi) || !(bi.getBlock() instanceof ShulkerBoxBlock)) {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ ItemStack otherStack = other.getItem();
|
|
+ if (selfStack.getItem() == otherStack.getItem()
|
|
+ && org.leavesmc.leaves.util.ShulkerBoxUtils.shulkerBoxNoItem(selfStack)
|
|
+ && org.leavesmc.leaves.util.ShulkerBoxUtils.shulkerBoxNoItem(otherStack)
|
|
+ && Objects.equals(selfStack.getComponents(), otherStack.getComponents()) // empty block entity tags are cleaned up when spawning
|
|
+ && selfStack.getCount() != org.leavesmc.leaves.LeavesConfig.shulkerBoxStackSize) {
|
|
+ int amount = Math.min(otherStack.getCount(), org.leavesmc.leaves.LeavesConfig.shulkerBoxStackSize - selfStack.getCount());
|
|
+
|
|
+ selfStack.grow(amount);
|
|
+ this.setItem(selfStack);
|
|
+
|
|
+ this.pickupDelay = Math.max(other.pickupDelay, this.pickupDelay);
|
|
+ this.age = Math.min(other.getAge(), this.age);
|
|
+
|
|
+ otherStack.shrink(amount);
|
|
+ if (otherStack.isEmpty()) {
|
|
+ other.discard();
|
|
+ }
|
|
+ else {
|
|
+ other.setItem(otherStack);
|
|
+ }
|
|
+ return true;
|
|
+ }
|
|
+ return false;
|
|
+ }
|
|
+ // Leaves end - stackable shulker boxes
|
|
+
|
|
private void tryToMerge(ItemEntity other) {
|
|
+ // Leaves start - stackable shulker boxes
|
|
+ if (tryStackShulkerBoxes(other)) {
|
|
+ return;
|
|
+ }
|
|
+ // Leaves end - stackable shulker boxes
|
|
ItemStack itemstack = this.getItem();
|
|
ItemStack itemstack1 = other.getItem();
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/player/Inventory.java b/src/main/java/net/minecraft/world/entity/player/Inventory.java
|
|
index eb11482f48c9f330b7fa62a278fd6f07d3a642e1..8631f3a5ce5aa24f195d5031dad6d289e4389314 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/player/Inventory.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/player/Inventory.java
|
|
@@ -111,7 +111,7 @@ public class Inventory implements Container, Nameable {
|
|
}
|
|
|
|
private boolean hasRemainingSpaceForItem(ItemStack existingStack, ItemStack stack) {
|
|
- return !existingStack.isEmpty() && existingStack.isStackable() && existingStack.getCount() < this.getMaxStackSize(existingStack) && ItemStack.isSameItemSameComponents(existingStack, stack); // Paper - check if itemstack is stackable first
|
|
+ return !existingStack.isEmpty() && org.leavesmc.leaves.util.ShulkerBoxUtils.isStackable(existingStack) && existingStack.getCount() < org.leavesmc.leaves.util.ShulkerBoxUtils.getItemStackMaxCount(existingStack) && ItemStack.isSameItemSameComponents(existingStack, stack); // Paper - check if itemstack is stackable first
|
|
}
|
|
|
|
// CraftBukkit start - Watch method above! :D
|
|
@@ -279,7 +279,9 @@ public class Inventory implements Container, Nameable {
|
|
this.setItem(slot, itemstack1);
|
|
}
|
|
|
|
- int k = this.getMaxStackSize(itemstack1) - itemstack1.getCount();
|
|
+ // Leaves start - stackable shulker boxes
|
|
+ int k = org.leavesmc.leaves.util.ShulkerBoxUtils.getItemStackMaxCount(itemstack1) - itemstack1.getCount();
|
|
+ // Leaves end - stackable shulker boxes
|
|
int l = Math.min(j, k);
|
|
|
|
if (l == 0) {
|
|
@@ -394,7 +396,7 @@ public class Inventory implements Container, Nameable {
|
|
}
|
|
|
|
if (i != -1) {
|
|
- int j = stack.getMaxStackSize() - this.getItem(i).getCount();
|
|
+ int j = org.leavesmc.leaves.util.ShulkerBoxUtils.getItemStackMaxCount(stack) - this.getItem(i).getCount(); // Leaves - stackable shulker boxes
|
|
|
|
if (this.add(i, stack.split(j)) && notifiesClient && this.player instanceof ServerPlayer) {
|
|
((ServerPlayer) this.player).connection.send(new ClientboundContainerSetSlotPacket(-2, 0, i, this.getItem(i)));
|
|
diff --git a/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java b/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java
|
|
index 845eff7401b811c179dc9dee70eca0d724be5c80..c88b98bd4ebec40649b9cfcf47ca20359ea2fb52 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java
|
|
@@ -162,7 +162,7 @@ public interface ContainerEntity extends Container, MenuProvider {
|
|
default void setChestVehicleItem(int slot, ItemStack stack) {
|
|
this.unpackChestVehicleLootTable(null);
|
|
this.getItemStacks().set(slot, stack);
|
|
- stack.limitSize(this.getMaxStackSize(stack));
|
|
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - stackable shulker boxes
|
|
}
|
|
|
|
default SlotAccess getChestVehicleSlot(int slot) {
|
|
diff --git a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java
|
|
index 961a7193fda00fa62acea9c39fda1c93f7fbe412..11bb1168f27a3a95b5e88f106e070a482702d50d 100644
|
|
--- a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java
|
|
+++ b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java
|
|
@@ -456,7 +456,7 @@ public abstract class AbstractContainerMenu {
|
|
|
|
if (slot1 != null && AbstractContainerMenu.canItemQuickReplace(slot1, itemstack2, true) && slot1.mayPlace(itemstack2) && (this.quickcraftType == 2 || itemstack2.getCount() >= this.quickcraftSlots.size()) && this.canDragTo(slot1)) {
|
|
int j1 = slot1.hasItem() ? slot1.getItem().getCount() : 0;
|
|
- int k1 = Math.min(itemstack1.getMaxStackSize(), slot1.getMaxStackSize(itemstack1));
|
|
+ int k1 = Math.min(org.leavesmc.leaves.util.ShulkerBoxUtils.getItemStackMaxCount(itemstack1), slot1.getMaxStackSize(itemstack1)); // Leaves - stackable shulker boxes int l1 = Math.min(AbstractContainerMenu.getQuickCraftPlaceCount(this.quickcraftSlots, this.quickcraftType, itemstack1) + j1, k1);
|
|
int l1 = Math.min(AbstractContainerMenu.getQuickCraftPlaceCount(this.quickcraftSlots, this.quickcraftType, itemstack1) + j1, k1);
|
|
|
|
l -= l1 - j1;
|
|
@@ -575,7 +575,7 @@ public abstract class AbstractContainerMenu {
|
|
slot.setByPlayer(itemstack3);
|
|
}
|
|
} else if (ItemStack.isSameItemSameComponents(itemstack, itemstack3)) {
|
|
- Optional<ItemStack> optional1 = slot.tryRemove(itemstack.getCount(), itemstack3.getMaxStackSize() - itemstack3.getCount(), player);
|
|
+ Optional<ItemStack> optional1 = slot.tryRemove(itemstack.getCount(), org.leavesmc.leaves.util.ShulkerBoxUtils.getItemStackMaxCount(itemstack3) - itemstack3.getCount(), player);
|
|
|
|
optional1.ifPresent((itemstack4) -> {
|
|
itemstack3.grow(itemstack4.getCount());
|
|
@@ -645,7 +645,7 @@ public abstract class AbstractContainerMenu {
|
|
slot2 = (Slot) this.slots.get(slotIndex);
|
|
if (slot2.hasItem()) {
|
|
itemstack1 = slot2.getItem();
|
|
- this.setCarried(itemstack1.copyWithCount(itemstack1.getMaxStackSize()));
|
|
+ this.setCarried(itemstack1.copyWithCount(org.leavesmc.leaves.util.ShulkerBoxUtils.getItemStackMaxCount(itemstack1))); // Leaves - stackable shulker boxes
|
|
}
|
|
} else if (actionType == ClickType.THROW && this.getCarried().isEmpty() && slotIndex >= 0) {
|
|
slot2 = (Slot) this.slots.get(slotIndex);
|
|
@@ -660,13 +660,13 @@ public abstract class AbstractContainerMenu {
|
|
j2 = button == 0 ? 1 : -1;
|
|
|
|
for (i2 = 0; i2 < 2; ++i2) {
|
|
- for (int k2 = l; k2 >= 0 && k2 < this.slots.size() && itemstack1.getCount() < itemstack1.getMaxStackSize(); k2 += j2) {
|
|
+ for (int k2 = l; k2 >= 0 && k2 < this.slots.size() && itemstack1.getCount() < org.leavesmc.leaves.util.ShulkerBoxUtils.getItemStackMaxCount(itemstack1); k2 += j2) { // Leaves - stackable shulker boxes
|
|
Slot slot3 = (Slot) this.slots.get(k2);
|
|
|
|
if (slot3.hasItem() && AbstractContainerMenu.canItemQuickReplace(slot3, itemstack1, true) && slot3.mayPickup(player) && this.canTakeItemForPickAll(itemstack1, slot3)) {
|
|
ItemStack itemstack5 = slot3.getItem();
|
|
|
|
- if (i2 != 0 || itemstack5.getCount() != itemstack5.getMaxStackSize()) {
|
|
+ if (i2 != 0 || itemstack5.getCount() != org.leavesmc.leaves.util.ShulkerBoxUtils.getItemStackMaxCount(itemstack5)) {
|
|
ItemStack itemstack6 = slot3.safeTake(itemstack5.getCount(), itemstack1.getMaxStackSize() - itemstack1.getCount(), player);
|
|
|
|
itemstack1.grow(itemstack6.getCount());
|
|
@@ -805,7 +805,7 @@ public abstract class AbstractContainerMenu {
|
|
ItemStack itemstack1;
|
|
int l;
|
|
|
|
- if (stack.isStackable()) {
|
|
+ if (org.leavesmc.leaves.util.ShulkerBoxUtils.isStackable(stack)) { // Leaves - stackable shulker boxes
|
|
while (!stack.isEmpty()) {
|
|
if (fromLast) {
|
|
if (k < startIndex) {
|
|
@@ -824,6 +824,7 @@ public abstract class AbstractContainerMenu {
|
|
// Paper end - Add PlayerTradeEvent and PlayerPurchaseEvent
|
|
if (!itemstack1.isEmpty() && ItemStack.isSameItemSameComponents(stack, itemstack1)) {
|
|
l = itemstack1.getCount() + stack.getCount();
|
|
+ // int i1 = org.leavesmc.leaves.util.ShulkerBoxUtils.getItemStackMaxCount(itemstack1); // Leaves - stackable shulker boxes // disabled temporarily
|
|
int i1 = slot.getMaxStackSize(itemstack1);
|
|
|
|
if (l <= i1) {
|
|
@@ -875,6 +876,7 @@ public abstract class AbstractContainerMenu {
|
|
}
|
|
// Paper end - Add PlayerTradeEvent and PlayerPurchaseEvent
|
|
if (itemstack1.isEmpty() && slot.mayPlace(stack)) {
|
|
+ // l = org.leavesmc.leaves.util.ShulkerBoxUtils.getItemStackMaxCount(itemstack1); // Leaves - stackable shulker boxes // disabled temporarily
|
|
l = slot.getMaxStackSize(stack);
|
|
// Paper start - Add PlayerTradeEvent and PlayerPurchaseEvent
|
|
if (isCheck) {
|
|
diff --git a/src/main/java/net/minecraft/world/inventory/MerchantContainer.java b/src/main/java/net/minecraft/world/inventory/MerchantContainer.java
|
|
index 9140fab07aab32065f7a3b5d13dd17d61dc6d646..210b88b5d87fad641188cf5907c54824d21163ce 100644
|
|
--- a/src/main/java/net/minecraft/world/inventory/MerchantContainer.java
|
|
+++ b/src/main/java/net/minecraft/world/inventory/MerchantContainer.java
|
|
@@ -130,7 +130,7 @@ public class MerchantContainer implements Container {
|
|
@Override
|
|
public void setItem(int slot, ItemStack stack) {
|
|
this.itemStacks.set(slot, stack);
|
|
- stack.limitSize(this.getMaxStackSize(stack));
|
|
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - stackable shulker boxes
|
|
if (this.isPaymentSlot(slot)) {
|
|
this.updateSellItem();
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/world/inventory/Slot.java b/src/main/java/net/minecraft/world/inventory/Slot.java
|
|
index c39c773112fb8b534b926f2f2b47fe6fbb69fcb2..ae9338b8a5598e7a257b469adae72858fed95c39 100644
|
|
--- a/src/main/java/net/minecraft/world/inventory/Slot.java
|
|
+++ b/src/main/java/net/minecraft/world/inventory/Slot.java
|
|
@@ -76,7 +76,7 @@ public class Slot {
|
|
}
|
|
|
|
public int getMaxStackSize(ItemStack stack) {
|
|
- return Math.min(this.getMaxStackSize(), stack.getMaxStackSize());
|
|
+ return Math.min(this.getMaxStackSize(), org.leavesmc.leaves.util.ShulkerBoxUtils.getItemStackMaxCount(stack)); // Leaves - stackable shulker boxes
|
|
}
|
|
|
|
@Nullable
|
|
diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java
|
|
index b6a2f3e4f22f36e75a1630bd456c2f471edbb398..4a790406e8031feba3b8bdc6e2fb9d17d1a7fbff 100644
|
|
--- a/src/main/java/net/minecraft/world/item/ItemStack.java
|
|
+++ b/src/main/java/net/minecraft/world/item/ItemStack.java
|
|
@@ -225,7 +225,7 @@ public final class ItemStack implements DataComponentHolder {
|
|
@Deprecated
|
|
@Nullable
|
|
private Item item;
|
|
- private PatchedDataComponentMap components;
|
|
+ public PatchedDataComponentMap components; // Leaves - stackable shulker boxes
|
|
@Nullable
|
|
private Entity entityRepresentation;
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/block/AbstractCauldronBlock.java b/src/main/java/net/minecraft/world/level/block/AbstractCauldronBlock.java
|
|
index 20f2b575c8131621edea0e75fbf38a9fe20a36c4..812856b02cab1c437550ba9c706da318cf420338 100644
|
|
--- a/src/main/java/net/minecraft/world/level/block/AbstractCauldronBlock.java
|
|
+++ b/src/main/java/net/minecraft/world/level/block/AbstractCauldronBlock.java
|
|
@@ -58,9 +58,27 @@ public abstract class AbstractCauldronBlock extends Block {
|
|
ItemStack stack, BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit
|
|
) {
|
|
CauldronInteraction cauldronInteraction = this.interactions.map().get(stack.getItem());
|
|
- return cauldronInteraction.interact(state, world, pos, player, hand, stack);
|
|
+ return wrapInteractor(cauldronInteraction, state, world, pos, player, hand, stack);
|
|
}
|
|
|
|
+ // Leaves start - stackable shulker boxes
|
|
+ private ItemInteractionResult wrapInteractor(CauldronInteraction cauldronBehavior, BlockState blockState, Level world, BlockPos blockPos, Player playerEntity, InteractionHand hand, ItemStack itemStack) {
|
|
+ int count = -1;
|
|
+ if (org.leavesmc.leaves.LeavesConfig.shulkerBoxStackSize > 1 && itemStack.getItem() instanceof net.minecraft.world.item.BlockItem bi &&
|
|
+ bi.getBlock() instanceof ShulkerBoxBlock) {
|
|
+ count = itemStack.getCount();
|
|
+ }
|
|
+ ItemInteractionResult result = cauldronBehavior.interact(blockState, world, blockPos, playerEntity, hand, itemStack);
|
|
+ if (count > 0 && result.consumesAction()) {
|
|
+ ItemStack current = playerEntity.getItemInHand(hand);
|
|
+ if (current.getItem() instanceof net.minecraft.world.item.BlockItem bi && bi.getBlock() instanceof ShulkerBoxBlock) {
|
|
+ current.setCount(count);
|
|
+ }
|
|
+ }
|
|
+ return result;
|
|
+ }
|
|
+ // Leaves end - stackable shulker boxes
|
|
+
|
|
@Override
|
|
protected VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) {
|
|
return SHAPE;
|
|
diff --git a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java
|
|
index 9ad4600ebee09d81b1785103ad17de47cf1f2ede..7092a4d4a583f4e01cc02bca17f3bd1bd32677a0 100644
|
|
--- a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java
|
|
@@ -549,7 +549,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit
|
|
boolean flag = !stack.isEmpty() && ItemStack.isSameItemSameComponents(itemstack1, stack);
|
|
|
|
this.items.set(slot, stack);
|
|
- stack.limitSize(this.getMaxStackSize(stack));
|
|
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - stackable shulker boxes
|
|
if (slot == 0 && !flag) {
|
|
this.cookingTotalTime = AbstractFurnaceBlockEntity.getTotalCookTime(this.level, this.recipeType, this, this.cookSpeedMultiplier); // Paper - cook speed multiplier API
|
|
this.cookingProgress = 0;
|
|
diff --git a/src/main/java/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java
|
|
index 15fd1fe1b55b6421d2c09e8385c9f69fa0152e56..f9b8604470e5d50448b83cdcb33ec826e9944857 100644
|
|
--- a/src/main/java/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java
|
|
@@ -158,7 +158,7 @@ public abstract class BaseContainerBlockEntity extends BlockEntity implements Co
|
|
@Override
|
|
public void setItem(int slot, ItemStack stack) {
|
|
this.getItems().set(slot, stack);
|
|
- stack.limitSize(this.getMaxStackSize(stack));
|
|
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - stackable shulker boxes
|
|
this.setChanged();
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java
|
|
index f7a6296773defc95215bdf36d8ea105cf9590a9e..5f394cda052271b6ecfafc325733e5ae0524822f 100644
|
|
--- a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java
|
|
@@ -125,7 +125,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
|
|
public void setItem(int slot, ItemStack stack) {
|
|
this.unpackLootTable((Player) null);
|
|
this.getItems().set(slot, stack);
|
|
- stack.limitSize(this.getMaxStackSize(stack));
|
|
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - stackable shulker boxes
|
|
}
|
|
|
|
@Override
|
|
@@ -753,9 +753,9 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
|
|
if (itemstack1.isEmpty()) {
|
|
// Spigot start - SPIGOT-6693, InventorySubcontainer#setItem
|
|
ItemStack leftover = ItemStack.EMPTY; // Paper - Make hoppers respect inventory max stack size
|
|
- if (!stack.isEmpty() && stack.getCount() > to.getMaxStackSize()) {
|
|
+ if (!stack.isEmpty() && (stack.getCount() > to.getMaxStackSize() || stack.getCount() > stack.getMaxStackSize())) { // Leaves - stackable shulker boxes
|
|
leftover = stack; // Paper - Make hoppers respect inventory max stack size
|
|
- stack = stack.split(to.getMaxStackSize());
|
|
+ stack = stack.split(Math.min(to.getMaxStackSize(), stack.getMaxStackSize())); // Leaves - stackable shulker boxes
|
|
}
|
|
// Spigot end
|
|
ignoreTileUpdates = true; // Paper - Perf: Optimize Hoppers
|
|
diff --git a/src/main/java/org/leavesmc/leaves/util/ShulkerBoxUtils.java b/src/main/java/org/leavesmc/leaves/util/ShulkerBoxUtils.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..eb31cd1dc9598f3915f25b6920a80fa2ebccdf62
|
|
--- /dev/null
|
|
+++ b/src/main/java/org/leavesmc/leaves/util/ShulkerBoxUtils.java
|
|
@@ -0,0 +1,28 @@
|
|
+package org.leavesmc.leaves.util;
|
|
+
|
|
+import net.minecraft.core.component.DataComponents;
|
|
+import net.minecraft.world.item.BlockItem;
|
|
+import net.minecraft.world.item.ItemStack;
|
|
+import net.minecraft.world.item.component.ItemContainerContents;
|
|
+import net.minecraft.world.level.block.ShulkerBoxBlock;
|
|
+import org.jetbrains.annotations.NotNull;
|
|
+import org.leavesmc.leaves.LeavesConfig;
|
|
+
|
|
+public class ShulkerBoxUtils {
|
|
+
|
|
+ public static boolean shulkerBoxNoItem(@NotNull ItemStack stack) {
|
|
+ return stack.getComponents().getOrDefault(DataComponents.CONTAINER, ItemContainerContents.EMPTY).stream().findAny().isEmpty();
|
|
+ }
|
|
+
|
|
+ public static int getItemStackMaxCount(ItemStack stack) {
|
|
+ if (LeavesConfig.shulkerBoxStackSize > 1 && stack.getItem() instanceof BlockItem bi &&
|
|
+ bi.getBlock() instanceof ShulkerBoxBlock && org.leavesmc.leaves.util.ShulkerBoxUtils.shulkerBoxNoItem(stack)) {
|
|
+ return org.leavesmc.leaves.LeavesConfig.shulkerBoxStackSize;
|
|
+ }
|
|
+ return stack.getMaxStackSize();
|
|
+ }
|
|
+
|
|
+ public static boolean isStackable(ItemStack itemStack) {
|
|
+ return getItemStackMaxCount(itemStack) > 1 && (!itemStack.isDamageableItem() || !itemStack.isDamaged());
|
|
+ }
|
|
+}
|