From eaccdec4a882082221857981d205f6dd8c3f2586 Mon Sep 17 00:00:00 2001
From: olischma <Martin.olischlaeger@icloud.com>
Date: Sat, 21 Sep 2024 14:18:12 +0200
Subject: [PATCH] added LeaveItem and restructured code

---
 .../eu/mhsl/minecraft/WorldMuseum/Main.java   |  4 +-
 .../WorldMuseum/items/ActionItemManager.java  | 20 +++---
 .../items/actionItems/IActionItem.java        | 11 ++++
 .../items/actionItems/LeaveItem.java          | 53 ++++++++++++++++
 .../items/actionItems/WorldSelector.java      | 32 ++++++++--
 .../worldSelector/WorldSelectListener.java    | 62 -------------------
 .../WorldMuseum/listener/PlayerListener.java  | 14 ++++-
 .../viewableWorld/ViewableWorld.java          |  2 +-
 8 files changed, 117 insertions(+), 81 deletions(-)
 create mode 100644 src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/IActionItem.java
 create mode 100644 src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/LeaveItem.java
 delete mode 100644 src/main/java/eu/mhsl/minecraft/WorldMuseum/items/worldSelector/WorldSelectListener.java

diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/Main.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/Main.java
index bb19d2a..08d64e0 100644
--- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/Main.java
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/Main.java
@@ -1,5 +1,6 @@
 package eu.mhsl.minecraft.WorldMuseum;
 
+import eu.mhsl.minecraft.WorldMuseum.items.actionItems.WorldSelector;
 import eu.mhsl.minecraft.WorldMuseum.listener.ChatListener;
 import eu.mhsl.minecraft.WorldMuseum.listener.PlayerListener;
 import eu.mhsl.minecraft.WorldMuseum.viewableWorld.ViewableWorld;
@@ -32,7 +33,8 @@ public class Main extends JavaPlugin {
             new PlayerListener(),
             new ChatListener(),
 //            new WorldSelectListener(),
-            new ViewableWorldListener()
+            new ViewableWorldListener(),
+            new WorldSelector()
         );
         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
index 50f0d4b..c419580 100644
--- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/ActionItemManager.java
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/ActionItemManager.java
@@ -1,33 +1,35 @@
 package eu.mhsl.minecraft.WorldMuseum.items;
 
+import eu.mhsl.minecraft.WorldMuseum.items.actionItems.IActionItem;
+import eu.mhsl.minecraft.WorldMuseum.items.actionItems.LeaveItem;
 import eu.mhsl.minecraft.WorldMuseum.items.actionItems.WorldSelector;
 import org.bukkit.entity.Player;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class ActionItemManager {
     private static ActionItemManager INSTANCE;
-    private WorldSelector worldSelector;
-
+    private final List<IActionItem> actionObjects = new ArrayList<>();
 
     public ActionItemManager() {
         initItems();
-
     }
 
     private void initItems() {
-        worldSelector = new WorldSelector();
+        actionObjects.add(new WorldSelector());
+        actionObjects.add(new LeaveItem());
     }
 
-
     public static ActionItemManager getInstance() {
         if (INSTANCE == null) INSTANCE = new ActionItemManager();
         return INSTANCE;
     }
     public void givePlayerItems(Player p) {
-        p.getInventory().setItem(0, worldSelector.getITEM());
+        actionObjects.forEach(actionObject -> p.getInventory().setItem(actionObject.getItemLocation(), actionObject.getItem()));
     }
 
-
-    public WorldSelector getWorldSelector() {
-        return worldSelector;
+    public List<IActionItem> getActionObjects() {
+        return actionObjects;
     }
 }
diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/IActionItem.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/IActionItem.java
new file mode 100644
index 0000000..057ab39
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/IActionItem.java
@@ -0,0 +1,11 @@
+package eu.mhsl.minecraft.WorldMuseum.items.actionItems;
+
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+
+public interface IActionItem {
+    void action(@NotNull Player player);
+    ItemStack getItem();
+    int getItemLocation();
+}
diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/LeaveItem.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/LeaveItem.java
new file mode 100644
index 0000000..bde867e
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/LeaveItem.java
@@ -0,0 +1,53 @@
+package eu.mhsl.minecraft.WorldMuseum.items.actionItems;
+
+import eu.mhsl.minecraft.WorldMuseum.Main;
+import eu.mhsl.minecraft.WorldMuseum.util.BungeeCord;
+import net.kyori.adventure.text.Component;
+import org.bukkit.Material;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Listener;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Objects;
+
+public class LeaveItem implements Listener, IActionItem {
+    private final ItemStack item = generateItem();
+
+    private ItemStack generateItem() {
+        ItemStack item = new ItemStack(Material.RED_BED);
+        ItemMeta meta = item.getItemMeta();
+        meta.displayName(Component.text("Leave World Museum"));
+        item.setItemMeta(meta);
+        return item;
+    }
+
+    @Override
+    public void action(@NotNull Player player) {
+        ConfigurationSection bungeeSettings = Main.instance().getConfig().getConfigurationSection("bungee");
+        Objects.requireNonNull(bungeeSettings);
+
+        if(!(bungeeSettings.getBoolean("enabled", false))) {
+            player.sendMessage(Component.text("Bungeecord is not enabled. You can't be transpered "));
+        }
+        if(!bungeeSettings.getBoolean("returnOnSelectExit")) return;
+        sendPlayerToExit(player);
+    }
+
+    private void sendPlayerToExit(Player player) {
+        BungeeCord.connect(player, Main.instance().getConfig().getString("bungee.returnToServer"));
+    }
+
+    @Override
+    public ItemStack getItem() {
+        return item;
+    }
+
+    @Override
+    public int getItemLocation() {
+        int itemLocation = 8; //Item will be placed in the last hotbar slot
+        return itemLocation;
+    }
+}
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
index dc5f34e..e23d33a 100644
--- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/WorldSelector.java
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/WorldSelector.java
@@ -6,6 +6,9 @@ import net.kyori.adventure.text.Component;
 import org.bukkit.Bukkit;
 import org.bukkit.Material;
 import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.inventory.InventoryClickEvent;
 import org.bukkit.inventory.Inventory;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.meta.ItemMeta;
@@ -13,7 +16,7 @@ import org.jetbrains.annotations.NotNull;
 
 import java.util.List;
 
-public class WorldSelector {
+public class WorldSelector implements Listener, IActionItem {
     private final ItemStack ITEM = generateWorldSelectorItem();
     private final Inventory INVENTORY = generateWorldSelectorInventory();
 
@@ -52,11 +55,30 @@ public class WorldSelector {
         return stack;
     }
 
-    public ItemStack getITEM() {
-        return ITEM;
-    }
-
+    @Override
     public void action(@NotNull Player player) {
         player.openInventory(INVENTORY);
     }
+
+    @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()));
+    }
+
+    @Override
+    public ItemStack getItem() {
+        return ITEM;
+    }
+
+    @Override
+    public int getItemLocation() {
+        int itemLocation = 0; // Item will be placed into the first hotbar slot
+        return itemLocation;
+    }
+
 }
diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/worldSelector/WorldSelectListener.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/worldSelector/WorldSelectListener.java
deleted file mode 100644
index b8d3f4c..0000000
--- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/worldSelector/WorldSelectListener.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package eu.mhsl.minecraft.WorldMuseum.items.worldSelector;
-
-import eu.mhsl.minecraft.WorldMuseum.Main;
-import eu.mhsl.minecraft.WorldMuseum.util.BungeeCord;
-import org.bukkit.Bukkit;
-import org.bukkit.configuration.ConfigurationSection;
-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.inventory.InventoryCloseEvent;
-import org.bukkit.event.player.PlayerJoinEvent;
-
-import java.util.Objects;
-
-public class WorldSelectListener implements Listener {
-    private void sendPlayerToExit(Player player) {
-        BungeeCord.connect(player, Main.instance().getConfig().getString("bungee.returnToServer"));
-    }
-
-    @EventHandler
-    public void onExit(InventoryCloseEvent event) {
-        if(event.getReason().equals(InventoryCloseEvent.Reason.TELEPORT)) return;
-
-        Bukkit.getScheduler().scheduleSyncDelayedTask(
-            Main.instance(),
-            () -> event.getPlayer().openInventory(WorldSelectInventory.generateInventory()),
-            1
-        );
-
-        ConfigurationSection bungeeSettings = Main.instance().getConfig().getConfigurationSection("bungee");
-        Objects.requireNonNull(bungeeSettings);
-
-        if(!event.getReason().equals(InventoryCloseEvent.Reason.PLAYER)) return;
-        if(!(bungeeSettings.getBoolean("enabled", false))) return;
-        if(!bungeeSettings.getBoolean("returnOnSelectExit")) return;
-        sendPlayerToExit((Player) event.getPlayer());
-    }
-
-    @EventHandler
-    public void onInteract(InventoryClickEvent event) {
-        event.setCancelled(true);
-
-        if(Objects.equals(event.getCurrentItem(), WorldSelectInventory.exitItem()))
-            sendPlayerToExit((Player) event.getWhoClicked());
-
-        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/eu/mhsl/minecraft/WorldMuseum/listener/PlayerListener.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/listener/PlayerListener.java
index aea0cea..c29fca1 100644
--- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/listener/PlayerListener.java
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/listener/PlayerListener.java
@@ -15,6 +15,7 @@ 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.inventory.ItemStack;
 import org.bukkit.potion.PotionEffect;
 import org.bukkit.potion.PotionEffectType;
 
@@ -23,7 +24,10 @@ import java.util.Objects;
 public class PlayerListener implements Listener {
     @EventHandler
     public void onJoin(PlayerJoinEvent event) {
-        event.getPlayer().setGameMode(GameMode.SURVIVAL);
+        Player player = event.getPlayer();
+        player.setGameMode(GameMode.SURVIVAL);
+        player.setAllowFlight(true);
+        player.setInvulnerable(true);
         Main.instance().getWorlds().forEach(world -> {
             if (world.isDefaultWorld()) world.addViewer(event.getPlayer());
         });
@@ -55,12 +59,16 @@ public class PlayerListener implements Listener {
 
     @EventHandler
     public void onInteract(PlayerInteractEvent event) {
-        ActionItemManager actionItems = ActionItemManager.getInstance();
+        ActionItemManager actionItemManager = ActionItemManager.getInstance();
 
         event.setCancelled(true);
         Player p = event.getPlayer();
         Action a = event.getAction();
+        ItemStack item = event.getItem();
         if ((a != Action.RIGHT_CLICK_AIR) || (event.getItem() == null)) return;
-        if (event.getItem().equals(actionItems.getWorldSelector().getITEM())) actionItems.getWorldSelector().action(p);
+        actionItemManager.getActionObjects().forEach(object -> {
+            assert item != null;
+            if (item.equals(object.getItem())) object.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 3580896..bb847c4 100644
--- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorld.java
+++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorld.java
@@ -64,8 +64,8 @@ public class ViewableWorld {
     }
 
     public void addViewer(Player player) {
-        player.setAllowFlight(true);
         player.teleport(world.getSpawnLocation());
+        player.setAllowFlight(true);
     }
 
     public ItemStack getItem() {