Skip to content

Commit 02eaa42

Browse files
authored
Entirely prevent modifying POS items while a player is viewing the POS contents (#149)
2 parents e02a0a4 + 3e43e2e commit 02eaa42

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

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

Lines changed: 16 additions & 2 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
*/
@@ -259,10 +271,11 @@ public void delete() {
259271
* @param pos The POS
260272
*/
261273
public static void openOwnerGui(final @NotNull Player player, final @NotNull Chest chest, final @NotNull POS pos) {
262-
final @NotNull ItemStack @NotNull [] items = Arrays.stream(chest.getInventory().getStorageContents()).filter(Objects::nonNull).toArray(ItemStack[]::new);
274+
final @NotNull ItemStack @NotNull [] items = Arrays.stream(chest.getInventory().getStorageContents()).filter(Objects::nonNull).map(ItemStack::clone).toArray(ItemStack[]::new);
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);
@@ -304,10 +317,11 @@ public static void openOwnerGui(final @NotNull Player player, final @NotNull Che
304317
* @param pos The POS
305318
*/
306319
public static void openBuyGui(final @NotNull Player player, final @NotNull Chest chest, final @NotNull POS pos, final @NotNull Account account) {
307-
final @NotNull ItemStack @NotNull [] items = Arrays.stream(chest.getInventory().getStorageContents()).filter(Objects::nonNull).toArray(ItemStack[]::new);
320+
final @NotNull ItemStack @NotNull [] items = Arrays.stream(chest.getInventory().getStorageContents()).filter(Objects::nonNull).map(ItemStack::clone).toArray(ItemStack[]::new);
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: 31 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,34 @@ 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, ignoreCancelled = true)
163+
public void posItemsChangeWhileOpened(final @NotNull InventoryMoveItemEvent event) {
164+
final @NotNull Inventory source = event.getSource();
165+
final @NotNull Inventory destination = event.getDestination();
166+
for (final @NotNull POS pos : POS.activePosChestGuis.values()) {
167+
final @Nullable Chest chest = pos.getChest();
168+
if (chest == null) continue;
169+
final @NotNull Inventory chestInventory = chest.getInventory();
170+
if (source.equals(chestInventory) || destination.equals(chestInventory)) {
171+
event.setCancelled(true);
172+
return;
173+
}
174+
}
175+
}
176+
177+
/**
178+
* POS GUI closed
179+
*/
180+
@EventHandler
181+
public void posGuiClosed(final @NotNull InventoryCloseEvent event) {
182+
if (!POS.activePosChestGuis.containsKey(event.getInventory())) return;
183+
POS.activePosChestGuis.remove(event.getInventory());
184+
}
185+
155186
public final static @NotNull HashMap<@NotNull String, @NotNull NamespacedKey[]> keys = new HashMap<>() {{
156187
put("pos-owner", new NamespacedKey[]{BankAccounts.Key.POS_OWNER_GUI});
157188
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)