Add a base for GUI to manage aspects of the island

This commit is contained in:
Len 2024-02-05 17:09:01 +01:00
parent b7f5b15534
commit ef411ac9a1
10 changed files with 308 additions and 1 deletions

View File

@ -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);
}
}

View File

@ -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("<red>GUI"));
}
}

View File

@ -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);
}

View File

@ -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<Player, ItemStack> iconCreator;
private Consumer<InventoryClickEvent> eventConsumer;
public GUIButton creator(Function<Player, ItemStack> iconCreator) {
this.iconCreator = iconCreator;
return this;
}
public GUIButton consumer(Consumer<InventoryClickEvent> eventConsumer) {
this.eventConsumer = eventConsumer;
return this;
}
}

View File

@ -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<Integer, GUIButton> 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<String> lore, Consumer<InventoryClickEvent> eventConsumer) {
return new GUIButton()
.creator(player -> createGuiItem(material, name, lore))
.consumer(eventConsumer);
}
public ItemStack createGuiItem(Material material, String name, List<String> 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<Component> 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;
}
}

View File

@ -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);
}
}

View File

@ -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("<red>GUI"));
}
}

View File

@ -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("<red>GUI"));
}
}

View File

@ -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("<red>GUI"));
}
}

View File

@ -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("<red>GUI"));
}
}