From 45a4349c2d150026a3dcc3503026668e4216bb30 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Elias=20M=C3=BCller?= <elias@elias-mueller.com>
Date: Wed, 28 Aug 2024 14:50:16 +0200
Subject: [PATCH] basic world loading implemented

---
 .idea/codeStyles/codeStyleConfig.xml          |  5 ++
 build.gradle.kts                              |  9 ++-
 .../minecraft/WorldMuseum/CancelListener.java | 12 ++++
 .../eu/mhsl/minecraft/WorldMuseum/Main.java   | 52 ++++++++++++++++
 .../minecraft/WorldMuseum/ViewableWorld.java  | 60 +++++++++++++++++++
 .../worldSelector/WorldSelectInventory.java   | 21 +++++++
 .../worldSelector/WorldSelectListener.java    | 31 ++++++++++
 src/main/java/org/example/WorldMuseum.java    | 13 ----
 src/main/resources/config.yml                 |  3 +
 src/main/resources/plugin.yml                 |  6 ++
 10 files changed, 198 insertions(+), 14 deletions(-)
 create mode 100644 .idea/codeStyles/codeStyleConfig.xml
 create mode 100644 src/main/java/eu/mhsl/minecraft/WorldMuseum/CancelListener.java
 create mode 100644 src/main/java/eu/mhsl/minecraft/WorldMuseum/Main.java
 create mode 100644 src/main/java/eu/mhsl/minecraft/WorldMuseum/ViewableWorld.java
 create mode 100644 src/main/java/eu/mhsl/minecraft/WorldMuseum/worldSelector/WorldSelectInventory.java
 create mode 100644 src/main/java/eu/mhsl/minecraft/WorldMuseum/worldSelector/WorldSelectListener.java
 delete mode 100644 src/main/java/org/example/WorldMuseum.java
 create mode 100644 src/main/resources/config.yml
 create mode 100644 src/main/resources/plugin.yml

diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000..a55e7a1
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+<component name="ProjectCodeStyleConfiguration">
+  <state>
+    <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
+  </state>
+</component>
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
index 98fbefe..1d4a2ba 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -23,4 +23,11 @@ java {
 
 tasks.test {
     useJUnitPlatform()
-}
\ No newline at end of file
+}
+
+tasks.register<Exec>("copyJarToTestServer") {
+    dependsOn(tasks.jar)
+    mustRunAfter(tasks.jar)
+
+    commandLine("cp", "build/libs/WorldMuseum-1.0-SNAPSHOT.jar", "/home/elias/Dokumente/mcTestServer/plugins/worldmuseum.jar")
+}
diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/CancelListener.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/CancelListener.java
new file mode 100644
index 0000000..a04fa9a
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/CancelListener.java
@@ -0,0 +1,12 @@
+package eu.mhsl.minecraft.WorldMuseum;
+
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.BlockRedstoneEvent;
+
+public class CancelListener implements Listener {
+    @EventHandler
+    public void disableRedstone(BlockRedstoneEvent event) {
+        event.setNewCurrent(0);
+    }
+}
diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/Main.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/Main.java
new file mode 100644
index 0000000..e5ca76a
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/Main.java
@@ -0,0 +1,52 @@
+package eu.mhsl.minecraft.WorldMuseum;
+
+import eu.mhsl.minecraft.WorldMuseum.worldSelector.WorldSelectListener;
+import org.bukkit.Bukkit;
+import org.bukkit.event.Listener;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+
+public class Main extends JavaPlugin {
+    private static Main instance;
+
+    private final List<ViewableWorld> worlds = new ArrayList<>();
+
+    @Override
+    public void onEnable() {
+        Main.instance = this;
+        this.saveDefaultConfig();
+
+        List<Listener> listeners = List.of(
+            new WorldSelectListener(),
+            new CancelListener()
+        );
+        listeners.forEach(listener -> Bukkit.getPluginManager().registerEvents(listener, this));
+
+        this.loadWorlds();
+    }
+
+    @Override
+    public void onDisable() {
+    }
+
+    private void loadWorlds() {
+        File worldFolder = new File(getDataFolder().getAbsolutePath() + "/worlds");
+        //noinspection ResultOfMethodCallIgnored
+        worldFolder.mkdirs();
+        Arrays.stream(Objects.requireNonNull(worldFolder.listFiles())).forEach(file -> this.worlds.add(new ViewableWorld(file)));
+        this.worlds.forEach(ViewableWorld::loadWorld);
+    }
+
+    public static Main instance() {
+        return Main.instance;
+    }
+
+    public List<ViewableWorld> getWorlds() {
+        return worlds;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/ViewableWorld.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/ViewableWorld.java
new file mode 100644
index 0000000..5969523
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/ViewableWorld.java
@@ -0,0 +1,60 @@
+package eu.mhsl.minecraft.WorldMuseum;
+
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.util.TriState;
+import org.bukkit.Material;
+import org.bukkit.World;
+import org.bukkit.WorldCreator;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+import org.bukkit.generator.ChunkGenerator;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import java.io.File;
+
+public class ViewableWorld {
+    private final File worldLocation;
+    private World world;
+
+    private boolean enabled = true;
+    private String name;
+    private Material icon = Material.GRASS_BLOCK;
+
+    public ViewableWorld(File worldLocation) {
+        this.worldLocation = worldLocation;
+        this.name = "unnamed_" + worldLocation.getName();
+        File configFile = new File(this.worldLocation.getAbsolutePath() + "/config.yml");
+        if (configFile.exists()) {
+            ConfigurationSection config = YamlConfiguration.loadConfiguration(configFile);
+            this.enabled = config.getBoolean("enabled");
+            this.name = config.getString("name");
+            this.icon = Material.valueOf(config.getString("icon"));
+        }
+    }
+
+    public void loadWorld() {
+        if(world != null) throw new IllegalStateException("World was already loaded");
+        WorldCreator worldCreator = new WorldCreator(this.worldLocation.getAbsolutePath());
+        worldCreator.keepSpawnLoaded(TriState.FALSE);
+        worldCreator.generator(new ChunkGenerator() {});
+        this.world = worldCreator.createWorld();
+    }
+
+    public void addViewer(Player player) {
+        player.teleport(world.getSpawnLocation());
+    }
+
+    public ItemStack getItem() {
+        ItemStack stack = new ItemStack(this.icon);
+        ItemMeta meta = stack.getItemMeta();
+        meta.displayName(Component.text(name));
+        stack.setItemMeta(meta);
+        return stack;
+    }
+
+    public boolean isEnabled() {
+        return enabled;
+    }
+}
diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/worldSelector/WorldSelectInventory.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/worldSelector/WorldSelectInventory.java
new file mode 100644
index 0000000..f21344e
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/worldSelector/WorldSelectInventory.java
@@ -0,0 +1,21 @@
+package eu.mhsl.minecraft.WorldMuseum.worldSelector;
+
+import eu.mhsl.minecraft.WorldMuseum.Main;
+import eu.mhsl.minecraft.WorldMuseum.ViewableWorld;
+import org.bukkit.Bukkit;
+import org.bukkit.inventory.Inventory;
+
+import java.util.List;
+
+public class WorldSelectInventory {
+    public static Inventory generateInventory() {
+        List<ViewableWorld> worlds = Main.instance().getWorlds();
+        Inventory inventory = Bukkit.createInventory(null, Math.max(worlds.size() / 9, 1) * 9);
+
+        worlds.stream()
+            .filter(ViewableWorld::isEnabled)
+            .forEach(viewableWorld -> inventory.addItem(viewableWorld.getItem()));
+
+        return inventory;
+    }
+}
diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/worldSelector/WorldSelectListener.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/worldSelector/WorldSelectListener.java
new file mode 100644
index 0000000..6a1bbda
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/worldSelector/WorldSelectListener.java
@@ -0,0 +1,31 @@
+package eu.mhsl.minecraft.WorldMuseum.worldSelector;
+
+import eu.mhsl.minecraft.WorldMuseum.Main;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.event.player.PlayerJoinEvent;
+
+public class WorldSelectListener implements Listener {
+    @EventHandler
+    public void onInteract(InventoryClickEvent event) {
+        event.setCancelled(true);
+
+        Main.instance().getWorlds().stream()
+            .filter(viewableWorld -> viewableWorld.getItem().equals(event.getCurrentItem()))
+            .findFirst()
+            .ifPresent(viewableWorld -> viewableWorld.addViewer((Player) event.getWhoClicked()));
+    }
+
+    @EventHandler
+    public void onJoin(PlayerJoinEvent event) {
+        Bukkit.getScheduler().scheduleSyncDelayedTask(
+            Main.instance(),
+            () -> event.getPlayer().openInventory(
+                WorldSelectInventory.generateInventory()
+            )
+        );
+    }
+}
diff --git a/src/main/java/org/example/WorldMuseum.java b/src/main/java/org/example/WorldMuseum.java
deleted file mode 100644
index 717683c..0000000
--- a/src/main/java/org/example/WorldMuseum.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.example;
-
-import org.bukkit.plugin.java.JavaPlugin;
-
-public class WorldMuseum extends JavaPlugin {
-    @Override
-    public void onEnable() {
-    }
-
-    @Override
-    public void onDisable() {
-    }
-}
\ No newline at end of file
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
new file mode 100644
index 0000000..59f3224
--- /dev/null
+++ b/src/main/resources/config.yml
@@ -0,0 +1,3 @@
+bungee:
+  enabled: true
+  returnToServer: 'server'
\ No newline at end of file
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
new file mode 100644
index 0000000..94e7c77
--- /dev/null
+++ b/src/main/resources/plugin.yml
@@ -0,0 +1,6 @@
+name: WorldMuseum
+version: 0.1
+main: eu.mhsl.minecraft.WorldMuseum.Main
+description: Weltenmuseum
+author: MineTec
+api-version: '1.21.1'
\ No newline at end of file