26 private JavaPlugin plugin;
27 private PluginManager pluginManager;
29 private Map<UUID, SmartInventory> inventories;
30 private Map<UUID, InventoryContents> contents;
32 private List<InventoryOpener> defaultOpeners;
33 private List<InventoryOpener> openers;
37 this.pluginManager = Bukkit.getPluginManager();
39 this.inventories =
new HashMap<>();
40 this.contents =
new HashMap<>();
42 this.defaultOpeners = Arrays.asList(
43 new ChestInventoryOpener(),
44 new SpecialInventoryOpener()
47 this.openers =
new ArrayList<>();
51 pluginManager.registerEvents(
new InvListener(), plugin);
53 new InvTask().runTaskTimer(plugin, 1, 1);
56 public Optional<InventoryOpener>
findOpener(InventoryType type) {
57 Optional<InventoryOpener> opInv = this.openers.stream()
58 .filter(opener -> opener.supports(type))
61 if (!opInv.isPresent()) {
62 opInv = this.defaultOpeners.stream()
63 .filter(opener -> opener.supports(type))
71 this.openers.addAll(Arrays.asList(openers));
75 List<Player> list =
new ArrayList<>();
77 this.inventories.forEach((player, playerInv) -> {
78 if (inv.equals(playerInv))
79 list.add(Bukkit.getPlayer(player));
86 return Optional.ofNullable(this.inventories.get(p.getUniqueId()));
91 this.inventories.remove(p.getUniqueId());
94 this.inventories.put(p.getUniqueId(), inv);
100 return Optional.ofNullable(this.contents.get(p.getUniqueId()));
103 protected void setContents(Player p, InventoryContents contents) {
104 if (contents ==
null)
105 this.contents.remove(p.getUniqueId());
107 this.contents.put(p.getUniqueId(), contents);
111 inventory.
close(player);
113 Bukkit.getLogger().log(Level.SEVERE,
"Error while opening SmartInventory:", exception);
117 inventory.
close(player);
119 Bukkit.getLogger().log(Level.SEVERE,
"Error while updating SmartInventory:", exception);
122 @SuppressWarnings(
"unchecked")
123 class InvListener implements Listener {
125 @EventHandler(priority = EventPriority.LOW)
126 public
void onInventoryClick(InventoryClickEvent e) {
127 Player p = (Player) e.getWhoClicked();
129 Bukkit.getConsoleSender().sendMessage(NamedTextColor.RED +
"looking for inventory");
131 if (!inventories.containsKey(p.getUniqueId()))
134 Inventory clickedInventory = e.getClickedInventory();
139 Bukkit.getConsoleSender().sendMessage(NamedTextColor.RED +
"checking is bottom clickable");
141 Bukkit.getConsoleSender().sendMessage(NamedTextColor.RED +
"checking Is bottom ivnentory");
142 if (clickedInventory == p.getOpenInventory().getBottomInventory()) {
143 Bukkit.getConsoleSender().sendMessage(NamedTextColor.RED +
"Is bottom ivnentory");
144 if (e.getAction() == InventoryAction.COLLECT_TO_CURSOR || e.getAction() == InventoryAction.MOVE_TO_OTHER_INVENTORY) {
145 int slot = e.getSlot();
150 if (e.getAction() == InventoryAction.NOTHING && e.getClick() != ClickType.MIDDLE) {
151 e.setCancelled(
true);
157 Bukkit.getConsoleSender().sendMessage(NamedTextColor.RED +
"checking top ivnentory");
158 if (clickedInventory == p.getOpenInventory().getTopInventory()) {
159 int slot = e.getSlot();
160 Bukkit.getConsoleSender().sendMessage(NamedTextColor.RED +
"Is top ivnentory");
162 e.setCancelled(
true);
164 int row = e.getSlot() / 9;
165 int column = e.getSlot() % 9;
167 if (row < 0 || column < 0)
170 SmartInventory inv = inventories.get(p.getUniqueId());
172 if (row >= inv.getRows() || column >= inv.getColumns())
175 Bukkit.getConsoleSender().sendMessage(NamedTextColor.RED +
"FIRE CLICK");
176 inv.getListeners().stream()
177 .filter(listener -> listener.getType() == InventoryClickEvent.class)
178 .forEach(listener -> ((InventoryListener<InventoryClickEvent>) listener).accept(e));
180 contents.get(p.getUniqueId()).
get(row, column).ifPresent(item -> item.run(e));
187 @EventHandler(priority = EventPriority.LOW)
188 public
void onInventoryDrag(InventoryDragEvent e) {
189 Player p = (Player) e.getWhoClicked();
191 if (!inventories.containsKey(p.getUniqueId()))
194 SmartInventory smartInventory = inventories.get(p.getUniqueId());
196 for (
int slot : e.getRawSlots()) {
197 if (slot >= p.getOpenInventory().getTopInventory().getSize())
200 if(!smartInventory.getClickableTiles().contains(slot)) e.setCancelled(
true);
204 smartInventory.getListeners().stream()
205 .filter(listener -> listener.getType() == InventoryDragEvent.class)
206 .forEach(listener -> ((InventoryListener<InventoryDragEvent>) listener).accept(e));
209 @EventHandler(priority = EventPriority.LOW)
210 public
void onInventoryOpen(InventoryOpenEvent e) {
211 Player p = (Player) e.getPlayer();
213 if (!inventories.containsKey(p.getUniqueId()))
216 SmartInventory inv = inventories.get(p.getUniqueId());
218 inv.getListeners().stream()
219 .filter(listener -> listener.getType() == InventoryOpenEvent.class)
220 .forEach(listener -> ((InventoryListener<InventoryOpenEvent>) listener).accept(e));
223 @EventHandler(priority = EventPriority.LOW)
224 public
void onInventoryClose(InventoryCloseEvent e) {
225 Player p = (Player) e.getPlayer();
227 if (!inventories.containsKey(p.getUniqueId()))
230 SmartInventory inv = inventories.get(p.getUniqueId());
232 inv.getListeners().stream()
233 .filter(listener -> listener.getType() == InventoryCloseEvent.class)
234 .forEach(listener -> ((InventoryListener<InventoryCloseEvent>) listener).accept(e));
236 inv.getProvider().closeinventory(p, contents.get(p.getUniqueId()), e.getView().getTopInventory());
238 if (inv.isCloseable()) {
239 e.getInventory().clear();
240 inventories.remove(p.getUniqueId());
241 contents.remove(p.getUniqueId());
243 Bukkit.getScheduler().runTask(plugin, () -> p.openInventory(e.getInventory()));
246 @EventHandler(priority = EventPriority.LOW)
247 public
void onPlayerQuit(PlayerQuitEvent e) {
248 Player p = e.getPlayer();
250 if (!inventories.containsKey(p.getUniqueId()))
253 SmartInventory inv = inventories.get(p.getUniqueId());
255 inv.getListeners().stream()
256 .filter(listener -> listener.getType() == PlayerQuitEvent.class)
257 .forEach(listener -> ((InventoryListener<PlayerQuitEvent>) listener).accept(e));
259 inventories.remove(p.getUniqueId());
260 contents.remove(p.getUniqueId());
263 @EventHandler(priority = EventPriority.LOW)
264 public
void onPluginDisable(PluginDisableEvent e) {
265 new HashMap<>(inventories).forEach((player, inv) -> {
266 inv.getListeners().stream()
267 .filter(listener -> listener.getType() == PluginDisableEvent.class)
268 .forEach(listener -> ((InventoryListener<PluginDisableEvent>) listener).accept(e));
270 inv.close(Bukkit.getPlayer(player));
279 class InvTask
extends BukkitRunnable {
283 new HashMap<>(inventories).forEach((uuid, inv) -> {
284 Player player = Bukkit.getPlayer(uuid);
287 inv.getProvider().update(player, contents.get(uuid));
288 }
catch (Exception e) {