From 216258955d226de64f04b0acf8b95e33c0d4abfd Mon Sep 17 00:00:00 2001
From: lars <larslukasneuhaus@gmx.de>
Date: Fri, 12 Jul 2024 19:00:56 +0200
Subject: [PATCH] started with database

---
 .../minecraft/pixelblocks/PixelBlocks.java    |  49 ++++++-
 .../commands/CreatePixelBlockCommand.java     |  16 ++-
 .../commands/ExitWorldCommand.java            |   2 +-
 .../listeners/PlayerChangeWorldListener.java  |  16 +++
 .../listeners/PlayerInteractListener.java     |  20 +--
 .../pixelblocks/pixelblock/PixelBlock.java    | 127 +++++++++++-------
 6 files changed, 169 insertions(+), 61 deletions(-)

diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocks.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocks.java
index 8fb5249..f4b5bc3 100644
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocks.java
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocks.java
@@ -4,9 +4,16 @@ 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.plugin.java.JavaPlugin;
 
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.util.Objects;
+import java.util.UUID;
 
 public final class PixelBlocks extends JavaPlugin {
     public static PixelBlocks plugin;
@@ -14,8 +21,8 @@ public final class PixelBlocks extends JavaPlugin {
     @Override
     public void onEnable() {
         PixelBlocks.plugin = this;
-        this.getLogger().info("Hello World");
-//        new File(plugin.getDataFolder().getPath()).mkdir();
+        this.getLogger().info("PixelBlocks Plugin was enabled.");
+        this.loadDB();
 
         getServer().getPluginManager().registerEvents(new PlayerJumpListener(), this);
         getServer().getPluginManager().registerEvents(new PlayerInteractListener(), this);
@@ -24,10 +31,48 @@ public final class PixelBlocks extends JavaPlugin {
         getServer().getPluginManager().registerEvents(new BlockBreakListener(), this);
         getServer().getPluginManager().registerEvents(new BlockPlaceListener(), this);
         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() {
+        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" +
+            ");";
+
+        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"));
+
+                PixelBlock newPixelBlock = new PixelBlock(
+                    newPixelBlockLocation,
+                    UUID.fromString(pixelBlocksResult.getString("owner")),
+                    16
+                );
+                newPixelBlock.remove();
+                newPixelBlock.place(newPixelBlockLocation);
+            }
+
+        } catch (SQLException e) {
+            System.err.println(e.getMessage());
+        }
+    }
+
 }
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 ccf7df5..8bd17e8 100644
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/CreatePixelBlockCommand.java
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/CreatePixelBlockCommand.java
@@ -3,19 +3,29 @@ package eu.mhsl.minecraft.pixelblocks.commands;
 import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlock;
 import org.bukkit.Bukkit;
 import org.bukkit.Location;
+import org.bukkit.World;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 
+import java.util.Arrays;
+
 public class CreatePixelBlockCommand 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();
-            PixelBlock pixelBlock = new PixelBlock(playerLocation, p.getUniqueId(), 16);
-            pixelBlock.place(playerLocation);
+            World playerWorld = p.getWorld();
+            World[] standardWorlds = {Bukkit.getWorlds().get(0), Bukkit.getWorlds().get(1)};
+
+            if(Arrays.stream(standardWorlds).toList().contains(playerWorld)) {
+                Location playerLocation = p.getLocation();
+                PixelBlock pixelBlock = new PixelBlock(playerLocation, p.getUniqueId(), 16);
+                pixelBlock.place(playerLocation);
+            } else {
+                p.sendMessage("Du kannst nur in der Overworld oder im Nether Pixelblocks erstellen!");
+            }
         }
 
         return(true);
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 c0b15e1..16b321b 100644
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/ExitWorldCommand.java
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/commands/ExitWorldCommand.java
@@ -21,7 +21,7 @@ public class ExitWorldCommand implements CommandExecutor {
 
             if(!Arrays.stream(standardWorlds).toList().contains(playerWorld)) {
                 List<PixelBlock> ownedBlocks = PixelBlock.placedBlocks.stream()
-                        .filter(pixelBlock -> pixelBlock.owner == p.getUniqueId())
+                        .filter(pixelBlock -> pixelBlock.owner.equals(p.getUniqueId()))
                         .sorted(Comparator.comparing(pixelBlock -> pixelBlock.lastEntryTime))
                         .toList();
 
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 db5ed9b..b64c6fb 100644
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerChangeWorldListener.java
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerChangeWorldListener.java
@@ -1,13 +1,29 @@
 package eu.mhsl.minecraft.pixelblocks.listeners;
 
+import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlock;
+import org.bukkit.Bukkit;
 import org.bukkit.World;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
 import org.bukkit.event.player.PlayerChangedWorldEvent;
 
+import java.util.Arrays;
+import java.util.List;
+
 public class PlayerChangeWorldListener implements Listener {
     @EventHandler
     static void onPlayerChangeWorld(PlayerChangedWorldEvent event) {
         World worldLeft = event.getFrom();
+        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();
+            }
+        }
     }
 }
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 93e4ede..856009a 100644
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerInteractListener.java
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlayerInteractListener.java
@@ -44,21 +44,21 @@ public class PlayerInteractListener implements Listener {
                     .orElseThrow();
             UUID blockOwner = pixelBlock.owner;
 
-            if(playerUID == blockOwner) {
+            if(playerUID.equals(blockOwner)) {
                 pixelBlock.lastEntryLocation = event.getPlayer().getLocation();
                 pixelBlock.lastEntryTime = System.currentTimeMillis();
 
-                World blockWorld = Bukkit.getWorld(plugin.getDataFolder().getPath()+"/"+pixelBlock.uuid);
+                World blockWorld = Bukkit.getWorld(plugin.getDataFolder().getPath()+ "/"+pixelBlock.uuid);
                 assert blockWorld != null;
                 event.getPlayer().teleport(blockWorld.getSpawnLocation());
 
-                Bukkit.getScheduler().cancelTask(pixelBlock.updateTaskID);
-                pixelBlock.updateTaskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(
-                    PixelBlocks.plugin,
-                    pixelBlock::update,
-                    100L,
-                    100L
-                );
+//                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!");
             }
@@ -79,7 +79,7 @@ public class PlayerInteractListener implements Listener {
                     .orElseThrow();
             UUID blockOwner = pixelBlock.owner;
 
-            if(playerUID == blockOwner) {
+            if(playerUID.equals(blockOwner)) {
                 Bukkit.getScheduler().runTask(PixelBlocks.plugin, pixelBlock::remove);
             } else {
                 event.getPlayer().sendMessage("Dieser Block gehört nicht dir!");
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 039dfd9..497e0ef 100644
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java
@@ -5,8 +5,8 @@ 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 java.sql.*;
 import java.util.*;
 
 import static eu.mhsl.minecraft.pixelblocks.PixelBlocks.plugin;
@@ -25,7 +25,6 @@ public class PixelBlock {
     public Location lastEntryLocation;
     public UUID owner;
     public UUID uuid;
-    public int updateTaskID;
 
     public PixelBlock(Location originLocation, UUID owner, double pixelsPerBlock) {
         PixelBlock.placedBlocks.add(this);
@@ -62,53 +61,57 @@ public class PixelBlock {
     }
 
     void createWorld() {
-        final WorldCreator worldCreator = new WorldCreator(plugin.getDataFolder().getPath()+"/"+this.uuid);
-        worldCreator.type(WorldType.FLAT);
-        worldCreator.generator(new EmptyChunkGenerator());
-        World newWorld = Bukkit.createWorld(worldCreator);
+        if(Bukkit.getWorld(plugin.getDataFolder().getPath() + "/" + this.uuid) == null) {
+            final WorldCreator worldCreator = new WorldCreator(plugin.getDataFolder().getPath() + "/" + this.uuid);
+            worldCreator.type(WorldType.FLAT);
+            worldCreator.generator(new EmptyChunkGenerator());
+            World newWorld = Bukkit.createWorld(worldCreator);
 
-        assert newWorld != null;
-        Location borderStartLocation = newWorld.getSpawnLocation().clone().subtract(1, 1, 1);
-        Location grassStartLocation = borderStartLocation.clone().subtract(worldGrassBorderWidth, 0, worldGrassBorderWidth);
+            assert newWorld != null;
+            newWorld.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false);
 
-        Bukkit.getScheduler().runTask(plugin, () -> {
-            for (int x = 0; x < 18+2*worldGrassBorderWidth; x++) {
-                for (int z = 0; z < 18+2*worldGrassBorderWidth; z++) {
-                    grassStartLocation.clone().add(x, 0, z).getBlock().setType(Material.GRASS_BLOCK);
-                }
-            }
-            for (int x = 0; x < 18+2*worldGrassBorderWidth; x++) {
-                for (int z = 0; z < 18+2*worldGrassBorderWidth; z++) {
-                    grassStartLocation.clone().add(x, -1, z).getBlock().setType(Material.DIRT);
-                }
-            }
-            for (int x = 0; x < 18; x++) {
-                for (int z = 0; z < 18; z++) {
-                    Location currentLocation = borderStartLocation.clone().add(x, 0, z);
-                    if(currentLocation.x() == borderStartLocation.x() || currentLocation.z() == borderStartLocation.z()) {
-                        currentLocation.getBlock().setType(Material.RED_CONCRETE);
-                    } else if (currentLocation.x() == borderStartLocation.x()+17 || currentLocation.z() == borderStartLocation.z()+17) {
-                        currentLocation.getBlock().setType(Material.RED_CONCRETE);
+            Location borderStartLocation = newWorld.getSpawnLocation().clone().subtract(1, 1, 1);
+            Location grassStartLocation = borderStartLocation.clone().subtract(worldGrassBorderWidth, 0, worldGrassBorderWidth);
+
+            Bukkit.getScheduler().runTask(plugin, () -> {
+                for (int x = 0; x < 18 + 2 * worldGrassBorderWidth; x++) {
+                    for (int z = 0; z < 18 + 2 * worldGrassBorderWidth; z++) {
+                        grassStartLocation.clone().add(x, 0, z).getBlock().setType(Material.GRASS_BLOCK);
                     }
                 }
-            }
-            borderStartLocation.getBlock().setType(Material.WHITE_CONCRETE);
-        });
+                for (int x = 0; x < 18 + 2 * worldGrassBorderWidth; x++) {
+                    for (int z = 0; z < 18 + 2 * worldGrassBorderWidth; z++) {
+                        grassStartLocation.clone().add(x, -1, z).getBlock().setType(Material.DIRT);
+                    }
+                }
+                for (int x = 0; x < 18; x++) {
+                    for (int z = 0; z < 18; z++) {
+                        Location currentLocation = borderStartLocation.clone().add(x, 0, z);
+                        if (currentLocation.x() == borderStartLocation.x() || currentLocation.z() == borderStartLocation.z()) {
+                            currentLocation.getBlock().setType(Material.RED_CONCRETE);
+                        } else if (currentLocation.x() == borderStartLocation.x() + 17 || currentLocation.z() == borderStartLocation.z() + 17) {
+                            currentLocation.getBlock().setType(Material.RED_CONCRETE);
+                        }
+                    }
+                }
+                borderStartLocation.getBlock().setType(Material.WHITE_CONCRETE);
+            });
+        }
     }
 
     public void update() {
         Bukkit.getScheduler().runTask(plugin, () -> {
-            Player owner = null;
-            for(Player player : Bukkit.getOnlinePlayers()) {
-                if(player.getUniqueId() == this.owner) {
-                    owner = player;
-                }
-            }
-
-            World[] standardWorlds = {Bukkit.getWorlds().get(0), Bukkit.getWorlds().get(1), Bukkit.getWorlds().get(2)};
-            if(owner == null || Arrays.stream(standardWorlds).toList().contains(owner.getWorld())) {
-                Bukkit.getScheduler().cancelTask(this.updateTaskID);
-            }
+//            Player owner = null;
+//            for(Player player : Bukkit.getOnlinePlayers()) {
+//                if(player.getUniqueId() == this.owner) {
+//                    owner = player;
+//                }
+//            }
+//
+//            World[] standardWorlds = {Bukkit.getWorlds().get(0), Bukkit.getWorlds().get(1), Bukkit.getWorlds().get(2)};
+//            if(owner == null || Arrays.stream(standardWorlds).toList().contains(owner.getWorld())) {
+//                Bukkit.getScheduler().cancelTask(this.updateTaskID);
+//            }
 
             for(Pixel pixel : this.pixels) { pixel.remove(); }
             pixels.clear();
@@ -144,16 +147,50 @@ public class PixelBlock {
             for(Pixel pixel : pixels) {
                 pixel.spawn(placeLocation.toBlockLocation());
             }
-        });
 
-        this.updateTaskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, this::update, 100L, 100L);
+
+            String url = "jdbc:sqlite:pixelblocks.db";
+            try (var conn = DriverManager.getConnection(url)) {
+                PreparedStatement prep = conn.prepareStatement(
+                    "INSERT INTO pixelblocks(uuid, owner, locationWorldName, locationX, locationY, locationZ)" +
+                        " 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());
+
+                prep.executeUpdate();
+
+                conn.close();
+                prep.close();
+            } catch (SQLException e) {
+                System.err.println(e.getMessage());
+            }
+        });
+//        this.updateTaskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, this::update, 100L, 100L);
     }
 
     public void remove() {
+        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();
+
+                conn.close();
+                prep.close();
+            } catch (SQLException e) {
+                System.err.println(e.getMessage());
+            }
+        });
+
         this.pixels.forEach(Pixel::remove);
         hitbox.remove();
-        pixelBlockLocation.getBlock().setType(Material.AIR);
+//        pixelBlockLocation.getBlock().setType(Material.AIR);
         placedBlocks.remove(this);
-        Bukkit.getScheduler().cancelTask(this.updateTaskID);
     }
 }