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 b45b1a8..bf36154 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.listeners.MapUseListener; 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 MapUseListener(), this); registerCommands(); } diff --git a/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/commands/AddCoordinateCommandHandler.java b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/commands/AddCoordinateCommandHandler.java index fea348e..83e063c 100644 --- a/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/commands/AddCoordinateCommandHandler.java +++ b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/commands/AddCoordinateCommandHandler.java @@ -41,11 +41,6 @@ public class AddCoordinateCommandHandler implements CoordinatesCommandHandler { return false; } - sender.sendMessage("Args after parsing:"); - sender.sendMessage("0:" + parsedArgs.get(0)); - sender.sendMessage("1:" + parsedArgs.get(1)); - sender.sendMessage("2:" + parsedArgs.get(2)); - String name = parsedArgs.get(0); String description = parsedArgs.get(1); String color = parsedArgs.get(2); @@ -84,12 +79,10 @@ public class AddCoordinateCommandHandler implements CoordinatesCommandHandler { private List removeFirstArg(String[] args) { List onlyArgs = new ArrayList<>(); - sender.sendMessage("removeFirstArg: size of args is " + String.valueOf(args.length)); for (int i = 1; i < args.length; i++) { onlyArgs.add(args[i]); } - sender.sendMessage("removeFirstArg: size of onlyArgs is " + String.valueOf(onlyArgs.size())); return onlyArgs; } diff --git a/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/commands/CoordinatesCommand.java b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/commands/CoordinatesCommand.java index dd17308..6128293 100644 --- a/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/commands/CoordinatesCommand.java +++ b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/commands/CoordinatesCommand.java @@ -14,14 +14,12 @@ public class CoordinatesCommand implements CommandExecutor{ sb.append(string); sb.append(" "); } - - sender.sendMessage("Args length: " + String.valueOf(args.length)); - sender.sendMessage(sb.toString()); // strategy design pattern return switch (args[0]) { case "get" -> new GetCoordinatesCommandHandler().handleCommand(sender, args); case "add" -> new AddCoordinateCommandHandler().handleCommand(sender, args); + case "map" -> new GetMapCommandHandler().handleCommand(sender, args); default -> false; }; } 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 9178d99..7441e2a 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 @@ -30,12 +30,6 @@ public class GetCoordinatesCommandHandler implements CoordinatesCommandHandler { player.sendMessage("No coordinates found! Add some with the §3/ic-coords §5add §fcommand."); return true; } - - StringBuilder res = new StringBuilder("Coordinates: "); - for (Coordinate coordinate : coords) { - res.append(coordinate.toString()); - } - player.sendMessage(res.toString()); CoordinatesGUI.open(player, coords); } diff --git a/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/commands/GetMapCommandHandler.java b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/commands/GetMapCommandHandler.java new file mode 100644 index 0000000..ef8a5cd --- /dev/null +++ b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/commands/GetMapCommandHandler.java @@ -0,0 +1,55 @@ +package nl.interestingcorner.coordinates.commands; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Material; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import nl.interestingcorner.core.MinecraftColor; + +public class GetMapCommandHandler implements CoordinatesCommandHandler { + public static final String MAP_ITEM_NAME = MinecraftColor.LIGHT_PURPLE + "Map of Coordinates"; + public static final String MAP_ITEM_LORE = MinecraftColor.AQUA.toColorCode() + "This will take you anywhere!"; + + @Override + public boolean handleCommand(CommandSender sender, String[] args) { + if (!(sender instanceof Player player)) { + sender.sendMessage("This command can only be used by a player."); + return true; + } + + // Create a custom map item + ItemStack map = new ItemStack(Material.FILLED_MAP); + ItemMeta meta = map.getItemMeta(); + if (meta != null) { + meta.setDisplayName(MAP_ITEM_NAME); + List lore = new ArrayList<>(); + lore.add(MAP_ITEM_LORE); + meta.setLore(lore); + map.setItemMeta(meta); + } + + // Give the item to the player + player.getInventory().addItem(map); + player.sendMessage(MinecraftColor.GREEN.toColorCode() + "You received the Coordinates map! Right-click to use it."); + return true; + } + + /** + * Check if the given item is the special map item. + * @param item The item to check. + * @return true if it is the special map, false otherwise. + */ + public static boolean isSpecialMap(ItemStack item) { + if (item == null || item.getType() != Material.FILLED_MAP) return false; + ItemMeta meta = item.getItemMeta(); + if (meta == null) return false; + return meta.hasDisplayName() && meta.getDisplayName().equals(MAP_ITEM_NAME) && + meta.hasLore() && meta.getLore() != null && meta.getLore().contains(MAP_ITEM_LORE); + } + +} 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 799aafa..63d938d 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 @@ -33,7 +33,7 @@ public class CoordinatesGUI { } GUI gui = new GUI("Coordinates", GUI.DEFAULT_PAGE_SIZE); - gui.setItemClickListener(new TeleportItemClickListener()); + gui.addItemClickListener(new TeleportItemClickListener()); gui.setItems(items); gui.show(player); } diff --git a/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/gui/TeleportItemClickListener.java b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/gui/TeleportItemClickListener.java index 04f852c..0a3e7b2 100644 --- a/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/gui/TeleportItemClickListener.java +++ b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/gui/TeleportItemClickListener.java @@ -24,8 +24,8 @@ public class TeleportItemClickListener implements GUIItemClickListener { Logger.INSTANCE.info(TAG, "Teleporting player " + player.getName() + " to coordinate " + coordinate.name); player.sendMessage("Teleporting you to " + coordinate.name); player.teleport(loc); + player.sendTitle(coordinate.name, coordinate.description, 10, 70, 20); player.closeInventory(); } } - } diff --git a/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/listeners/MapUseListener.java b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/listeners/MapUseListener.java new file mode 100644 index 0000000..b2b6c4f --- /dev/null +++ b/ic_plugin_coordinates/src/main/java/nl/interestingcorner/coordinates/listeners/MapUseListener.java @@ -0,0 +1,25 @@ +package nl.interestingcorner.coordinates.listeners; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +import nl.interestingcorner.coordinates.commands.GetMapCommandHandler; + +public class MapUseListener implements Listener { + + @EventHandler + public void onPlayerUseMap(PlayerInteractEvent event) { + Player player = event.getPlayer(); + ItemStack item = event.getItem(); + + if (GetMapCommandHandler.isSpecialMap(item)) { + event.setCancelled(true); + + // execute command to show coordinates of this world + player.performCommand("ic-coords get world"); + } + } +} diff --git a/ic_plugin_coordinates/src/main/resources/plugin.yml b/ic_plugin_coordinates/src/main/resources/plugin.yml index a3146ca..22d5693 100644 --- a/ic_plugin_coordinates/src/main/resources/plugin.yml +++ b/ic_plugin_coordinates/src/main/resources/plugin.yml @@ -7,4 +7,4 @@ depend: [IC-core] commands: ic-coords: description: Main command for the coordinates - usage: /ic-coords get | add \ No newline at end of file + usage: /ic-coords get | add | map \ No newline at end of file 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 ec12f72..9da7065 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 @@ -4,44 +4,19 @@ import java.util.ArrayList; import java.util.List; import org.bukkit.Bukkit; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; -public class GUI implements InventoryHolder, Listener { +public final class GUI implements InventoryHolder, Listener { public static final int MAX_INVENTORY_SIZE = 54; // max size of inventory before pages are needed public static final int DEFAULT_PAGE_SIZE = 45; // default items per page (excluding navigation row) - -/** - * TODO add listener functionality for clicking on an item, something like - * - * -public interface GUIListener { - void onItemClick(Player player, GUI gui, ItemStack item, int slot); -} - -private GUIListener listener; - -public void setListener(GUIListener listener) { - this.listener = listener; -} - -public GUIListener getListener() { - return listener; -} - - -@EventHandler -public void onInventoryClick(InventoryClickEvent event) { - if (event.getInventory().getHolder() instanceof GUI gui) { - if (gui.getListener() != null) { - gui.getListener().onItemClick((Player) event.getWhoClicked(), gui, event.getCurrentItem(), event.getSlot()); - } - } -} - */ + public static final int PREVIOUS_PAGE_SLOT = 45; // slot for previous page button + public static final int NEXT_PAGE_SLOT = 53; // slot for next page button /** * Inventory that will be displayed @@ -71,7 +46,7 @@ public void onInventoryClick(InventoryClickEvent event) { /** * Listener for item click events */ - private GUIItemClickListener itemClickListener; + private final List itemClickListeners; public GUI(String title, int pageSize) { this.title = title; @@ -79,6 +54,8 @@ public void onInventoryClick(InventoryClickEvent event) { this.items = new ArrayList<>(); this.currentPage = 0; this.inventory = null; + this.itemClickListeners = new ArrayList<>(); + addItemClickListener(new NavigationItemClickListener()); } public void setItems(List items) { @@ -87,12 +64,12 @@ public void onInventoryClick(InventoryClickEvent event) { updateInventory(); } - public void setItemClickListener(GUIItemClickListener listener) { - this.itemClickListener = listener; + public void addItemClickListener(GUIItemClickListener listener) { + this.itemClickListeners.add(listener); } - public GUIItemClickListener getItemClickListener() { - return this.itemClickListener; + public List getItemClickListeners() { + return this.itemClickListeners; } public void addItem(ItemStack item) { @@ -124,16 +101,55 @@ public void onInventoryClick(InventoryClickEvent event) { } 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()); + boolean needsPagination = items.size() > DEFAULT_PAGE_SIZE; + int inventorySize = needsPagination ? MAX_INVENTORY_SIZE : pageSize; + this.inventory = Bukkit.createInventory(this, inventorySize, title); + + int itemsPerPage = needsPagination ? DEFAULT_PAGE_SIZE : pageSize; + int start = currentPage * itemsPerPage; + int end = Math.min(start + itemsPerPage, items.size()); List pageItems = items.subList(start, end); + for (int i = 0; i < pageItems.size(); i++) { + if (needsPagination && i >= DEFAULT_PAGE_SIZE) { + // Fill only the top rows (0-44) with items if paginating + break; + } this.inventory.setItem(i, pageItems.get(i)); } - // TODO: Add navigation items if needed + + // Add navigation buttons if needed + if (needsPagination) { + if (currentPage > 0) { + // Slot 45: Previous Page + // use currentPage to show 1-based page number + ItemStack prevButton = createNavigationItem("Previous Page", (currentPage) + " / " + getPagesAmount()); + this.inventory.setItem(PREVIOUS_PAGE_SLOT, prevButton); + } + + if ((currentPage + 1) * pageSize < items.size()) { + // Slot 53: Next Page + // use currentPage + 2 to show 1-based page number + ItemStack nextButton = createNavigationItem("Next Page", (currentPage + 2) + " / " + getPagesAmount()); + this.inventory.setItem(NEXT_PAGE_SLOT, nextButton); + } + } + } + + private ItemStack createNavigationItem(String name, String description) { + ItemStack compass = new ItemStack(Material.COMPASS); + ItemMeta meta = compass.getItemMeta(); + if (meta == null) + { + return compass; + } + + meta.setDisplayName(name); + List lore = new ArrayList<>(); + lore.add(description); + meta.setLore(lore); + compass.setItemMeta(meta); + return compass; } @Override diff --git a/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/GUIInventoryClickListener.java b/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/GUIInventoryClickListener.java index 00bc023..2782162 100644 --- a/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/GUIInventoryClickListener.java +++ b/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/GUIInventoryClickListener.java @@ -1,5 +1,7 @@ package nl.interestingcorner.core.gui; +import java.util.List; + import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -16,8 +18,10 @@ public enum GUIInventoryClickListener implements Listener{ public void onInventoryClick(InventoryClickEvent event) { if (event.getInventory().getHolder() instanceof GUI gui) { Logger.INSTANCE.info(TAG, "Inventory click event detected"); - GUIItemClickListener itemClickListener = gui.getItemClickListener(); - if (itemClickListener!= null) { + + List itemClickListeners = gui.getItemClickListeners(); + for (GUIItemClickListener itemClickListener : itemClickListeners) + { event.setCancelled(true); Logger.INSTANCE.info(TAG, "Sending click event to listener"); itemClickListener.onItemClick((Player) event.getWhoClicked(), gui, event.getCurrentItem(), event.getSlot()); diff --git a/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/NavigationItemClickListener.java b/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/NavigationItemClickListener.java new file mode 100644 index 0000000..b9869fa --- /dev/null +++ b/ic_plugin_core/src/main/java/nl/interestingcorner/core/gui/NavigationItemClickListener.java @@ -0,0 +1,21 @@ +package nl.interestingcorner.core.gui; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class NavigationItemClickListener implements GUIItemClickListener { + + @Override + public void onItemClick(Player player, GUI gui, ItemStack item, int slot) { + if (slot == GUI.PREVIOUS_PAGE_SLOT) { + gui.previousPage(); + player.closeInventory(); + gui.show(player); + } else if (slot == GUI.NEXT_PAGE_SLOT) { + gui.nextPage(); + player.closeInventory(); + gui.show(player); + } + } + +}