From ff312152952ac71944db1146c287380e6a4438c7 Mon Sep 17 00:00:00 2001
From: lars <larslukasneuhaus@gmx.de>
Date: Mon, 7 Apr 2025 23:48:06 +0200
Subject: [PATCH] added option for end prevent

---
 .../tooling/endPrevent/EndPrevent.java        | 42 ++++++++++++----
 .../tooling/endPrevent/EndPreventCommand.java | 10 ++--
 .../endPrevent/EndPreventListener.java        | 49 +++++++++++++++++++
 .../PreventEnderEyeUseListener.java           | 23 ---------
 4 files changed, 89 insertions(+), 35 deletions(-)
 create mode 100644 common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPreventListener.java
 delete mode 100644 common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/PreventEnderEyeUseListener.java

diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPrevent.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPrevent.java
index 085cb39..7d7e188 100644
--- a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPrevent.java
+++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPrevent.java
@@ -3,33 +3,57 @@ package eu.mhsl.craftattack.spawn.common.appliances.tooling.endPrevent;
 import eu.mhsl.craftattack.core.appliance.Appliance;
 import eu.mhsl.craftattack.core.appliance.ApplianceCommand;
 import eu.mhsl.craftattack.core.config.Configuration;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
 import org.bukkit.event.Listener;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.List;
 
 public class EndPrevent extends Appliance {
-    private final String endDisabledKey = "endDisabled";
-    private boolean endDisabled;
+    private final String endPreventKey = "endPrevent";
+    private State endPreventState;
+    private final World endWorld = Bukkit.getWorlds().stream().filter(world -> world.getEnvironment().equals(World.Environment.THE_END)).findFirst().orElseThrow();
+
+    public enum State {
+        OPEN,
+        CLOSED,
+        NO_OUTER
+    }
 
     public EndPrevent() {
         super("endPrevent");
-        this.endDisabled = this.localConfig().getBoolean(this.endDisabledKey);
+        this.endPreventState = State.valueOf(this.localConfig().getString(this.endPreventKey, State.OPEN.name()));
+        this.updateEndBorder();
     }
 
-    public void setEndDisabled(boolean disabled) {
-        this.localConfig().set(this.endDisabledKey, disabled);
+    private void updateEndBorder() {
+        if(this.endPreventState == State.NO_OUTER) this.endWorld.getWorldBorder().setSize(500);
+        if(this.endPreventState == State.OPEN) this.endWorld.getWorldBorder().setSize(this.endWorld.getWorldBorder().getMaxSize());
+    }
+
+    public void setEndState(State state) {
+        this.localConfig().set(this.endPreventKey, state.name());
         Configuration.saveChanges();
-        this.endDisabled = disabled;
+        this.endPreventState = state;
+        this.updateEndBorder();
     }
 
-    public boolean isEndDisabled() {
-        return this.endDisabled;
+    public boolean isEndClosed() {
+        return this.endPreventState.equals(State.CLOSED);
+    }
+
+    public boolean isOnlyInner() {
+        return this.endPreventState.equals(State.NO_OUTER);
+    }
+
+    public State getEndPreventState() {
+        return this.endPreventState;
     }
 
     @Override
     protected @NotNull List<Listener> listeners() {
-        return List.of(new PreventEnderEyeUseListener());
+        return List.of(new EndPreventListener());
     }
 
     @Override
diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPreventCommand.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPreventCommand.java
index f62c28f..8bfe7c6 100644
--- a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPreventCommand.java
+++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPreventCommand.java
@@ -12,7 +12,11 @@ import java.util.List;
 import java.util.Map;
 
 class EndPreventCommand extends ApplianceCommand<EndPrevent> {
-    private final Map<String, Boolean> arguments = Map.of("preventEnd", true, "allowEnd", false);
+    private final Map<String, EndPrevent.State> arguments = Map.of(
+        "preventEnd", EndPrevent.State.CLOSED,
+        "allowEnd", EndPrevent.State.OPEN,
+        "onlyInnerEnd", EndPrevent.State.NO_OUTER
+    );
 
     public EndPreventCommand() {
         super("endPrevent");
@@ -21,11 +25,11 @@ class EndPreventCommand extends ApplianceCommand<EndPrevent> {
     @Override
     protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) throws Exception {
         if(args.length == 1 && this.arguments.containsKey(args[0])) {
-            this.getAppliance().setEndDisabled(this.arguments.get(args[0]));
+            this.getAppliance().setEndState(this.arguments.get(args[0]));
             sender.sendMessage(Component.text("Setting updated!", NamedTextColor.GREEN));
         }
         sender.sendMessage(Component.text(
-            String.format("The End is %s!", this.getAppliance().isEndDisabled() ? "closed" : "open"),
+            String.format("The End is now on '%s'!", this.getAppliance().getEndPreventState().name()),
             NamedTextColor.GOLD
         ));
     }
diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPreventListener.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPreventListener.java
new file mode 100644
index 0000000..c15140e
--- /dev/null
+++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/EndPreventListener.java
@@ -0,0 +1,49 @@
+package eu.mhsl.craftattack.spawn.common.appliances.tooling.endPrevent;
+
+import com.destroystokyo.paper.event.player.PlayerTeleportEndGatewayEvent;
+import eu.mhsl.craftattack.core.appliance.ApplianceListener;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.format.NamedTextColor;
+import org.bukkit.Material;
+import org.bukkit.World;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.event.player.PlayerPortalEvent;
+
+class EndPreventListener extends ApplianceListener<EndPrevent> {
+    @EventHandler
+    public void onEnderEyeInteraction(PlayerInteractEvent event) {
+        if(event.getClickedBlock() == null) return;
+        if(!event.getClickedBlock().getType().equals(Material.END_PORTAL_FRAME)) return;
+        if(event.getItem() == null) return;
+        if(!event.getItem().getType().equals(Material.ENDER_EYE)) return;
+
+        this.cancelIfClosed(event, event.getPlayer());
+    }
+
+    @EventHandler
+    public void onPlayerPortal(PlayerPortalEvent event) {
+        if(!event.getTo().getWorld().getEnvironment().equals(World.Environment.THE_END)) return;
+
+        this.cancelIfClosed(event, event.getPlayer());
+    }
+
+    @EventHandler
+    public void onPlayerEndGateway(PlayerTeleportEndGatewayEvent event) {
+        this.cancelIfOnlyInner(event, event.getPlayer());
+    }
+
+    private void cancelIfClosed(Cancellable event, Player p) {
+        if(!this.getAppliance().isEndClosed()) return;
+        event.setCancelled(true);
+        p.sendActionBar(Component.text("Das End ist nicht freigeschaltet!", NamedTextColor.RED));
+    }
+
+    private void cancelIfOnlyInner(Cancellable event, Player p) {
+        if(!this.getAppliance().isOnlyInner()) return;
+        event.setCancelled(true);
+        p.sendActionBar(Component.text("Das Outer End ist nicht freigeschaltet!", NamedTextColor.RED));
+    }
+}
diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/PreventEnderEyeUseListener.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/PreventEnderEyeUseListener.java
deleted file mode 100644
index 425a527..0000000
--- a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/tooling/endPrevent/PreventEnderEyeUseListener.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package eu.mhsl.craftattack.spawn.common.appliances.tooling.endPrevent;
-
-import eu.mhsl.craftattack.core.appliance.ApplianceListener;
-import net.kyori.adventure.text.Component;
-import net.kyori.adventure.text.format.NamedTextColor;
-import org.bukkit.Material;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.player.PlayerInteractEvent;
-
-class PreventEnderEyeUseListener extends ApplianceListener<EndPrevent> {
-    @EventHandler
-    public void onEnderEyeInteraction(PlayerInteractEvent event) {
-        if(event.getClickedBlock() == null) return;
-        if(!event.getClickedBlock().getType().equals(Material.END_PORTAL_FRAME)) return;
-        if(event.getItem() == null) return;
-        if(!event.getItem().getType().equals(Material.ENDER_EYE)) return;
-
-        if(!this.getAppliance().isEndDisabled()) return;
-
-        event.setCancelled(true);
-        event.getPlayer().sendActionBar(Component.text("Das End ist noch nicht freigeschaltet!", NamedTextColor.RED));
-    }
-}