Add command to get map to view al coordinates

This commit is contained in:
SemvdH
2026-02-03 20:47:55 +01:00
parent a07108e141
commit de87781ee1
12 changed files with 170 additions and 64 deletions

View File

@@ -6,7 +6,7 @@ import org.bukkit.plugin.java.JavaPlugin;
import nl.interestingcorner.coordinates.commands.CoordinatesCommand; import nl.interestingcorner.coordinates.commands.CoordinatesCommand;
import nl.interestingcorner.coordinates.db.CoordinatesDatabaseManager; import nl.interestingcorner.coordinates.db.CoordinatesDatabaseManager;
// import nl.interestingcorner.coordinates.gui.CoordinatesGUIListener; import nl.interestingcorner.coordinates.listeners.MapUseListener;
public class App extends JavaPlugin { public class App extends JavaPlugin {
@@ -16,7 +16,7 @@ public class App extends JavaPlugin {
CoordinatesDatabaseManager.INSTANCE.initialize(this); CoordinatesDatabaseManager.INSTANCE.initialize(this);
getLogger().info("Successfully initialized database"); getLogger().info("Successfully initialized database");
// getServer().getPluginManager().registerEvents(new CoordinatesGUIListener(), this); getServer().getPluginManager().registerEvents(new MapUseListener(), this);
registerCommands(); registerCommands();
} }

View File

@@ -41,11 +41,6 @@ public class AddCoordinateCommandHandler implements CoordinatesCommandHandler {
return false; 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 name = parsedArgs.get(0);
String description = parsedArgs.get(1); String description = parsedArgs.get(1);
String color = parsedArgs.get(2); String color = parsedArgs.get(2);
@@ -84,12 +79,10 @@ public class AddCoordinateCommandHandler implements CoordinatesCommandHandler {
private List<String> removeFirstArg(String[] args) { private List<String> removeFirstArg(String[] args) {
List<String> onlyArgs = new ArrayList<>(); List<String> onlyArgs = new ArrayList<>();
sender.sendMessage("removeFirstArg: size of args is " + String.valueOf(args.length));
for (int i = 1; i < args.length; i++) { for (int i = 1; i < args.length; i++) {
onlyArgs.add(args[i]); onlyArgs.add(args[i]);
} }
sender.sendMessage("removeFirstArg: size of onlyArgs is " + String.valueOf(onlyArgs.size()));
return onlyArgs; return onlyArgs;
} }

View File

@@ -15,13 +15,11 @@ public class CoordinatesCommand implements CommandExecutor{
sb.append(" "); sb.append(" ");
} }
sender.sendMessage("Args length: " + String.valueOf(args.length));
sender.sendMessage(sb.toString());
// strategy design pattern // strategy design pattern
return switch (args[0]) { return switch (args[0]) {
case "get" -> new GetCoordinatesCommandHandler().handleCommand(sender, args); case "get" -> new GetCoordinatesCommandHandler().handleCommand(sender, args);
case "add" -> new AddCoordinateCommandHandler().handleCommand(sender, args); case "add" -> new AddCoordinateCommandHandler().handleCommand(sender, args);
case "map" -> new GetMapCommandHandler().handleCommand(sender, args);
default -> false; default -> false;
}; };
} }

View File

@@ -31,12 +31,6 @@ public class GetCoordinatesCommandHandler implements CoordinatesCommandHandler {
return true; return true;
} }
StringBuilder res = new StringBuilder("Coordinates: ");
for (Coordinate coordinate : coords) {
res.append(coordinate.toString());
}
player.sendMessage(res.toString());
CoordinatesGUI.open(player, coords); CoordinatesGUI.open(player, coords);
} }
return true; return true;

View File

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

View File

@@ -33,7 +33,7 @@ public class CoordinatesGUI {
} }
GUI gui = new GUI("Coordinates", GUI.DEFAULT_PAGE_SIZE); GUI gui = new GUI("Coordinates", GUI.DEFAULT_PAGE_SIZE);
gui.setItemClickListener(new TeleportItemClickListener()); gui.addItemClickListener(new TeleportItemClickListener());
gui.setItems(items); gui.setItems(items);
gui.show(player); gui.show(player);
} }

View File

@@ -24,8 +24,8 @@ public class TeleportItemClickListener implements GUIItemClickListener {
Logger.INSTANCE.info(TAG, "Teleporting player " + player.getName() + " to coordinate " + coordinate.name); Logger.INSTANCE.info(TAG, "Teleporting player " + player.getName() + " to coordinate " + coordinate.name);
player.sendMessage("Teleporting you to " + coordinate.name); player.sendMessage("Teleporting you to " + coordinate.name);
player.teleport(loc); player.teleport(loc);
player.sendTitle(coordinate.name, coordinate.description, 10, 70, 20);
player.closeInventory(); player.closeInventory();
} }
} }
} }

View File

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

View File

@@ -7,4 +7,4 @@ depend: [IC-core]
commands: commands:
ic-coords: ic-coords:
description: Main command for the coordinates description: Main command for the coordinates
usage: /ic-coords get | add usage: /ic-coords get | add | map

View File

@@ -4,44 +4,19 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack; 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 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) public static final int DEFAULT_PAGE_SIZE = 45; // default items per page (excluding navigation row)
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
* 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());
}
}
}
*/
/** /**
* Inventory that will be displayed * Inventory that will be displayed
@@ -71,7 +46,7 @@ public void onInventoryClick(InventoryClickEvent event) {
/** /**
* Listener for item click events * Listener for item click events
*/ */
private GUIItemClickListener itemClickListener; private final List<GUIItemClickListener> itemClickListeners;
public GUI(String title, int pageSize) { public GUI(String title, int pageSize) {
this.title = title; this.title = title;
@@ -79,6 +54,8 @@ public void onInventoryClick(InventoryClickEvent event) {
this.items = new ArrayList<>(); this.items = new ArrayList<>();
this.currentPage = 0; this.currentPage = 0;
this.inventory = null; this.inventory = null;
this.itemClickListeners = new ArrayList<>();
addItemClickListener(new NavigationItemClickListener());
} }
public void setItems(List<ItemStack> items) { public void setItems(List<ItemStack> items) {
@@ -87,12 +64,12 @@ public void onInventoryClick(InventoryClickEvent event) {
updateInventory(); updateInventory();
} }
public void setItemClickListener(GUIItemClickListener listener) { public void addItemClickListener(GUIItemClickListener listener) {
this.itemClickListener = listener; this.itemClickListeners.add(listener);
} }
public GUIItemClickListener getItemClickListener() { public List<GUIItemClickListener> getItemClickListeners() {
return this.itemClickListener; return this.itemClickListeners;
} }
public void addItem(ItemStack item) { public void addItem(ItemStack item) {
@@ -124,16 +101,55 @@ public void onInventoryClick(InventoryClickEvent event) {
} }
private void updateInventory() { private void updateInventory() {
// Create inventory for the current page boolean needsPagination = items.size() > DEFAULT_PAGE_SIZE;
int size = Math.min(pageSize, MAX_INVENTORY_SIZE); int inventorySize = needsPagination ? MAX_INVENTORY_SIZE : pageSize;
this.inventory = Bukkit.createInventory(this, size, title); this.inventory = Bukkit.createInventory(this, inventorySize, title);
int start = currentPage * pageSize;
int end = Math.min(start + pageSize, items.size()); int itemsPerPage = needsPagination ? DEFAULT_PAGE_SIZE : pageSize;
int start = currentPage * itemsPerPage;
int end = Math.min(start + itemsPerPage, items.size());
List<ItemStack> pageItems = items.subList(start, end); List<ItemStack> pageItems = items.subList(start, end);
for (int i = 0; i < pageItems.size(); i++) { 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)); 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<String> lore = new ArrayList<>();
lore.add(description);
meta.setLore(lore);
compass.setItemMeta(meta);
return compass;
} }
@Override @Override

View File

@@ -1,5 +1,7 @@
package nl.interestingcorner.core.gui; package nl.interestingcorner.core.gui;
import java.util.List;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@@ -16,8 +18,10 @@ public enum GUIInventoryClickListener implements Listener{
public void onInventoryClick(InventoryClickEvent event) { public void onInventoryClick(InventoryClickEvent event) {
if (event.getInventory().getHolder() instanceof GUI gui) { if (event.getInventory().getHolder() instanceof GUI gui) {
Logger.INSTANCE.info(TAG, "Inventory click event detected"); Logger.INSTANCE.info(TAG, "Inventory click event detected");
GUIItemClickListener itemClickListener = gui.getItemClickListener();
if (itemClickListener!= null) { List<GUIItemClickListener> itemClickListeners = gui.getItemClickListeners();
for (GUIItemClickListener itemClickListener : itemClickListeners)
{
event.setCancelled(true); event.setCancelled(true);
Logger.INSTANCE.info(TAG, "Sending click event to listener"); Logger.INSTANCE.info(TAG, "Sending click event to listener");
itemClickListener.onItemClick((Player) event.getWhoClicked(), gui, event.getCurrentItem(), event.getSlot()); itemClickListener.onItemClick((Player) event.getWhoClicked(), gui, event.getCurrentItem(), event.getSlot());

View File

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