Add command to get map to view al coordinates
This commit is contained in:
@@ -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();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user