diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishConfig.java index 82ae66b73..712303064 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishConfig.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishConfig.java @@ -16,6 +16,9 @@ public class VanishConfig extends OkaeriConfig implements VanishSettings { @Comment("Should vanished players be invulnerable to damage from other players") public boolean godMode = true; + @Comment("Allow vanished players to fly") + public boolean flyMode = true; + @Comment("Give night vision effect to vanished players") public boolean nightVision = true; @@ -45,5 +48,4 @@ public class VanishConfig extends OkaeriConfig implements VanishSettings { @Comment("Prevent vanished players from placing blocks") public boolean blockBlockPlacing = false; - } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishSettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishSettings.java index 4d3ed2139..a37827ec5 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishSettings.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishSettings.java @@ -8,6 +8,8 @@ public interface VanishSettings { boolean godMode(); + boolean flyMode(); + boolean nightVision(); boolean silentInventoryAccess(); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/controller/FlyController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/controller/FlyController.java new file mode 100644 index 000000000..404233cbf --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/controller/FlyController.java @@ -0,0 +1,70 @@ +package com.eternalcode.core.feature.vanish.controller; + +import com.eternalcode.core.feature.vanish.VanishSettings; +import com.eternalcode.core.feature.vanish.event.DisableVanishEvent; +import com.eternalcode.core.feature.vanish.event.EnableVanishEvent; +import com.eternalcode.core.injector.annotations.Inject; +import com.eternalcode.core.injector.annotations.component.Controller; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import org.bukkit.GameMode; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; + +@Controller +class FlyController implements Listener { + + private final VanishSettings settings; + private final Map previousFlightStates = new ConcurrentHashMap<>(); + + @Inject + FlyController(VanishSettings settings) { + this.settings = settings; + } + + @EventHandler(ignoreCancelled = true) + void onEnable(EnableVanishEvent event) { + if (!this.settings.flyMode()) { + return; + } + + Player player = event.getPlayer(); + + this.previousFlightStates.computeIfAbsent( + player.getUniqueId(), + id -> new FlightState(player.getAllowFlight(), player.isFlying()) + ); + + player.setAllowFlight(true); + player.setFlying(true); + } + + @EventHandler(ignoreCancelled = true) + void onDisable(DisableVanishEvent event) { + Player player = event.getPlayer(); + + if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) { + this.previousFlightStates.remove(player.getUniqueId()); + return; + } + + FlightState state = this.previousFlightStates.remove(player.getUniqueId()); + if (state == null) { + return; + } + + player.setAllowFlight(state.hadAllowFlight()); + player.setFlying(state.wasFlying()); + } + + @EventHandler + void onQuit(PlayerQuitEvent event) { + this.previousFlightStates.remove(event.getPlayer().getUniqueId()); + } + + private record FlightState(boolean hadAllowFlight, boolean wasFlying) { + } +}