Add displaying coordinates in inventory upon get request

This commit is contained in:
SemvdH
2025-11-06 00:07:26 +01:00
parent 7810281976
commit 096e66f116
7 changed files with 117 additions and 12 deletions

View File

@@ -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

View File

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

View File

@@ -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) {

View File

@@ -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,

View File

@@ -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<MinecraftColor, Material> 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<MinecraftColor, String> 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);
}
}

View File

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

View File

@@ -1,6 +1,7 @@
main: nl.interestingcorner.App
name: InterestingCornerPlugin
version: 0.1
api-version: 1.21
commands:
ic-coords: