From 5c8bc57123ef22a01de78fdd90e44b69e15c016b Mon Sep 17 00:00:00 2001 From: lars <larslukasneuhaus@gmx.de> Date: Tue, 16 Jul 2024 14:06:49 +0200 Subject: [PATCH] own database class, added methods to PixelBlock class --- .../mhsl/minecraft/pixelblocks/DataBase.java | 199 ++++++++++++ .../minecraft/pixelblocks/PixelBlocks.java | 83 +----- .../pixelblocks/commands/ChessCommand.java | 56 ---- .../commands/CreatePixelBlockCommand.java | 2 +- .../commands/ExitWorldCommand.java | 2 + .../listeners/BlockBreakListener.java | 32 +- .../listeners/BlockPlaceListener.java | 33 +- .../listeners/PlayerChangeWorldListener.java | 10 +- .../listeners/PlayerInteractListener.java | 68 +---- .../listeners/PlayerJoinListener.java | 12 - .../listeners/PlayerJumpListener.java | 15 - .../pixelblocks/pixelblock/PixelBlock.java | 282 ++++++++++-------- 12 files changed, 378 insertions(+), 416 deletions(-) create mode 100644 src/main/java/eu/mhsl/minecraft/pixelblocks/DataBase.java delete mode 100644 src/main/java/eu/mhsl/minecraft/pixelblocks/commands/ChessCommand.java delete mode 100644 src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerJoinListener.java delete mode 100644 src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerJumpListener.java diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/DataBase.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/DataBase.java new file mode 100644 index 0000000..be8978c --- /dev/null +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/DataBase.java @@ -0,0 +1,199 @@ +package eu.mhsl.minecraft.pixelblocks; + +import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlock; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static eu.mhsl.minecraft.pixelblocks.PixelBlocks.plugin; + +public class DataBase { + public static String url; + + public DataBase(String url) { + DataBase.url = url; + } + + public Connection getConnection() throws SQLException { + return DriverManager.getConnection(url); + } + + public Statement getStatement() throws SQLException { + return getConnection().createStatement(); + } + + public void removePixelBlock(PixelBlock pixelBlock) { + Bukkit.getScheduler().runTask(plugin, () -> { + + try (var conn = getConnection()) { + PreparedStatement prep = conn.prepareStatement("DELETE FROM pixelblocks WHERE uuid = ?"); + prep.setString(1, pixelBlock.uuid.toString()); + prep.executeUpdate(); + + prep.close(); + } catch (SQLException e) { + System.err.println(e.getMessage()); + } + + }); + } + + public void savePixelBlock(PixelBlock pixelBlock) { + Bukkit.getScheduler().runTask(plugin, () -> { + List<UUID> uuids = new ArrayList<>(); + + try (var statement = getStatement()) { + ResultSet pixelBlocksResult = statement.executeQuery("SELECT * FROM pixelblocks;"); + while (pixelBlocksResult.next()) { + uuids.add(UUID.fromString(pixelBlocksResult.getString("uuid"))); + } + } catch (SQLException e) { + System.err.println(e.getMessage()); + } + + if(!uuids.contains(pixelBlock.uuid)) { + + try (var conn = getConnection()) { + PreparedStatement prep = conn.prepareStatement( + "INSERT INTO pixelblocks(uuid, owner, " + + "locationWorldName, locationX, locationY, locationZ, " + + "entryLocationWorldName, entryLocationX, entryLocationY, entryLocationZ) " + + "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?);" + ); + prep.setString(1, pixelBlock.uuid.toString()); + prep.setString(2, pixelBlock.owner.toString()); + + prep.setString(3, pixelBlock.pixelBlockLocation.getWorld().getName()); + prep.setDouble(4, pixelBlock.pixelBlockLocation.getX()); + prep.setDouble(5, pixelBlock.pixelBlockLocation.getY()); + prep.setDouble(6, pixelBlock.pixelBlockLocation.getZ()); + + if(pixelBlock.lastEntryLocation != null) { + prep.setString(7, pixelBlock.lastEntryLocation.getWorld().getName()); + prep.setDouble(8, pixelBlock.lastEntryLocation.getX()); + prep.setDouble(9, pixelBlock.lastEntryLocation.getY()); + prep.setDouble(10, pixelBlock.lastEntryLocation.getZ()); + } else { + prep.setString(7, Bukkit.getWorlds().getFirst().getName()); + prep.setDouble(8, Bukkit.getWorlds().getFirst().getSpawnLocation().getX()); + prep.setDouble(9, Bukkit.getWorlds().getFirst().getSpawnLocation().getY()); + prep.setDouble(10, Bukkit.getWorlds().getFirst().getSpawnLocation().getZ()); + } + + prep.executeUpdate(); + prep.close(); + } catch (SQLException e) { + System.err.println(e.getMessage()); + } + + } else { + try (var conn = getConnection()) { + PreparedStatement prep = conn.prepareStatement( + "UPDATE pixelblocks " + + "SET owner=?, locationWorldName=?, locationX=?, locationY=?, locationZ=?," + + "entryLocationWorldName=?, entryLocationX=?, entryLocationY=?, entryLocationZ=? " + + "WHERE uuid=?;" + ); + prep.setString(1, pixelBlock.owner.toString()); + + prep.setString(2, pixelBlock.pixelBlockLocation.getWorld().getName()); + prep.setDouble(3, pixelBlock.pixelBlockLocation.getX()); + prep.setDouble(4, pixelBlock.pixelBlockLocation.getY()); + prep.setDouble(5, pixelBlock.pixelBlockLocation.getZ()); + + if(pixelBlock.lastEntryLocation != null) { + prep.setString(6, pixelBlock.lastEntryLocation.getWorld().getName()); + prep.setDouble(7, pixelBlock.lastEntryLocation.getX()); + prep.setDouble(8, pixelBlock.lastEntryLocation.getY()); + prep.setDouble(9, pixelBlock.lastEntryLocation.getZ()); + } else { + prep.setString(6, Bukkit.getWorlds().getFirst().getName()); + prep.setDouble(7, Bukkit.getWorlds().getFirst().getSpawnLocation().getX()); + prep.setDouble(8, Bukkit.getWorlds().getFirst().getSpawnLocation().getY()); + prep.setDouble(9, Bukkit.getWorlds().getFirst().getSpawnLocation().getZ()); + } + + prep.setString(10, pixelBlock.uuid.toString()); + + prep.executeUpdate(); + prep.close(); + } catch (SQLException e) { + System.err.println(e.getMessage()); + } + } + }); + } + + public void loadPixelBlocks() { + List<Entity> entities = new ArrayList<>(); + entities.addAll(Bukkit.getWorlds().get(0).getEntities().stream() + .filter(entity -> entity.getType().equals(EntityType.BLOCK_DISPLAY) || entity.getType().equals(EntityType.INTERACTION)) + .toList()); + entities.addAll(Bukkit.getWorlds().get(1).getEntities().stream() + .filter(entity -> entity.getType().equals(EntityType.BLOCK_DISPLAY) || entity.getType().equals(EntityType.INTERACTION)) + .toList()); + entities.addAll(Bukkit.getWorlds().get(2).getEntities().stream() + .filter(entity -> entity.getType().equals(EntityType.BLOCK_DISPLAY) || entity.getType().equals(EntityType.INTERACTION)) + .toList()); + + String sql = "CREATE TABLE IF NOT EXISTS pixelblocks (" + + "uuid CHAR(36) PRIMARY KEY, " + + "owner CHAR(36), " + + "locationWorldName CHAR(36), " + + "locationX DOUBLE, " + + "locationY DOUBLE, " + + "locationZ DOUBLE, " + + "entryLocationWorldName CHAR(36), " + + "entryLocationX DOUBLE, " + + "entryLocationY DOUBLE, " + + "entryLocationZ DOUBLE" + + ");"; + + try (var statement = getStatement()) { + statement.execute(sql); + ResultSet pixelBlocksResult = statement.executeQuery("SELECT * FROM pixelblocks;"); + + while (pixelBlocksResult.next()) { + Location newPixelBlockLocation = new Location( + Bukkit.getWorld(pixelBlocksResult.getString("locationWorldName")), + pixelBlocksResult.getDouble("locationX"), + pixelBlocksResult.getDouble("locationY"), + pixelBlocksResult.getDouble("locationZ") + ); + + Location newEntryLocation = new Location( + Bukkit.getWorld(pixelBlocksResult.getString("entryLocationWorldName")), + pixelBlocksResult.getDouble("entryLocationX"), + pixelBlocksResult.getDouble("entryLocationY"), + pixelBlocksResult.getDouble("entryLocationZ") + ); + + entities.stream().filter(entity -> entity. + getLocation(). + clone(). + add(0, PixelBlock.hitboxOffset, 0). + toBlockLocation(). + equals(newPixelBlockLocation)). + forEach(Entity::remove); + + PixelBlock newPixelBlock = new PixelBlock( + newPixelBlockLocation, + UUID.fromString(pixelBlocksResult.getString("owner")), + UUID.fromString(pixelBlocksResult.getString("uuid")) + ); + newPixelBlock.lastEntryLocation = newEntryLocation; + newPixelBlock.place(newPixelBlockLocation); + } + + } catch (SQLException e) { + System.err.println(e.getMessage()); + } + + } +} diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocks.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocks.java index 5f8dde3..2308675 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocks.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocks.java @@ -1,34 +1,25 @@ package eu.mhsl.minecraft.pixelblocks; -import eu.mhsl.minecraft.pixelblocks.commands.ChessCommand; import eu.mhsl.minecraft.pixelblocks.commands.CreatePixelBlockCommand; import eu.mhsl.minecraft.pixelblocks.commands.ExitWorldCommand; import eu.mhsl.minecraft.pixelblocks.listeners.*; -import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlock; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; import org.bukkit.plugin.java.JavaPlugin; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; import java.util.Objects; -import java.util.UUID; public final class PixelBlocks extends JavaPlugin { public static PixelBlocks plugin; + public static DataBase dataBase; + public static String pathSeparator = "/"; @Override public void onEnable() { PixelBlocks.plugin = this; this.getLogger().info("PixelBlocks Plugin was enabled."); - this.loadDB(); - getServer().getPluginManager().registerEvents(new PlayerJumpListener(), this); + dataBase = new DataBase("jdbc:sqlite:pixelblocks.db"); + dataBase.loadPixelBlocks(); + getServer().getPluginManager().registerEvents(new PlayerInteractListener(), this); getServer().getPluginManager().registerEvents(new PlayerMoveListener(), this); getServer().getPluginManager().registerEvents(new EntityDamageListener(), this); @@ -37,72 +28,8 @@ public final class PixelBlocks extends JavaPlugin { getServer().getPluginManager().registerEvents(new CreatureSpawnListener(), this); getServer().getPluginManager().registerEvents(new PlayerChangeWorldListener(), this); - Objects.requireNonNull(getCommand("chess")).setExecutor(new ChessCommand()); Objects.requireNonNull(getCommand("createpixelblock")).setExecutor(new CreatePixelBlockCommand()); Objects.requireNonNull(getCommand("exitworld")).setExecutor(new ExitWorldCommand()); } - public void loadDB() { - List<Entity> entities = new ArrayList<>(); - entities.addAll(Bukkit.getWorlds().get(0).getEntities().stream() - .filter(entity -> entity.getType().equals(EntityType.BLOCK_DISPLAY) || entity.getType().equals(EntityType.INTERACTION)) - .toList()); - entities.addAll(Bukkit.getWorlds().get(1).getEntities().stream() - .filter(entity -> entity.getType().equals(EntityType.BLOCK_DISPLAY) || entity.getType().equals(EntityType.INTERACTION)) - .toList()); - entities.addAll(Bukkit.getWorlds().get(2).getEntities().stream() - .filter(entity -> entity.getType().equals(EntityType.BLOCK_DISPLAY) || entity.getType().equals(EntityType.INTERACTION)) - .toList()); - - String url = "jdbc:sqlite:pixelblocks.db"; - String sql = "CREATE TABLE IF NOT EXISTS pixelblocks (" + - "uuid CHAR(36) PRIMARY KEY, " + - "owner CHAR(36), " + - "locationWorldName CHAR(36), " + - "locationX DOUBLE, " + - "locationY DOUBLE, " + - "locationZ DOUBLE, " + - "entryLocationWorldName CHAR(36), " + - "entryLocationX DOUBLE, " + - "entryLocationY DOUBLE, " + - "entryLocationZ DOUBLE" + - ");"; - - try (var conn = DriverManager.getConnection(url); - var stmt = conn.createStatement()) { - stmt.execute(sql); - - ResultSet pixelBlocksResult = stmt.executeQuery("SELECT * FROM pixelblocks;"); - while (pixelBlocksResult.next()) { - - Location newPixelBlockLocation = new Location( - Bukkit.getWorld(pixelBlocksResult.getString("locationWorldName")), - pixelBlocksResult.getDouble("locationX"), - pixelBlocksResult.getDouble("locationY"), - pixelBlocksResult.getDouble("locationZ") - ); - - Location newEntryLocation = new Location( - Bukkit.getWorld(pixelBlocksResult.getString("entryLocationWorldName")), - pixelBlocksResult.getDouble("entryLocationX"), - pixelBlocksResult.getDouble("entryLocationY"), - pixelBlocksResult.getDouble("entryLocationZ") - ); - - entities.stream().filter(entity -> entity.getLocation().clone().add(0, PixelBlock.hitboxOffset, 0).toBlockLocation().equals(newPixelBlockLocation)).forEach(Entity::remove); - - PixelBlock newPixelBlock = new PixelBlock( - newPixelBlockLocation, - UUID.fromString(pixelBlocksResult.getString("owner")), - 16, - UUID.fromString(pixelBlocksResult.getString("uuid")) - ); - newPixelBlock.lastEntryLocation = newEntryLocation; - newPixelBlock.place(newPixelBlockLocation); - } - - } catch (SQLException e) { - System.err.println(e.getMessage()); - } - } } diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/ChessCommand.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/ChessCommand.java deleted file mode 100644 index 9c7c580..0000000 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/ChessCommand.java +++ /dev/null @@ -1,56 +0,0 @@ -package eu.mhsl.minecraft.pixelblocks.commands; - -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.BlockDisplay; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.util.Transformation; -import org.jetbrains.annotations.NotNull; - -public class ChessCommand implements CommandExecutor { - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if(sender instanceof Player p) { - Location playerLocation = p.getLocation().toBlockLocation(); - double scale = (double) 1/16; - - for (int i = 0; i < 16; i++) { - int finalI = i+1; - for (int j = 0; j < 16; j++) { - int finalJ = j+1; - - double blockPositionX = playerLocation.x()+i*scale; - double blockPositionY = playerLocation.y(); - double blockPositionZ = playerLocation.z()+j*scale; - - BlockDisplay bd; - bd = (BlockDisplay) p.getWorld().spawnEntity( - new Location(p.getWorld(), blockPositionX, blockPositionY, blockPositionZ), - EntityType.BLOCK_DISPLAY - ); - - if(finalI % 2 == 0 && finalJ % 2 == 0) { - bd.setBlock(Material.BLACK_CONCRETE.createBlockData()); - } else if(finalI % 2 != 0 && finalJ % 2 != 0) { - bd.setBlock(Material.BLACK_CONCRETE.createBlockData()); - } else { - bd.setBlock(Material.WHITE_CONCRETE.createBlockData()); - } - - Transformation transform = bd.getTransformation(); - transform.getScale().set(scale); - bd.setTransformation(transform); - - } - } - - } else { - sender.sendMessage("This command is only for real Players!"); - } - return(true); - } -} diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/CreatePixelBlockCommand.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/CreatePixelBlockCommand.java index a18382c..53d026f 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/CreatePixelBlockCommand.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/CreatePixelBlockCommand.java @@ -22,7 +22,7 @@ public class CreatePixelBlockCommand implements CommandExecutor { if(Arrays.stream(standardWorlds).toList().contains(playerWorld)) { Location playerLocation = p.getLocation(); - PixelBlock pixelBlock = new PixelBlock(playerLocation, p.getUniqueId(), 16, UUID.randomUUID()); + PixelBlock pixelBlock = new PixelBlock(playerLocation, p.getUniqueId(), UUID.randomUUID()); pixelBlock.place(playerLocation); } else { p.sendMessage("Du kannst nur in der Overworld oder im Nether Pixelblocks erstellen!"); diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/ExitWorldCommand.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/ExitWorldCommand.java index 16b321b..9a907a6 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/ExitWorldCommand.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/ExitWorldCommand.java @@ -20,6 +20,7 @@ public class ExitWorldCommand implements CommandExecutor { World[] standardWorlds = {Bukkit.getWorlds().get(0), Bukkit.getWorlds().get(1), Bukkit.getWorlds().get(2)}; if(!Arrays.stream(standardWorlds).toList().contains(playerWorld)) { + List<PixelBlock> ownedBlocks = PixelBlock.placedBlocks.stream() .filter(pixelBlock -> pixelBlock.owner.equals(p.getUniqueId())) .sorted(Comparator.comparing(pixelBlock -> pixelBlock.lastEntryTime)) @@ -32,6 +33,7 @@ public class ExitWorldCommand implements CommandExecutor { newLocation = Bukkit.getWorlds().getFirst().getSpawnLocation(); } p.teleport(newLocation); + } else { p.sendMessage("Dieser Command ist nur für PixelBlock Welten verfügbar!"); } diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/BlockBreakListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/BlockBreakListener.java index fd888a9..3918616 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/BlockBreakListener.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/BlockBreakListener.java @@ -1,7 +1,5 @@ package eu.mhsl.minecraft.pixelblocks.listeners; -import eu.mhsl.minecraft.pixelblocks.PixelBlocks; -import eu.mhsl.minecraft.pixelblocks.pixelblock.Pixel; import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlock; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -11,7 +9,6 @@ import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import java.util.Arrays; -import java.util.List; public class BlockBreakListener implements Listener { @EventHandler @@ -20,33 +17,10 @@ public class BlockBreakListener implements Listener { World[] standardWorlds = {Bukkit.getWorlds().get(0), Bukkit.getWorlds().get(1), Bukkit.getWorlds().get(2)}; if(!Arrays.stream(standardWorlds).toList().contains(blockLocation.getWorld())) { - Location spawnLocation = blockLocation.getWorld().getSpawnLocation(); + PixelBlock pixelBlock = PixelBlock.getPixelBlockFromWorld(blockLocation.getWorld()); - if(blockLocation.x() < spawnLocation.x() || blockLocation.z() < spawnLocation.z() || blockLocation.y() < spawnLocation.y()-1) { - event.setCancelled(true); - return; - } else if(blockLocation.x() > spawnLocation.x()+15 || blockLocation.z() > spawnLocation.z()+15 || blockLocation.y() > spawnLocation.y()+14) { - event.setCancelled(true); - return; - } - - Bukkit.getScheduler().runTask(PixelBlocks.plugin, () -> { - String blockUUID = Arrays.stream(blockLocation.getWorld().getName().split("/")).toList().getLast(); - List<PixelBlock> pixelBlocks = PixelBlock.placedBlocks.stream().filter(block -> block.uuid.toString().equals(blockUUID)).toList(); - - if(!pixelBlocks.isEmpty()) { - PixelBlock pixelBlock = pixelBlocks.getFirst(); - Location relativeLocation = blockLocation.subtract(spawnLocation.x(), spawnLocation.y()-1, spawnLocation.z()); - relativeLocation.setWorld(pixelBlock.pixelBlockLocation.getWorld()); - List<Pixel> pixels = pixelBlock.pixels.stream().filter(pixel -> pixel.relativeLocation.equals(relativeLocation)).toList(); - - if(!pixels.isEmpty()) { - Pixel pixel = pixels.getFirst(); - pixel.remove(); - pixelBlock.pixels.remove(pixel); - } - } - }); + assert pixelBlock != null; + pixelBlock.handleBlockBreak(event, true); } } } diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/BlockPlaceListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/BlockPlaceListener.java index caac9b0..8eb3afd 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/BlockPlaceListener.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/BlockPlaceListener.java @@ -1,7 +1,5 @@ package eu.mhsl.minecraft.pixelblocks.listeners; -import eu.mhsl.minecraft.pixelblocks.PixelBlocks; -import eu.mhsl.minecraft.pixelblocks.pixelblock.Pixel; import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlock; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -11,7 +9,6 @@ import org.bukkit.event.Listener; import org.bukkit.event.block.BlockPlaceEvent; import java.util.Arrays; -import java.util.List; public class BlockPlaceListener implements Listener { @EventHandler @@ -20,34 +17,10 @@ public class BlockPlaceListener implements Listener { World[] standardWorlds = {Bukkit.getWorlds().get(0), Bukkit.getWorlds().get(1), Bukkit.getWorlds().get(2)}; if(!Arrays.stream(standardWorlds).toList().contains(blockLocation.getWorld())) { - Location spawnLocation = blockLocation.getWorld().getSpawnLocation(); + PixelBlock pixelBlock = PixelBlock.getPixelBlockFromWorld(blockLocation.getWorld()); - if(blockLocation.x() < spawnLocation.x() || blockLocation.z() < spawnLocation.z() || blockLocation.y() < spawnLocation.y()-1) { - event.setCancelled(true); - return; - } else if(blockLocation.x() > spawnLocation.x()+15 || blockLocation.z() > spawnLocation.z()+15 || blockLocation.y() > spawnLocation.y()+14) { - event.setCancelled(true); - return; - } - - Bukkit.getScheduler().runTask(PixelBlocks.plugin, () -> { - String blockUUID = Arrays.stream(blockLocation.getWorld().getName().split("/")).toList().getLast(); - List<PixelBlock> pixelBlocks = PixelBlock.placedBlocks.stream().filter(block -> block.uuid.toString().equals(blockUUID)).toList(); - - if(!pixelBlocks.isEmpty()) { - PixelBlock pixelBlock = pixelBlocks.getFirst(); - Location relativeLocation = blockLocation.subtract(spawnLocation.x(), spawnLocation.y()-1, spawnLocation.z()); - relativeLocation.setWorld(pixelBlock.pixelBlockLocation.getWorld()); - - Pixel newPixel = new Pixel( - relativeLocation, - event.getBlock().getBlockData(), - (1/pixelBlock.pixelsPerBlock)-0.0001, - 0.00005*pixelBlock.pixelsPerBlock); - pixelBlock.pixels.add(newPixel); - newPixel.spawn(pixelBlock.pixelBlockLocation); - } - }); + assert pixelBlock != null; + pixelBlock.handleBlockPlace(event, true); } } } diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerChangeWorldListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerChangeWorldListener.java index b64c6fb..785cff2 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerChangeWorldListener.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerChangeWorldListener.java @@ -8,7 +8,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerChangedWorldEvent; import java.util.Arrays; -import java.util.List; +import java.util.Objects; public class PlayerChangeWorldListener implements Listener { @EventHandler @@ -17,13 +17,7 @@ public class PlayerChangeWorldListener implements Listener { World[] standardWorlds = {Bukkit.getWorlds().get(0), Bukkit.getWorlds().get(1), Bukkit.getWorlds().get(2)}; if(!Arrays.stream(standardWorlds).toList().contains(worldLeft)) { - String blockUUID = Arrays.stream(worldLeft.getName().split("/")).toList().getLast(); - List<PixelBlock> pixelBlocks = PixelBlock.placedBlocks.stream().filter(block -> block.uuid.toString().equals(blockUUID)).toList(); - - if(!pixelBlocks.isEmpty()) { - PixelBlock pixelBlock = pixelBlocks.getFirst(); - pixelBlock.update(); - } + Objects.requireNonNull(PixelBlock.getPixelBlockFromWorld(worldLeft)).update(); } } } diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerInteractListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerInteractListener.java index e03d73b..02dcfa7 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerInteractListener.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerInteractListener.java @@ -1,91 +1,39 @@ package eu.mhsl.minecraft.pixelblocks.listeners; -import eu.mhsl.minecraft.pixelblocks.PixelBlocks; import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlock; import io.papermc.paper.event.player.PrePlayerAttackEntityEvent; import org.bukkit.*; import org.bukkit.entity.Interaction; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEntityEvent; -import org.bukkit.event.player.PlayerInteractEvent; - -import java.util.*; - -import static eu.mhsl.minecraft.pixelblocks.PixelBlocks.plugin; public class PlayerInteractListener implements Listener { -// @EventHandler -// static void onPlayerInteract(PlayerInteractEvent event) { -// if(event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock() != null) { -// if(event.getClickedBlock().getType() == Material.GLASS) { -//// final WorldCreator worldCreator = new WorldCreator(plugin.getDataFolder().getPath()+"/"+event.getPlayer().getUniqueId()); -//// worldCreator.type(WorldType.FLAT); -//// -//// World newWorld = Bukkit.createWorld(worldCreator); -//// -//// event.getPlayer().teleport(newWorld.getSpawnLocation()); -// } -// } -// } - @EventHandler static void onPlayerInteractEntity(PlayerInteractEntityEvent event) { if(event.getRightClicked() instanceof Interaction) { - Location interactionLocation = event.getRightClicked().getLocation().add(0, PixelBlock.hitboxOffset+0.5, 0).toBlockLocation(); + Location interactionLocation = event.getRightClicked().getLocation().clone().add(0, PixelBlock.hitboxOffset, 0).toBlockLocation(); interactionLocation.setYaw(0); interactionLocation.setPitch(0); - UUID playerUID = event.getPlayer().getUniqueId(); - PixelBlock pixelBlock = PixelBlock.placedBlocks.stream() - .filter(block -> block.pixelBlockLocation.equals(interactionLocation)) - .findFirst() - .orElseThrow(); - UUID blockOwner = pixelBlock.owner; + PixelBlock pixelBlock = PixelBlock.getPixelBlockFromLocation(interactionLocation); - if(playerUID.equals(blockOwner)) { - pixelBlock.lastEntryLocation = event.getPlayer().getLocation(); - pixelBlock.lastEntryTime = System.currentTimeMillis(); - pixelBlock.saveToDB(); - - World blockWorld = Bukkit.getWorld(plugin.getDataFolder().getPath()+ "/" +pixelBlock.uuid); - assert blockWorld != null; - event.getPlayer().teleport(blockWorld.getSpawnLocation().clone().subtract(0.5, 0, 0.5)); - -// Bukkit.getScheduler().cancelTask(pixelBlock.updateTaskID); -// pixelBlock.updateTaskID = Bukkit.getScheduler().scheduleSyncRepeatingTask( -// PixelBlocks.plugin, -// pixelBlock::update, -// 100L, -// 100L -// ); - } else { - event.getPlayer().sendMessage("Dieser Block gehört nicht dir!"); - } + assert pixelBlock != null; + pixelBlock.handleInteraction(event.getPlayer()); } } @EventHandler static void onPlayerAttackEntity(PrePlayerAttackEntityEvent event) { if(event.getAttacked() instanceof Interaction) { - Location blockLocation = event.getAttacked().getLocation().add(0, PixelBlock.hitboxOffset+0.5, 0).toBlockLocation(); + Location blockLocation = event.getAttacked().getLocation().add(0, PixelBlock.hitboxOffset, 0).toBlockLocation(); blockLocation.setYaw(0); blockLocation.setPitch(0); - UUID playerUID = event.getPlayer().getUniqueId(); - PixelBlock pixelBlock = PixelBlock.placedBlocks.stream() - .filter(block -> block.pixelBlockLocation.equals(blockLocation)) - .findFirst() - .orElseThrow(); - UUID blockOwner = pixelBlock.owner; - - if(playerUID.equals(blockOwner)) { - Bukkit.getScheduler().runTask(PixelBlocks.plugin, pixelBlock::remove); - } else { - event.getPlayer().sendMessage("Dieser Block gehört nicht dir!"); - } + PixelBlock pixelBlock = PixelBlock.getPixelBlockFromLocation(blockLocation); + assert pixelBlock != null; + pixelBlock.handleAttack(event.getPlayer()); } } } diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerJoinListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerJoinListener.java deleted file mode 100644 index d1e55b2..0000000 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerJoinListener.java +++ /dev/null @@ -1,12 +0,0 @@ -package eu.mhsl.minecraft.pixelblocks.listeners; - -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; - -public class PlayerJoinListener implements Listener { - @EventHandler - static void onPlayerJoin(PlayerJoinEvent event) { - - } -} diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerJumpListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerJumpListener.java deleted file mode 100644 index d854ecd..0000000 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerJumpListener.java +++ /dev/null @@ -1,15 +0,0 @@ -package eu.mhsl.minecraft.pixelblocks.listeners; - -import com.destroystokyo.paper.event.player.PlayerJumpEvent; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; - -public class PlayerJumpListener implements Listener { - @EventHandler - static void onPlayerJump(PlayerJumpEvent event) { -// event.getPlayer().getWorld().spawn(event.getPlayer().getLocation(), BlockDisplay.class, blockDisplay -> { -// blockDisplay.setBlock(Material.OAK_LOG.createBlockData()); -// }); - - } -} diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java index df8dcaa..00b9919 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java @@ -1,26 +1,29 @@ package eu.mhsl.minecraft.pixelblocks.pixelblock; +import eu.mhsl.minecraft.pixelblocks.PixelBlocks; import eu.mhsl.minecraft.pixelblocks.chunkGenerators.EmptyChunkGenerator; import org.bukkit.*; import org.bukkit.block.data.BlockData; import org.bukkit.entity.EntityType; import org.bukkit.entity.Interaction; +import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; import org.codehaus.plexus.util.FileUtils; import java.io.File; import java.io.IOException; -import java.sql.*; import java.util.*; -import static eu.mhsl.minecraft.pixelblocks.PixelBlocks.plugin; +import static eu.mhsl.minecraft.pixelblocks.PixelBlocks.*; public class PixelBlock { public static List<PixelBlock> placedBlocks = new ArrayList<>(); public static float hitboxOffset = 0.005F; public static int worldGrassBorderWidth = 5; + public static int pixelsPerBlock = 16; public Location pixelBlockLocation; - public double pixelsPerBlock; public ArrayList<Pixel> pixels = new ArrayList<>(); public Interaction hitbox; @@ -29,28 +32,51 @@ public class PixelBlock { public UUID owner; public UUID uuid; - public PixelBlock(Location originLocation, UUID owner, double pixelsPerBlock, UUID blockUUID) { + public PixelBlock(Location originLocation, UUID owner, UUID blockUUID) { PixelBlock.placedBlocks.add(this); this.uuid = blockUUID; this.pixelBlockLocation = originLocation.toBlockLocation(); this.pixelBlockLocation.setYaw(0); this.pixelBlockLocation.setPitch(0); - this.pixelsPerBlock = pixelsPerBlock; this.owner = owner; -// pixelBlockLocation.getBlock().setType(Material.GLASS); - - createWorld(); + createPixelWorld(); } - void createWorld() { - File file = new File(plugin.getDataFolder().getPath()+ "/" +this.uuid.toString()); + public static PixelBlock getPixelBlockFromWorld(World world) { + String blockUUID = Arrays.stream(world.getName().split(pathSeparator)).toList().getLast(); + List<PixelBlock> pixelBlocks = placedBlocks.stream().filter(block -> block.uuid.toString().equals(blockUUID)).toList(); + + if(!pixelBlocks.isEmpty()) { + return pixelBlocks.getFirst(); + } else { + return null; + } + } + + public static PixelBlock getPixelBlockFromLocation(Location location) { + Location loc = location.clone().toBlockLocation(); + loc.setPitch(0); + loc.setYaw(0); + + List<PixelBlock> pixelBlocks = placedBlocks.stream() + .filter(block -> block.pixelBlockLocation.equals(loc)) + .toList(); + + if(pixelBlocks.isEmpty()) { + return null; + } else { + return pixelBlocks.getFirst(); + } + } + + + void createPixelWorld() { + File file = new File(plugin.getDataFolder().getPath()+ pathSeparator +this.uuid.toString()); if(!file.exists() || !file.isDirectory()) { - System.out.println("NEUE WELT WURDE ERSTELLT"); - - final WorldCreator worldCreator = new WorldCreator(plugin.getDataFolder().getPath() + "/" + this.uuid); + final WorldCreator worldCreator = new WorldCreator(plugin.getDataFolder().getPath() + pathSeparator + this.uuid); worldCreator.type(WorldType.FLAT); worldCreator.generator(new EmptyChunkGenerator()); World newWorld = Bukkit.createWorld(worldCreator); @@ -85,21 +111,110 @@ public class PixelBlock { borderStartLocation.getBlock().setType(Material.WHITE_CONCRETE); }); } else { - new WorldCreator(plugin.getDataFolder().getPath() + "/" + this.uuid).createWorld(); + new WorldCreator(plugin.getDataFolder().getPath() + pathSeparator + this.uuid).createWorld(); } } + public void handleInteraction(Player player) { + if(!player.getUniqueId().equals(owner)) { + player.sendMessage("Dieser Pixelblock gehört nicht dir!"); + return; + } + + this.lastEntryLocation = player.getLocation(); + this.lastEntryTime = System.currentTimeMillis(); + dataBase.savePixelBlock(this); + + player.teleport(getPlayerSpawnLocation(player)); + } + + public void handleAttack(Player player) { + if(!player.getUniqueId().equals(owner)) { + player.sendMessage("Dieser Pixelblock gehört nicht dir!"); + return; + } + + this.delete(); + } + + public void handleBlockBreak(BlockBreakEvent event, boolean liveUpdate) { + Location blockLocation = event.getBlock().getLocation(); + Location spawnLocation = blockLocation.getWorld().getSpawnLocation(); + + if(blockLocation.x() < spawnLocation.x() || blockLocation.z() < spawnLocation.z() || blockLocation.y() < spawnLocation.y()-1) { + event.setCancelled(true); + return; + } else if(blockLocation.x() > spawnLocation.x()+15 || blockLocation.z() > spawnLocation.z()+15 || blockLocation.y() > spawnLocation.y()+14) { + event.setCancelled(true); + return; + } + + Bukkit.getScheduler().runTask(plugin, () -> { + if(liveUpdate) { + Location relativeLocation = blockLocation.subtract(spawnLocation.x(), spawnLocation.y()-1, spawnLocation.z()); + relativeLocation.setWorld(this.pixelBlockLocation.getWorld()); + List<Pixel> pixels = this.pixels.stream().filter(pixel -> pixel.relativeLocation.equals(relativeLocation)).toList(); + if(!pixels.isEmpty()) { + Pixel pixel = pixels.getFirst(); + pixel.remove(); + this.pixels.remove(pixel); + } + } + }); + } + + public void handleBlockPlace(BlockPlaceEvent event, boolean liveUpdate) { + Location blockLocation = event.getBlock().getLocation(); + Location spawnLocation = blockLocation.getWorld().getSpawnLocation(); + + if(blockLocation.x() < spawnLocation.x() || blockLocation.z() < spawnLocation.z() || blockLocation.y() < spawnLocation.y()-1) { + event.setCancelled(true); + return; + } else if(blockLocation.x() > spawnLocation.x()+15 || blockLocation.z() > spawnLocation.z()+15 || blockLocation.y() > spawnLocation.y()+14) { + event.setCancelled(true); + return; + } + + Bukkit.getScheduler().runTask(PixelBlocks.plugin, () -> { + if(liveUpdate) { + Location relativeLocation = blockLocation.subtract(spawnLocation.x(), spawnLocation.y()-1, spawnLocation.z()); + relativeLocation.setWorld(this.pixelBlockLocation.getWorld()); + + Pixel newPixel = new Pixel(relativeLocation, event.getBlock().getBlockData(), ((double) 1 /pixelsPerBlock), 0); + this.pixels.add(newPixel); + newPixel.spawn(this.pixelBlockLocation); + } + }); + } + + public Location getPlayerSpawnLocation(Player player) { + Location spawnLocation = getPixelWorld().getSpawnLocation().clone().subtract(0.5, 0, 0.5); + spawnLocation.setYaw(player.getLocation().getYaw()); + spawnLocation.setPitch(player.getLocation().getPitch()); + return spawnLocation; + } + + public World getPixelWorld() { + return Bukkit.getWorld(plugin.getDataFolder().getPath() + pathSeparator + this.uuid); + } + public void update() { Bukkit.getScheduler().runTask(plugin, () -> { - for(Pixel pixel : this.pixels) { pixel.remove(); } - pixels.clear(); + clearEntities(); + + hitbox = (Interaction) pixelBlockLocation.getWorld().spawnEntity( + pixelBlockLocation.clone().add(0.5, -hitboxOffset, 0.5), + EntityType.INTERACTION + ); + hitbox.setInteractionHeight(1F + 2*hitboxOffset); + hitbox.setInteractionWidth(1F + 2*hitboxOffset); for (int x = 0; x < 16; x++) { for (int y = 0; y < 16; y++) { for (int z = 0; z < 16; z++) { Location relativeLocation = new Location(pixelBlockLocation.getWorld(), x, y, z); Location blockLocation = Objects.requireNonNull(Bukkit - .getWorld(plugin.getDataFolder().getPath() + "/" + this.uuid)) + .getWorld(plugin.getDataFolder().getPath() + pathSeparator + this.uuid)) .getSpawnLocation() .clone() .subtract(0, 1, 0) @@ -107,7 +222,7 @@ public class PixelBlock { BlockData block = blockLocation.getBlock().getBlockData(); if(block.getMaterial() != Material.AIR) { - Pixel newPixel = new Pixel(relativeLocation, block, (1/pixelsPerBlock)-0.0001, 0.00005*pixelsPerBlock); + Pixel newPixel = new Pixel(relativeLocation, block, ((double) 1 /pixelsPerBlock), 0); pixels.add(newPixel); } } @@ -120,134 +235,47 @@ public class PixelBlock { }); } - public void saveToDB() { - String url = "jdbc:sqlite:pixelblocks.db"; - List<UUID> uuids = new ArrayList<>(); - try (var conn = DriverManager.getConnection(url); - var stmt = conn.createStatement()) { - ResultSet pixelBlocksResult = stmt.executeQuery("SELECT * FROM pixelblocks;"); - while (pixelBlocksResult.next()) { - uuids.add(UUID.fromString(pixelBlocksResult.getString("uuid"))); - } - } catch (SQLException e) { - System.err.println(e.getMessage()); + public void clearEntities() { + if(!pixels.isEmpty()) { + this.pixels.forEach(Pixel::remove); + pixels.clear(); } - if(!uuids.contains(this.uuid)) { - try (var conn = DriverManager.getConnection(url)) { - PreparedStatement prep = conn.prepareStatement( - "INSERT INTO pixelblocks(uuid, owner, " + - "locationWorldName, locationX, locationY, locationZ, " + - "entryLocationWorldName, entryLocationX, entryLocationY, entryLocationZ) " + - "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?);" - ); - prep.setString(1, this.uuid.toString()); - prep.setString(2, this.owner.toString()); - - prep.setString(3, this.pixelBlockLocation.getWorld().getName()); - prep.setDouble(4, this.pixelBlockLocation.getX()); - prep.setDouble(5, this.pixelBlockLocation.getY()); - prep.setDouble(6, this.pixelBlockLocation.getZ()); - - if(this.lastEntryLocation != null) { - prep.setString(7, this.lastEntryLocation.getWorld().getName()); - prep.setDouble(8, this.lastEntryLocation.getX()); - prep.setDouble(9, this.lastEntryLocation.getY()); - prep.setDouble(10, this.lastEntryLocation.getZ()); - } else { - prep.setString(7, Bukkit.getWorlds().getFirst().getName()); - prep.setDouble(8, Bukkit.getWorlds().getFirst().getSpawnLocation().getX()); - prep.setDouble(9, Bukkit.getWorlds().getFirst().getSpawnLocation().getY()); - prep.setDouble(10, Bukkit.getWorlds().getFirst().getSpawnLocation().getZ()); - } - - prep.executeUpdate(); - } catch (SQLException e) { - System.err.println(e.getMessage()); - } - } else { - try (var conn = DriverManager.getConnection(url)) { - PreparedStatement prep = conn.prepareStatement( - "UPDATE pixelblocks " + - "SET owner=?, locationWorldName=?, locationX=?, locationY=?, locationZ=?," + - "entryLocationWorldName=?, entryLocationX=?, entryLocationY=?, entryLocationZ=? " + - "WHERE uuid=?;" - ); - prep.setString(1, this.owner.toString()); - - prep.setString(2, this.pixelBlockLocation.getWorld().getName()); - prep.setDouble(3, this.pixelBlockLocation.getX()); - prep.setDouble(4, this.pixelBlockLocation.getY()); - prep.setDouble(5, this.pixelBlockLocation.getZ()); - - if(this.lastEntryLocation != null) { - prep.setString(6, this.lastEntryLocation.getWorld().getName()); - prep.setDouble(7, this.lastEntryLocation.getX()); - prep.setDouble(8, this.lastEntryLocation.getY()); - prep.setDouble(9, this.lastEntryLocation.getZ()); - } else { - prep.setString(6, Bukkit.getWorlds().getFirst().getName()); - prep.setDouble(7, Bukkit.getWorlds().getFirst().getSpawnLocation().getX()); - prep.setDouble(8, Bukkit.getWorlds().getFirst().getSpawnLocation().getY()); - prep.setDouble(9, Bukkit.getWorlds().getFirst().getSpawnLocation().getZ()); - } - - prep.setString(10, this.uuid.toString()); - - prep.executeUpdate(); - } catch (SQLException e) { - System.err.println(e.getMessage()); - } + if(hitbox != null) { + hitbox.remove(); + hitbox = null; } } - public void removeFromDB() { - Bukkit.getScheduler().runTask(plugin, () -> { - String url = "jdbc:sqlite:pixelblocks.db"; - try (var conn = DriverManager.getConnection(url)) { - PreparedStatement prep = conn.prepareStatement("DELETE FROM pixelblocks WHERE uuid = ?"); - prep.setString(1, this.uuid.toString()); - prep.executeUpdate(); + public boolean place(Location placeLocation) { + Location newLocation = placeLocation.toBlockLocation(); + newLocation.setPitch(0); + newLocation.setYaw(0); - conn.close(); - prep.close(); - } catch (SQLException e) { - System.err.println(e.getMessage()); - } - }); - } - - public void place(Location placeLocation) { - Bukkit.getScheduler().runTask(plugin, () -> { - hitbox = (Interaction) pixelBlockLocation.getWorld().spawnEntity( - pixelBlockLocation.clone().add(0.5, -hitboxOffset, 0.5), - EntityType.INTERACTION - ); - hitbox.setInteractionHeight(1F + 2*hitboxOffset); - hitbox.setInteractionWidth(1F + 2*hitboxOffset); - this.saveToDB(); + if(PixelBlock.getPixelBlockFromLocation(newLocation) == null || PixelBlock.getPixelBlockFromLocation(newLocation) == this) { + this.pixelBlockLocation = newLocation; update(); - }); -// this.updateTaskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, this::update, 100L, 100L); + dataBase.savePixelBlock(this); + return true; + } + return false; } public void remove() { - this.removeFromDB(); + dataBase.removePixelBlock(this); - this.pixels.forEach(Pixel::remove); - hitbox.remove(); -// pixelBlockLocation.getBlock().setType(Material.AIR); + clearEntities(); placedBlocks.remove(this); } public void delete() { this.remove(); - Bukkit.unloadWorld(plugin.getDataFolder().getPath() + "/" + this.uuid, true); + Bukkit.unloadWorld(getPixelWorld(), true); try { - FileUtils.deleteDirectory(plugin.getDataFolder().getPath() + "/" + this.uuid); + FileUtils.deleteDirectory(plugin.getDataFolder().getPath() + pathSeparator + this.uuid); } catch (IOException e) { - System.err.println("World could not be deleted!"); + System.err.println("World could not be deleted: " + e.getMessage()); } } }