Add basic GUI and getting coordinates by world

This commit is contained in:
SemvdH
2025-10-22 23:42:30 +02:00
parent 02e76ef7d6
commit 7810281976
5 changed files with 140 additions and 38 deletions

View File

@@ -6,6 +6,7 @@ import org.bukkit.plugin.java.JavaPlugin;
import nl.interestingcorner.commands.CoordinatesCommand;
import nl.interestingcorner.db.DatabaseManager;
import nl.interestingcorner.gui.CoordinatesGUIListener;
public class App extends JavaPlugin {
@@ -19,7 +20,8 @@ public class App extends JavaPlugin {
return;
}
getLogger().info("Successfully initialized database");
getServer().getPluginManager().registerEvents(new CoordinatesGUIListener(), this);
registerCommands();
}

View File

@@ -7,13 +7,23 @@ import org.bukkit.entity.Player;
import nl.interestingcorner.db.Coordinate;
import nl.interestingcorner.db.DatabaseManager;
import nl.interestingcorner.gui.CoordinatesGUI;
public class GetCoordinatesCommandHandler implements CoordinatesCommandHandler {
@Override
public boolean handleCommand(CommandSender sender, String[] args) {
if (sender instanceof Player player) {
List<Coordinate> coords = DatabaseManager.INSTANCE.getAllCoordinates();
List<Coordinate> coords;
if (args.length < 2) {
coords = DatabaseManager.INSTANCE.getAllCoordinates();
} else if (args[1].equalsIgnoreCase("world")) {
String world = player.getWorld().getName();
coords = DatabaseManager.INSTANCE.getAllCoordinates(world);
} else {
sender.sendMessage("Invalid argument: " + args[1]);
return false;
}
StringBuilder res = new StringBuilder("Coordinates: ");
for (Coordinate coordinate : coords) {
@@ -21,6 +31,8 @@ public class GetCoordinatesCommandHandler implements CoordinatesCommandHandler {
}
player.sendMessage(res.toString());
CoordinatesGUI.open(player, coords);
}
return true;
}

View File

@@ -26,7 +26,7 @@ public enum DatabaseManager {
/**
* Initializes the database. Creates the file and sets up the db structure.
*
*
* @param app the app to use for logging
* @return true if the database was initialized successfully. False if not.
*/
@@ -46,7 +46,7 @@ public enum DatabaseManager {
/**
* Closes the connectino to the database
*
*
* @return true if the connection closed succesfully, false if not.
*/
public boolean close() {
@@ -64,7 +64,7 @@ public enum DatabaseManager {
/**
* Gets all coordinates from the database
*
*
* @return a list with all coordinates from the database. Empty if an error
* occurred.
*/
@@ -73,44 +73,68 @@ public enum DatabaseManager {
try {
PreparedStatement getAllCoordinatesStatement = this.connection
.prepareStatement("SELECT * FROM coordinates");
ResultSet allCoordinates = getAllCoordinatesStatement.executeQuery();
while (allCoordinates.next()) {
MinecraftColor color = MinecraftColor.fromString(allCoordinates.getString("color"));
if (color == null) {
color = MinecraftColor.WHITE;
}
Coordinate c = new Coordinate(
allCoordinates.getInt("id"),
allCoordinates.getString("name"),
allCoordinates.getString("description"),
new Coordinate.Position(
allCoordinates.getInt("x"),
allCoordinates.getInt("y"),
allCoordinates.getInt("z")),
allCoordinates.getBoolean("nether"),
allCoordinates.getString("world"),
color);
result.add(c);
}
result = convertResultsToCoordinates(getAllCoordinatesStatement.executeQuery());
} catch (SQLException e) {
this.app.getLogger().log(Level.SEVERE, "Could not get commands! {0}", e.getMessage());
this.app.getLogger().log(Level.SEVERE, "Could not get coordinates! {0}", e.getMessage());
}
return result;
}
public List<Coordinate> getAllCoordinates(String world) {
List<Coordinate> result = new ArrayList<>();
try {
PreparedStatement getAllCoordinatesStatement = this.connection
.prepareStatement("SELECT * FROM coordinates WHERE world = ?");
getAllCoordinatesStatement.setString(1, world);
result = convertResultsToCoordinates(getAllCoordinatesStatement.executeQuery());
} catch (SQLException e) {
this.app.getLogger().log(Level.SEVERE, "Could not get coordinates for world {0}! {1}",
new Object[] { world, e.getMessage() });
}
return result;
}
public List<Coordinate> convertResultsToCoordinates(ResultSet results) throws SQLException {
List<Coordinate> coordinates = new ArrayList<>();
while (results.next()) {
MinecraftColor color = MinecraftColor.fromString(results.getString("color"));
if (color == null) {
color = MinecraftColor.WHITE;
}
Coordinate c = new Coordinate(
results.getInt("id"),
results.getString("name"),
results.getString("description"),
new Coordinate.Position(
results.getInt("x"),
results.getInt("y"),
results.getInt("z")),
results.getBoolean("nether"),
results.getString("world"),
color);
coordinates.add(c);
}
return coordinates;
}
/**
* Adds a new coordinate to the database with the given parameters.
* @param name the name of the coordinate
*
* @param name the name of the coordinate
* @param description a short description of the coordinate
* @param position the position of the coordinate where the player will spwan when they teleport to the coordinate
* @param nether if the coordinate is in the nether
* @param world the Multiverse world the coordinate belongs to
* @param color the color to display for the coordinate name
* @param position the position of the coordinate where the player will
* spwan when they teleport to the coordinate
* @param nether if the coordinate is in the nether
* @param world the Multiverse world the coordinate belongs to
* @param color the color to display for the coordinate name
* @return true if the command was added successfully, false otherwise
*/
public boolean addCoordinate(String name, String description, Coordinate.Position position, boolean nether,
@@ -136,9 +160,9 @@ public enum DatabaseManager {
}
/**
* Sets up the connectino to the database. Creates a new .db file if it doesn't
* exist yet.
*
* Sets up the connectino to the database. Creates a new .db file if it
* doesn't exist yet.
*
* @return true if the connection was set up successfully. False if not.
*/
private boolean setupDatabase() {
@@ -166,14 +190,14 @@ public enum DatabaseManager {
/**
* initializes the tables for the database.
*
*
* @return true if the tables were initialized successfully. False if not.
*/
private boolean initializeTables() {
try {
PreparedStatement createTableStatement = this.connection.prepareStatement(Coordinate.createTableStatement);
createTableStatement.executeUpdate();
this.app.getLogger().info("Executed create table statement");
this.app.getLogger().fine("Executed create table statement");
PreparedStatement getTablesStatement = this.connection.prepareStatement(
"SELECT name FROM sqlite_master WHERE type='table'");

View File

@@ -0,0 +1,31 @@
package nl.interestingcorner.gui;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import nl.interestingcorner.db.Coordinate;
public class CoordinatesGUI {
public static void open(Player player, List<Coordinate> coordinates) {
// Create an inventory with 9 slots and a title
Inventory gui = Bukkit.createInventory(null, 9, "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);
// Open the GUI for the player
player.openInventory(gui);
}
}

View File

@@ -0,0 +1,33 @@
package nl.interestingcorner.gui;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.entity.Player;
import org.bukkit.ChatColor;
public class CoordinatesGUIListener implements Listener{
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
// Check if this is our custom GUI
if (event.getView().getTitle().equals("Coordinates Menu")) {
event.setCancelled(true); // Prevent taking the item
if (event.getCurrentItem() == null) return;
Player player = (Player) event.getWhoClicked();
switch (event.getSlot()) {
case 0 -> {
player.sendMessage(ChatColor.GREEN + "You clicked Add Coordinate!");
player.closeInventory();
// Here you could open another GUI or run a command
}
// Add other cases for other slots if needed
}
}
}
}