/
MenusListener.java
86 lines (70 loc) · 3.46 KB
/
MenusListener.java
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
package com.bgsoftware.superiorskyblock.listeners;
import com.bgsoftware.superiorskyblock.SuperiorSkyblockPlugin;
import com.bgsoftware.superiorskyblock.menu.impl.internal.StackedBlocksDepositMenu;
import com.bgsoftware.superiorskyblock.menu.SuperiorMenu;
import com.bgsoftware.superiorskyblock.threads.Executor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@SuppressWarnings("unused")
public final class MenusListener implements Listener {
private final Map<UUID, ItemStack> latestClickedItem = new HashMap<>();
private final SuperiorSkyblockPlugin plugin;
public MenusListener(SuperiorSkyblockPlugin plugin) {
this.plugin = plugin;
}
/**
* The following two events are here for patching a dupe glitch caused
* by shift clicking and closing the inventory in the same time.
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onInventoryClickMonitor(InventoryClickEvent e) {
if (e.getCurrentItem() != null && e.isCancelled() && e.getClickedInventory().getHolder() instanceof SuperiorMenu) {
latestClickedItem.put(e.getWhoClicked().getUniqueId(), e.getCurrentItem());
Executor.sync(() -> latestClickedItem.remove(e.getWhoClicked().getUniqueId()), 20L);
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onInventoryCloseMonitor(InventoryCloseEvent e) {
if (latestClickedItem.containsKey(e.getPlayer().getUniqueId())) {
ItemStack clickedItem = latestClickedItem.get(e.getPlayer().getUniqueId());
Executor.sync(() -> {
e.getPlayer().getInventory().removeItem(clickedItem);
((Player) e.getPlayer()).updateInventory();
}, 1L);
}
}
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onMenuClick(InventoryClickEvent e) {
if (!(e.getWhoClicked() instanceof Player) || e.getView().getTopInventory() == null ||
e.getClickedInventory() == null)
return;
InventoryHolder inventoryHolder = e.getView().getTopInventory().getHolder();
if (inventoryHolder instanceof SuperiorMenu) {
e.setCancelled(true);
if (e.getClickedInventory().equals(e.getView().getTopInventory()))
((SuperiorMenu) inventoryHolder).onClick(plugin, e);
} else if (inventoryHolder instanceof StackedBlocksDepositMenu) {
((StackedBlocksDepositMenu) inventoryHolder).onInteract(e);
}
}
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onMenuClose(InventoryCloseEvent e) {
InventoryHolder inventoryHolder = e.getInventory() == null ? null : e.getInventory().getHolder();
if (!(e.getPlayer() instanceof Player))
return;
if (inventoryHolder instanceof SuperiorMenu) {
((SuperiorMenu) inventoryHolder).closeInventory(plugin, plugin.getPlayers().getSuperiorPlayer(e.getPlayer()));
} else if (inventoryHolder instanceof StackedBlocksDepositMenu) {
((StackedBlocksDepositMenu) inventoryHolder).onClose(e);
}
}
}