|
1 | 1 | package com.marcusslover.plus.lib.item; |
2 | 2 |
|
3 | | -import com.marcusslover.plus.lib.events.EventReference; |
4 | | -import com.marcusslover.plus.lib.events.Events; |
5 | 3 | import com.marcusslover.plus.lib.item.Button.DetectableArea; |
6 | 4 | import com.marcusslover.plus.lib.item.Canvas.ItemDecorator; |
7 | 5 | import com.marcusslover.plus.lib.item.event.PlayerMenuOpenEvent; |
8 | 6 | import org.bukkit.Bukkit; |
9 | 7 | import org.bukkit.entity.Player; |
| 8 | +import org.bukkit.event.EventHandler; |
| 9 | +import org.bukkit.event.HandlerList; |
| 10 | +import org.bukkit.event.Listener; |
10 | 11 | import org.bukkit.event.inventory.InventoryClickEvent; |
11 | 12 | import org.bukkit.event.inventory.InventoryCloseEvent; |
12 | 13 | import org.bukkit.inventory.Inventory; |
|
19 | 20 | import java.util.List; |
20 | 21 | import java.util.Set; |
21 | 22 |
|
22 | | -public final class MenuManager { |
| 23 | +public final class MenuManager implements Listener { |
23 | 24 | private final @NotNull Plugin plugin; |
24 | 25 | private final @NotNull List<@NotNull Menu> menus = new LinkedList<>(); |
25 | 26 |
|
26 | | - private final @NotNull EventReference<InventoryCloseEvent> closeEvent; |
27 | | - private final @NotNull EventReference<InventoryClickEvent> clickEvent; |
28 | | - |
29 | 27 | // Global click context |
30 | 28 | private @Nullable Canvas.GenericClick genericClick = null; |
31 | 29 |
|
32 | 30 | public MenuManager(@NotNull Plugin plugin) { |
33 | 31 | this.plugin = plugin; |
34 | | - this.closeEvent = Events.listen(InventoryCloseEvent.class).handler(event -> { |
35 | | - InventoryView view = event.getView(); |
36 | | - Inventory inventory = view.getTopInventory(); |
37 | | - Player player = (Player) event.getPlayer(); |
| 32 | + Bukkit.getPluginManager().registerEvents(this, plugin); |
| 33 | + } |
38 | 34 |
|
39 | | - if (!(inventory.getHolder() instanceof Canvas canvas)) { |
40 | | - return; |
41 | | - } |
| 35 | + @EventHandler |
| 36 | + public void onClose(InventoryCloseEvent event) { |
| 37 | + InventoryView view = event.getView(); |
| 38 | + Inventory inventory = view.getTopInventory(); |
| 39 | + Player player = (Player) event.getPlayer(); |
42 | 40 |
|
43 | | - // empty or invalid inventory shouldn't be handled |
44 | | - if (canvas.assosiatedInventory() == null) return; |
| 41 | + if (!(inventory.getHolder() instanceof Canvas canvas)) { |
| 42 | + return; |
| 43 | + } |
45 | 44 |
|
46 | | - // handle the close event action |
47 | | - Canvas.ClickContext closeInventory = canvas.closeInventory(); |
48 | | - if (closeInventory != null) { |
49 | | - Canvas.CloseInventory function = closeInventory.closeInventory(); |
50 | | - if (function != null) { |
51 | | - try { |
52 | | - function.onClose(player, event, canvas); |
53 | | - } catch (Throwable e) { |
54 | | - if (closeInventory.throwableConsumer() != null) { |
55 | | - closeInventory.throwableConsumer().accept(e); |
56 | | - } else { |
57 | | - Bukkit.getLogger().warning(e.getMessage()); |
58 | | - } |
| 45 | + // empty or invalid inventory shouldn't be handled |
| 46 | + if (canvas.assosiatedInventory() == null) return; |
| 47 | + |
| 48 | + // handle the close event action |
| 49 | + Canvas.ClickContext closeInventory = canvas.closeInventory(); |
| 50 | + if (closeInventory != null) { |
| 51 | + Canvas.CloseInventory function = closeInventory.closeInventory(); |
| 52 | + if (function != null) { |
| 53 | + try { |
| 54 | + function.onClose(player, event, canvas); |
| 55 | + } catch (Throwable e) { |
| 56 | + if (closeInventory.throwableConsumer() != null) { |
| 57 | + closeInventory.throwableConsumer().accept(e); |
| 58 | + } else { |
| 59 | + Bukkit.getLogger().warning(e.getMessage()); |
59 | 60 | } |
60 | 61 | } |
61 | 62 | } |
| 63 | + } |
62 | 64 |
|
63 | | - Menu menu = canvas.assosiatedMenu(); |
64 | | - Canvas remove = menu.canvasMap().remove(player.getUniqueId()); |
65 | | - if (remove != null) { |
66 | | - remove.clear(); // help the gc |
67 | | - } |
68 | | - menu.close(canvas, player); // call the close method so developers can handle it |
| 65 | + Menu menu = canvas.assosiatedMenu(); |
| 66 | + Canvas remove = menu.canvasMap().remove(player.getUniqueId()); |
| 67 | + if (remove != null) { |
| 68 | + remove.clear(); // help the gc |
| 69 | + } |
| 70 | + menu.close(canvas, player); // call the close method so developers can handle it |
| 71 | + } |
69 | 72 |
|
70 | | - }).asRegistered(plugin); |
| 73 | + @EventHandler |
| 74 | + public void onClick(InventoryClickEvent event) { |
| 75 | + InventoryView view = event.getView(); |
| 76 | + Inventory inventory = view.getTopInventory(); |
71 | 77 |
|
72 | | - this.clickEvent = Events.listen(InventoryClickEvent.class).handler(event -> { |
73 | | - InventoryView view = event.getView(); |
74 | | - Inventory inventory = view.getTopInventory(); |
| 78 | + if (!(inventory.getHolder() instanceof Canvas canvas)) { |
| 79 | + return; |
| 80 | + } |
75 | 81 |
|
76 | | - if (!(inventory.getHolder() instanceof Canvas canvas)) { |
77 | | - return; |
78 | | - } |
| 82 | + event.setCancelled(true); |
| 83 | + int slot = event.getRawSlot(); |
| 84 | + int size = inventory.getSize(); |
79 | 85 |
|
80 | | - event.setCancelled(true); |
81 | | - int slot = event.getRawSlot(); |
82 | | - int size = inventory.getSize(); |
| 86 | + Item item = Item.of(event.getCurrentItem()); |
83 | 87 |
|
84 | | - Item item = Item.of(event.getCurrentItem()); |
| 88 | + // handle the generic click context (global) |
| 89 | + if (this.genericClick != null) { |
| 90 | + try { |
| 91 | + this.genericClick.onClick((Player) event.getWhoClicked(), item, event, canvas); |
| 92 | + } catch (Throwable e) { |
| 93 | + Bukkit.getLogger().warning(e.getMessage()); |
| 94 | + } |
| 95 | + } |
85 | 96 |
|
86 | | - // handle the generic click context (global) |
87 | | - if (this.genericClick != null) { |
| 97 | + Canvas.ClickContext genericClick = canvas.genericClick(); |
| 98 | + if (genericClick != null) { |
| 99 | + Canvas.ButtonClick buttonClick = genericClick.click(); |
| 100 | + if (buttonClick != null) { |
88 | 101 | try { |
89 | | - this.genericClick.onClick((Player) event.getWhoClicked(), item, event, canvas); |
| 102 | + buttonClick.onClick((Player) event.getWhoClicked(), item, event, canvas); |
90 | 103 | } catch (Throwable e) { |
91 | | - Bukkit.getLogger().warning(e.getMessage()); |
| 104 | + if (genericClick.throwableConsumer() != null) { |
| 105 | + genericClick.throwableConsumer().accept(e); |
| 106 | + } else { |
| 107 | + Bukkit.getLogger().warning(e.getMessage()); |
| 108 | + } |
92 | 109 | } |
93 | 110 | } |
| 111 | + } |
94 | 112 |
|
95 | | - Canvas.ClickContext genericClick = canvas.genericClick(); |
96 | | - if (genericClick != null) { |
97 | | - Canvas.ButtonClick buttonClick = genericClick.click(); |
| 113 | + if (slot > size) { |
| 114 | + Canvas.ClickContext selfInventory = canvas.selfInventory(); |
| 115 | + if (selfInventory != null) { |
| 116 | + Canvas.ButtonClick buttonClick = selfInventory.click(); |
98 | 117 | if (buttonClick != null) { |
99 | 118 | try { |
100 | 119 | buttonClick.onClick((Player) event.getWhoClicked(), item, event, canvas); |
101 | 120 | } catch (Throwable e) { |
102 | | - if (genericClick.throwableConsumer() != null) { |
103 | | - genericClick.throwableConsumer().accept(e); |
| 121 | + if (selfInventory.throwableConsumer() != null) { |
| 122 | + selfInventory.throwableConsumer().accept(e); |
104 | 123 | } else { |
105 | 124 | Bukkit.getLogger().warning(e.getMessage()); |
106 | 125 | } |
107 | 126 | } |
108 | 127 | } |
109 | 128 | } |
| 129 | + return; |
| 130 | + } |
110 | 131 |
|
111 | | - if (slot > size) { |
112 | | - Canvas.ClickContext selfInventory = canvas.selfInventory(); |
113 | | - if (selfInventory != null) { |
114 | | - Canvas.ButtonClick buttonClick = selfInventory.click(); |
115 | | - if (buttonClick != null) { |
116 | | - try { |
117 | | - buttonClick.onClick((Player) event.getWhoClicked(), item, event, canvas); |
118 | | - } catch (Throwable e) { |
119 | | - if (selfInventory.throwableConsumer() != null) { |
120 | | - selfInventory.throwableConsumer().accept(e); |
121 | | - } else { |
122 | | - Bukkit.getLogger().warning(e.getMessage()); |
123 | | - } |
124 | | - } |
| 132 | + canvas.buttons().stream() |
| 133 | + .filter(button -> button.within(slot)) |
| 134 | + .findFirst() |
| 135 | + .ifPresent(button -> { |
| 136 | + Player player = (Player) event.getWhoClicked(); |
| 137 | + Canvas.ClickContext context = button.clickContext(); |
| 138 | + if (context == null) { |
| 139 | + return; |
125 | 140 | } |
126 | | - } |
127 | | - return; |
128 | | - } |
129 | | - |
130 | | - canvas.buttons().stream() |
131 | | - .filter(button -> button.within(slot)) |
132 | | - .findFirst() |
133 | | - .ifPresent(button -> { |
134 | | - Player player = (Player) event.getWhoClicked(); |
135 | | - Canvas.ClickContext context = button.clickContext(); |
136 | | - if (context == null) { |
137 | | - return; |
138 | | - } |
139 | | - Canvas.ButtonClick click = context.click(); |
140 | | - if (click == null) { |
141 | | - return; |
142 | | - } |
143 | | - try { |
144 | | - click.onClick(player, item, event, canvas); |
145 | | - } catch (Throwable e) { |
146 | | - if (context.throwableConsumer() != null) { |
147 | | - context.throwableConsumer().accept(e); |
148 | | - } else { |
149 | | - Bukkit.getLogger().warning(e.getMessage()); |
150 | | - } |
| 141 | + Canvas.ButtonClick click = context.click(); |
| 142 | + if (click == null) { |
| 143 | + return; |
| 144 | + } |
| 145 | + try { |
| 146 | + click.onClick(player, item, event, canvas); |
| 147 | + } catch (Throwable e) { |
| 148 | + if (context.throwableConsumer() != null) { |
| 149 | + context.throwableConsumer().accept(e); |
| 150 | + } else { |
| 151 | + Bukkit.getLogger().warning(e.getMessage()); |
151 | 152 | } |
152 | | - }); |
153 | | - }).asRegistered(plugin); |
| 153 | + } |
| 154 | + }); |
154 | 155 | } |
155 | 156 |
|
156 | 157 | @Deprecated |
@@ -370,7 +371,6 @@ private void updateInventory(@NotNull Player player, @NotNull Inventory inventor |
370 | 371 | */ |
371 | 372 | public void clearMenus() { |
372 | 373 | this.menus.clear(); |
373 | | - this.clickEvent.unregister(); |
374 | | - this.closeEvent.unregister(); |
| 374 | + HandlerList.unregisterAll(this); |
375 | 375 | } |
376 | 376 | } |
0 commit comments