Skip to content

Commit 7f4090b

Browse files
committed
add InventoryUtils.addItems
1 parent 0131db8 commit 7f4090b

File tree

1 file changed

+49
-35
lines changed

1 file changed

+49
-35
lines changed

src/main/java/cat/nyaa/nyaacore/utils/InventoryUtils.java

Lines changed: 49 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
import org.bukkit.inventory.PlayerInventory;
99

1010
import java.util.ArrayList;
11+
import java.util.Collections;
1112
import java.util.List;
13+
import java.util.stream.Collectors;
1214

1315
public final class InventoryUtils {
1416

@@ -29,57 +31,69 @@ public static boolean addItem(Inventory inventory, ItemStack item) {
2931
}
3032

3133
private static boolean addItem(Inventory inventory, ItemStack item, int amount) {
32-
ItemStack[] items = new ItemStack[inventory.getSize()];
34+
ItemStack i = item.clone();
35+
i.setAmount(amount);
36+
return addItems(inventory, Collections.singletonList(i));
37+
}
38+
39+
public static boolean addItems(Inventory inventory, List<ItemStack> items) {
40+
return _addItems(inventory, items.stream().filter(i -> i != null && i.getType() != Material.AIR).map(ItemStack::clone).collect(Collectors.toList()));
41+
}
42+
43+
private static boolean _addItems(Inventory inventory, List<ItemStack> items) {
44+
ItemStack[] tmpInv = new ItemStack[inventory.getSize()];
3345
for (int i = 0; i < inventory.getSize(); i++) {
3446
if (i >= 36 && i <= 39 && inventory instanceof PlayerInventory) {
35-
items[i] = null;
47+
tmpInv[i] = null;
3648
continue;
3749
}
3850
if (inventory.getItem(i) != null && inventory.getItem(i).getType() != Material.AIR) {
39-
items[i] = inventory.getItem(i).clone();
51+
tmpInv[i] = inventory.getItem(i).clone();
4052
} else {
41-
items[i] = new ItemStack(Material.AIR);
53+
tmpInv[i] = new ItemStack(Material.AIR);
4254
}
4355
}
44-
boolean success = false;
45-
for (int slot = 0; slot < items.length; slot++) {
46-
ItemStack tmp = items[slot];
47-
if (tmp == null) {
48-
continue;
49-
}
50-
if (item.isSimilar(tmp) && tmp.getAmount() < item.getMaxStackSize()) {
51-
if ((tmp.getAmount() + amount) <= item.getMaxStackSize()) {
52-
tmp.setAmount(amount + tmp.getAmount());
53-
items[slot] = tmp;
54-
success = true;
55-
break;
56-
} else {
57-
amount = amount - (item.getMaxStackSize() - tmp.getAmount());
58-
tmp.setAmount(item.getMaxStackSize());
59-
items[slot] = tmp;
56+
for (ItemStack item : items) {
57+
int amount = item.getAmount();
58+
for (int slot = 0; slot < tmpInv.length; slot++) {
59+
ItemStack tmp = tmpInv[slot];
60+
if (tmp == null) {
6061
continue;
6162
}
63+
if (tmp.getAmount() < item.getMaxStackSize() && item.isSimilar(tmp)) {
64+
if ((tmp.getAmount() + amount) <= item.getMaxStackSize()) {
65+
tmp.setAmount(amount + tmp.getAmount());
66+
amount = 0;
67+
tmpInv[slot] = tmp;
68+
break;
69+
} else {
70+
amount = amount - (item.getMaxStackSize() - tmp.getAmount());
71+
tmp.setAmount(item.getMaxStackSize());
72+
tmpInv[slot] = tmp;
73+
continue;
74+
}
75+
}
6276
}
63-
}
64-
if (!success) {
65-
for (int i = 0; i < items.length; i++) {
66-
if (items[i] != null && items[i].getType() == Material.AIR) {
67-
item.setAmount(amount);
68-
items[i] = item;
69-
success = true;
70-
break;
77+
if (amount > 0) {
78+
for (int i = 0; i < tmpInv.length; i++) {
79+
if (tmpInv[i] != null && tmpInv[i].getType() == Material.AIR) {
80+
item.setAmount(amount);
81+
tmpInv[i] = item.clone();
82+
amount = 0;
83+
break;
84+
}
7185
}
7286
}
87+
if (amount > 0) {
88+
return false;
89+
}
7390
}
74-
if (success) {
75-
for (int i = 0; i < items.length; i++) {
76-
if (items[i] != null && !items[i].equals(inventory.getItem(i))) {
77-
inventory.setItem(i, items[i]);
78-
}
91+
for (int i = 0; i < tmpInv.length; i++) {
92+
if (tmpInv[i] != null && !tmpInv[i].equals(inventory.getItem(i))) {
93+
inventory.setItem(i, tmpInv[i]);
7994
}
80-
return true;
8195
}
82-
return false;
96+
return true;
8397
}
8498

8599
public static boolean removeItem(Player player, ItemStack item, int amount) {

0 commit comments

Comments
 (0)