From 096e66f11627550eb2b238eef31e89a3811814a8 Mon Sep 17 00:00:00 2001 From: SemvdH Date: Thu, 6 Nov 2025 00:07:26 +0100 Subject: [PATCH] Add displaying coordinates in inventory upon get request --- .../commands/AddCoordinateCommandHandler.java | 4 +- .../commands/CoordinatesCommand.java | 1 + .../GetCoordinatesCommandHandler.java | 6 ++ .../nl/interestingcorner/db/Coordinate.java | 2 +- .../interestingcorner/db/MinecraftColor.java | 60 +++++++++++++++++++ .../interestingcorner/gui/CoordinatesGUI.java | 55 ++++++++++++++--- ic_plugin/src/main/resources/plugin.yml | 1 + 7 files changed, 117 insertions(+), 12 deletions(-) diff --git a/ic_plugin/src/main/java/nl/interestingcorner/commands/AddCoordinateCommandHandler.java b/ic_plugin/src/main/java/nl/interestingcorner/commands/AddCoordinateCommandHandler.java index 329123d..d264f41 100644 --- a/ic_plugin/src/main/java/nl/interestingcorner/commands/AddCoordinateCommandHandler.java +++ b/ic_plugin/src/main/java/nl/interestingcorner/commands/AddCoordinateCommandHandler.java @@ -55,10 +55,9 @@ public class AddCoordinateCommandHandler implements CoordinatesCommandHandler { String description = parsedArgs.get(1); String color = parsedArgs.get(2); - // TODO check if color is added, if not, use white if (!MinecraftColor.isValidColor(color)) { sendInvalidColorMessage(color); - color = "WHITE"; + return false; } if (sender instanceof Player player) { @@ -72,6 +71,7 @@ public class AddCoordinateCommandHandler implements CoordinatesCommandHandler { return false; } + //TODO check if item doesnt already exist, coordinate with same values, create isEquals method for coordinate return DatabaseManager.INSTANCE .addCoordinate(name, // name description, // description diff --git a/ic_plugin/src/main/java/nl/interestingcorner/commands/CoordinatesCommand.java b/ic_plugin/src/main/java/nl/interestingcorner/commands/CoordinatesCommand.java index faa985c..d0db498 100644 --- a/ic_plugin/src/main/java/nl/interestingcorner/commands/CoordinatesCommand.java +++ b/ic_plugin/src/main/java/nl/interestingcorner/commands/CoordinatesCommand.java @@ -18,6 +18,7 @@ public class CoordinatesCommand implements CommandExecutor{ 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); diff --git a/ic_plugin/src/main/java/nl/interestingcorner/commands/GetCoordinatesCommandHandler.java b/ic_plugin/src/main/java/nl/interestingcorner/commands/GetCoordinatesCommandHandler.java index 0ad90dd..b58a60e 100644 --- a/ic_plugin/src/main/java/nl/interestingcorner/commands/GetCoordinatesCommandHandler.java +++ b/ic_plugin/src/main/java/nl/interestingcorner/commands/GetCoordinatesCommandHandler.java @@ -24,6 +24,12 @@ public class GetCoordinatesCommandHandler implements CoordinatesCommandHandler { sender.sendMessage("Invalid argument: " + args[1]); return false; } + + if (coords.isEmpty()) { + 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) { diff --git a/ic_plugin/src/main/java/nl/interestingcorner/db/Coordinate.java b/ic_plugin/src/main/java/nl/interestingcorner/db/Coordinate.java index 59c825a..5695863 100644 --- a/ic_plugin/src/main/java/nl/interestingcorner/db/Coordinate.java +++ b/ic_plugin/src/main/java/nl/interestingcorner/db/Coordinate.java @@ -79,7 +79,7 @@ public class Coordinate { public static String createTableStatement = """ CREATE TABLE IF NOT EXISTS coordinates ( - id INT AUTO_INCREMENT PRIMARY KEY, + id INTEGER PRIMARY KEY, name VARCHAR(255) NOT NULL, description VARCHAR(255), x INT NOT NULL, diff --git a/ic_plugin/src/main/java/nl/interestingcorner/db/MinecraftColor.java b/ic_plugin/src/main/java/nl/interestingcorner/db/MinecraftColor.java index 932b360..ec427fa 100644 --- a/ic_plugin/src/main/java/nl/interestingcorner/db/MinecraftColor.java +++ b/ic_plugin/src/main/java/nl/interestingcorner/db/MinecraftColor.java @@ -1,5 +1,9 @@ package nl.interestingcorner.db; +import java.util.HashMap; + +import org.bukkit.Material; + public enum MinecraftColor { DARK_RED("dark_red"), RED("red"), @@ -20,6 +24,44 @@ public enum MinecraftColor { private final String name; + private static final HashMap materialsMap = new HashMap<>() {{ + put(DARK_RED, Material.RED_WOOL); + put(RED, Material.RED_WOOL); + put(BLACK, Material.BLACK_WOOL); + put(BLUE, Material.BLUE_WOOL); + put(AQUA, Material.LIGHT_BLUE_WOOL); + put(DARK_AQUA, Material.CYAN_WOOL); + put(GREEN, Material.GREEN_WOOL); + put(GOLD, Material.YELLOW_WOOL); + put(DARK_PURPLE, Material.PURPLE_WOOL); + put(LIGHT_PURPLE, Material.MAGENTA_WOOL); + put(YELLOW, Material.YELLOW_WOOL); + put(DARK_GREEN, Material.LIME_WOOL); + put(GRAY, Material.LIGHT_GRAY_WOOL); + put(DARK_GRAY, Material.GRAY_WOOL); + put(WHITE, Material.WHITE_WOOL); + put(DARK_BLUE, Material.BLUE_WOOL); + }}; + + private static final HashMap colorCodesMap = new HashMap<>() {{ + put(DARK_RED, "§4"); + put(RED, "§c"); + put(BLACK, "§0"); + put(BLUE, "§9"); + put(AQUA, "§b"); + put(DARK_AQUA, "§3"); + put(GREEN, "§a"); + put(GOLD, "§6"); + put(DARK_PURPLE, "§5"); + put(LIGHT_PURPLE, "§d"); + put(YELLOW, "§e"); + put(DARK_GREEN, "§2"); + put(GRAY, "§7"); + put(DARK_GRAY, "§8"); + put(WHITE, "§f"); + put(DARK_BLUE, "§1"); + }}; + MinecraftColor(String name) { this.name = name; } @@ -72,4 +114,22 @@ public enum MinecraftColor { return false; } + + /** + * Converts this MinecraftColor to a corresponding Material. + * + * @return the Material corresponding to this MinecraftColor + */ + public Material toMaterial() { + return materialsMap.get(this); + } + + /** + * Converts this MinecraftColor to a corresponding Minecraft color code. + * @return + */ + public String toColorCode() { + return colorCodesMap.get(this); + } } + diff --git a/ic_plugin/src/main/java/nl/interestingcorner/gui/CoordinatesGUI.java b/ic_plugin/src/main/java/nl/interestingcorner/gui/CoordinatesGUI.java index 6022944..55c6fc9 100644 --- a/ic_plugin/src/main/java/nl/interestingcorner/gui/CoordinatesGUI.java +++ b/ic_plugin/src/main/java/nl/interestingcorner/gui/CoordinatesGUI.java @@ -10,22 +10,59 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import nl.interestingcorner.db.Coordinate; +import nl.interestingcorner.db.MinecraftColor; public class CoordinatesGUI { public static void open(Player player, List coordinates) { + + 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, 9, "Coordinates Menu"); + Inventory gui = Bukkit.createInventory(null, size, "Coordinates Menu"); - // Create an example item - ItemStack addItem = new ItemStack(Material.GREEN_WOOL); - ItemMeta meta = addItem.getItemMeta(); - meta.setDisplayName(coordinates.get(0).name); - addItem.setItemMeta(meta); - - // Place it in slot 0 - gui.setItem(0, addItem); + 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; + } } diff --git a/ic_plugin/src/main/resources/plugin.yml b/ic_plugin/src/main/resources/plugin.yml index 45b73dc..a9729fb 100644 --- a/ic_plugin/src/main/resources/plugin.yml +++ b/ic_plugin/src/main/resources/plugin.yml @@ -1,6 +1,7 @@ main: nl.interestingcorner.App name: InterestingCornerPlugin version: 0.1 +api-version: 1.21 commands: ic-coords: