Skip to content

Commit efe9a14

Browse files
committed
prevent taking items from chest while POS GUI is open
1 parent e02a0a4 commit efe9a14

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

src/main/java/pro/cloudnode/smp/bankaccounts/POS.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.Arrays;
2727
import java.util.Comparator;
2828
import java.util.Date;
29+
import java.util.HashMap;
2930
import java.util.Objects;
3031
import java.util.Optional;
3132
import java.util.UUID;
@@ -66,6 +67,8 @@ public final class POS {
6667
*/
6768
public final @NotNull Date created;
6869

70+
public final static @NotNull HashMap<@NotNull Inventory, @NotNull POS> activePosChestGuis = new HashMap<>();
71+
6972
/**
7073
* Create new POS instance
7174
*
@@ -118,6 +121,15 @@ public POS(final @NotNull ResultSet rs) throws @NotNull SQLException, @NotNull I
118121
return getLocation().getBlock();
119122
}
120123

124+
/**
125+
* Get POS chest
126+
*/
127+
public @Nullable Chest getChest() {
128+
if (getBlock().getState() instanceof final @NotNull Chest chest) return chest;
129+
delete();
130+
return null;
131+
}
132+
121133
/**
122134
* Create POS id
123135
*/
@@ -263,6 +275,7 @@ public static void openOwnerGui(final @NotNull Player player, final @NotNull Che
263275
final int extraRows = 1;
264276
final int size = extraRows * 9 + items.length + 9 - items.length % 9;
265277
final @NotNull Inventory gui = BankAccounts.getInstance().getServer().createInventory(null, size, BankAccounts.getInstance().config().posTitle(pos));
278+
POS.activePosChestGuis.put(gui, pos);
266279
gui.addItem(items);
267280

268281
final @NotNull ItemStack overview = new ItemStack(BankAccounts.getInstance().config().posInfoMaterial(), 1);
@@ -308,6 +321,7 @@ public static void openBuyGui(final @NotNull Player player, final @NotNull Chest
308321
final int extraRows = 1;
309322
final int size = extraRows * 9 + items.length + 9 - items.length % 9;
310323
final @NotNull Inventory gui = BankAccounts.getInstance().getServer().createInventory(null, size, BankAccounts.getInstance().config().posTitle(pos));
324+
POS.activePosChestGuis.put(gui, pos);
311325
gui.addItem(items);
312326

313327
final @NotNull ItemStack overview = new ItemStack(BankAccounts.getInstance().config().posInfoMaterial(), 1);

src/main/java/pro/cloudnode/smp/bankaccounts/events/GUI.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
import org.bukkit.block.Chest;
66
import org.bukkit.entity.Player;
77
import org.bukkit.event.EventHandler;
8+
import org.bukkit.event.EventPriority;
89
import org.bukkit.event.Listener;
910
import org.bukkit.event.inventory.ClickType;
1011
import org.bukkit.event.inventory.InventoryClickEvent;
12+
import org.bukkit.event.inventory.InventoryCloseEvent;
1113
import org.bukkit.event.inventory.InventoryDragEvent;
14+
import org.bukkit.event.inventory.InventoryMoveItemEvent;
1215
import org.bukkit.inventory.Inventory;
1316
import org.bukkit.inventory.ItemStack;
1417
import org.bukkit.persistence.PersistentDataContainer;
@@ -152,6 +155,32 @@ public void onInventoryClick(final @NotNull InventoryDragEvent event) {
152155
event.setCancelled(true);
153156
}
154157

158+
/**
159+
* Detect changes in items of POS chest while a POS GUI is opened and prevent the item change.
160+
* POS items can still be modified if no POS GUI is opened for that POS.
161+
*/
162+
@EventHandler(priority = EventPriority.HIGHEST)
163+
public void posItemsChangeWhileOpened(final @NotNull InventoryMoveItemEvent event) {
164+
final @NotNull Inventory inventory = event.getSource();
165+
for (final @NotNull POS pos : POS.activePosChestGuis.values()) {
166+
final @Nullable Chest chest = pos.getChest();
167+
if (chest == null) continue;
168+
if (inventory.equals(chest.getInventory())) {
169+
event.setCancelled(true);
170+
return;
171+
}
172+
}
173+
}
174+
175+
/**
176+
* POS GUI closed
177+
*/
178+
@EventHandler
179+
public void posGuiClosed(final @NotNull InventoryCloseEvent event) {
180+
if (!POS.activePosChestGuis.containsKey(event.getInventory())) return;
181+
POS.activePosChestGuis.remove(event.getInventory());
182+
}
183+
155184
public final static @NotNull HashMap<@NotNull String, @NotNull NamespacedKey[]> keys = new HashMap<>() {{
156185
put("pos-owner", new NamespacedKey[]{BankAccounts.Key.POS_OWNER_GUI});
157186
put("pos-buyer", new NamespacedKey[]{BankAccounts.Key.POS_BUYER_GUI_CONFIRM, BankAccounts.Key.POS_BUYER_GUI, BankAccounts.Key.POS_BUYER_GUI_CANCEL});

0 commit comments

Comments
 (0)