Skip to content

Commit d6b616e

Browse files
committed
GUI Implementation
+ extended `/core reload`
1 parent 6dbc4f4 commit d6b616e

File tree

8 files changed

+459
-11
lines changed

8 files changed

+459
-11
lines changed

src/main/java/io/github/divinerealms/core/commands/CoreCommand.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.bukkit.command.TabCompleter;
1010

1111
import java.util.ArrayList;
12+
import java.util.Arrays;
1213
import java.util.Collections;
1314
import java.util.List;
1415

@@ -31,11 +32,29 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
3132

3233
String sub = args[0].toLowerCase();
3334
if (sub.equalsIgnoreCase("reload")) {
35+
if (args.length == 1) { logger.send(sender, Lang.HELP.replace(null)); return true; }
3436
if (!sender.hasPermission(PERM_RELOAD)) { logger.send(sender, Lang.NO_PERM.replace(new String[]{PERM_RELOAD, label + " " + sub})); return true; }
3537

36-
coreManager.reload();
37-
logger.send(sender, Lang.ADMIN_RELOAD.replace(null));
38-
return true;
38+
switch (args[1].toLowerCase()) {
39+
case "menus":
40+
coreManager.getGuiManager().reloadMenus();
41+
logger.send(sender, "&aMenus reloaded!");
42+
return true;
43+
44+
case "configs":
45+
coreManager.getConfigManager().reloadAllConfigs();
46+
logger.send(sender, "&aConfigs reloaded!");
47+
return true;
48+
49+
case "all":
50+
coreManager.reload();
51+
logger.send(sender, Lang.ADMIN_RELOAD.replace(null));
52+
return true;
53+
54+
default:
55+
logger.send(sender, Lang.USAGE.replace(new String[]{label + " " + sub + " <menus|configs|all>"}));
56+
return true;
57+
}
3958
}
4059

4160
logger.send(sender, Lang.UNKNOWN_COMMAND.replace(null));
@@ -49,6 +68,7 @@ public List<String> onTabComplete(CommandSender sender, Command command, String
4968
List<String> completions = new ArrayList<>();
5069

5170
if (args.length == 1) completions.add("reload");
71+
if (args.length == 2) completions.addAll(Arrays.asList("menus", "configs", "all"));
5272

5373
if (!completions.isEmpty()) {
5474
String lastWord = args[args.length - 1].toLowerCase();
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.github.divinerealms.core.gui;
2+
3+
import lombok.Getter;
4+
import org.bukkit.entity.Player;
5+
import org.bukkit.event.inventory.InventoryClickEvent;
6+
import org.bukkit.inventory.ItemStack;
7+
8+
import java.util.function.Consumer;
9+
import java.util.function.Function;
10+
11+
@Getter
12+
public class InventoryButton {
13+
private Function<Player, ItemStack> iconCreator;
14+
private Consumer<InventoryClickEvent> eventConsumer;
15+
16+
public InventoryButton creator(Function<Player, ItemStack> iconCreator) {
17+
this.iconCreator = iconCreator;
18+
return this;
19+
}
20+
21+
public InventoryButton consumer(Consumer<InventoryClickEvent> eventConsumer) {
22+
this.eventConsumer = eventConsumer;
23+
return this;
24+
}
25+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package io.github.divinerealms.core.gui;
2+
3+
import lombok.Getter;
4+
import me.clip.placeholderapi.PlaceholderAPI;
5+
import org.bukkit.entity.Player;
6+
import org.bukkit.event.inventory.InventoryClickEvent;
7+
import org.bukkit.event.inventory.InventoryCloseEvent;
8+
import org.bukkit.event.inventory.InventoryOpenEvent;
9+
import org.bukkit.inventory.Inventory;
10+
import org.bukkit.inventory.InventoryHolder;
11+
import org.bukkit.inventory.ItemStack;
12+
import org.bukkit.inventory.meta.ItemMeta;
13+
14+
import java.util.ArrayList;
15+
import java.util.HashMap;
16+
import java.util.List;
17+
import java.util.Map;
18+
import java.util.function.Function;
19+
20+
public abstract class InventoryGUI implements InventoryHandler, InventoryHolder {
21+
@Getter private final Inventory inventory;
22+
@Getter private final Map<Integer, InventoryButton> buttonMap = new HashMap<>();
23+
24+
public InventoryGUI() {
25+
this.inventory = this.createInventory();
26+
}
27+
28+
public void addButton(int slot, InventoryButton button) {
29+
this.buttonMap.put(slot, button);
30+
}
31+
32+
public void decorate(Player player) {
33+
this.buttonMap.forEach((slot, button) -> {
34+
if (slot < 0 || slot >= this.inventory.getSize()) return;
35+
36+
Function<Player, ItemStack> creator = button.getIconCreator();
37+
if (creator == null) return;
38+
39+
ItemStack stack = creator.apply(player);
40+
if (stack == null) return;
41+
42+
ItemMeta meta = stack.getItemMeta();
43+
if (meta != null) {
44+
if (meta.hasDisplayName()) meta.setDisplayName(applyPlaceholders(player, meta.getDisplayName()));
45+
if (meta.hasLore()) {
46+
List<String> newLore = new ArrayList<>();
47+
for (String line : meta.getLore()) newLore.add(applyPlaceholders(player, line));
48+
meta.setLore(newLore);
49+
}
50+
stack.setItemMeta(meta);
51+
}
52+
53+
this.inventory.setItem(slot, stack);
54+
});
55+
}
56+
57+
public String applyPlaceholders(Player player, String text) {
58+
if (player == null) return text;
59+
try {
60+
return PlaceholderAPI.setPlaceholders(player, text);
61+
} catch (Throwable ignored) {
62+
return text;
63+
}
64+
}
65+
66+
@Override
67+
public void onClick(InventoryClickEvent event) {
68+
event.setCancelled(true);
69+
int slot = event.getSlot();
70+
InventoryButton button = this.buttonMap.get(slot);
71+
if (button != null && button.getEventConsumer() != null) button.getEventConsumer().accept(event);
72+
}
73+
74+
@Override
75+
public void onOpen(InventoryOpenEvent event) {
76+
this.decorate((Player) event.getPlayer());
77+
}
78+
79+
@Override
80+
public void onClose(InventoryCloseEvent event) {
81+
}
82+
83+
public void clear() {
84+
this.buttonMap.clear();
85+
this.inventory.clear();
86+
}
87+
88+
protected abstract Inventory createInventory();
89+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.github.divinerealms.core.gui;
2+
3+
import org.bukkit.event.inventory.InventoryClickEvent;
4+
import org.bukkit.event.inventory.InventoryCloseEvent;
5+
import org.bukkit.event.inventory.InventoryOpenEvent;
6+
7+
public interface InventoryHandler {
8+
void onClick(InventoryClickEvent event);
9+
void onOpen(InventoryOpenEvent event);
10+
void onClose(InventoryCloseEvent event);
11+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package io.github.divinerealms.core.listeners;
2+
3+
import io.github.divinerealms.core.gui.InventoryGUI;
4+
import org.bukkit.event.EventHandler;
5+
import org.bukkit.event.Listener;
6+
import org.bukkit.event.inventory.InventoryClickEvent;
7+
import org.bukkit.event.inventory.InventoryCloseEvent;
8+
import org.bukkit.event.inventory.InventoryOpenEvent;
9+
10+
public class GUIListener implements Listener {
11+
@EventHandler
12+
public void onInventoryClick(InventoryClickEvent event) {
13+
if (event.getInventory().getHolder() instanceof InventoryGUI) {
14+
InventoryGUI gui = (InventoryGUI) event.getInventory().getHolder();
15+
gui.onClick(event);
16+
}
17+
}
18+
19+
@EventHandler
20+
public void onInventoryOpen(InventoryOpenEvent event) {
21+
if (event.getInventory().getHolder() instanceof InventoryGUI) {
22+
InventoryGUI gui = (InventoryGUI) event.getInventory().getHolder();
23+
gui.onOpen(event);
24+
}
25+
}
26+
27+
@EventHandler
28+
public void onInventoryClose(InventoryCloseEvent event) {
29+
if (event.getInventory().getHolder() instanceof InventoryGUI) {
30+
InventoryGUI gui = (InventoryGUI) event.getInventory().getHolder();
31+
gui.onClose(event);
32+
}
33+
}
34+
}

src/main/java/io/github/divinerealms/core/main/CoreManager.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public class CoreManager {
3434
private final ResultManager resultManager;
3535
private final PlayerSettingsManager playerSettingsManager;
3636
private final PlaytimeManager playtimeManager;
37+
private final GUIManager guiManager;
3738

3839
private final Set<String> registeredCommands = new HashSet<>();
3940

@@ -59,6 +60,7 @@ public CoreManager(Plugin plugin) throws IllegalStateException {
5960
this.resultManager = new ResultManager(this);
6061
this.playerSettingsManager = new PlayerSettingsManager(this);
6162
this.playtimeManager = new PlaytimeManager(this);
63+
this.guiManager = new GUIManager(this);
6264

6365
this.reload();
6466
}
@@ -70,6 +72,7 @@ public void reload() {
7072
channelManager.reloadAll();
7173
registerCommands();
7274
getListenerManager().registerAll();
75+
guiManager.reloadMenus();
7376
}
7477

7578
public void registerCommands() {
@@ -90,13 +93,13 @@ public void registerCommands() {
9093
registerCommand(commandMap, "rosters", new BukkitCommandWrapper("rosters", new RostersCommand(this), Collections.singletonList("rt")));
9194
registerCommand(commandMap, "proxycheck", new BukkitCommandWrapper("proxycheck", new ProxyCheckCommand(this), Collections.singletonList("proxy")));
9295

93-
for (ChannelManager.ChannelInfo info : channelManager.getChannels().values()) {
94-
if (info.name.equalsIgnoreCase("global")) continue;
95-
if (info.permission.startsWith("tab.group.")) continue;
96+
channelManager.getChannels().values().forEach(info -> {
97+
if (info.name.equalsIgnoreCase("global")) return;
98+
if (info.permission.startsWith("tab.group.")) return;
9699

97100
DynamicChannelBukkitCommand dynamicCommand = new DynamicChannelBukkitCommand(info, channelManager, logger);
98101
registerCommand(commandMap, dynamicCommand.getName(), dynamicCommand);
99-
}
102+
});
100103

101104
logger.info("&a✔ &9Registered &e" + registeredCommands.size() + " &9commands.");
102105
} catch (Exception exception) {

src/main/java/io/github/divinerealms/core/main/ListenerManager.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package io.github.divinerealms.core.main;
22

33
import github.scarsz.discordsrv.DiscordSRV;
4-
import io.github.divinerealms.core.listeners.ChatChannelListener;
5-
import io.github.divinerealms.core.listeners.ClientBlockerListener;
6-
import io.github.divinerealms.core.listeners.DiscordMessageListener;
7-
import io.github.divinerealms.core.listeners.PlayerEvents;
4+
import io.github.divinerealms.core.listeners.*;
85
import lombok.Getter;
96
import org.bukkit.Server;
107
import org.bukkit.event.HandlerList;
@@ -18,6 +15,7 @@ public class ListenerManager {
1815

1916
private ClientBlockerListener clientBlockerListener;
2017
private DiscordMessageListener discordMessageListener;
18+
private GUIListener guiListener;
2119

2220
public ListenerManager(CoreManager coreManager) {
2321
this.coreManager = coreManager;
@@ -50,6 +48,16 @@ public void unregisterAll() {
5048
disableClientBlocker();
5149
}
5250

51+
public void enableMenuListener() {
52+
guiListener = new GUIListener();
53+
server.getPluginManager().registerEvents(guiListener, plugin);
54+
}
55+
56+
public void disableMenuListener() {
57+
HandlerList.unregisterAll(guiListener);
58+
guiListener = null;
59+
}
60+
5361
public void enableClientBlocker() {
5462
if (clientBlockerListener != null) return;
5563

0 commit comments

Comments
 (0)