Skip to content
This repository was archived by the owner on Mar 8, 2022. It is now read-only.

Commit ef2ed0a

Browse files
committed
improve InventoryUtils
1 parent b6e03de commit ef2ed0a

File tree

3 files changed

+120
-18
lines changed

3 files changed

+120
-18
lines changed

src/main/java/cat/nyaa/nyaautils/ElytraEnhanceListener.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public void playerMove(PlayerMoveEvent e) {
3636
!disableFuelMode.contains(player.getUniqueId())) {
3737
if (!FuelMode.contains(player.getUniqueId()) &&
3838
player.getVelocity().length() >= 0.75 &&
39-
InventoryUtils.hasItem(player.getInventory(), plugin.cfg.elytra_fuel, 1)) {
39+
InventoryUtils.hasItem(player, plugin.cfg.elytra_fuel, 1)) {
4040
FuelMode.add(player.getUniqueId());
4141
}
4242
if (FuelMode.contains(player.getUniqueId()) &&
@@ -52,7 +52,7 @@ public void playerMove(PlayerMoveEvent e) {
5252
}
5353
}
5454

55-
if (!InventoryUtils.hasItem(player.getInventory(), plugin.cfg.elytra_fuel, plugin.cfg.elytra_fuel_notify)) {
55+
if (!InventoryUtils.hasItem(player, plugin.cfg.elytra_fuel, plugin.cfg.elytra_fuel_notify)) {
5656
player.sendMessage(I18n._("user.elytra_enhance.fuel_notify", InventoryUtils.getAmount(player, plugin.cfg.elytra_fuel)));
5757
}
5858
if (!(duration.containsKey(player.getUniqueId()) && duration.get(player.getUniqueId()) >= System.currentTimeMillis())) {

src/main/java/cat/nyaa/nyaautils/mailbox/MailboxCommands.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import cat.nyaa.nyaautils.NyaaUtils;
44
import cat.nyaa.utils.CommandReceiver;
55
import cat.nyaa.utils.Internationalization;
6+
import cat.nyaa.utils.InventoryUtils;
67
import me.crafter.mc.lockettepro.LocketteProAPI;
78
import org.bukkit.Location;
89
import org.bukkit.Material;
@@ -199,14 +200,13 @@ public void sendMailbox(CommandSender sender, Arguments args) {
199200
Player recp = plugin.getServer().getPlayer(toPlayer);
200201
if (recp != null && !recp.isOnline()) recp = null;
201202
Inventory targetInventory = ((InventoryHolder) toLocation.getBlock().getState()).getInventory();
202-
int slot = targetInventory.firstEmpty();
203-
if (slot < 0) {
203+
if (!InventoryUtils.hasEnoughSpace(targetInventory, stack)) {
204204
msg(sender, "user.mailbox.recipient_no_space");
205205
if (recp != null) {
206206
msg(recp, "user.mailbox.mailbox_no_space", sender.getName());
207207
}
208208
} else {
209-
targetInventory.setItem(slot, stack);
209+
InventoryUtils.addItem(targetInventory, stack);
210210
p.getInventory().setItemInMainHand(new ItemStack(Material.AIR));
211211
msg(sender, "user.mailbox.mail_sent", toPlayer, (float) plugin.cfg.mailHandFee);
212212
if (recp != null) {

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

Lines changed: 115 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,90 @@
55
import org.bukkit.entity.Player;
66
import org.bukkit.inventory.Inventory;
77
import org.bukkit.inventory.ItemStack;
8+
import org.bukkit.inventory.PlayerInventory;
89

910
public class InventoryUtils {
1011

12+
public static boolean hasItem(Player player, ItemStack item, int amount) {
13+
return hasItem(player.getInventory(), item, amount);
14+
}
15+
1116
public static boolean hasItem(Inventory inv, ItemStack item, int amount) {
1217
return inv.containsAtLeast(item, amount);
1318
}
1419

20+
public static boolean addItem(Player player, ItemStack item) {
21+
return addItem(player.getInventory(), item.clone(), item.getAmount());
22+
}
23+
24+
public static boolean addItem(Inventory inventory, ItemStack item) {
25+
return addItem(inventory, item.clone(), item.getAmount());
26+
}
27+
28+
private static boolean addItem(Inventory inventory, ItemStack item, int amount) {
29+
ItemStack[] items = new ItemStack[inventory.getSize()];
30+
for (int i = 0; i < inventory.getSize(); i++) {
31+
if (i >= 36 && i <= 39 && inventory instanceof PlayerInventory) {
32+
items[i] = null;
33+
continue;
34+
}
35+
if (inventory.getItem(i) != null && inventory.getItem(i).getType() != Material.AIR) {
36+
items[i] = inventory.getItem(i).clone();
37+
} else {
38+
items[i] = new ItemStack(Material.AIR);
39+
}
40+
}
41+
boolean success = false;
42+
for (int slot = 0; slot < items.length; slot++) {
43+
ItemStack tmp = items[slot];
44+
if (tmp == null) {
45+
continue;
46+
}
47+
if (item.isSimilar(tmp) && tmp.getAmount() < item.getMaxStackSize()) {
48+
if ((tmp.getAmount() + amount) <= item.getMaxStackSize()) {
49+
tmp.setAmount(amount + tmp.getAmount());
50+
items[slot] = tmp;
51+
success = true;
52+
break;
53+
} else {
54+
amount = amount - (item.getMaxStackSize() - tmp.getAmount());
55+
tmp.setAmount(item.getMaxStackSize());
56+
items[slot] = tmp;
57+
continue;
58+
}
59+
}
60+
}
61+
if (!success) {
62+
for (int i = 0; i < items.length; i++) {
63+
if (items[i] != null && items[i].getType() == Material.AIR) {
64+
item.setAmount(amount);
65+
items[i] = item;
66+
success = true;
67+
break;
68+
}
69+
}
70+
}
71+
if (success) {
72+
for (int i = 0; i < items.length; i++) {
73+
if (items[i] != null && !items[i].equals(inventory.getItem(i))) {
74+
inventory.setItem(i, items[i]);
75+
}
76+
}
77+
return true;
78+
}
79+
return false;
80+
}
81+
1582
public static boolean removeItem(Player player, ItemStack item, int amount) {
16-
Inventory inv = player.getInventory();
17-
ItemStack[] items = new ItemStack[inv.getSize()];
18-
for (int i = 0; i < inv.getSize(); i++) {
19-
if (inv.getItem(i) != null &&
20-
inv.getItem(i).getType() != Material.AIR) {
21-
items[i] = inv.getItem(i).clone();
83+
return removeItem(player.getInventory(), item, amount);
84+
}
85+
86+
public static boolean removeItem(Inventory inventory, ItemStack item, int amount) {
87+
ItemStack[] items = new ItemStack[inventory.getSize()];
88+
for (int i = 0; i < inventory.getSize(); i++) {
89+
if (inventory.getItem(i) != null &&
90+
inventory.getItem(i).getType() != Material.AIR) {
91+
items[i] = inventory.getItem(i).clone();
2292
} else {
2393
items[i] = new ItemStack(Material.AIR);
2494
}
@@ -45,23 +115,55 @@ public static boolean removeItem(Player player, ItemStack item, int amount) {
45115
}
46116
}
47117
if (success) {
48-
player.getInventory().setContents(items);
118+
for (int i = 0; i < items.length; i++) {
119+
if (!items[i].equals(inventory.getItem(i))) {
120+
inventory.setItem(i, items[i]);
121+
}
122+
}
49123
return true;
50124
}
51125
return false;
52126
}
53127

54128
public static int getAmount(Player p, ItemStack item) {
129+
return getAmount(p.getInventory(), item);
130+
}
131+
132+
public static int getAmount(Inventory inventory, ItemStack item) {
55133
int amount = 0;
56-
Inventory inv = p.getInventory();
57-
for (int i = 0; i < inv.getSize(); i++) {
58-
if (inv.getItem(i) != null &&
59-
inv.getItem(i).getType() != Material.AIR &&
60-
inv.getItem(i).isSimilar(item)) {
61-
amount += inv.getItem(i).getAmount();
134+
for (int i = 0; i < inventory.getSize(); i++) {
135+
if (inventory.getItem(i) != null &&
136+
inventory.getItem(i).getType() != Material.AIR &&
137+
inventory.getItem(i).isSimilar(item)) {
138+
amount += inventory.getItem(i).getAmount();
62139
}
63140
}
64141
return amount;
65142
}
66143

144+
public static boolean hasEnoughSpace(Player player, ItemStack item, int amount) {
145+
return hasEnoughSpace(player.getInventory(), item, amount);
146+
}
147+
148+
public static boolean hasEnoughSpace(Inventory inventory, ItemStack item) {
149+
return hasEnoughSpace(inventory, item, item.getAmount());
150+
}
151+
152+
public static boolean hasEnoughSpace(Inventory inventory, ItemStack item, int amount) {
153+
for (int i = 0; i < inventory.getSize(); i++) {
154+
if (i >= 36 && i <= 39 && inventory instanceof PlayerInventory) {
155+
continue;
156+
}
157+
if (inventory.getItem(i) != null && item.isSimilar(inventory.getItem(i)) &&
158+
inventory.getItem(i).getAmount() < item.getMaxStackSize()) {
159+
amount -= item.getMaxStackSize() - inventory.getItem(i).getAmount();
160+
} else if (inventory.getItem(i) == null || inventory.getItem(i).getType() == Material.AIR) {
161+
amount = 0;
162+
}
163+
if (amount < 1) {
164+
return true;
165+
}
166+
}
167+
return false;
168+
}
67169
}

0 commit comments

Comments
 (0)