Dateien nach "src/main/java/de/nexuslobby/modules/settings" hochladen

This commit is contained in:
2026-01-22 14:57:55 +00:00
parent eed7462eed
commit b24d3e4a0c

View File

@@ -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<String> 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<String> 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<String> lores = new ArrayList<>();
lores.add(lore);
meta.setLore(lores);
}
item.setItemMeta(meta);
return item;
}
@Override
public void onDisable() { saveSettings(); }
}