From ef411ac9a1e11977e3e0a6bb922b937153290cc0 Mon Sep 17 00:00:00 2001 From: Len <40720638+destro174@users.noreply.github.com> Date: Mon, 5 Feb 2024 17:09:01 +0100 Subject: [PATCH] Add a base for GUI to manage aspects of the island --- .../cometskyblock/CometSkyBlockPlugin.java | 3 +- .../challenges/ChallengesGUI.java | 17 +++ .../java/com/alttd/cometskyblock/gui/GUI.java | 15 +++ .../alttd/cometskyblock/gui/GUIButton.java | 27 ++++ .../alttd/cometskyblock/gui/GUIInventory.java | 115 ++++++++++++++++++ .../alttd/cometskyblock/gui/GUIListener.java | 64 ++++++++++ .../cometskyblock/island/gui/IslandGUI.java | 17 +++ .../cometskyblock/island/gui/MembersGUI.java | 17 +++ .../cometskyblock/island/gui/SettingsGUI.java | 17 +++ .../cometskyblock/island/gui/UpgradesGUI.java | 17 +++ 10 files changed, 308 insertions(+), 1 deletion(-) create mode 100644 plugin/src/main/java/com/alttd/cometskyblock/challenges/ChallengesGUI.java create mode 100644 plugin/src/main/java/com/alttd/cometskyblock/gui/GUI.java create mode 100644 plugin/src/main/java/com/alttd/cometskyblock/gui/GUIButton.java create mode 100644 plugin/src/main/java/com/alttd/cometskyblock/gui/GUIInventory.java create mode 100644 plugin/src/main/java/com/alttd/cometskyblock/gui/GUIListener.java create mode 100644 plugin/src/main/java/com/alttd/cometskyblock/island/gui/IslandGUI.java create mode 100644 plugin/src/main/java/com/alttd/cometskyblock/island/gui/MembersGUI.java create mode 100644 plugin/src/main/java/com/alttd/cometskyblock/island/gui/SettingsGUI.java create mode 100644 plugin/src/main/java/com/alttd/cometskyblock/island/gui/UpgradesGUI.java diff --git a/plugin/src/main/java/com/alttd/cometskyblock/CometSkyBlockPlugin.java b/plugin/src/main/java/com/alttd/cometskyblock/CometSkyBlockPlugin.java index 069fcc9..a3d998a 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/CometSkyBlockPlugin.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/CometSkyBlockPlugin.java @@ -3,6 +3,7 @@ package com.alttd.cometskyblock; import com.alttd.cometskyblock.commands.challenges.ChallengeCommand; import com.alttd.cometskyblock.commands.island.IslandCommand; import com.alttd.cometskyblock.configuration.*; +import com.alttd.cometskyblock.gui.GUIListener; import com.alttd.cometskyblock.listeners.BedListener; import com.alttd.cometskyblock.listeners.CobbestoneGeneratorListener; import com.alttd.cometskyblock.listeners.PlayerJoinListener; @@ -82,11 +83,11 @@ public class CometSkyBlockPlugin extends JavaPlugin implements CometSkyBlockAPI } public void loadEventListeners() { - // TODO - Use reflection to load all of these final PluginManager pm = getServer().getPluginManager(); pm.registerEvents(new PlayerJoinListener(this), this); pm.registerEvents(new BedListener(this), this); pm.registerEvents(new CobbestoneGeneratorListener(this), this); + pm.registerEvents(new GUIListener(this), this); } } diff --git a/plugin/src/main/java/com/alttd/cometskyblock/challenges/ChallengesGUI.java b/plugin/src/main/java/com/alttd/cometskyblock/challenges/ChallengesGUI.java new file mode 100644 index 0000000..36d0e32 --- /dev/null +++ b/plugin/src/main/java/com/alttd/cometskyblock/challenges/ChallengesGUI.java @@ -0,0 +1,17 @@ +package com.alttd.cometskyblock.challenges; + +import com.alttd.cometskyblock.gui.GUIInventory; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.inventory.Inventory; + +public class ChallengesGUI extends GUIInventory { + + public ChallengesGUI() { + super(); + } + @Override + protected Inventory createInventory() { // TODO - config + return Bukkit.createInventory(this, 54, MiniMessage.miniMessage().deserialize("GUI")); + } +} diff --git a/plugin/src/main/java/com/alttd/cometskyblock/gui/GUI.java b/plugin/src/main/java/com/alttd/cometskyblock/gui/GUI.java new file mode 100644 index 0000000..35c2d71 --- /dev/null +++ b/plugin/src/main/java/com/alttd/cometskyblock/gui/GUI.java @@ -0,0 +1,15 @@ +package com.alttd.cometskyblock.gui; + +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryOpenEvent; + +public interface GUI { + + void onClick(InventoryClickEvent event); + + void onOpen(InventoryOpenEvent event); + + void onClose(InventoryCloseEvent event); + +} diff --git a/plugin/src/main/java/com/alttd/cometskyblock/gui/GUIButton.java b/plugin/src/main/java/com/alttd/cometskyblock/gui/GUIButton.java new file mode 100644 index 0000000..10c54c6 --- /dev/null +++ b/plugin/src/main/java/com/alttd/cometskyblock/gui/GUIButton.java @@ -0,0 +1,27 @@ +package com.alttd.cometskyblock.gui; + +import lombok.Getter; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.function.Consumer; +import java.util.function.Function; + +@Getter +public class GUIButton { + + private Function iconCreator; + private Consumer eventConsumer; + + public GUIButton creator(Function iconCreator) { + this.iconCreator = iconCreator; + return this; + } + + public GUIButton consumer(Consumer eventConsumer) { + this.eventConsumer = eventConsumer; + return this; + } + +} diff --git a/plugin/src/main/java/com/alttd/cometskyblock/gui/GUIInventory.java b/plugin/src/main/java/com/alttd/cometskyblock/gui/GUIInventory.java new file mode 100644 index 0000000..f126df8 --- /dev/null +++ b/plugin/src/main/java/com/alttd/cometskyblock/gui/GUIInventory.java @@ -0,0 +1,115 @@ +package com.alttd.cometskyblock.gui; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryOpenEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +public abstract class GUIInventory implements GUI, InventoryHolder { + + private final Inventory inventory; + private final Map buttons = new HashMap<>(); + int currentSlot = 0; + int pageIndex = 0; + + public GUIInventory() { + this.inventory = this.createInventory(); + } + + protected abstract Inventory createInventory(); + + @Override + public @NotNull Inventory getInventory() { + return inventory; + } + + @Override + public void onClick(InventoryClickEvent event) { + int slot = event.getSlot(); + GUIButton button = this.buttons.get(slot); + if (button != null) { + event.setCancelled(true); + button.eventConsumer().accept(event); + } + } + + @Override + public void onOpen(InventoryOpenEvent event) { + this.decorate((Player) event.getPlayer()); + } + + @Override + public void onClose(InventoryCloseEvent event) { + + } + + public void addButton(int slot, GUIButton button) { + this.buttons.put(slot, button); + } + + public void decorate(Player player) { + this.buttons.forEach((slot, button) -> { + ItemStack icon = button.iconCreator().apply(player); + this.inventory.setItem(slot, icon); + }); + } + + public GUIButton createMenuButton(Material material, String name, List lore, Consumer eventConsumer) { + return new GUIButton() + .creator(player -> createGuiItem(material, name, lore)) + .consumer(eventConsumer); + } + + public ItemStack createGuiItem(Material material, String name, List lore) { + ItemStack item = new ItemStack(material, 1); + ItemMeta meta = item.getItemMeta(); + meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES, ItemFlag.HIDE_ITEM_SPECIFICS, ItemFlag.HIDE_ENCHANTS); + meta.displayName(MiniMessage.miniMessage().deserialize(name)); + + List metaLore = new ArrayList<>(); + for (String loreString : lore) { + metaLore.add(MiniMessage.miniMessage().deserialize(loreString)); + } + + meta.lore(metaLore); + item.setItemMeta(meta); + return item; + } + + void makeMenuBar() { + for (int i = inventory.getSize() - 9; i < inventory.getSize(); ++i) { + addButton(i, createMenuButton(Material.BLACK_STAINED_GLASS_PANE, "", new ArrayList<>(), event -> {})); + } + } + + public void open(Player player) { + if (player != null) { + player.openInventory(inventory); + } + } + + protected boolean addItem(GUIButton guiButton) { + if (currentSlot == inventory.getSize() - 9) + return false; + + addButton(currentSlot, guiButton); + currentSlot++; + return true; + } + +} diff --git a/plugin/src/main/java/com/alttd/cometskyblock/gui/GUIListener.java b/plugin/src/main/java/com/alttd/cometskyblock/gui/GUIListener.java new file mode 100644 index 0000000..2270c78 --- /dev/null +++ b/plugin/src/main/java/com/alttd/cometskyblock/gui/GUIListener.java @@ -0,0 +1,64 @@ +package com.alttd.cometskyblock.gui; + +import com.alttd.cometskyblock.CometSkyBlockPlugin; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryOpenEvent; + +/** + * Basically a handler to redirect events to our GUI implementations + */ +public class GUIListener implements Listener { + + protected final CometSkyBlockPlugin plugin; + + public GUIListener(CometSkyBlockPlugin plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onClick(InventoryClickEvent event) { + if (!(event.getWhoClicked() instanceof Player)) + return; + + if (!(event.getView().getTopInventory().getHolder() instanceof GUIInventory gui)) + return; + + if ((event.getView().getBottomInventory().equals(event.getClickedInventory()))) + return; + + if (event.getClick() == ClickType.NUMBER_KEY) { + event.setCancelled(true); + return; + } + + gui.onClick(event); + } + + @EventHandler + public void onOpen(InventoryOpenEvent event) { + if (!(event.getPlayer() instanceof Player)) + return; + + if (!(event.getView().getTopInventory().getHolder() instanceof GUIInventory gui)) + return; + + gui.onOpen(event); + } + + @EventHandler + public void onClose(InventoryCloseEvent event) { + if (!(event.getPlayer() instanceof Player)) + return; + + if (!(event.getView().getTopInventory().getHolder() instanceof GUIInventory gui)) + return; + + gui.onClose(event); + } + +} diff --git a/plugin/src/main/java/com/alttd/cometskyblock/island/gui/IslandGUI.java b/plugin/src/main/java/com/alttd/cometskyblock/island/gui/IslandGUI.java new file mode 100644 index 0000000..8f5a5a6 --- /dev/null +++ b/plugin/src/main/java/com/alttd/cometskyblock/island/gui/IslandGUI.java @@ -0,0 +1,17 @@ +package com.alttd.cometskyblock.island.gui; + +import com.alttd.cometskyblock.gui.GUIInventory; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.inventory.Inventory; + +public class IslandGUI extends GUIInventory { + + public IslandGUI() { + super(); + } + @Override + protected Inventory createInventory() { // TODO - config + return Bukkit.createInventory(this, 54, MiniMessage.miniMessage().deserialize("GUI")); + } +} diff --git a/plugin/src/main/java/com/alttd/cometskyblock/island/gui/MembersGUI.java b/plugin/src/main/java/com/alttd/cometskyblock/island/gui/MembersGUI.java new file mode 100644 index 0000000..c4bf38a --- /dev/null +++ b/plugin/src/main/java/com/alttd/cometskyblock/island/gui/MembersGUI.java @@ -0,0 +1,17 @@ +package com.alttd.cometskyblock.island.gui; + +import com.alttd.cometskyblock.gui.GUIInventory; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.inventory.Inventory; + +public class MembersGUI extends GUIInventory { + + public MembersGUI() { + super(); + } + @Override + protected Inventory createInventory() { // TODO - config + return Bukkit.createInventory(this, 54, MiniMessage.miniMessage().deserialize("GUI")); + } +} diff --git a/plugin/src/main/java/com/alttd/cometskyblock/island/gui/SettingsGUI.java b/plugin/src/main/java/com/alttd/cometskyblock/island/gui/SettingsGUI.java new file mode 100644 index 0000000..b890ebb --- /dev/null +++ b/plugin/src/main/java/com/alttd/cometskyblock/island/gui/SettingsGUI.java @@ -0,0 +1,17 @@ +package com.alttd.cometskyblock.island.gui; + +import com.alttd.cometskyblock.gui.GUIInventory; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.inventory.Inventory; + +public class SettingsGUI extends GUIInventory { + + public SettingsGUI() { + super(); + } + @Override + protected Inventory createInventory() { // TODO - config + return Bukkit.createInventory(this, 54, MiniMessage.miniMessage().deserialize("GUI")); + } +} diff --git a/plugin/src/main/java/com/alttd/cometskyblock/island/gui/UpgradesGUI.java b/plugin/src/main/java/com/alttd/cometskyblock/island/gui/UpgradesGUI.java new file mode 100644 index 0000000..1dcd8e8 --- /dev/null +++ b/plugin/src/main/java/com/alttd/cometskyblock/island/gui/UpgradesGUI.java @@ -0,0 +1,17 @@ +package com.alttd.cometskyblock.island.gui; + +import com.alttd.cometskyblock.gui.GUIInventory; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.inventory.Inventory; + +public class UpgradesGUI extends GUIInventory { + + public UpgradesGUI() { + super(); + } + @Override + protected Inventory createInventory() { // TODO - config + return Bukkit.createInventory(this, 54, MiniMessage.miniMessage().deserialize("GUI")); + } +}