feat: use leaves-ver Item overstack util instead of Stackable ShulkerBoxes
This commit is contained in:
+101
-157
@@ -1,30 +1,34 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
From: Helvetica Volubi <suisuroru@blue-millennium.fun>
|
From: Helvetica Volubi <suisuroru@blue-millennium.fun>
|
||||||
Date: Mon, 9 Jun 2025 19:23:10 +0800
|
Date: Sat, 26 Jul 2025 01:11:54 +0800
|
||||||
Subject: [PATCH] Stackable ShulkerBoxes
|
Subject: [PATCH] Leaves: Item overstack util
|
||||||
|
|
||||||
Co-authored by: violetc <58360096+s-yh-china@users.noreply.github.com>
|
Co-authored by: violetc <58360096+s-yh-china@users.noreply.github.com>
|
||||||
Some of changes is a part of : Leaves (https://github.com/LeavesMC/Leaves/blob/9d32c5bd3df7c76055aff886ed9efda02e45a45a/leaves-server/minecraft-patches/features/0034-Stackable-ShulkerBoxes.patch)
|
As a part of : Leaves (https://github.com/LeavesMC/Leaves/blob/46cccfc39cafbca1681620d03947bc3ad558327f/leaves-server/minecraft-patches/features/0034-Item-overstack-util.patch)
|
||||||
Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html)
|
Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html)
|
||||||
|
|
||||||
diff --git a/net/minecraft/commands/arguments/item/ItemInput.java b/net/minecraft/commands/arguments/item/ItemInput.java
|
diff --git a/net/minecraft/commands/arguments/item/ItemInput.java b/net/minecraft/commands/arguments/item/ItemInput.java
|
||||||
index 643797124fe5a4489d0b7419b7e600c04f283ef2..3b4d97c76db9c742072c92dd7c8b39553c62a1f1 100644
|
index 643797124fe5a4489d0b7419b7e600c04f283ef2..04b4100da96aad50f08e8c59200eec934e7e873d 100644
|
||||||
--- a/net/minecraft/commands/arguments/item/ItemInput.java
|
--- a/net/minecraft/commands/arguments/item/ItemInput.java
|
||||||
+++ b/net/minecraft/commands/arguments/item/ItemInput.java
|
+++ b/net/minecraft/commands/arguments/item/ItemInput.java
|
||||||
@@ -39,8 +39,9 @@ public class ItemInput {
|
@@ -39,11 +39,13 @@ public class ItemInput {
|
||||||
public ItemStack createItemStack(int count, boolean allowOversizedStacks) throws CommandSyntaxException {
|
public ItemStack createItemStack(int count, boolean allowOversizedStacks) throws CommandSyntaxException {
|
||||||
ItemStack itemStack = new ItemStack(this.item, count);
|
ItemStack itemStack = new ItemStack(this.item, count);
|
||||||
itemStack.applyComponents(this.components);
|
itemStack.applyComponents(this.components);
|
||||||
- if (allowOversizedStacks && count > itemStack.getMaxStackSize()) {
|
- if (allowOversizedStacks && count > itemStack.getMaxStackSize()) {
|
||||||
- throw ERROR_STACK_TOO_BIG.create(this.getItemName(), itemStack.getMaxStackSize());
|
- throw ERROR_STACK_TOO_BIG.create(this.getItemName(), itemStack.getMaxStackSize());
|
||||||
+ int maxCount = fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(itemStack); // Lophine - Stackable ShulkerBoxes
|
+ // Leaves start - item over-stack util
|
||||||
+ if (allowOversizedStacks && count > maxCount) { // Lophine - Stackable ShulkerBoxes
|
+ if (allowOversizedStacks && count > org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack)) {
|
||||||
+ throw ERROR_STACK_TOO_BIG.create(this.getItemName(), maxCount); // Lophine - Stackable ShulkerBoxes
|
+ throw ERROR_STACK_TOO_BIG.create(this.getItemName(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack));
|
||||||
} else {
|
} else {
|
||||||
return itemStack;
|
return itemStack;
|
||||||
}
|
}
|
||||||
|
+ // Leaves end - item over-stack util
|
||||||
|
}
|
||||||
|
|
||||||
|
public String serialize(HolderLookup.Provider levelRegistry) {
|
||||||
diff --git a/net/minecraft/server/commands/GiveCommand.java b/net/minecraft/server/commands/GiveCommand.java
|
diff --git a/net/minecraft/server/commands/GiveCommand.java b/net/minecraft/server/commands/GiveCommand.java
|
||||||
index 5a1c21b05545a03fbb00cf734605049870d3eecb..2ade5ce23cdab08b1746e2cbe99bfe1d3da42f02 100644
|
index 5a1c21b05545a03fbb00cf734605049870d3eecb..a0459bc6b2241e7fca74bfbfce058882a8ad7f49 100644
|
||||||
--- a/net/minecraft/server/commands/GiveCommand.java
|
--- a/net/minecraft/server/commands/GiveCommand.java
|
||||||
+++ b/net/minecraft/server/commands/GiveCommand.java
|
+++ b/net/minecraft/server/commands/GiveCommand.java
|
||||||
@@ -55,7 +55,7 @@ public class GiveCommand {
|
@@ -55,7 +55,7 @@ public class GiveCommand {
|
||||||
@@ -32,12 +36,12 @@ index 5a1c21b05545a03fbb00cf734605049870d3eecb..2ade5ce23cdab08b1746e2cbe99bfe1d
|
|||||||
ItemStack itemStack = item.createItemStack(1, false);
|
ItemStack itemStack = item.createItemStack(1, false);
|
||||||
final Component displayName = itemStack.getDisplayName(); // Paper - get display name early
|
final Component displayName = itemStack.getDisplayName(); // Paper - get display name early
|
||||||
- int maxStackSize = itemStack.getMaxStackSize();
|
- int maxStackSize = itemStack.getMaxStackSize();
|
||||||
+ int maxStackSize = fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(itemStack); // Lophine - Stackable ShulkerBoxes
|
+ int maxStackSize = org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack); // Leaves - item over-stack util
|
||||||
int i = maxStackSize * 100;
|
int i = maxStackSize * 100;
|
||||||
if (count > i) {
|
if (count > i) {
|
||||||
source.sendFailure(Component.translatable("commands.give.failed.toomanyitems", i, itemStack.getDisplayName()));
|
source.sendFailure(Component.translatable("commands.give.failed.toomanyitems", i, itemStack.getDisplayName()));
|
||||||
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||||
index 68f0023c4234585a8385a830ed410883c8bd1549..1aed2578bb5f4e605fe68d1cfe4dce6a4cf5a1f7 100644
|
index 68f0023c4234585a8385a830ed410883c8bd1549..ebb884743989097ef7b7fa8edaa824b27cab4a7a 100644
|
||||||
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||||
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||||
@@ -3076,7 +3076,7 @@ public class ServerGamePacketListenerImpl
|
@@ -3076,7 +3076,7 @@ public class ServerGamePacketListenerImpl
|
||||||
@@ -45,7 +49,7 @@ index 68f0023c4234585a8385a830ed410883c8bd1549..1aed2578bb5f4e605fe68d1cfe4dce6a
|
|||||||
if (ItemStack.isSameItemSameComponents(clickedItem, cursor)) {
|
if (ItemStack.isSameItemSameComponents(clickedItem, cursor)) {
|
||||||
int toPlace = packet.buttonNum() == 0 ? cursor.getCount() : 1;
|
int toPlace = packet.buttonNum() == 0 ? cursor.getCount() : 1;
|
||||||
- toPlace = Math.min(toPlace, clickedItem.getMaxStackSize() - clickedItem.getCount());
|
- toPlace = Math.min(toPlace, clickedItem.getMaxStackSize() - clickedItem.getCount());
|
||||||
+ toPlace = Math.min(toPlace, fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(clickedItem) - clickedItem.getCount()); // Lophine - Stackable ShulkerBoxes
|
+ toPlace = Math.min(toPlace, org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(clickedItem) - clickedItem.getCount()); // Leaves - item over-stack util
|
||||||
toPlace = Math.min(toPlace, slot.container.getMaxStackSize() - clickedItem.getCount());
|
toPlace = Math.min(toPlace, slot.container.getMaxStackSize() - clickedItem.getCount());
|
||||||
if (toPlace == 1) {
|
if (toPlace == 1) {
|
||||||
action = InventoryAction.PLACE_ONE;
|
action = InventoryAction.PLACE_ONE;
|
||||||
@@ -54,7 +58,7 @@ index 68f0023c4234585a8385a830ed410883c8bd1549..1aed2578bb5f4e605fe68d1cfe4dce6a
|
|||||||
} else if (ItemStack.isSameItemSameComponents(cursor, clickedItem)) {
|
} else if (ItemStack.isSameItemSameComponents(cursor, clickedItem)) {
|
||||||
if (clickedItem.getCount() >= 0) {
|
if (clickedItem.getCount() >= 0) {
|
||||||
- if (clickedItem.getCount() + cursor.getCount() <= cursor.getMaxStackSize()) {
|
- if (clickedItem.getCount() + cursor.getCount() <= cursor.getMaxStackSize()) {
|
||||||
+ if (clickedItem.getCount() + cursor.getCount() <= fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(cursor)) { // Lophine - Stackable ShulkerBoxes
|
+ if (clickedItem.getCount() + cursor.getCount() <= org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(cursor)) { // Leaves - item over-stack util
|
||||||
// As of 1.5, this is result slots only
|
// As of 1.5, this is result slots only
|
||||||
action = InventoryAction.PICKUP_ALL;
|
action = InventoryAction.PICKUP_ALL;
|
||||||
}
|
}
|
||||||
@@ -62,7 +66,7 @@ index 68f0023c4234585a8385a830ed410883c8bd1549..1aed2578bb5f4e605fe68d1cfe4dce6a
|
|||||||
this.player.containerMenu.broadcastFullState();
|
this.player.containerMenu.broadcastFullState();
|
||||||
} else {
|
} else {
|
||||||
this.player.containerMenu.broadcastChanges();
|
this.player.containerMenu.broadcastChanges();
|
||||||
+ if (fun.bm.lophine.utils.ShulkerBoxesUtil.shouldCheck()) this.player.containerMenu.broadcastCarriedItem(); // Lophine - Stackable ShulkerBoxes
|
+ if (org.leavesmc.leaves.util.ItemOverstackUtils.hasOverstackingItem()) this.player.containerMenu.broadcastCarriedItem(); // Leaves - item over-stack util - force send carried item
|
||||||
}
|
}
|
||||||
if (io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.updateEquipmentOnPlayerActions) this.player.detectEquipmentUpdates(); // Paper - Force update attributes.
|
if (io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.updateEquipmentOnPlayerActions) this.player.detectEquipmentUpdates(); // Paper - Force update attributes.
|
||||||
}
|
}
|
||||||
@@ -71,7 +75,7 @@ index 68f0023c4234585a8385a830ed410883c8bd1549..1aed2578bb5f4e605fe68d1cfe4dce6a
|
|||||||
|
|
||||||
boolean flag1 = packet.slotNum() >= 1 && packet.slotNum() <= 45;
|
boolean flag1 = packet.slotNum() >= 1 && packet.slotNum() <= 45;
|
||||||
- boolean flag2 = itemStack.isEmpty() || itemStack.getCount() <= itemStack.getMaxStackSize();
|
- boolean flag2 = itemStack.isEmpty() || itemStack.getCount() <= itemStack.getMaxStackSize();
|
||||||
+ boolean flag2 = itemStack.isEmpty() || itemStack.getCount() <= fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(itemStack); // Lophine - Stackable ShulkerBoxes
|
+ boolean flag2 = itemStack.isEmpty() || itemStack.getCount() <= org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack); // Leaves - item over-stack util
|
||||||
if (flag || (flag1 && !ItemStack.matches(this.player.inventoryMenu.getSlot(packet.slotNum()).getItem(), packet.itemStack()))) { // Insist on valid slot
|
if (flag || (flag1 && !ItemStack.matches(this.player.inventoryMenu.getSlot(packet.slotNum()).getItem(), packet.itemStack()))) { // Insist on valid slot
|
||||||
// CraftBukkit start - Call click event
|
// CraftBukkit start - Call click event
|
||||||
org.bukkit.inventory.InventoryView inventory = this.player.inventoryMenu.getBukkitView();
|
org.bukkit.inventory.InventoryView inventory = this.player.inventoryMenu.getBukkitView();
|
||||||
@@ -79,29 +83,29 @@ index 68f0023c4234585a8385a830ed410883c8bd1549..1aed2578bb5f4e605fe68d1cfe4dce6a
|
|||||||
this.player.inventoryMenu.getSlot(packet.slotNum()).setByPlayer(itemStack);
|
this.player.inventoryMenu.getSlot(packet.slotNum()).setByPlayer(itemStack);
|
||||||
this.player.inventoryMenu.setRemoteSlot(packet.slotNum(), itemStack);
|
this.player.inventoryMenu.setRemoteSlot(packet.slotNum(), itemStack);
|
||||||
this.player.inventoryMenu.broadcastChanges();
|
this.player.inventoryMenu.broadcastChanges();
|
||||||
+ if (fun.bm.lophine.utils.ShulkerBoxesUtil.shouldCheck()) this.player.containerMenu.broadcastCarriedItem(); // Lophine - Stackable ShulkerBoxes
|
+ if (org.leavesmc.leaves.util.ItemOverstackUtils.hasOverstackingItem()) this.player.containerMenu.sendSingleSlot(packet.slotNum(), itemStack); // Leaves - item over-stack util - force send carried item
|
||||||
if (io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.updateEquipmentOnPlayerActions) this.player.detectEquipmentUpdates(); // Paper - Force update attributes.
|
if (io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.updateEquipmentOnPlayerActions) this.player.detectEquipmentUpdates(); // Paper - Force update attributes.
|
||||||
} else if (flag && flag2) {
|
} else if (flag && flag2) {
|
||||||
if (this.dropSpamThrottler.isUnderThreshold()) {
|
if (this.dropSpamThrottler.isUnderThreshold()) {
|
||||||
diff --git a/net/minecraft/world/Container.java b/net/minecraft/world/Container.java
|
diff --git a/net/minecraft/world/Container.java b/net/minecraft/world/Container.java
|
||||||
index b382665cc125b8b5c0938e5e55984e4bf91d37ff..5d8bd05f966cf9befe8b8f3359b2fa4ce2428e98 100644
|
index b382665cc125b8b5c0938e5e55984e4bf91d37ff..86cac164a2bf0e76528396e6aabbfd64cfc29559 100644
|
||||||
--- a/net/minecraft/world/Container.java
|
--- a/net/minecraft/world/Container.java
|
||||||
+++ b/net/minecraft/world/Container.java
|
+++ b/net/minecraft/world/Container.java
|
||||||
@@ -32,6 +32,12 @@ public interface Container extends Clearable, Iterable<ItemStack> {
|
@@ -32,6 +32,12 @@ public interface Container extends Clearable, Iterable<ItemStack> {
|
||||||
return Math.min(this.getMaxStackSize(), stack.getMaxStackSize());
|
return Math.min(this.getMaxStackSize(), stack.getMaxStackSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
+ // Leaves start - stackable shulker boxes
|
+ // Leaves start - item over-stack util
|
||||||
+ default int getMaxStackLeaves(ItemStack stack) {
|
+ default int getMaxStackLeaves(ItemStack stack) {
|
||||||
+ return Math.min(this.getMaxStackSize(), fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(stack));
|
+ return Math.min(this.getMaxStackSize(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(stack));
|
||||||
+ }
|
+ }
|
||||||
+ // Leaves end - stackable shulker boxes
|
+ // Leaves end - item over-stack util
|
||||||
+
|
+
|
||||||
void setChanged();
|
void setChanged();
|
||||||
|
|
||||||
boolean stillValid(Player player);
|
boolean stillValid(Player player);
|
||||||
diff --git a/net/minecraft/world/SimpleContainer.java b/net/minecraft/world/SimpleContainer.java
|
diff --git a/net/minecraft/world/SimpleContainer.java b/net/minecraft/world/SimpleContainer.java
|
||||||
index d907e24d563e27acab2f2bf9711b1755ea9afd19..6189cb7c1745a242b610e89c859cc849f16cc9e3 100644
|
index d907e24d563e27acab2f2bf9711b1755ea9afd19..75170c8d3be477a6ea2a1d62018a6ab630b0e54e 100644
|
||||||
--- a/net/minecraft/world/SimpleContainer.java
|
--- a/net/minecraft/world/SimpleContainer.java
|
||||||
+++ b/net/minecraft/world/SimpleContainer.java
|
+++ b/net/minecraft/world/SimpleContainer.java
|
||||||
@@ -211,7 +211,7 @@ public class SimpleContainer implements Container, StackedContentsCompatible {
|
@@ -211,7 +211,7 @@ public class SimpleContainer implements Container, StackedContentsCompatible {
|
||||||
@@ -109,7 +113,7 @@ index d907e24d563e27acab2f2bf9711b1755ea9afd19..6189cb7c1745a242b610e89c859cc849
|
|||||||
public void setItem(int index, ItemStack stack) {
|
public void setItem(int index, ItemStack stack) {
|
||||||
this.items.set(index, stack);
|
this.items.set(index, stack);
|
||||||
- stack.limitSize(this.getMaxStackSize(stack));
|
- stack.limitSize(this.getMaxStackSize(stack));
|
||||||
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - stackable shulker boxes
|
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - item over-stack util
|
||||||
this.setChanged();
|
this.setChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,114 +122,88 @@ index d907e24d563e27acab2f2bf9711b1755ea9afd19..6189cb7c1745a242b610e89c859cc849
|
|||||||
|
|
||||||
private void moveItemsBetweenStacks(ItemStack stack, ItemStack other) {
|
private void moveItemsBetweenStacks(ItemStack stack, ItemStack other) {
|
||||||
- int maxStackSize = this.getMaxStackSize(other);
|
- int maxStackSize = this.getMaxStackSize(other);
|
||||||
+ int maxStackSize = this.getMaxStackLeaves(other); // Leaves - stackable shulker boxes
|
+ int maxStackSize = this.getMaxStackLeaves(other); // Leaves - item over-stack util
|
||||||
int min = Math.min(stack.getCount(), maxStackSize - other.getCount());
|
int min = Math.min(stack.getCount(), maxStackSize - other.getCount());
|
||||||
if (min > 0) {
|
if (min > 0) {
|
||||||
other.grow(min);
|
other.grow(min);
|
||||||
diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java
|
diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java
|
||||||
index b745eb5d9c68547335247910ff2ae8d5fb36349c..6d8675b918f92dc3ce85825edf2b33469950ef9d 100644
|
index b745eb5d9c68547335247910ff2ae8d5fb36349c..0c2bf0f8edb34a9011092ea94e54f7bbcee0bbbc 100644
|
||||||
--- a/net/minecraft/world/entity/item/ItemEntity.java
|
--- a/net/minecraft/world/entity/item/ItemEntity.java
|
||||||
+++ b/net/minecraft/world/entity/item/ItemEntity.java
|
+++ b/net/minecraft/world/entity/item/ItemEntity.java
|
||||||
@@ -279,10 +279,45 @@ public class ItemEntity extends Entity implements TraceableEntity {
|
@@ -279,10 +279,15 @@ public class ItemEntity extends Entity implements TraceableEntity {
|
||||||
|
|
||||||
private boolean isMergable() {
|
private boolean isMergable() {
|
||||||
ItemStack item = this.getItem();
|
ItemStack item = this.getItem();
|
||||||
- return this.isAlive() && this.pickupDelay != 32767 && this.age != -32768 && this.age < this.despawnRate && item.getCount() < item.getMaxStackSize(); // Paper - Alternative item-despawn-rate
|
- return this.isAlive() && this.pickupDelay != 32767 && this.age != -32768 && this.age < this.despawnRate && item.getCount() < item.getMaxStackSize(); // Paper - Alternative item-despawn-rate
|
||||||
+ return this.isAlive() && this.pickupDelay != 32767 && this.age != -32768 && this.age < this.despawnRate && item.getCount() < fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(item); // Paper - Alternative item-despawn-rate // Lophine - Stackable ShulkerBoxes
|
+ return this.isAlive() && this.pickupDelay != 32767 && this.age != -32768 && this.age < this.despawnRate && item.getCount() < org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(item); // Paper - Alternative item-despawn-rate // Leaves - item over-stack util
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ // Lophine start - Stackable ShulkerBoxes
|
|
||||||
+ private boolean tryMergeShulkerBox(ItemEntity ote) {
|
|
||||||
+ ItemStack sf = this.getItem();
|
|
||||||
+ ItemStack ot = ote.getItem();
|
|
||||||
+ if (!fun.bm.lophine.utils.ShulkerBoxesUtil.checkShulkerBox(sf)) return false;
|
|
||||||
+ if (sf.getItem().equals(ot.getItem())
|
|
||||||
+ && fun.bm.lophine.utils.ShulkerBoxesUtil.emptyShulkerBoxCheck(sf)
|
|
||||||
+ && fun.bm.lophine.utils.ShulkerBoxesUtil.emptyShulkerBoxCheck(ot)
|
|
||||||
+ && Objects.equals(sf.getComponents(), ot.getComponents()) // empty block entity tags are cleaned up when spawning
|
|
||||||
+ && sf.getCount() != fun.bm.lophine.utils.ShulkerBoxesUtil.getShulkerBoxesMaxCountUnsafe()) {
|
|
||||||
+ int count = Math.min(ot.getCount(), fun.bm.lophine.utils.ShulkerBoxesUtil.getShulkerBoxesMaxCountUnsafe() - sf.getCount());
|
|
||||||
+ sf.grow(count);
|
|
||||||
+ this.setItem(sf);
|
|
||||||
+
|
|
||||||
+ this.pickupDelay = Math.max(ote.pickupDelay, this.pickupDelay);
|
|
||||||
+ this.age = Math.min(ote.getAge(), this.age);
|
|
||||||
+ ot.shrink(count);
|
|
||||||
+ if (ot.isEmpty()) {
|
|
||||||
+ ote.discard();
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ ote.setItem(ot);
|
|
||||||
+ }
|
|
||||||
+ return true;
|
|
||||||
+ }
|
|
||||||
+ return false;
|
|
||||||
}
|
}
|
||||||
+ // Lophine end - Stackable ShulkerBoxes
|
|
||||||
|
|
||||||
private void tryToMerge(ItemEntity itemEntity) {
|
private void tryToMerge(ItemEntity itemEntity) {
|
||||||
+ // Lophine start - Stackable ShulkerBoxes
|
+ // Leaves start - item over-stack util
|
||||||
+ if (fun.bm.lophine.utils.ShulkerBoxesUtil.shouldCheck()
|
+ if (org.leavesmc.leaves.util.ItemOverstackUtils.tryStackItems(this, itemEntity)) {
|
||||||
+ && this.tryMergeShulkerBox(itemEntity)) {
|
|
||||||
+ return;
|
+ return;
|
||||||
+ }
|
+ }
|
||||||
+ // Lophine end - Stackable ShulkerBoxes
|
+ // Leaves end - item over-stack util
|
||||||
ItemStack item = this.getItem();
|
ItemStack item = this.getItem();
|
||||||
ItemStack item1 = itemEntity.getItem();
|
ItemStack item1 = itemEntity.getItem();
|
||||||
if (Objects.equals(this.target, itemEntity.target) && areMergable(item, item1)) {
|
if (Objects.equals(this.target, itemEntity.target) && areMergable(item, item1)) {
|
||||||
diff --git a/net/minecraft/world/entity/player/Inventory.java b/net/minecraft/world/entity/player/Inventory.java
|
diff --git a/net/minecraft/world/entity/player/Inventory.java b/net/minecraft/world/entity/player/Inventory.java
|
||||||
index a6bb436dc80daf6901dc027a6011ead4b3ed27e2..53210a7d32241c47c2b1cd698b515726f0a1fd0d 100644
|
index a6bb436dc80daf6901dc027a6011ead4b3ed27e2..71df58ae26325a2d28b6679733c474c0c59f7654 100644
|
||||||
--- a/net/minecraft/world/entity/player/Inventory.java
|
--- a/net/minecraft/world/entity/player/Inventory.java
|
||||||
+++ b/net/minecraft/world/entity/player/Inventory.java
|
+++ b/net/minecraft/world/entity/player/Inventory.java
|
||||||
@@ -166,8 +166,8 @@ public class Inventory implements Container, Nameable {
|
@@ -165,10 +165,12 @@ public class Inventory implements Container, Nameable {
|
||||||
|
}
|
||||||
|
|
||||||
private boolean hasRemainingSpaceForItem(ItemStack destination, ItemStack origin) {
|
private boolean hasRemainingSpaceForItem(ItemStack destination, ItemStack origin) {
|
||||||
|
+ // Leaves start - item over-stack util
|
||||||
return !destination.isEmpty()
|
return !destination.isEmpty()
|
||||||
- && destination.isStackable()
|
- && destination.isStackable()
|
||||||
- && destination.getCount() < this.getMaxStackSize(destination)
|
- && destination.getCount() < this.getMaxStackSize(destination)
|
||||||
+ && fun.bm.lophine.utils.ShulkerBoxesUtil.isStackable(destination) // Lophine - Stackable ShulkerBoxes
|
+ && org.leavesmc.leaves.util.ItemOverstackUtils.isStackable(destination)
|
||||||
+ && destination.getCount() < fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(destination) // Lophine - Stackable ShulkerBoxes
|
+ && destination.getCount() < org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(destination)
|
||||||
&& ItemStack.isSameItemSameComponents(destination, origin); // Paper - check if itemstack is stackable first
|
&& ItemStack.isSameItemSameComponents(destination, origin); // Paper - check if itemstack is stackable first
|
||||||
|
+ // Leaves end - item over-stack util
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,7 +181,7 @@ public class Inventory implements Container, Nameable {
|
// CraftBukkit start - Watch method above! :D
|
||||||
|
@@ -181,7 +183,7 @@ public class Inventory implements Container, Nameable {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.hasRemainingSpaceForItem(itemInSlot, itemStack)) {
|
if (this.hasRemainingSpaceForItem(itemInSlot, itemStack)) {
|
||||||
- remains -= (itemInSlot.getMaxStackSize() < this.getMaxStackSize() ? itemInSlot.getMaxStackSize() : this.getMaxStackSize()) - itemInSlot.getCount();
|
- remains -= (itemInSlot.getMaxStackSize() < this.getMaxStackSize() ? itemInSlot.getMaxStackSize() : this.getMaxStackSize()) - itemInSlot.getCount();
|
||||||
+ remains -= (fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(itemInSlot) < this.getMaxStackSize() ? fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(itemInSlot) : this.getMaxStackSize()) - itemInSlot.getCount(); // Lophine - Stackable ShulkerBoxes
|
+ remains -= (org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemInSlot) < this.getMaxStackSize() ? org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemInSlot) : this.getMaxStackSize()) - itemInSlot.getCount(); // Leaves - item over-stack util
|
||||||
}
|
}
|
||||||
if (remains <= 0) {
|
if (remains <= 0) {
|
||||||
return itemStack.getCount();
|
return itemStack.getCount();
|
||||||
@@ -190,7 +190,7 @@ public class Inventory implements Container, Nameable {
|
@@ -190,7 +192,7 @@ public class Inventory implements Container, Nameable {
|
||||||
|
|
||||||
ItemStack itemInOffhand = this.equipment.get(EquipmentSlot.OFFHAND);
|
ItemStack itemInOffhand = this.equipment.get(EquipmentSlot.OFFHAND);
|
||||||
if (this.hasRemainingSpaceForItem(itemInOffhand, itemStack)) {
|
if (this.hasRemainingSpaceForItem(itemInOffhand, itemStack)) {
|
||||||
- remains -= (itemInOffhand.getMaxStackSize() < this.getMaxStackSize() ? itemInOffhand.getMaxStackSize() : this.getMaxStackSize()) - itemInOffhand.getCount();
|
- remains -= (itemInOffhand.getMaxStackSize() < this.getMaxStackSize() ? itemInOffhand.getMaxStackSize() : this.getMaxStackSize()) - itemInOffhand.getCount();
|
||||||
+ remains -= (fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(itemInOffhand) < this.getMaxStackSize() ? fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(itemInOffhand) : this.getMaxStackSize()) - itemInOffhand.getCount(); // Lophine - Stackable ShulkerBoxes
|
+ remains -= (org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemInOffhand) < this.getMaxStackSize() ? org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemInOffhand) : this.getMaxStackSize()) - itemInOffhand.getCount(); // Leaves - item over-stack util
|
||||||
}
|
}
|
||||||
if (remains <= 0) {
|
if (remains <= 0) {
|
||||||
return itemStack.getCount();
|
return itemStack.getCount();
|
||||||
@@ -314,7 +314,7 @@ public class Inventory implements Container, Nameable {
|
@@ -314,7 +316,7 @@ public class Inventory implements Container, Nameable {
|
||||||
this.setItem(slot, item);
|
this.setItem(slot, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
- int i = this.getMaxStackSize(item) - item.getCount();
|
- int i = this.getMaxStackSize(item) - item.getCount();
|
||||||
+ int i = this.getMaxStackLeaves(item) - item.getCount();
|
+ int i = this.getMaxStackLeaves(item) - item.getCount(); // Leaves - item over-stack util
|
||||||
int min = Math.min(count, i);
|
int min = Math.min(count, i);
|
||||||
if (min == 0) {
|
if (min == 0) {
|
||||||
return count;
|
return count;
|
||||||
@@ -420,7 +420,7 @@ public class Inventory implements Container, Nameable {
|
@@ -420,7 +422,7 @@ public class Inventory implements Container, Nameable {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
- int i = stack.getMaxStackSize() - this.getItem(slotWithRemainingSpace).getCount();
|
- int i = stack.getMaxStackSize() - this.getItem(slotWithRemainingSpace).getCount();
|
||||||
+ int i = fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(stack) - this.getItem(slotWithRemainingSpace).getCount(); // Lophine - Stackable ShulkerBoxes
|
+ int i = org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(stack) - this.getItem(slotWithRemainingSpace).getCount(); // Leaves - item over-stack util
|
||||||
if (this.add(slotWithRemainingSpace, stack.split(i)) && sendPacket && this.player instanceof ServerPlayer serverPlayer) {
|
if (this.add(slotWithRemainingSpace, stack.split(i)) && sendPacket && this.player instanceof ServerPlayer serverPlayer) {
|
||||||
serverPlayer.connection.send(this.createInventoryUpdatePacket(slotWithRemainingSpace));
|
serverPlayer.connection.send(this.createInventoryUpdatePacket(slotWithRemainingSpace));
|
||||||
}
|
}
|
||||||
diff --git a/net/minecraft/world/entity/player/StackedItemContents.java b/net/minecraft/world/entity/player/StackedItemContents.java
|
diff --git a/net/minecraft/world/entity/player/StackedItemContents.java b/net/minecraft/world/entity/player/StackedItemContents.java
|
||||||
index 83ccde54c625d40dc595e000c533f60aa929bd5a..3206b599481eeab29c58bc1ca9cac6935da9963a 100644
|
index 83ccde54c625d40dc595e000c533f60aa929bd5a..6779503888e6d311758cffde582b0efbd66a33de 100644
|
||||||
--- a/net/minecraft/world/entity/player/StackedItemContents.java
|
--- a/net/minecraft/world/entity/player/StackedItemContents.java
|
||||||
+++ b/net/minecraft/world/entity/player/StackedItemContents.java
|
+++ b/net/minecraft/world/entity/player/StackedItemContents.java
|
||||||
@@ -23,7 +23,7 @@ public class StackedItemContents {
|
@@ -23,7 +23,7 @@ public class StackedItemContents {
|
||||||
@@ -233,12 +211,12 @@ index 83ccde54c625d40dc595e000c533f60aa929bd5a..3206b599481eeab29c58bc1ca9cac693
|
|||||||
|
|
||||||
public void accountStack(ItemStack stack) {
|
public void accountStack(ItemStack stack) {
|
||||||
- this.accountStack(stack, stack.getMaxStackSize());
|
- this.accountStack(stack, stack.getMaxStackSize());
|
||||||
+ this.accountStack(stack, fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(stack)); // Lophine - Stackable Shulker Boxes
|
+ this.accountStack(stack, org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(stack)); // Leaves - item over-stack util
|
||||||
}
|
}
|
||||||
|
|
||||||
public void accountStack(ItemStack stack, int maxStackSize) {
|
public void accountStack(ItemStack stack, int maxStackSize) {
|
||||||
diff --git a/net/minecraft/world/entity/vehicle/ContainerEntity.java b/net/minecraft/world/entity/vehicle/ContainerEntity.java
|
diff --git a/net/minecraft/world/entity/vehicle/ContainerEntity.java b/net/minecraft/world/entity/vehicle/ContainerEntity.java
|
||||||
index 02d2efef2dc0f0e12eac0c71fa290af706f7694d..d042b3729a615bdabeb08f559ac895a731856545 100644
|
index 02d2efef2dc0f0e12eac0c71fa290af706f7694d..99f109e2653eff10c011f380694bd77a76381cee 100644
|
||||||
--- a/net/minecraft/world/entity/vehicle/ContainerEntity.java
|
--- a/net/minecraft/world/entity/vehicle/ContainerEntity.java
|
||||||
+++ b/net/minecraft/world/entity/vehicle/ContainerEntity.java
|
+++ b/net/minecraft/world/entity/vehicle/ContainerEntity.java
|
||||||
@@ -163,7 +163,7 @@ public interface ContainerEntity extends Container, MenuProvider {
|
@@ -163,7 +163,7 @@ public interface ContainerEntity extends Container, MenuProvider {
|
||||||
@@ -246,62 +224,61 @@ index 02d2efef2dc0f0e12eac0c71fa290af706f7694d..d042b3729a615bdabeb08f559ac895a7
|
|||||||
this.unpackChestVehicleLootTable(null);
|
this.unpackChestVehicleLootTable(null);
|
||||||
this.getItemStacks().set(slot, stack);
|
this.getItemStacks().set(slot, stack);
|
||||||
- stack.limitSize(this.getMaxStackSize(stack));
|
- stack.limitSize(this.getMaxStackSize(stack));
|
||||||
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - stackable shulker boxes
|
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - item over-stack util
|
||||||
}
|
}
|
||||||
|
|
||||||
default SlotAccess getChestVehicleSlot(final int index) {
|
default SlotAccess getChestVehicleSlot(final int index) {
|
||||||
diff --git a/net/minecraft/world/inventory/AbstractContainerMenu.java b/net/minecraft/world/inventory/AbstractContainerMenu.java
|
diff --git a/net/minecraft/world/inventory/AbstractContainerMenu.java b/net/minecraft/world/inventory/AbstractContainerMenu.java
|
||||||
index 9b6cd35e4dfa894069238a1365db16050aa5542b..a928c2e50e43245542a8bc8e307acf27259bbf74 100644
|
index 9b6cd35e4dfa894069238a1365db16050aa5542b..7e9bfb433a252bb4211e490365265d35590f2474 100644
|
||||||
--- a/net/minecraft/world/inventory/AbstractContainerMenu.java
|
--- a/net/minecraft/world/inventory/AbstractContainerMenu.java
|
||||||
+++ b/net/minecraft/world/inventory/AbstractContainerMenu.java
|
+++ b/net/minecraft/world/inventory/AbstractContainerMenu.java
|
||||||
@@ -258,6 +258,14 @@ public abstract class AbstractContainerMenu {
|
@@ -295,6 +295,13 @@ public abstract class AbstractContainerMenu {
|
||||||
return list;
|
this.sendAllDataToRemote();
|
||||||
}
|
}
|
||||||
|
|
||||||
+ // Lophine start - Stackable ShulkerBoxes
|
+ // Leaves start - item over-stack util
|
||||||
+ public void boardcastChangesSigleSlot(int slot, ItemStack item) {
|
+ public void sendSingleSlot(int slotIndex, ItemStack item) {
|
||||||
+ if (this.synchronizer != null) {
|
+ if (this.synchronizer != null) {
|
||||||
+ this.synchronizer.sendSlotChange(this, slot, item);
|
+ this.synchronizer.sendSlotChange(this, slotIndex, item);
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+ // Lophine end - Stackable ShulkerBoxes
|
+ // Leaves end - item over-stack util
|
||||||
+
|
private void updateDataSlotListeners(int slotIndex, int value) {
|
||||||
public void broadcastChanges() {
|
for (ContainerListener containerListener : this.containerListeners) {
|
||||||
for (int i = 0; i < this.slots.size(); i++) {
|
containerListener.dataChanged(this, slotIndex, value);
|
||||||
ItemStack item = this.slots.get(i).getItem();
|
@@ -451,7 +458,7 @@ public abstract class AbstractContainerMenu {
|
||||||
@@ -451,7 +459,7 @@ public abstract class AbstractContainerMenu {
|
|
||||||
&& (this.quickcraftType == 2 || carried1.getCount() >= this.quickcraftSlots.size())
|
&& (this.quickcraftType == 2 || carried1.getCount() >= this.quickcraftSlots.size())
|
||||||
&& this.canDragTo(slot1)) {
|
&& this.canDragTo(slot1)) {
|
||||||
int i2 = slot1.hasItem() ? slot1.getItem().getCount() : 0;
|
int i2 = slot1.hasItem() ? slot1.getItem().getCount() : 0;
|
||||||
- int min = Math.min(itemStack.getMaxStackSize(), slot1.getMaxStackSize(itemStack));
|
- int min = Math.min(itemStack.getMaxStackSize(), slot1.getMaxStackSize(itemStack));
|
||||||
+ int min = Math.min(fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(itemStack), slot1.getMaxStackSize(itemStack)); // Lophine - Stackable ShulkerBoxes
|
+ int min = Math.min(org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack), slot1.getMaxStackSize(itemStack)); // Leaves - item over-stack util
|
||||||
int min1 = Math.min(getQuickCraftPlaceCount(this.quickcraftSlots, this.quickcraftType, itemStack) + i2, min);
|
int min1 = Math.min(getQuickCraftPlaceCount(this.quickcraftSlots, this.quickcraftType, itemStack) + i2, min);
|
||||||
count -= min1 - i2;
|
count -= min1 - i2;
|
||||||
// slot1.setByPlayer(itemStack.copyWithCount(min1));
|
// slot1.setByPlayer(itemStack.copyWithCount(min1));
|
||||||
@@ -563,7 +571,7 @@ public abstract class AbstractContainerMenu {
|
@@ -563,7 +570,7 @@ public abstract class AbstractContainerMenu {
|
||||||
slot.setByPlayer(carried2);
|
slot.setByPlayer(carried2);
|
||||||
}
|
}
|
||||||
} else if (ItemStack.isSameItemSameComponents(carried, carried2)) {
|
} else if (ItemStack.isSameItemSameComponents(carried, carried2)) {
|
||||||
- Optional<ItemStack> optional1 = slot.tryRemove(carried.getCount(), carried2.getMaxStackSize() - carried2.getCount(), player);
|
- Optional<ItemStack> optional1 = slot.tryRemove(carried.getCount(), carried2.getMaxStackSize() - carried2.getCount(), player);
|
||||||
+ Optional<ItemStack> optional1 = slot.tryRemove(carried.getCount(), fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(carried2) - carried2.getCount(), player); // Lophine - Stackable ShulkerBoxes
|
+ Optional<ItemStack> optional1 = slot.tryRemove(carried.getCount(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(carried2) - carried2.getCount(), player); // Leaves - item over-stack util
|
||||||
optional1.ifPresent(itemStack2 -> {
|
optional1.ifPresent(itemStack2 -> {
|
||||||
carried2.grow(itemStack2.getCount());
|
carried2.grow(itemStack2.getCount());
|
||||||
slot.onTake(player, itemStack2);
|
slot.onTake(player, itemStack2);
|
||||||
@@ -625,7 +633,7 @@ public abstract class AbstractContainerMenu {
|
@@ -625,7 +632,7 @@ public abstract class AbstractContainerMenu {
|
||||||
Slot slot2 = this.slots.get(slotId);
|
Slot slot2 = this.slots.get(slotId);
|
||||||
if (slot2.hasItem()) {
|
if (slot2.hasItem()) {
|
||||||
ItemStack itemStack = slot2.getItem();
|
ItemStack itemStack = slot2.getItem();
|
||||||
- this.setCarried(itemStack.copyWithCount(itemStack.getMaxStackSize()));
|
- this.setCarried(itemStack.copyWithCount(itemStack.getMaxStackSize()));
|
||||||
+ this.setCarried(itemStack.copyWithCount(fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(itemStack))); // Lophine - Stackable ShulkerBoxes
|
+ this.setCarried(itemStack.copyWithCount(org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack))); // Leaves - item over-stack util
|
||||||
}
|
}
|
||||||
} else if (clickType == ClickType.THROW && this.getCarried().isEmpty() && slotId >= 0) {
|
} else if (clickType == ClickType.THROW && this.getCarried().isEmpty() && slotId >= 0) {
|
||||||
Slot slot2 = this.slots.get(slotId);
|
Slot slot2 = this.slots.get(slotId);
|
||||||
@@ -656,15 +664,15 @@ public abstract class AbstractContainerMenu {
|
@@ -656,15 +663,15 @@ public abstract class AbstractContainerMenu {
|
||||||
int maxStackSize = button == 0 ? 1 : -1;
|
int maxStackSize = button == 0 ? 1 : -1;
|
||||||
|
|
||||||
for (int i3 = 0; i3 < 2; i3++) {
|
for (int i3 = 0; i3 < 2; i3++) {
|
||||||
- for (int i4 = count; i4 >= 0 && i4 < this.slots.size() && itemStack.getCount() < itemStack.getMaxStackSize(); i4 += maxStackSize) {
|
- for (int i4 = count; i4 >= 0 && i4 < this.slots.size() && itemStack.getCount() < itemStack.getMaxStackSize(); i4 += maxStackSize) {
|
||||||
+ for (int i4 = count; i4 >= 0 && i4 < this.slots.size() && itemStack.getCount() < fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(itemStack); i4 += maxStackSize) { // Lophine - Stackable ShulkerBoxes
|
+ for (int i4 = count; i4 >= 0 && i4 < this.slots.size() && itemStack.getCount() < org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack); i4 += maxStackSize) { // Leaves - item over-stack util
|
||||||
Slot slot3 = this.slots.get(i4);
|
Slot slot3 = this.slots.get(i4);
|
||||||
if (slot3.hasItem()
|
if (slot3.hasItem()
|
||||||
&& canItemQuickReplace(slot3, itemStack, true)
|
&& canItemQuickReplace(slot3, itemStack, true)
|
||||||
@@ -310,49 +287,49 @@ index 9b6cd35e4dfa894069238a1365db16050aa5542b..a928c2e50e43245542a8bc8e307acf27
|
|||||||
ItemStack item1 = slot3.getItem();
|
ItemStack item1 = slot3.getItem();
|
||||||
- if (i3 != 0 || item1.getCount() != item1.getMaxStackSize()) {
|
- if (i3 != 0 || item1.getCount() != item1.getMaxStackSize()) {
|
||||||
- ItemStack itemStack1 = slot3.safeTake(item1.getCount(), itemStack.getMaxStackSize() - itemStack.getCount(), player);
|
- ItemStack itemStack1 = slot3.safeTake(item1.getCount(), itemStack.getMaxStackSize() - itemStack.getCount(), player);
|
||||||
+ if (i3 != 0 || item1.getCount() != fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(item1)) { // Lophine - stackable shulker boxes
|
+ if (i3 != 0 || item1.getCount() != org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(item1)) { // Leaves - item over-stack util
|
||||||
+ ItemStack itemStack1 = slot3.safeTake(item1.getCount(), fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(itemStack) - itemStack.getCount(), player); // Lophine - stackable shulker boxes
|
+ ItemStack itemStack1 = slot3.safeTake(item1.getCount(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack) - itemStack.getCount(), player); // Leaves - item over-stack util
|
||||||
itemStack.grow(itemStack1.getCount());
|
itemStack.grow(itemStack1.getCount());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -766,7 +774,7 @@ public abstract class AbstractContainerMenu {
|
@@ -766,7 +773,7 @@ public abstract class AbstractContainerMenu {
|
||||||
i = endIndex - 1;
|
i = endIndex - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
- if (stack.isStackable()) {
|
- if (stack.isStackable()) {
|
||||||
+ if (fun.bm.lophine.utils.ShulkerBoxesUtil.isStackable(stack)) { // Lophine - Stackable ShulkerBoxes
|
+ if (org.leavesmc.leaves.util.ItemOverstackUtils.isStackable(stack)) { // Leaves - item over-stack util
|
||||||
while (!stack.isEmpty() && (reverseDirection ? i >= startIndex : i < endIndex)) {
|
while (!stack.isEmpty() && (reverseDirection ? i >= startIndex : i < endIndex)) {
|
||||||
Slot slot = this.slots.get(i);
|
Slot slot = this.slots.get(i);
|
||||||
ItemStack item = slot.getItem();
|
ItemStack item = slot.getItem();
|
||||||
@@ -867,7 +875,7 @@ public abstract class AbstractContainerMenu {
|
@@ -867,7 +874,7 @@ public abstract class AbstractContainerMenu {
|
||||||
public static boolean canItemQuickReplace(@Nullable Slot slot, ItemStack stack, boolean stackSizeMatters) {
|
public static boolean canItemQuickReplace(@Nullable Slot slot, ItemStack stack, boolean stackSizeMatters) {
|
||||||
boolean flag = slot == null || !slot.hasItem();
|
boolean flag = slot == null || !slot.hasItem();
|
||||||
return !flag && ItemStack.isSameItemSameComponents(stack, slot.getItem())
|
return !flag && ItemStack.isSameItemSameComponents(stack, slot.getItem())
|
||||||
- ? slot.getItem().getCount() + (stackSizeMatters ? 0 : stack.getCount()) <= stack.getMaxStackSize()
|
- ? slot.getItem().getCount() + (stackSizeMatters ? 0 : stack.getCount()) <= stack.getMaxStackSize()
|
||||||
+ ? slot.getItem().getCount() + (stackSizeMatters ? 0 : stack.getCount()) <= fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(stack) // Lophine - Stackable ShulkerBoxes
|
+ ? slot.getItem().getCount() + (stackSizeMatters ? 0 : stack.getCount()) <= org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(stack) // Leaves - item over-stack util
|
||||||
: flag;
|
: flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -875,7 +883,7 @@ public abstract class AbstractContainerMenu {
|
@@ -875,7 +882,7 @@ public abstract class AbstractContainerMenu {
|
||||||
return switch (type) {
|
return switch (type) {
|
||||||
case 0 -> Mth.floor((float)stack.getCount() / slots.size());
|
case 0 -> Mth.floor((float)stack.getCount() / slots.size());
|
||||||
case 1 -> 1;
|
case 1 -> 1;
|
||||||
- case 2 -> stack.getMaxStackSize();
|
- case 2 -> stack.getMaxStackSize();
|
||||||
+ case 2 -> fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(stack); // Lophine - Stackable ShulkerBoxes
|
+ case 2 -> org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(stack); // Leaves - item over-stack util
|
||||||
default -> stack.getCount();
|
default -> stack.getCount();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -897,7 +905,7 @@ public abstract class AbstractContainerMenu {
|
@@ -897,7 +904,7 @@ public abstract class AbstractContainerMenu {
|
||||||
for (int i = 0; i < container.getContainerSize(); i++) {
|
for (int i = 0; i < container.getContainerSize(); i++) {
|
||||||
ItemStack item = container.getItem(i);
|
ItemStack item = container.getItem(i);
|
||||||
if (!item.isEmpty()) {
|
if (!item.isEmpty()) {
|
||||||
- f += (float)item.getCount() / container.getMaxStackSize(item);
|
- f += (float)item.getCount() / container.getMaxStackSize(item);
|
||||||
+ f += (float)item.getCount() / container.getMaxStackLeaves(item); // Leaves - stackable shulker boxes
|
+ f += Math.clamp((float) item.getCount() / container.getMaxStackSize(item), 0f, 1f); // Leaves - item over-stack util
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
diff --git a/net/minecraft/world/inventory/MerchantContainer.java b/net/minecraft/world/inventory/MerchantContainer.java
|
diff --git a/net/minecraft/world/inventory/MerchantContainer.java b/net/minecraft/world/inventory/MerchantContainer.java
|
||||||
index 1e5dfb1f9e371fa23cdfa9280797aa0e183d4cd2..cf87267130c0aebd38206556261929d6f6383bc9 100644
|
index 1e5dfb1f9e371fa23cdfa9280797aa0e183d4cd2..1a593d5bfc4574fd071604105422cd1d395648b8 100644
|
||||||
--- a/net/minecraft/world/inventory/MerchantContainer.java
|
--- a/net/minecraft/world/inventory/MerchantContainer.java
|
||||||
+++ b/net/minecraft/world/inventory/MerchantContainer.java
|
+++ b/net/minecraft/world/inventory/MerchantContainer.java
|
||||||
@@ -109,7 +109,7 @@ public class MerchantContainer implements Container {
|
@@ -109,7 +109,7 @@ public class MerchantContainer implements Container {
|
||||||
@@ -360,12 +337,12 @@ index 1e5dfb1f9e371fa23cdfa9280797aa0e183d4cd2..cf87267130c0aebd38206556261929d6
|
|||||||
public void setItem(int index, ItemStack stack) {
|
public void setItem(int index, ItemStack stack) {
|
||||||
this.itemStacks.set(index, stack);
|
this.itemStacks.set(index, stack);
|
||||||
- stack.limitSize(this.getMaxStackSize(stack));
|
- stack.limitSize(this.getMaxStackSize(stack));
|
||||||
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - stackable shulker boxes
|
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - item over-stack util
|
||||||
if (this.isPaymentSlot(index)) {
|
if (this.isPaymentSlot(index)) {
|
||||||
this.updateSellItem();
|
this.updateSellItem();
|
||||||
}
|
}
|
||||||
diff --git a/net/minecraft/world/inventory/Slot.java b/net/minecraft/world/inventory/Slot.java
|
diff --git a/net/minecraft/world/inventory/Slot.java b/net/minecraft/world/inventory/Slot.java
|
||||||
index 5ceb8964476b40db4511bec91ff13c4f522a1357..dd978d1590fb896775a240ed87e38d85744017d3 100644
|
index 5ceb8964476b40db4511bec91ff13c4f522a1357..f416d7976e41a06b5a8be93485eaa233ffceda5c 100644
|
||||||
--- a/net/minecraft/world/inventory/Slot.java
|
--- a/net/minecraft/world/inventory/Slot.java
|
||||||
+++ b/net/minecraft/world/inventory/Slot.java
|
+++ b/net/minecraft/world/inventory/Slot.java
|
||||||
@@ -75,7 +75,7 @@ public class Slot {
|
@@ -75,7 +75,7 @@ public class Slot {
|
||||||
@@ -373,12 +350,12 @@ index 5ceb8964476b40db4511bec91ff13c4f522a1357..dd978d1590fb896775a240ed87e38d85
|
|||||||
|
|
||||||
public int getMaxStackSize(ItemStack stack) {
|
public int getMaxStackSize(ItemStack stack) {
|
||||||
- return Math.min(this.getMaxStackSize(), stack.getMaxStackSize());
|
- return Math.min(this.getMaxStackSize(), stack.getMaxStackSize());
|
||||||
+ return Math.min(this.getMaxStackSize(), fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(stack)); // Lophine - Stackable ShulkerBoxes
|
+ return Math.min(this.getMaxStackSize(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(stack)); // Leaves - item over-stack util
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java
|
diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java
|
||||||
index 6154da1158756cff072d7e8cae10e20eafed1eec..687249e1ad1cb09edbe2939f1db2f90e146cd664 100644
|
index 6154da1158756cff072d7e8cae10e20eafed1eec..93bbe7b473b8150954f06602a9f311867fe9a550 100644
|
||||||
--- a/net/minecraft/world/item/ItemStack.java
|
--- a/net/minecraft/world/item/ItemStack.java
|
||||||
+++ b/net/minecraft/world/item/ItemStack.java
|
+++ b/net/minecraft/world/item/ItemStack.java
|
||||||
@@ -162,7 +162,7 @@ public final class ItemStack implements DataComponentHolder {
|
@@ -162,7 +162,7 @@ public final class ItemStack implements DataComponentHolder {
|
||||||
@@ -386,7 +363,7 @@ index 6154da1158756cff072d7e8cae10e20eafed1eec..687249e1ad1cb09edbe2939f1db2f90e
|
|||||||
@Nullable
|
@Nullable
|
||||||
private Item item;
|
private Item item;
|
||||||
- PatchedDataComponentMap components;
|
- PatchedDataComponentMap components;
|
||||||
+ public PatchedDataComponentMap components; // Leaves - stackable shulker boxes
|
+ public PatchedDataComponentMap components; // Leaves - item over-stack util
|
||||||
@Nullable
|
@Nullable
|
||||||
private Entity entityRepresentation;
|
private Entity entityRepresentation;
|
||||||
|
|
||||||
@@ -396,7 +373,7 @@ index 6154da1158756cff072d7e8cae10e20eafed1eec..687249e1ad1cb09edbe2939f1db2f90e
|
|||||||
DataComponentPatch dataComponentPatch = codec.decode(buffer);
|
DataComponentPatch dataComponentPatch = codec.decode(buffer);
|
||||||
- return new ItemStack(holder, varInt, dataComponentPatch);
|
- return new ItemStack(holder, varInt, dataComponentPatch);
|
||||||
+ ItemStack itemStack = new ItemStack(holder, varInt, dataComponentPatch);
|
+ ItemStack itemStack = new ItemStack(holder, varInt, dataComponentPatch);
|
||||||
+ return fun.bm.lophine.utils.ShulkerBoxesUtil.decodeMaxStackSize(itemStack);
|
+ return org.leavesmc.leaves.util.ItemOverstackUtils.decodeMaxStackSize(itemStack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -406,8 +383,8 @@ index 6154da1158756cff072d7e8cae10e20eafed1eec..687249e1ad1cb09edbe2939f1db2f90e
|
|||||||
} else {
|
} else {
|
||||||
- buffer.writeVarInt(io.papermc.paper.util.sanitizer.ItemComponentSanitizer.sanitizeCount(io.papermc.paper.util.sanitizer.ItemObfuscationSession.currentSession(), value, value.getCount())); // Paper - potentially sanitize count
|
- buffer.writeVarInt(io.papermc.paper.util.sanitizer.ItemComponentSanitizer.sanitizeCount(io.papermc.paper.util.sanitizer.ItemObfuscationSession.currentSession(), value, value.getCount())); // Paper - potentially sanitize count
|
||||||
- Item.STREAM_CODEC.encode(buffer, value.getItemHolder());
|
- Item.STREAM_CODEC.encode(buffer, value.getItemHolder());
|
||||||
+ // Leaves start - stackable shulker boxes
|
+ // Leaves start - item over-stack util
|
||||||
+ final ItemStack itemStack = fun.bm.lophine.utils.ShulkerBoxesUtil.encodeMaxStackSize(value.copy());
|
+ final ItemStack itemStack = org.leavesmc.leaves.util.ItemOverstackUtils.encodeMaxStackSize(value.copy());
|
||||||
+ buffer.writeVarInt(io.papermc.paper.util.sanitizer.ItemComponentSanitizer.sanitizeCount(io.papermc.paper.util.sanitizer.ItemObfuscationSession.currentSession(), itemStack, itemStack.getCount())); // Paper - potentially sanitize count
|
+ buffer.writeVarInt(io.papermc.paper.util.sanitizer.ItemComponentSanitizer.sanitizeCount(io.papermc.paper.util.sanitizer.ItemObfuscationSession.currentSession(), itemStack, itemStack.getCount())); // Paper - potentially sanitize count
|
||||||
+ Item.STREAM_CODEC.encode(buffer, itemStack.getItemHolder());
|
+ Item.STREAM_CODEC.encode(buffer, itemStack.getItemHolder());
|
||||||
// Paper start - adventure; conditionally render translatable components
|
// Paper start - adventure; conditionally render translatable components
|
||||||
@@ -425,45 +402,12 @@ index 6154da1158756cff072d7e8cae10e20eafed1eec..687249e1ad1cb09edbe2939f1db2f90e
|
|||||||
for (ItemStack itemStack : itemContainerContents.nonEmptyItems()) {
|
for (ItemStack itemStack : itemContainerContents.nonEmptyItems()) {
|
||||||
int count = itemStack.getCount();
|
int count = itemStack.getCount();
|
||||||
- int maxStackSize = itemStack.getMaxStackSize();
|
- int maxStackSize = itemStack.getMaxStackSize();
|
||||||
+ int maxStackSize = fun.bm.lophine.utils.ShulkerBoxesUtil.getItemMaxCount(itemStack); // Leaves - stackable shulker boxes
|
+ int maxStackSize = org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack); // Leaves - item over-stack util
|
||||||
if (count > maxStackSize) {
|
if (count > maxStackSize) {
|
||||||
return DataResult.error(() -> "Item stack with count of " + count + " was larger than maximum: " + maxStackSize);
|
return DataResult.error(() -> "Item stack with count of " + count + " was larger than maximum: " + maxStackSize);
|
||||||
}
|
}
|
||||||
diff --git a/net/minecraft/world/level/block/AbstractCauldronBlock.java b/net/minecraft/world/level/block/AbstractCauldronBlock.java
|
|
||||||
index 1a927b08f86c0585e62d8c4207954ab36d3316ee..e9899a03b15a2ca3dbd941775f14b041bbcfc85e 100644
|
|
||||||
--- a/net/minecraft/world/level/block/AbstractCauldronBlock.java
|
|
||||||
+++ b/net/minecraft/world/level/block/AbstractCauldronBlock.java
|
|
||||||
@@ -57,9 +57,27 @@ public abstract class AbstractCauldronBlock extends Block {
|
|
||||||
ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult
|
|
||||||
) {
|
|
||||||
CauldronInteraction cauldronInteraction = this.interactions.map().get(stack.getItem());
|
|
||||||
- return cauldronInteraction.interact(state, level, pos, player, hand, stack, hitResult.getDirection()); // Paper - pass hit direction
|
|
||||||
+ return wrapInteractor(cauldronInteraction, state, level, pos, player, hand, stack, hitResult.getDirection()); // Paper - pass hit direction // Leaves - stackable shulker boxes
|
|
||||||
}
|
|
||||||
|
|
||||||
+ // Leaves start - stackable shulker boxes
|
|
||||||
+ private InteractionResult wrapInteractor(CauldronInteraction cauldronBehavior, BlockState blockState, Level world, BlockPos blockPos, Player playerEntity, InteractionHand hand, ItemStack itemStack, net.minecraft.core.Direction hitDirection) {
|
|
||||||
+ int count = -1;
|
|
||||||
+ if (fun.bm.lophine.utils.ShulkerBoxesUtil.shouldCheck() && itemStack.getItem() instanceof net.minecraft.world.item.BlockItem bi &&
|
|
||||||
+ bi.getBlock() instanceof ShulkerBoxBlock) {
|
|
||||||
+ count = itemStack.getCount();
|
|
||||||
+ }
|
|
||||||
+ InteractionResult result = cauldronBehavior.interact(blockState, world, blockPos, playerEntity, hand, itemStack, hitDirection);
|
|
||||||
+ 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 level, BlockPos pos, CollisionContext context) {
|
|
||||||
return SHAPE;
|
|
||||||
diff --git a/net/minecraft/world/level/block/CrafterBlock.java b/net/minecraft/world/level/block/CrafterBlock.java
|
diff --git a/net/minecraft/world/level/block/CrafterBlock.java b/net/minecraft/world/level/block/CrafterBlock.java
|
||||||
index 38b03c7b02bdfc579e5e126c12de3d878e26d188..33e24f2c3b63b2d3b55dfae2f2e55869abeed055 100644
|
index 38b03c7b02bdfc579e5e126c12de3d878e26d188..caf31218a1aff84367da126ee1dc46b8c8a1e5d1 100644
|
||||||
--- a/net/minecraft/world/level/block/CrafterBlock.java
|
--- a/net/minecraft/world/level/block/CrafterBlock.java
|
||||||
+++ b/net/minecraft/world/level/block/CrafterBlock.java
|
+++ b/net/minecraft/world/level/block/CrafterBlock.java
|
||||||
@@ -192,7 +192,7 @@ public class CrafterBlock extends BaseEntityBlock {
|
@@ -192,7 +192,7 @@ public class CrafterBlock extends BaseEntityBlock {
|
||||||
@@ -471,12 +415,12 @@ index 38b03c7b02bdfc579e5e126c12de3d878e26d188..33e24f2c3b63b2d3b55dfae2f2e55869
|
|||||||
Container containerAt = HopperBlockEntity.getContainerAt(level, pos.relative(direction));
|
Container containerAt = HopperBlockEntity.getContainerAt(level, pos.relative(direction));
|
||||||
ItemStack itemStack = stack.copy();
|
ItemStack itemStack = stack.copy();
|
||||||
- if (containerAt != null && (containerAt instanceof CrafterBlockEntity || stack.getCount() > containerAt.getMaxStackSize(stack))) {
|
- if (containerAt != null && (containerAt instanceof CrafterBlockEntity || stack.getCount() > containerAt.getMaxStackSize(stack))) {
|
||||||
+ if (containerAt != null && (containerAt instanceof CrafterBlockEntity || stack.getCount() > containerAt.getMaxStackLeaves(stack))) { // Leaves - stackable shulker boxes
|
+ if (containerAt != null && (containerAt instanceof CrafterBlockEntity || stack.getCount() > containerAt.getMaxStackLeaves(stack))) { // Leaves - item over-stack util
|
||||||
// CraftBukkit start - InventoryMoveItemEvent
|
// CraftBukkit start - InventoryMoveItemEvent
|
||||||
org.bukkit.craftbukkit.inventory.CraftItemStack oitemstack = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack);
|
org.bukkit.craftbukkit.inventory.CraftItemStack oitemstack = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack);
|
||||||
|
|
||||||
diff --git a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java
|
diff --git a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java
|
||||||
index 36a72a11d28f99bfe85868461925b778cc01478e..831900a4ed6ca335707289391a095af7717a01a4 100644
|
index 36a72a11d28f99bfe85868461925b778cc01478e..2a9f204a514d697178fb3ffac25aece0024f0347 100644
|
||||||
--- a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java
|
--- a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java
|
||||||
+++ b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java
|
+++ b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java
|
||||||
@@ -409,7 +409,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit
|
@@ -409,7 +409,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit
|
||||||
@@ -484,12 +428,12 @@ index 36a72a11d28f99bfe85868461925b778cc01478e..831900a4ed6ca335707289391a095af7
|
|||||||
boolean flag = !stack.isEmpty() && ItemStack.isSameItemSameComponents(itemStack, stack);
|
boolean flag = !stack.isEmpty() && ItemStack.isSameItemSameComponents(itemStack, stack);
|
||||||
this.items.set(index, stack);
|
this.items.set(index, stack);
|
||||||
- stack.limitSize(this.getMaxStackSize(stack));
|
- stack.limitSize(this.getMaxStackSize(stack));
|
||||||
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - stackable shulker boxes
|
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - item over-stack util
|
||||||
if (index == 0 && !flag && this.level instanceof ServerLevel serverLevel) {
|
if (index == 0 && !flag && this.level instanceof ServerLevel serverLevel) {
|
||||||
this.cookingTotalTime = getTotalCookTime(serverLevel, this, this.recipeType, this.cookSpeedMultiplier); // Paper - cook speed multiplier API
|
this.cookingTotalTime = getTotalCookTime(serverLevel, this, this.recipeType, this.cookSpeedMultiplier); // Paper - cook speed multiplier API
|
||||||
this.cookingTimer = 0;
|
this.cookingTimer = 0;
|
||||||
diff --git a/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java b/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java
|
diff --git a/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java b/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java
|
||||||
index 5a094257a31f0500278a706a418e1697f8810ffb..1f132848ae284668c05d6ca17d5890fa341e14cd 100644
|
index 5a094257a31f0500278a706a418e1697f8810ffb..63d6a43dab067aa4c8fb67095c455130196eef9f 100644
|
||||||
--- a/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java
|
--- a/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java
|
||||||
+++ b/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java
|
+++ b/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java
|
||||||
@@ -145,7 +145,7 @@ public abstract class BaseContainerBlockEntity extends BlockEntity implements Co
|
@@ -145,7 +145,7 @@ public abstract class BaseContainerBlockEntity extends BlockEntity implements Co
|
||||||
@@ -497,12 +441,12 @@ index 5a094257a31f0500278a706a418e1697f8810ffb..1f132848ae284668c05d6ca17d5890fa
|
|||||||
public void setItem(int slot, ItemStack stack) {
|
public void setItem(int slot, ItemStack stack) {
|
||||||
this.getItems().set(slot, stack);
|
this.getItems().set(slot, stack);
|
||||||
- stack.limitSize(this.getMaxStackSize(stack));
|
- stack.limitSize(this.getMaxStackSize(stack));
|
||||||
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - stackable shulker boxes
|
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - item over-stack util
|
||||||
this.setChanged();
|
this.setChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java
|
diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java
|
||||||
index 5de769e7bd56bb3355c3c711d46ce5e103ea4409..061501979195cf43c6da4d4b6cf6359251978bd3 100644
|
index 5de769e7bd56bb3355c3c711d46ce5e103ea4409..8ba900fda7cce45679cde2b8b3272654129135ca 100644
|
||||||
--- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java
|
--- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java
|
||||||
+++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java
|
+++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java
|
||||||
@@ -123,7 +123,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
|
@@ -123,7 +123,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
|
||||||
@@ -510,7 +454,7 @@ index 5de769e7bd56bb3355c3c711d46ce5e103ea4409..061501979195cf43c6da4d4b6cf63592
|
|||||||
this.unpackLootTable(null);
|
this.unpackLootTable(null);
|
||||||
this.getItems().set(index, stack);
|
this.getItems().set(index, stack);
|
||||||
- stack.limitSize(this.getMaxStackSize(stack));
|
- stack.limitSize(this.getMaxStackSize(stack));
|
||||||
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - stackable shulker boxes
|
+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - item over-stack util
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -519,10 +463,10 @@ index 5de769e7bd56bb3355c3c711d46ce5e103ea4409..061501979195cf43c6da4d4b6cf63592
|
|||||||
// Spigot start - SPIGOT-6693, SimpleContainer#setItem
|
// Spigot start - SPIGOT-6693, SimpleContainer#setItem
|
||||||
ItemStack leftover = ItemStack.EMPTY; // Paper - Make hoppers respect inventory max stack size
|
ItemStack leftover = ItemStack.EMPTY; // Paper - Make hoppers respect inventory max stack size
|
||||||
- if (!stack.isEmpty() && stack.getCount() > destination.getMaxStackSize()) {
|
- if (!stack.isEmpty() && stack.getCount() > destination.getMaxStackSize()) {
|
||||||
+ if (!stack.isEmpty() && (stack.getCount() > destination.getMaxStackSize() || stack.getCount() > stack.getMaxStackSize())) {
|
+ if (!stack.isEmpty() && (stack.getCount() > destination.getMaxStackSize() || stack.getCount() > stack.getMaxStackSize())) { // Leaves - item over-stack util
|
||||||
leftover = stack; // Paper - Make hoppers respect inventory max stack size
|
leftover = stack; // Paper - Make hoppers respect inventory max stack size
|
||||||
- stack = stack.split(destination.getMaxStackSize());
|
- stack = stack.split(destination.getMaxStackSize());
|
||||||
+ stack = stack.split(Math.min(destination.getMaxStackSize(), stack.getMaxStackSize()));
|
+ stack = stack.split(Math.min(destination.getMaxStackSize(), stack.getMaxStackSize())); // Leaves - item over-stack util
|
||||||
}
|
}
|
||||||
// Spigot end
|
// Spigot end
|
||||||
IGNORE_TILE_UPDATES.set(Boolean.TRUE); // Paper - Perf: Optimize Hoppers // Folia - region threading
|
IGNORE_TILE_UPDATES.set(Boolean.TRUE); // Paper - Perf: Optimize Hoppers // Folia - region threading
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
From: Helvetica Volubi <suisuroru@blue-millennium.fun>
|
From: Helvetica Volubi <suisuroru@blue-millennium.fun>
|
||||||
Date: Wed, 23 Jul 2025 20:28:40 +0800
|
Date: Wed, 23 Jul 2025 20:28:40 +0800
|
||||||
Subject: [PATCH] Redstone Shears Wrench
|
Subject: [PATCH] Leaves: Redstone Shears Wrench
|
||||||
|
|
||||||
Co-authored by: violetc <58360096+s-yh-china@users.noreply.github.com>
|
Co-authored by: violetc <58360096+s-yh-china@users.noreply.github.com>
|
||||||
As a part of : Leaves (https://github.com/LeavesMC/Leaves/blob/bfde470a867b74d177fe1b9a2a3ed5c49cd126c7/leaves-server/minecraft-patches/features/0009-Redstone-Shears-Wrench.patch)
|
As a part of : Leaves (https://github.com/LeavesMC/Leaves/blob/bfde470a867b74d177fe1b9a2a3ed5c49cd126c7/leaves-server/minecraft-patches/features/0009-Redstone-Shears-Wrench.patch)
|
||||||
+1
-1
@@ -8,7 +8,7 @@ As part of: Purpur (https://github.com/PurpurMC/Purpur/blob/09f547de09fc5d886f18
|
|||||||
Licensed under: MIT (https://github.com/PurpurMC/Purpur/blob/09f547de09fc5d886f18f6d99ff389289766ec9d/LICENSE)
|
Licensed under: MIT (https://github.com/PurpurMC/Purpur/blob/09f547de09fc5d886f18f6d99ff389289766ec9d/LICENSE)
|
||||||
|
|
||||||
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
|
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
|
||||||
index a24c332a8f9cb2ebc6f9926c6dabf1238238028d..58c2a6a3304e1bea25980b04046fe7c0017bc90d 100644
|
index 5c21fc0c749973d17df690fe7e2eab597b198131..f01e3147cb49ee37d8e33d4146aa1a72cf38014f 100644
|
||||||
--- a/net/minecraft/server/players/PlayerList.java
|
--- a/net/minecraft/server/players/PlayerList.java
|
||||||
+++ b/net/minecraft/server/players/PlayerList.java
|
+++ b/net/minecraft/server/players/PlayerList.java
|
||||||
@@ -1086,6 +1086,10 @@ public abstract class PlayerList {
|
@@ -1086,6 +1086,10 @@ public abstract class PlayerList {
|
||||||
+5
@@ -20,6 +20,11 @@ public class ContainerExpansionConfig implements IConfigModule {
|
|||||||
range: 1~64""")
|
range: 1~64""")
|
||||||
public static int shulkerCount = 1;
|
public static int shulkerCount = 1;
|
||||||
|
|
||||||
|
@ConfigInfo(baseName = "same_nbt_shulker_stackable", comments =
|
||||||
|
"""
|
||||||
|
range: 1~64""")
|
||||||
|
public static boolean nbtShulkerStackable = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EnumConfigCategory getCategory() {
|
public EnumConfigCategory getCategory() {
|
||||||
return EnumConfigCategory.MISC;
|
return EnumConfigCategory.MISC;
|
||||||
|
|||||||
@@ -1,78 +0,0 @@
|
|||||||
package fun.bm.lophine.utils;
|
|
||||||
|
|
||||||
import fun.bm.lophine.config.modules.misc.ContainerExpansionConfig;
|
|
||||||
import net.minecraft.core.component.DataComponents;
|
|
||||||
import net.minecraft.nbt.CompoundTag;
|
|
||||||
import net.minecraft.world.item.BlockItem;
|
|
||||||
import net.minecraft.world.item.ItemStack;
|
|
||||||
import net.minecraft.world.item.component.CustomData;
|
|
||||||
import net.minecraft.world.item.component.ItemContainerContents;
|
|
||||||
import net.minecraft.world.level.block.ShulkerBoxBlock;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
public class ShulkerBoxesUtil {
|
|
||||||
public static boolean shouldCheck() {
|
|
||||||
return ContainerExpansionConfig.shulkerCount > 1 && ContainerExpansionConfig.shulkerCount <= 64;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean checkShulkerBox(ItemStack itemStack) {
|
|
||||||
return shouldCheck() && checkIsShulkerBox(itemStack);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean checkIsShulkerBox(ItemStack itemStack) {
|
|
||||||
return itemStack.getItem() instanceof BlockItem b && b.getBlock() instanceof ShulkerBoxBlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getItemMaxCount(ItemStack itemStack) {
|
|
||||||
if (checkShulkerBox(itemStack)) {
|
|
||||||
return Math.clamp(ContainerExpansionConfig.shulkerCount, 1, 64);
|
|
||||||
}
|
|
||||||
return itemStack.getMaxStackSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getShulkerBoxesMaxCountUnsafe() {
|
|
||||||
return Math.clamp(ContainerExpansionConfig.shulkerCount, 1, 64);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean emptyShulkerBoxCheck(@NotNull ItemStack stack) {
|
|
||||||
return stack.getComponents().getOrDefault(DataComponents.CONTAINER, ItemContainerContents.EMPTY).stream().findAny().isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isStackable(ItemStack itemStack) {
|
|
||||||
return getItemMaxCount(itemStack) > 1 && (!itemStack.isDamageableItem() || !itemStack.isDamaged());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getItemStackMaxCountReal(ItemStack stack) {
|
|
||||||
CompoundTag nbt = Optional.ofNullable(stack.get(DataComponents.CUSTOM_DATA)).orElse(CustomData.EMPTY).copyTag();
|
|
||||||
return nbt.getInt("Lophine.RealStackSize").orElse(stack.getMaxStackSize());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ItemStack encodeMaxStackSize(ItemStack itemStack) {
|
|
||||||
int realMaxStackSize = getItemStackMaxCountReal(itemStack);
|
|
||||||
int modifiedMaxStackSize = getItemMaxCount(itemStack);
|
|
||||||
if (itemStack.getMaxStackSize() != modifiedMaxStackSize) {
|
|
||||||
itemStack.set(DataComponents.MAX_STACK_SIZE, modifiedMaxStackSize);
|
|
||||||
CompoundTag nbt = itemStack.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY).copyTag();
|
|
||||||
nbt.putInt("Lophine.RealStackSize", realMaxStackSize);
|
|
||||||
itemStack.set(DataComponents.CUSTOM_DATA, CustomData.of(nbt));
|
|
||||||
}
|
|
||||||
return itemStack;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ItemStack decodeMaxStackSize(ItemStack itemStack) {
|
|
||||||
int realMaxStackSize = getItemStackMaxCountReal(itemStack);
|
|
||||||
if (itemStack.getMaxStackSize() != realMaxStackSize) {
|
|
||||||
itemStack.set(DataComponents.MAX_STACK_SIZE, realMaxStackSize);
|
|
||||||
CompoundTag nbt = itemStack.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY).copyTag();
|
|
||||||
nbt.remove("Lophine.RealStackSize");
|
|
||||||
if (nbt.isEmpty()) {
|
|
||||||
itemStack.remove(DataComponents.CUSTOM_DATA);
|
|
||||||
} else {
|
|
||||||
itemStack.set(DataComponents.CUSTOM_DATA, CustomData.of(nbt));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return itemStack;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,203 @@
|
|||||||
|
package org.leavesmc.leaves.util;
|
||||||
|
|
||||||
|
import fun.bm.lophine.config.modules.misc.ContainerExpansionConfig;
|
||||||
|
import net.minecraft.core.component.DataComponents;
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.world.entity.item.ItemEntity;
|
||||||
|
import net.minecraft.world.item.BlockItem;
|
||||||
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
import net.minecraft.world.item.component.CustomData;
|
||||||
|
import net.minecraft.world.item.component.ItemContainerContents;
|
||||||
|
import net.minecraft.world.level.block.ShulkerBoxBlock;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class ItemOverstackUtils {
|
||||||
|
|
||||||
|
private static final List<ItemUtil> overstackUtils = List.of(
|
||||||
|
new ShulkerBox()
|
||||||
|
// new CurseEnchantedBook()
|
||||||
|
);
|
||||||
|
|
||||||
|
public static int getItemStackMaxCount(ItemStack stack) {
|
||||||
|
int size;
|
||||||
|
for (ItemUtil util : overstackUtils) {
|
||||||
|
if ((size = util.getMaxServerStackCount(stack)) != -1) {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return stack.getMaxStackSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getNetworkMaxCount(ItemStack stack) {
|
||||||
|
int size;
|
||||||
|
for (ItemUtil util : overstackUtils) {
|
||||||
|
if ((size = util.getMaxClientStackCount(stack)) != -1) {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return stack.getMaxStackSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean tryStackItems(ItemEntity self, ItemEntity other) {
|
||||||
|
for (ItemUtil util : overstackUtils) {
|
||||||
|
if (util.tryStackItems(self, other)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean hasOverstackingItem() {
|
||||||
|
return overstackUtils.stream().anyMatch(ItemUtil::isEnabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getItemStackMaxCountReal(ItemStack stack) {
|
||||||
|
CompoundTag nbt = Optional.ofNullable(stack.get(DataComponents.CUSTOM_DATA)).orElse(CustomData.EMPTY).copyTag();
|
||||||
|
return nbt.getInt("Leaves.RealStackSize").orElse(stack.getMaxStackSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ItemStack encodeMaxStackSize(ItemStack itemStack) {
|
||||||
|
int realMaxStackSize = getItemStackMaxCountReal(itemStack);
|
||||||
|
int modifiedMaxStackSize = getNetworkMaxCount(itemStack);
|
||||||
|
if (itemStack.getMaxStackSize() != modifiedMaxStackSize) {
|
||||||
|
itemStack.set(DataComponents.MAX_STACK_SIZE, modifiedMaxStackSize);
|
||||||
|
CompoundTag nbt = itemStack.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY).copyTag();
|
||||||
|
nbt.putInt("Leaves.RealStackSize", realMaxStackSize);
|
||||||
|
itemStack.set(DataComponents.CUSTOM_DATA, CustomData.of(nbt));
|
||||||
|
}
|
||||||
|
return itemStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ItemStack decodeMaxStackSize(ItemStack itemStack) {
|
||||||
|
int realMaxStackSize = getItemStackMaxCountReal(itemStack);
|
||||||
|
if (itemStack.getMaxStackSize() != realMaxStackSize) {
|
||||||
|
itemStack.set(DataComponents.MAX_STACK_SIZE, realMaxStackSize);
|
||||||
|
CompoundTag nbt = itemStack.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY).copyTag();
|
||||||
|
nbt.remove("Leaves.RealStackSize");
|
||||||
|
if (nbt.isEmpty()) {
|
||||||
|
itemStack.remove(DataComponents.CUSTOM_DATA);
|
||||||
|
} else {
|
||||||
|
itemStack.set(DataComponents.CUSTOM_DATA, CustomData.of(nbt));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return itemStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isStackable(ItemStack itemStack) {
|
||||||
|
return getItemStackMaxCount(itemStack) > 1 && (!itemStack.isDamageableItem() || !itemStack.isDamaged());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private interface ItemUtil {
|
||||||
|
boolean isEnabled();
|
||||||
|
|
||||||
|
boolean tryStackItems(ItemEntity self, ItemEntity other);
|
||||||
|
|
||||||
|
// number -> modified count, -1 -> I don't care
|
||||||
|
int getMaxServerStackCount(ItemStack stack);
|
||||||
|
|
||||||
|
// number -> modified count, -1 -> I don't care
|
||||||
|
default int getMaxClientStackCount(ItemStack stack) {
|
||||||
|
return getMaxServerStackCount(stack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ShulkerBox implements ItemUtil {
|
||||||
|
public static boolean shulkerBoxCheck(@NotNull ItemStack stack1, @NotNull ItemStack stack2) {
|
||||||
|
if (ContainerExpansionConfig.nbtShulkerStackable) {
|
||||||
|
return Objects.equals(stack1.getComponents(), stack2.getComponents());
|
||||||
|
}
|
||||||
|
return shulkerBoxNoItem(stack1) && shulkerBoxNoItem(stack2) && Objects.equals(stack1.getComponents(), stack2.getComponents());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean shulkerBoxNoItem(@NotNull ItemStack stack) {
|
||||||
|
return stack.getComponents().getOrDefault(DataComponents.CONTAINER, ItemContainerContents.EMPTY).stream().findAny().isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return ContainerExpansionConfig.shulkerCount > 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean tryStackItems(ItemEntity self, ItemEntity other) {
|
||||||
|
ItemStack selfStack = self.getItem();
|
||||||
|
if (!isEnabled() ||
|
||||||
|
!(selfStack.getItem() instanceof BlockItem blockItem) ||
|
||||||
|
!(blockItem.getBlock() instanceof ShulkerBoxBlock)
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemStack otherStack = other.getItem();
|
||||||
|
if (selfStack.getItem() == otherStack.getItem()
|
||||||
|
&& shulkerBoxCheck(selfStack, otherStack)
|
||||||
|
&& selfStack.getCount() != ContainerExpansionConfig.shulkerCount) {
|
||||||
|
int amount = Math.min(otherStack.getCount(), ContainerExpansionConfig.shulkerCount - selfStack.getCount());
|
||||||
|
|
||||||
|
selfStack.grow(amount);
|
||||||
|
self.setItem(selfStack);
|
||||||
|
|
||||||
|
self.pickupDelay = Math.max(other.pickupDelay, self.pickupDelay);
|
||||||
|
self.age = Math.min(other.getAge(), self.age);
|
||||||
|
|
||||||
|
otherStack.shrink(amount);
|
||||||
|
if (otherStack.isEmpty()) {
|
||||||
|
other.discard();
|
||||||
|
} else {
|
||||||
|
other.setItem(otherStack);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMaxServerStackCount(ItemStack stack) {
|
||||||
|
if (isEnabled() && stack.getItem() instanceof BlockItem bi &&
|
||||||
|
bi.getBlock() instanceof ShulkerBoxBlock && (ContainerExpansionConfig.nbtShulkerStackable || shulkerBoxNoItem(stack))) {
|
||||||
|
return ContainerExpansionConfig.shulkerCount;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// only use shulker box part
|
||||||
|
/* public static class CurseEnchantedBook implements ItemUtil {
|
||||||
|
public static boolean isCursedEnchantedBook(ItemStack stack) {
|
||||||
|
ItemEnchantments enchantments = stack.getOrDefault(DataComponents.STORED_ENCHANTMENTS, ItemEnchantments.EMPTY);
|
||||||
|
if (enchantments.size() != 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return stack.getBukkitStack().getEnchantmentLevel(org.bukkit.enchantments.Enchantment.BINDING_CURSE) == 1 ||
|
||||||
|
stack.getBukkitStack().getEnchantmentLevel(org.bukkit.enchantments.Enchantment.BINDING_CURSE) == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return LeavesConfig.modify.oldMC.allowGrindstoneOverstacking;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean tryStackItems(ItemEntity self, ItemEntity other) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMaxServerStackCount(ItemStack stack) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMaxClientStackCount(ItemStack stack) {
|
||||||
|
if (isEnabled() && isCursedEnchantedBook(stack)) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user