diff --git a/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/App.java b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/App.java index e02c6ae..b45b1a8 100644 --- a/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/App.java +++ b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/App.java @@ -6,7 +6,7 @@ import org.bukkit.plugin.java.JavaPlugin; import nl.interestingcorner.coordinates.commands.CoordinatesCommand; import nl.interestingcorner.coordinates.db.CoordinatesDatabaseManager; -import nl.interestingcorner.coordinates.gui.CoordinatesGUIListener; +// import nl.interestingcorner.coordinates.gui.CoordinatesGUIListener; public class App extends JavaPlugin { @@ -16,7 +16,7 @@ public class App extends JavaPlugin { CoordinatesDatabaseManager.INSTANCE.initialize(this); getLogger().info("Successfully initialized database"); - getServer().getPluginManager().registerEvents(new CoordinatesGUIListener(), this); + // getServer().getPluginManager().registerEvents(new CoordinatesGUIListener(), this); registerCommands(); } diff --git a/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/commands/GetCoordinatesCommandHandler.java b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/commands/GetCoordinatesCommandHandler.java index 02033ce..18e9360 100644 --- a/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/commands/GetCoordinatesCommandHandler.java +++ b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/commands/GetCoordinatesCommandHandler.java @@ -5,8 +5,8 @@ import java.util.List; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import nl.interestingcorner.coordinates.db.CoordinatesDatabaseManager; import nl.interestingcorner.coordinates.db.Coordinate; +import nl.interestingcorner.coordinates.db.CoordinatesDatabaseManager; import nl.interestingcorner.coordinates.gui.CoordinatesGUI; public class GetCoordinatesCommandHandler implements CoordinatesCommandHandler { diff --git a/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/gui/CoordinatesGUI.java b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/gui/CoordinatesGUI.java index 88a1c06..12e37c8 100644 --- a/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/gui/CoordinatesGUI.java +++ b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/gui/CoordinatesGUI.java @@ -2,67 +2,24 @@ package nl.interestingcorner.coordinates.gui; import java.util.List; -import org.bukkit.Bukkit; -import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import nl.interestingcorner.coordinates.db.Coordinate; -import nl.interestingcorner.core.MinecraftColor; +import nl.interestingcorner.core.gui.GUI; public class CoordinatesGUI { - public static void open(Player player, List coordinates) { + public static void open(Player player, List coords) { + // Convert coordinates to ItemStacks for GUI display + List items = coords.stream() + .map(coord -> { + ItemStack item = coord.toItem(); + return item; + }) + .toList(); - int coordinatesAmount = coordinates.size(); - int size; - if (coordinatesAmount <= 9) { - size = 9; - } else { - // TODO handle if size is more than 54 - 9, add pagination - /** - * if more than 45, add pages. Split by 45 items per page. - * use bottom row leftmost and rightmost item for navigation. - * use paper item for page number display in middle. - * use lore of navigation items clicked to handle showing next/previous page. - * use player.getOpeninventory() to get current inventory and update or close it. - */ - - // round up to nearest multiple of 9 - size = ((coordinatesAmount / 9) + 1) * 9; - player.sendMessage("Size: " + size); - } - - // Create an inventory with 9 slots and a title - Inventory gui = Bukkit.createInventory(null, size, "Coordinates Menu"); - - for (Coordinate coordinate : coordinates) { - ItemStack item = createCoordinateItem(coordinate); - gui.addItem(item); - } - - // Open the GUI for the player - player.openInventory(gui); - } - - private static ItemStack createCoordinateItem(Coordinate coordinate) { - ItemStack itemStack = new ItemStack(coordinate.color.toMaterial()); - ItemMeta meta = itemStack.getItemMeta(); - if (meta == null) { - return itemStack; - } - meta.setDisplayName(coordinate.color.toColorCode() + coordinate.name); - meta.setLore(List.of( - MinecraftColor.WHITE.toColorCode() + coordinate.description, - coordinate.nether ? MinecraftColor.RED.toColorCode() + "Nether Coordinate" : "Overworld Coordinate", - "X: " + coordinate.position.x(), - "Y: " + coordinate.position.y(), - "Z: " + coordinate.position.z(), - "World: " + coordinate.world - )); - itemStack.setItemMeta(meta); - - return itemStack; + GUI gui = new GUI("Coordinates", GUI.DEFAULT_PAGE_SIZE); + gui.setItems(items); + gui.show(player); } } diff --git a/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/gui/CoordinatesGUIListener.java b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/gui/CoordinatesGUIListener.java deleted file mode 100644 index ef040b6..0000000 --- a/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/gui/CoordinatesGUIListener.java +++ /dev/null @@ -1,33 +0,0 @@ -package nl.interestingcorner.coordinates.gui; - -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.entity.Player; -import org.bukkit.ChatColor; - -public class CoordinatesGUIListener implements Listener{ - - @EventHandler - public void onInventoryClick(InventoryClickEvent event) { - - // Check if this is our custom GUI - if (event.getView().getTitle().equals("Coordinates Menu")) { - event.setCancelled(true); // Prevent taking the item - - if (event.getCurrentItem() == null) return; - - Player player = (Player) event.getWhoClicked(); - - switch (event.getSlot()) { - case 0 -> { - player.sendMessage(ChatColor.GREEN + "You clicked Add Coordinate!"); - player.closeInventory(); - // Here you could open another GUI or run a command - } - // Add other cases for other slots if needed - } - } - } - -} diff --git a/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/ChestGUI.java b/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/ChestGUI.java new file mode 100644 index 0000000..d3297c7 --- /dev/null +++ b/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/ChestGUI.java @@ -0,0 +1,29 @@ +package nl.interestingcorner.core.gui; + +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +/** + * Generalized chest GUI for use in plugins. + */ +public class ChestGUI { + public static void open(Player player, String title, List items) { + int itemsAmount = items.size(); + int size; + if (itemsAmount <= 9) { + size = 9; + } else { + // TODO: handle pagination for >54 items + size = ((itemsAmount / 9) + 1) * 9; + } + Inventory gui = Bukkit.createInventory(null, size, title); + for (ItemStack item : items) { + gui.addItem(item); + } + player.openInventory(gui); + } +} diff --git a/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/ChestGUIListener.java b/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/ChestGUIListener.java new file mode 100644 index 0000000..2a32aa0 --- /dev/null +++ b/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/ChestGUIListener.java @@ -0,0 +1,27 @@ +package nl.interestingcorner.core.gui; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; + +/** + * Generalized listener for chest GUIs. Extend or register with custom logic. + */ +public class ChestGUIListener implements Listener { + private final String guiTitle; + + public ChestGUIListener(String guiTitle) { + this.guiTitle = guiTitle; + } + + @EventHandler + public void onInventoryClick(InventoryClickEvent event) { + if (event.getView().getTitle().equals(guiTitle)) { + event.setCancelled(true); + if (event.getCurrentItem() == null) return; + Player player = (Player) event.getWhoClicked(); + // Extend this class and override this method for custom slot handling + } + } +} diff --git a/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/GUI.java b/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/GUI.java index b3d6a13..97498d4 100644 --- a/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/GUI.java +++ b/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/GUI.java @@ -1,19 +1,81 @@ package nl.interestingcorner.core.gui; +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.ItemStack; public class GUI implements InventoryHolder { public static final int MAX_INVENTORY_SIZE = 54; // max size of inventory before pages are needed - public static final int MAX_PAGE_INVENTORY_SIZE = 45; // max amount of items on a page + public static final int DEFAULT_PAGE_SIZE = 45; // default items per page (excluding navigation row) private Inventory inventory; + private List items; private int currentPage; + private String title; + private int pageSize; + + public GUI(String title, int pageSize) { + this.title = title; + this.pageSize = Math.min(pageSize, MAX_INVENTORY_SIZE); + this.items = new ArrayList<>(); + this.currentPage = 0; + this.inventory = null; + } + + public void setItems(List items) { + this.items = new ArrayList<>(items); + this.currentPage = 0; + updateInventory(); + } + + public void addItem(ItemStack item) { + this.items.add(item); + updateInventory(); + } + + public void show(Player player) { + updateInventory(); + player.openInventory(this.inventory); + } + + public void nextPage() { + if ((currentPage + 1) * pageSize < items.size()) { + currentPage++; + updateInventory(); + } + } + + public void previousPage() { + if (currentPage > 0) { + currentPage--; + updateInventory(); + } + } + + public int getPagesAmount() { + return (int) Math.ceil((double) items.size() / pageSize); + } + + private void updateInventory() { + // Create inventory for the current page + int size = Math.min(pageSize, MAX_INVENTORY_SIZE); + this.inventory = Bukkit.createInventory(this, size, title); + int start = currentPage * pageSize; + int end = Math.min(start + pageSize, items.size()); + List pageItems = items.subList(start, end); + for (int i = 0; i < pageItems.size(); i++) { + this.inventory.setItem(i, pageItems.get(i)); + } + // TODO: Add navigation items if needed + } @Override public Inventory getInventory() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'getInventory'"); + return this.inventory; } - } diff --git a/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/GUIBuilder.java b/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/GUIBuilder.java index 2ee2d7a..72ab21f 100644 --- a/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/GUIBuilder.java +++ b/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/GUIBuilder.java @@ -4,7 +4,6 @@ import java.util.List; import org.bukkit.Bukkit; import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; public class GUIBuilder { @@ -22,7 +21,7 @@ public class GUIBuilder { int itemsAmount = items.size(); int pagesAmount = getPagesAmount(itemsAmount); - Inventory gui = Bukkit.createInventory(null, MAX_INVENTORY_SIZE, "Coordinates Menu"); + Inventory gui = Bukkit.createInventory(null, GUI.MAX_INVENTORY_SIZE, "Coordinates Menu"); for (ItemStack item : items) { gui.addItem(item); @@ -32,8 +31,8 @@ public class GUIBuilder { } private static int getPagesAmount(int itemsAmount) { - if (itemsAmount > MAX_INVENTORY_SIZE) { - return ((itemsAmount / MAX_PAGE_INVENTORY_SIZE) + 1); + if (itemsAmount > GUI.MAX_INVENTORY_SIZE) { + return ((itemsAmount / GUI.DEFAULT_PAGE_SIZE) + 1); } return 1; }