diff --git a/src/main/java/de/nexuslobby/utils/ConfigUpdater.java b/src/main/java/de/nexuslobby/utils/ConfigUpdater.java new file mode 100644 index 0000000..675f7f2 --- /dev/null +++ b/src/main/java/de/nexuslobby/utils/ConfigUpdater.java @@ -0,0 +1,78 @@ +package de.nexuslobby.utils; + +import de.nexuslobby.NexusLobby; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +public class ConfigUpdater { + + public static void updateConfig(String fileName) { + NexusLobby plugin = NexusLobby.getInstance(); + File configFile = new File(plugin.getDataFolder(), fileName); + + if (!configFile.exists()) { + plugin.saveResource(fileName, false); + return; + } + + FileConfiguration serverConfig = YamlConfiguration.loadConfiguration(configFile); + List newFileContent = new ArrayList<>(); + + try (BufferedReader reader = new BufferedReader(new InputStreamReader(plugin.getResource(fileName), StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + String trimmed = line.trim(); + + // 1. Kommentare, Leerzeilen und Listen-Elemente direkt übernehmen + if (trimmed.startsWith("#") || trimmed.isEmpty() || trimmed.startsWith("-")) { + newFileContent.add(line); + continue; + } + + // 2. Prüfen ob es ein Key ist + if (trimmed.contains(":") && !trimmed.startsWith("-")) { + String key = trimmed.split(":")[0]; + + // WICHTIG: Nur wenn der Key KEINE Sektion ist, darf er überschrieben werden + if (serverConfig.contains(key) && !serverConfig.isConfigurationSection(key)) { + String indentation = line.substring(0, line.indexOf(trimmed)); + Object value = serverConfig.get(key); + newFileContent.add(indentation + key + ": " + formatValue(value)); + } else { + // Es ist eine Sektion oder ein neuer Key -> Original aus JAR übernehmen + newFileContent.add(line); + } + } else { + newFileContent.add(line); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + // 3. Datei sauber speichern + try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(configFile), StandardCharsets.UTF_8))) { + for (String outputLine : newFileContent) { + writer.write(outputLine); + writer.newLine(); + } + } catch (IOException e) { + plugin.getLogger().severe("Konnte " + fileName + " nicht speichern!"); + } + } + + private static String formatValue(Object value) { + if (value == null) return ""; + if (value instanceof String) { + // Verhindert das "Zerschießen" der Config durch Sonderzeichen + String s = (String) value; + return "\"" + s.replace("\"", "\\\"") + "\""; + } + return value.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/de/nexuslobby/utils/DoubleJump.java b/src/main/java/de/nexuslobby/utils/DoubleJump.java new file mode 100644 index 0000000..c1abce8 --- /dev/null +++ b/src/main/java/de/nexuslobby/utils/DoubleJump.java @@ -0,0 +1,50 @@ +package de.nexuslobby.utils; + +import de.nexuslobby.NexusLobby; +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.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerToggleFlightEvent; +import org.bukkit.util.Vector; + +public class DoubleJump implements Listener { + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + if (NexusLobby.getInstance().getConfig().getBoolean("doublejump.enabled", true)) { + event.getPlayer().setAllowFlight(true); + } + } + + @EventHandler + public void onFly(PlayerToggleFlightEvent event) { + Player player = event.getPlayer(); + if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR) return; + + if (NexusLobby.getInstance().getConfig().getBoolean("doublejump.enabled", true)) { + event.setCancelled(true); + player.setAllowFlight(false); + player.setFlying(false); + + double velocity = NexusLobby.getInstance().getConfig().getDouble("doublejump.velocity", 1.0); + double horizontal = NexusLobby.getInstance().getConfig().getDouble("doublejump.horizontal", 0.2); + + Vector v = player.getLocation().getDirection().multiply(horizontal).setY(velocity); + player.setVelocity(v); + } + } + + @EventHandler + public void onMove(PlayerMoveEvent event) { + Player player = event.getPlayer(); + if (player.getGameMode() != GameMode.CREATIVE && player.getLocation().subtract(0, 0.1, 0).getBlock().getType() != Material.AIR) { + if (NexusLobby.getInstance().getConfig().getBoolean("doublejump.enabled", true)) { + player.setAllowFlight(true); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/de/nexuslobby/utils/ExampleUtils.java b/src/main/java/de/nexuslobby/utils/ExampleUtils.java new file mode 100644 index 0000000..0950390 --- /dev/null +++ b/src/main/java/de/nexuslobby/utils/ExampleUtils.java @@ -0,0 +1,8 @@ +package de.nexuslobby.utils; + +public class ExampleUtils { + + public static String format(String text) { + return text.replace("&", "§"); + } +} diff --git a/src/main/java/de/nexuslobby/utils/MaintenanceListener.java b/src/main/java/de/nexuslobby/utils/MaintenanceListener.java new file mode 100644 index 0000000..d7ca9ab --- /dev/null +++ b/src/main/java/de/nexuslobby/utils/MaintenanceListener.java @@ -0,0 +1,32 @@ +package de.nexuslobby.utils; + +import de.nexuslobby.NexusLobby; +import org.bukkit.ChatColor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerLoginEvent; + +public class MaintenanceListener implements Listener { + + /** + * Gibt zurück, ob der Wartungsmodus in der Config aktiviert ist. + * Wird für den PlaceholderAPI-Platzhalter benötigt. + */ + public static boolean isMaintenance() { + return NexusLobby.getInstance().getConfig().getBoolean("maintenance.enabled", false); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onLogin(PlayerLoginEvent event) { + if (isMaintenance()) { + // Wenn der Spieler kein OP ist und keine Permission hat + if (!event.getPlayer().isOp() && !event.getPlayer().hasPermission("nexuslobby.join.maintenance")) { + String kickMsg = ChatColor.translateAlternateColorCodes('&', + NexusLobby.getInstance().getConfig().getString("maintenance.kick_message", "&cWartungsarbeiten!")); + + event.disallow(PlayerLoginEvent.Result.KICK_OTHER, kickMsg); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/de/nexuslobby/utils/PlayerHider.java b/src/main/java/de/nexuslobby/utils/PlayerHider.java new file mode 100644 index 0000000..078baaa --- /dev/null +++ b/src/main/java/de/nexuslobby/utils/PlayerHider.java @@ -0,0 +1,70 @@ +package de.nexuslobby.utils; + +import de.nexuslobby.NexusLobby; +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.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class PlayerHider implements Listener { + + private final List hidden = new ArrayList<>(); + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + if (!NexusLobby.getInstance().getConfig().getBoolean("hider.enabled", true)) return; + + Material material = Material.valueOf(NexusLobby.getInstance().getConfig().getString("hider.item", "REDSTONE")); + int slot = NexusLobby.getInstance().getConfig().getInt("hider.slot", 8); + + ItemStack item = new ItemStack(material); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(NexusLobby.getInstance().getConfig().getString("hider.messages.all").replace("&", "§")); + item.setItemMeta(meta); + + event.getPlayer().getInventory().setItem(slot, item); + } + + @EventHandler + public void onInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) return; + if (event.getItem() == null) return; + + Player player = event.getPlayer(); + String allMsg = NexusLobby.getInstance().getConfig().getString("hider.messages.all").replace("&", "§"); + String noneMsg = NexusLobby.getInstance().getConfig().getString("hider.messages.none").replace("&", "§"); + + if (event.getItem().getItemMeta().getDisplayName().equals(allMsg)) { + // Verstecken + hidden.add(player.getUniqueId()); + for (Player target : Bukkit.getOnlinePlayers()) player.hidePlayer(NexusLobby.getInstance(), target); + + updateItem(player, noneMsg); + player.sendMessage(noneMsg); + } else if (event.getItem().getItemMeta().getDisplayName().equals(noneMsg)) { + // Zeigen + hidden.remove(player.getUniqueId()); + for (Player target : Bukkit.getOnlinePlayers()) player.showPlayer(NexusLobby.getInstance(), target); + + updateItem(player, allMsg); + player.sendMessage(allMsg); + } + } + + private void updateItem(Player player, String name) { + ItemStack item = player.getInventory().getItemInHand(); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(name); + item.setItemMeta(meta); + } +} \ No newline at end of file diff --git a/src/main/java/de/nexuslobby/utils/VoidProtection.java b/src/main/java/de/nexuslobby/utils/VoidProtection.java new file mode 100644 index 0000000..9efc30c --- /dev/null +++ b/src/main/java/de/nexuslobby/utils/VoidProtection.java @@ -0,0 +1,29 @@ +package de.nexuslobby.utils; + +import de.nexuslobby.NexusLobby; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerMoveEvent; + +public class VoidProtection implements Listener { + + @EventHandler + public void onMove(PlayerMoveEvent event) { + if (!NexusLobby.getInstance().getConfig().getBoolean("void_protection.enabled", true)) return; + + Player player = event.getPlayer(); + if (player.getLocation().getY() < 0) { + if (NexusLobby.getInstance().getConfig().getBoolean("void_protection.teleport_to_spawn", true)) { + Location spawn = player.getWorld().getSpawnLocation(); + player.teleport(spawn); + String msg = NexusLobby.getInstance().getConfig().getString("void_protection.message"); + if (msg != null && !msg.isEmpty()) { + player.sendMessage(msg.replace("&", "§")); + } + } + } + } +} \ No newline at end of file