From b24d3e4a0c23af65990ddebf59ca3320d3afe438 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Thu, 22 Jan 2026 14:57:55 +0000 Subject: [PATCH] Dateien nach "src/main/java/de/nexuslobby/modules/settings" hochladen --- .../modules/settings/LobbySettingsModule.java | 203 ++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 src/main/java/de/nexuslobby/modules/settings/LobbySettingsModule.java diff --git a/src/main/java/de/nexuslobby/modules/settings/LobbySettingsModule.java b/src/main/java/de/nexuslobby/modules/settings/LobbySettingsModule.java new file mode 100644 index 0000000..d8f805d --- /dev/null +++ b/src/main/java/de/nexuslobby/modules/settings/LobbySettingsModule.java @@ -0,0 +1,203 @@ +package de.nexuslobby.modules.settings; + +import de.nexuslobby.NexusLobby; +import de.nexuslobby.api.Module; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.ClickType; // DIESER IMPORT HAT GEFEHLT +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class LobbySettingsModule implements Module, Listener { + + private File configFile; + private FileConfiguration settingsConfig; + private final String mainTitle = "§8» §6§lLobby Admin"; + private final String subTitlePrefix = "§8» §e"; + + @Override + public String getName() { return "LobbySettings"; } + + @Override + public void onEnable() { + loadConfig(); + applyAllGamerules(); + Bukkit.getPluginManager().registerEvents(this, NexusLobby.getInstance()); + } + + public void loadConfig() { + configFile = new File(NexusLobby.getInstance().getDataFolder(), "settings.yml"); + settingsConfig = YamlConfiguration.loadConfiguration(configFile); + } + + public FileConfiguration getSettingsConfig() { + return settingsConfig; + } + + private void applyAllGamerules() { + if (settingsConfig.getConfigurationSection("gamerules") == null) return; + Set keys = settingsConfig.getConfigurationSection("gamerules").getKeys(false); + for (World world : Bukkit.getWorlds()) { + for (String key : keys) { + String value = String.valueOf(settingsConfig.get("gamerules." + key)); + world.setGameRuleValue(key, value); + } + } + } + + public void openMainMenu(Player player) { + Inventory inv = Bukkit.createInventory(null, 27, mainTitle); + ItemStack glass = createItem(Material.BLACK_STAINED_GLASS_PANE, " ", ""); + for (int i = 0; i < 27; i++) inv.setItem(i, glass); + + inv.setItem(10, createItem(Material.IRON_BARS, "§c§lLobby-Schutz", "§7PvP, Bauen, Drops...")); + inv.setItem(11, createItem(Material.PAPER, "§bChat & System", "§7Gamerules für Nachrichten")); + inv.setItem(12, createItem(Material.CHEST, "§6Drops & Inventar", "§7Items und Tod")); + inv.setItem(13, createItem(Material.ZOMBIE_HEAD, "§aSpawning & Mobs", "§7Monster & Entities")); + inv.setItem(14, createItem(Material.CLOCK, "§eZeit & Wetter", "§7Tag/Nacht & Regen")); + inv.setItem(15, createItem(Material.GRASS_BLOCK, "§2Welt-Mechaniken", "§7Physik & Wachstum")); + inv.setItem(16, createItem(Material.IRON_BOOTS, "§fSpieler & Schaden", "§7Status & Health")); + + player.openInventory(inv); + } + + private void openCategory(Player player, String category, String... keys) { + Inventory inv = Bukkit.createInventory(null, 54, subTitlePrefix + category); + int slot = 0; + for (String key : keys) { + if (slot >= 45) break; + Object value = settingsConfig.contains("gamerules." + key) ? settingsConfig.get("gamerules." + key) : settingsConfig.get(key); + inv.setItem(slot, createToggleItem(key, value)); + slot++; + } + inv.setItem(49, createItem(Material.BARRIER, "§cZurück", "§7Zum Hauptmenü")); + player.openInventory(inv); + } + + private ItemStack createToggleItem(String key, Object value) { + boolean isBool = value instanceof Boolean; + boolean isInt = value instanceof Integer; + Material mat = isBool ? ((Boolean)value ? Material.LIME_DYE : Material.GRAY_DYE) : Material.BOOK; + ItemStack item = new ItemStack(mat); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName("§e" + key); + List lore = new ArrayList<>(); + lore.add("§7Aktueller Wert: §f" + value); + lore.add(""); + if (isBool) lore.add("§6» Klick: §7Umschalten"); + else if (isInt) { + lore.add("§6» Linksklick: §a+1"); + lore.add("§6» Rechtsklick: §c-1"); + } + meta.setLore(lore); + item.setItemMeta(meta); + return item; + } + + @EventHandler + public void onClick(InventoryClickEvent event) { + if (event.getView().getTitle().equals(mainTitle)) { + event.setCancelled(true); + handleMainClick(event); + } else if (event.getView().getTitle().startsWith(subTitlePrefix)) { + event.setCancelled(true); + handleSubClick(event); + } + } + + private void handleMainClick(InventoryClickEvent event) { + Player p = (Player) event.getWhoClicked(); + if (event.getCurrentItem() == null) return; + Material m = event.getCurrentItem().getType(); + + if (m == Material.IRON_BARS) openCategory(p, "Lobby-Schutz", "allowPvp", "allowBlockBreaking", "allowBlockPlacing", "allowBlockInteracting", "allowItemDropping", "allowItemPickup", "allowExplosions"); + else if (m == Material.PAPER) openCategory(p, "Chat", "announceAdvancements", "commandBlockOutput", "logAdminCommands", "sendCommandFeedback", "showDeathMessages", "reducedDebugInfo"); + else if (m == Material.CHEST) openCategory(p, "Drops", "keepInventory", "doEntityDrops", "doMobLoot", "doTileDrops", "mobExplosionDropDecay", "blockExplosionDropDecay", "tntExplosionDropDecay"); + else if (m == Material.ZOMBIE_HEAD) openCategory(p, "Spawning", "doMobSpawning", "doInsomnia", "doPatrolSpawning", "doTraderSpawning", "doWardenSpawning", "doRaids", "disableRaids", "maxEntityCramming"); + else if (m == Material.CLOCK) openCategory(p, "Zeit", "doDaylightCycle", "doWeatherCycle"); + else if (m == Material.GRASS_BLOCK) openCategory(p, "Welt", "doFireTick", "doVinesSpread", "mobGriefing", "randomTickSpeed", "snowAccumulationHeight", "waterSourceConversion", "lavaSourceConversion"); + else if (m == Material.IRON_BOOTS) openCategory(p, "Spieler", "naturalRegeneration", "doImmediateRespawn", "doLimitedCrafting", "playersSleepingPercentage", "spawnRadius", "spectatorsGenerateChunks", "drowningDamage", "fallDamage", "fireDamage", "freezeDamage"); + + p.playSound(p.getLocation(), Sound.BLOCK_CHEST_OPEN, 0.5f, 1.2f); + } + + private void handleSubClick(InventoryClickEvent event) { + Player p = (Player) event.getWhoClicked(); + if (event.getCurrentItem() == null || event.getCurrentItem().getType() == Material.AIR) return; + if (event.getCurrentItem().getType() == Material.BARRIER) { + openMainMenu(p); + return; + } + + String key = event.getCurrentItem().getItemMeta().getDisplayName().substring(2); + String path = settingsConfig.contains("gamerules." + key) ? "gamerules." + key : key; + Object value = settingsConfig.get(path); + String category = event.getView().getTitle().replace(subTitlePrefix, ""); + + if (value instanceof Boolean) { + boolean newValue = !(Boolean) value; + settingsConfig.set(path, newValue); + saveSettings(); + if (path.startsWith("gamerules.")) { + for (World w : Bukkit.getWorlds()) w.setGameRuleValue(key, String.valueOf(newValue)); + } + } else if (value instanceof Integer) { + int newVal = (Integer) value + (event.getClick().isLeftClick() ? 1 : -1); + if (newVal < 0) newVal = 0; + settingsConfig.set(path, newVal); + saveSettings(); + if (path.startsWith("gamerules.")) { + for (World w : Bukkit.getWorlds()) w.setGameRuleValue(key, String.valueOf(newVal)); + } + } + + p.playSound(p.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 0.5f, 1.5f); + refreshCategory(p, category); + } + + private void refreshCategory(Player p, String category) { + // Die refresh-Logik wurde vereinfacht, um Fehler zu vermeiden + if (category.equals("Lobby-Schutz")) openCategory(p, "Lobby-Schutz", "allowPvp", "allowBlockBreaking", "allowBlockPlacing", "allowBlockInteracting", "allowItemDropping", "allowItemPickup", "allowExplosions"); + else if (category.equals("Chat")) openCategory(p, "Chat", "announceAdvancements", "commandBlockOutput", "logAdminCommands", "sendCommandFeedback", "showDeathMessages", "reducedDebugInfo"); + else if (category.equals("Drops")) openCategory(p, "Drops", "keepInventory", "doEntityDrops", "doMobLoot", "doTileDrops", "mobExplosionDropDecay", "blockExplosionDropDecay", "tntExplosionDropDecay"); + else if (category.equals("Spawning")) openCategory(p, "Spawning", "doMobSpawning", "doInsomnia", "doPatrolSpawning", "doTraderSpawning", "doWardenSpawning", "doRaids", "disableRaids", "maxEntityCramming"); + else if (category.equals("Zeit")) openCategory(p, "Zeit", "doDaylightCycle", "doWeatherCycle"); + else if (category.equals("Welt")) openCategory(p, "Welt", "doFireTick", "doVinesSpread", "mobGriefing", "randomTickSpeed", "snowAccumulationHeight", "waterSourceConversion", "lavaSourceConversion"); + else if (category.equals("Spieler")) openCategory(p, "Spieler", "naturalRegeneration", "doImmediateRespawn", "doLimitedCrafting", "playersSleepingPercentage", "spawnRadius", "spectatorsGenerateChunks", "drowningDamage", "fallDamage", "fireDamage", "freezeDamage"); + } + + private void saveSettings() { + try { settingsConfig.save(configFile); } catch (IOException e) { e.printStackTrace(); } + } + + private ItemStack createItem(Material mat, String name, String lore) { + ItemStack item = new ItemStack(mat); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(name); + if (!lore.isEmpty()) { + List lores = new ArrayList<>(); + lores.add(lore); + meta.setLore(lores); + } + item.setItemMeta(meta); + return item; + } + + @Override + public void onDisable() { saveSettings(); } +} \ No newline at end of file