summaryrefslogtreecommitdiff
path: root/dicore3/core/src/main/java/io/dico/dicore/InventoryEventUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'dicore3/core/src/main/java/io/dico/dicore/InventoryEventUtil.java')
-rw-r--r--dicore3/core/src/main/java/io/dico/dicore/InventoryEventUtil.java120
1 files changed, 120 insertions, 0 deletions
diff --git a/dicore3/core/src/main/java/io/dico/dicore/InventoryEventUtil.java b/dicore3/core/src/main/java/io/dico/dicore/InventoryEventUtil.java
new file mode 100644
index 0000000..84d3ce1
--- /dev/null
+++ b/dicore3/core/src/main/java/io/dico/dicore/InventoryEventUtil.java
@@ -0,0 +1,120 @@
+package io.dico.dicore;
+
+import org.bukkit.Material;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.PlayerInventory;
+
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class InventoryEventUtil {
+
+ private InventoryEventUtil() {
+
+ }
+
+ public static ItemStack getNewItem(InventoryClickEvent event) {
+ Inventory clicked = event.getClickedInventory();
+ switch (event.getAction()) {
+ case SWAP_WITH_CURSOR:
+ case PLACE_ALL:
+ return event.getCursor();
+ case PICKUP_ALL:
+ case HOTBAR_MOVE_AND_READD:
+ case MOVE_TO_OTHER_INVENTORY:
+ case DROP_ALL_SLOT:
+ case COLLECT_TO_CURSOR:
+ return null;
+ case PICKUP_HALF:
+ case PICKUP_SOME:
+ ItemStack item = clicked.getItem(event.getSlot()).clone();
+ item.setAmount(item.getAmount() / 2);
+ return item;
+ case PICKUP_ONE:
+ case DROP_ONE_SLOT:
+ item = clicked.getItem(event.getSlot()).clone();
+ item.setAmount(Math.max(0, item.getAmount() - 1));
+ return item;
+ case PLACE_ONE:
+ item = event.getView().getCursor().clone();
+ item.setAmount(1);
+ return item;
+ case PLACE_SOME:
+ item = event.getView().getCursor().clone();
+ item.setAmount(item.getAmount() / 2);
+ return item;
+ case HOTBAR_SWAP:
+ return event.getView().getBottomInventory().getItem(event.getHotbarButton());
+ default:
+ return clicked.getItem(event.getSlot());
+ }
+ }
+
+
+ public static Map<Integer, ItemStack> deduceChangesIfItemAdded(Inventory inventory, ItemStack added, boolean computeNewItem) {
+ int addedAmount = added.getAmount();
+ Map<Integer, ItemStack> rv = Collections.emptyMap();
+
+ for (int n = inventory.getSize(), i = 0; i < n; i++) {
+ if (addedAmount <= 0) break;
+
+ ItemStack current = inventory.getItem(i);
+ if (current == null || current.getType() == Material.AIR || current.isSimilar(added)) {
+ int count = current == null ? 0 : current.getAmount();
+ int max = (current == null ? added : current).getType().getMaxStackSize();
+ if (count < max) {
+ int diff = max - count;
+ if (diff > addedAmount) {
+ diff = addedAmount;
+ }
+ addedAmount -= diff;
+
+ if (rv.isEmpty()) rv = new LinkedHashMap<>();
+
+ if (computeNewItem) {
+ current = (current == null ? added : current).clone();
+ current.setAmount(count + diff);
+ rv.put(i, current);
+ } else {
+ rv.put(i, null);
+ }
+ }
+ }
+ }
+
+ return rv;
+ }
+
+
+ public static ItemStack getNewHeldItemIfPickedUp(PlayerInventory inventory, ItemStack added) {
+ int heldItemSlot = inventory.getHeldItemSlot();
+ ItemStack heldItem = inventory.getItem(heldItemSlot);
+
+ if (SpigotUtil.isItemPresent(heldItem) && !added.isSimilar(heldItem)) {
+ return null;
+ }
+
+ int amt = added.getAmount();
+ for (int i = 0; i < heldItemSlot; i++) {
+ ItemStack item = inventory.getItem(i);
+ if (!SpigotUtil.isItemPresent(item)) {
+ return null;
+ }
+ if (item.isSimilar(item)) {
+ amt -= Math.max(0, item.getMaxStackSize() - item.getAmount());
+ if (amt <= 0) {
+ return null;
+ }
+ }
+ }
+
+ added = added.clone();
+ added.setAmount(amt + Math.max(0, heldItem == null ? 0 : heldItem.getAmount()));
+ return added;
+ }
+
+
+}