blob: 3be2179e1a27c985616005a324b67c16f40142e8 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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.getInventory();
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;
}
}
|