From d405c3f233efaaaf6e19395f3d7599012697cb90 Mon Sep 17 00:00:00 2001
From: olischma <Martin.olischlaeger@icloud.com>
Date: Sat, 21 Sep 2024 12:49:02 +0200
Subject: [PATCH] added WorldSelectItem to players inventory

---
 .../eu/mhsl/minecraft/WorldMuseum/Main.java   |  3 +-
 .../WorldMuseum/items/ActionItemManager.java  | 33 ++++++++++
 .../items/actionItems/WorldSelector.java      | 62 +++++++++++++++++++
 .../worldSelector/WorldSelectInventory.java   |  2 +-
 .../worldSelector/WorldSelectListener.java    |  2 +-
 .../WorldMuseum/listener/PlayerListener.java  | 23 +++++++
 .../viewableWorld/ViewableWorld.java          |  1 -
 .../viewableWorld/ViewableWorldListener.java  |  5 ++
 8 files changed, 126 insertions(+), 5 deletions(-)
 create mode 100644 src/main/java/eu/mhsl/minecraft/WorldMuseum/items/ActionItemManager.java
 create mode 100644 src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/WorldSelector.java
 rename src/main/java/eu/mhsl/minecraft/WorldMuseum/{ => items}/worldSelector/WorldSelectInventory.java (96%)
 rename src/main/java/eu/mhsl/minecraft/WorldMuseum/{ => items}/worldSelector/WorldSelectListener.java (97%)

diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/Main.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/Main.java
index 585d60d..bb19d2a 100644
--- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/Main.java
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/Main.java
@@ -4,7 +4,6 @@ import eu.mhsl.minecraft.WorldMuseum.listener.ChatListener;
 import eu.mhsl.minecraft.WorldMuseum.listener.PlayerListener;
 import eu.mhsl.minecraft.WorldMuseum.viewableWorld.ViewableWorld;
 import eu.mhsl.minecraft.WorldMuseum.viewableWorld.ViewableWorldListener;
-import eu.mhsl.minecraft.WorldMuseum.worldSelector.WorldSelectListener;
 import org.bukkit.Bukkit;
 import org.bukkit.event.Listener;
 import org.bukkit.plugin.java.JavaPlugin;
@@ -32,7 +31,7 @@ public class Main extends JavaPlugin {
         List<Listener> listeners = List.of(
             new PlayerListener(),
             new ChatListener(),
-            new WorldSelectListener(),
+//            new WorldSelectListener(),
             new ViewableWorldListener()
         );
         listeners.forEach(listener -> Bukkit.getPluginManager().registerEvents(listener, this));
diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/ActionItemManager.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/ActionItemManager.java
new file mode 100644
index 0000000..50f0d4b
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/ActionItemManager.java
@@ -0,0 +1,33 @@
+package eu.mhsl.minecraft.WorldMuseum.items;
+
+import eu.mhsl.minecraft.WorldMuseum.items.actionItems.WorldSelector;
+import org.bukkit.entity.Player;
+
+public class ActionItemManager {
+    private static ActionItemManager INSTANCE;
+    private WorldSelector worldSelector;
+
+
+    public ActionItemManager() {
+        initItems();
+
+    }
+
+    private void initItems() {
+        worldSelector = new WorldSelector();
+    }
+
+
+    public static ActionItemManager getInstance() {
+        if (INSTANCE == null) INSTANCE = new ActionItemManager();
+        return INSTANCE;
+    }
+    public void givePlayerItems(Player p) {
+        p.getInventory().setItem(0, worldSelector.getITEM());
+    }
+
+
+    public WorldSelector getWorldSelector() {
+        return worldSelector;
+    }
+}
diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/WorldSelector.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/WorldSelector.java
new file mode 100644
index 0000000..dc5f34e
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/WorldSelector.java
@@ -0,0 +1,62 @@
+package eu.mhsl.minecraft.WorldMuseum.items.actionItems;
+
+import eu.mhsl.minecraft.WorldMuseum.Main;
+import eu.mhsl.minecraft.WorldMuseum.viewableWorld.ViewableWorld;
+import net.kyori.adventure.text.Component;
+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 org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+public class WorldSelector {
+    private final ItemStack ITEM = generateWorldSelectorItem();
+    private final Inventory INVENTORY = generateWorldSelectorInventory();
+
+    private ItemStack generateWorldSelectorItem() {
+        ItemStack item = new ItemStack(Material.GRASS_BLOCK);
+        ItemMeta meta = item.getItemMeta();
+        meta.displayName(Component.text("Worldselector"));
+        item.setItemMeta(meta);
+        return item;
+    }
+
+    private Inventory generateWorldSelectorInventory() {
+        List<ViewableWorld> worlds = Main.instance().getWorlds();
+
+        int itemCount = worlds.size() + 1;
+        int inventoryRows = Math.max(itemCount / 9, 1);
+        int inventorySize = inventoryRows * 9;
+        Inventory inventory = Bukkit.createInventory(null, inventorySize, Component.text("Weltenmuseum"));
+
+        worlds.stream()
+                .filter(ViewableWorld::isEnabled)
+                .forEach(viewableWorld -> inventory.addItem(viewableWorld.getItem()));
+
+        boolean canExit = Main.instance().getConfig().getBoolean("bungee.enabled");
+        if(canExit) inventory.setItem(inventorySize - 1, exitItem());
+
+        return inventory;
+    }
+
+    public static ItemStack exitItem() {
+        ItemStack stack = ItemStack.of(Material.OAK_DOOR);
+        ItemMeta meta = stack.getItemMeta();
+        meta.displayName(Component.text("Zurück zum Server"));
+        meta.setEnchantmentGlintOverride(true);
+        stack.setItemMeta(meta);
+        return stack;
+    }
+
+    public ItemStack getITEM() {
+        return ITEM;
+    }
+
+    public void action(@NotNull Player player) {
+        player.openInventory(INVENTORY);
+    }
+}
diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/worldSelector/WorldSelectInventory.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/worldSelector/WorldSelectInventory.java
similarity index 96%
rename from src/main/java/eu/mhsl/minecraft/WorldMuseum/worldSelector/WorldSelectInventory.java
rename to src/main/java/eu/mhsl/minecraft/WorldMuseum/items/worldSelector/WorldSelectInventory.java
index d391a37..84bea4c 100644
--- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/worldSelector/WorldSelectInventory.java
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/worldSelector/WorldSelectInventory.java
@@ -1,4 +1,4 @@
-package eu.mhsl.minecraft.WorldMuseum.worldSelector;
+package eu.mhsl.minecraft.WorldMuseum.items.worldSelector;
 
 import eu.mhsl.minecraft.WorldMuseum.Main;
 import eu.mhsl.minecraft.WorldMuseum.viewableWorld.ViewableWorld;
diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/worldSelector/WorldSelectListener.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/worldSelector/WorldSelectListener.java
similarity index 97%
rename from src/main/java/eu/mhsl/minecraft/WorldMuseum/worldSelector/WorldSelectListener.java
rename to src/main/java/eu/mhsl/minecraft/WorldMuseum/items/worldSelector/WorldSelectListener.java
index 8007505..b8d3f4c 100644
--- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/worldSelector/WorldSelectListener.java
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/worldSelector/WorldSelectListener.java
@@ -1,4 +1,4 @@
-package eu.mhsl.minecraft.WorldMuseum.worldSelector;
+package eu.mhsl.minecraft.WorldMuseum.items.worldSelector;
 
 import eu.mhsl.minecraft.WorldMuseum.Main;
 import eu.mhsl.minecraft.WorldMuseum.util.BungeeCord;
diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/listener/PlayerListener.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/listener/PlayerListener.java
index 17af1e5..aea0cea 100644
--- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/listener/PlayerListener.java
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/listener/PlayerListener.java
@@ -1,14 +1,19 @@
 package eu.mhsl.minecraft.WorldMuseum.listener;
 
 import eu.mhsl.minecraft.WorldMuseum.Main;
+import eu.mhsl.minecraft.WorldMuseum.items.ActionItemManager;
 import net.kyori.adventure.util.Ticks;
 import org.bukkit.Bukkit;
 import org.bukkit.GameMode;
 import org.bukkit.Material;
+import org.bukkit.entity.Player;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
+import org.bukkit.event.block.Action;
 import org.bukkit.event.block.BlockBreakEvent;
 import org.bukkit.event.block.BlockPlaceEvent;
+import org.bukkit.event.player.PlayerDropItemEvent;
+import org.bukkit.event.player.PlayerInteractEvent;
 import org.bukkit.event.player.PlayerJoinEvent;
 import org.bukkit.potion.PotionEffect;
 import org.bukkit.potion.PotionEffectType;
@@ -25,10 +30,12 @@ public class PlayerListener implements Listener {
         event.getPlayer().addPotionEffect(
             new PotionEffect(PotionEffectType.HASTE, PotionEffect.INFINITE_DURATION, 15, false, false, false)
         );
+        ActionItemManager.getInstance().givePlayerItems(event.getPlayer());
     }
 
     @EventHandler
     public void onBreak(BlockBreakEvent event) {
+        event.setDropItems(false);
         Material material = event.getBlock().getType();
         Bukkit.getScheduler().scheduleSyncDelayedTask(
             Main.instance(),
@@ -40,4 +47,20 @@ public class PlayerListener implements Listener {
     public void onPlace(BlockPlaceEvent event) {
         event.setCancelled(true);
     }
+
+    @EventHandler
+    public void onDrop(PlayerDropItemEvent event) {
+        event.setCancelled(true);
+    }
+
+    @EventHandler
+    public void onInteract(PlayerInteractEvent event) {
+        ActionItemManager actionItems = ActionItemManager.getInstance();
+
+        event.setCancelled(true);
+        Player p = event.getPlayer();
+        Action a = event.getAction();
+        if ((a != Action.RIGHT_CLICK_AIR) || (event.getItem() == null)) return;
+        if (event.getItem().equals(actionItems.getWorldSelector().getITEM())) actionItems.getWorldSelector().action(p);
+    }
 }
diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorld.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorld.java
index eb4964f..3580896 100644
--- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorld.java
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorld.java
@@ -57,7 +57,6 @@ public class ViewableWorld {
         this.world = worldCreator.createWorld();
         Objects.requireNonNull(this.world);
         this.world.setAutoSave(false);
-//        Bukkit.unloadWorld(this.world, false);
     }
 
     public void unloadWorld() {
diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorldListener.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorldListener.java
index 2cb83d1..cdd9687 100644
--- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorldListener.java
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorldListener.java
@@ -7,6 +7,7 @@ import org.bukkit.event.block.BlockFromToEvent;
 import org.bukkit.event.block.BlockGrowEvent;
 import org.bukkit.event.block.BlockRedstoneEvent;
 import org.bukkit.event.entity.EntitySpawnEvent;
+import org.bukkit.event.world.ChunkUnloadEvent;
 
 public class ViewableWorldListener implements Listener {
     @EventHandler
@@ -29,4 +30,8 @@ public class ViewableWorldListener implements Listener {
     public void preventGrowth(BlockGrowEvent event) {
         event.setCancelled(true);
     }
+    @EventHandler
+    public void onChunkUnload(ChunkUnloadEvent event) {
+        event.setSaveChunk(false);
+    }
 }