diff --git a/src/main/java/de/nexuslobby/NexusLobby.java b/src/main/java/de/nexuslobby/NexusLobby.java index a243c96..e2c6f3c 100644 --- a/src/main/java/de/nexuslobby/NexusLobby.java +++ b/src/main/java/de/nexuslobby/NexusLobby.java @@ -527,13 +527,7 @@ public class NexusLobby extends JavaPlugin implements Listener { if (params.equalsIgnoreCase("build_mode")) return BuildCommand.isInBuildMode(player) ? "§aAktiv" : "§cInaktiv"; if (params.equalsIgnoreCase("silent_join")) return silentPlayers.contains(player.getUniqueId()) ? "§aEin" : "§cAus"; if (params.equalsIgnoreCase("parkour_top")) { - return parkourManager != null ? parkourManager.getTopTen(1) : "N/A"; - } - if (params.equalsIgnoreCase("parkour_top1")) { - return parkourManager != null ? parkourManager.getTopTen(1) : "N/A"; - } - if (params.equalsIgnoreCase("parkour_top2")) { - return parkourManager != null ? parkourManager.getTopTen(2) : "N/A"; + return parkourManager != null ? parkourManager.getTopTen() : "N/A"; } return null; } diff --git a/src/main/java/de/nexuslobby/modules/gadgets/GadgetModule.java b/src/main/java/de/nexuslobby/modules/gadgets/GadgetModule.java index 6130b68..924fcad 100644 --- a/src/main/java/de/nexuslobby/modules/gadgets/GadgetModule.java +++ b/src/main/java/de/nexuslobby/modules/gadgets/GadgetModule.java @@ -31,8 +31,6 @@ import java.util.Set; import java.util.UUID; public class GadgetModule implements Module, Listener { - // Speichert laufende Disco-Modus Tasks pro Spieler - private final Map discoTasks = new HashMap<>(); private final Map activeBalloons = new HashMap<>(); private final Map activeEffects = new HashMap<>(); @@ -56,8 +54,6 @@ public class GadgetModule implements Module, Listener { private final String FUN_TITLE = "§b§lGadgets §8- §6Lustiges"; private final String HAT_TITLE = "§b§lGadgets §8- §aHüte & Köpfe"; private final String PET_TITLE = "§b§lGadgets §8- §dBegleiter"; - private final String PET2_TITLE = "§b§lGadgets §8- §dBegleiter §7(2)"; - private final String PET3_TITLE = "§b§lGadgets §8- §dBegleiter §7(3)"; @Override public String getName() { return "Gadgets"; } @@ -261,70 +257,12 @@ public class GadgetModule implements Module, Listener { } private void openPetGUI(Player player) { - Inventory gui = Bukkit.createInventory(null, 54, PET_TITLE); + Inventory gui = Bukkit.createInventory(null, 27, PET_TITLE); fillEdges(gui); - // Oben: Baby-Varianten, darunter: Erwachsene - gui.setItem(10, createItem(Material.BONE, "§fBaby-Wolf", "§7Ein kleiner treuer Begleiter")); - gui.setItem(11, createItem(Material.BONE, "§7Baby-Ashen Wolf", "§7Ein kleiner Aschen-Wolf")); - gui.setItem(12, createItem(Material.CAT_SPAWN_EGG, "§6Baby-Katze", "§7Ein kleiner Schmusefreund")); - gui.setItem(13, createItem(Material.PANDA_SPAWN_EGG, "§aBaby-Panda", "§7Ein kleiner Flauschball")); - gui.setItem(14, createItem(Material.FOX_SPAWN_EGG, "§6Baby-Fuchs", "§7Ein kleiner Schlaukopf")); - gui.setItem(15, createItem(Material.FROG_SPAWN_EGG, "§aBaby-Frosch", "§7Ein kleiner Hopsfreund")); - gui.setItem(16, createItem(Material.TURTLE_SPAWN_EGG, "§2Baby-Schildkröte", "§7Ein kleiner Panzenträger")); - gui.setItem(28, createItem(Material.FOX_SPAWN_EGG, "§bBaby-Schneefuchs", "§7Ein kleiner Schnee-Fuchs")); - gui.setItem(29, createItem(Material.RABBIT_SPAWN_EGG, "§fBaby-Kaninchen", "§7Ein kleiner Flitzer")); - gui.setItem(30, createItem(Material.AXOLOTL_SPAWN_EGG,"§dBaby-Axolotl", "§7Ein kleiner Wasserfreund")); - gui.setItem(31, createItem(Material.OCELOT_SPAWN_EGG, "§6Baby-Ozelot", "§7Ein kleiner Schleicher")); - gui.setItem(32, createItem(Material.POLAR_BEAR_SPAWN_EGG, "§fBaby-Eisbär", "§7Ein kleiner Eisbär")); - gui.setItem(33, createItem(Material.BEE_SPAWN_EGG, "§eBaby-Biene", "§7Eine kleine Biene")); - gui.setItem(34, createItem(Material.CHICKEN_SPAWN_EGG,"§fKüken", "§7Ein kleines Huhn")); - // Armadillo Baby entfernt, da auf Seite 2 - - gui.setItem(19, createItem(Material.BONE, "§fWolf", "§7Ein treuer Begleiter")); - gui.setItem(20, createItem(Material.BONE, "§7Ashen Wolf", "§7Ein seltener Aschen-Wolf")); - gui.setItem(21, createItem(Material.CAT_SPAWN_EGG, "§6Katze", "§7Ein verschmuster Freund")); - gui.setItem(22, createItem(Material.PANDA_SPAWN_EGG, "§aPanda", "§7Ein gemütlicher Zeitgenosse")); - gui.setItem(23, createItem(Material.FOX_SPAWN_EGG, "§6Fuchs", "§7Ein schlauer Begleiter")); - gui.setItem(24, createItem(Material.FROG_SPAWN_EGG, "§aFrosch", "§7Ein echter Hopsmeister")); - gui.setItem(25, createItem(Material.TURTLE_SPAWN_EGG, "§2Schildkröte", "§7Gemütlich und gelassen")); - gui.setItem(37, createItem(Material.FOX_SPAWN_EGG, "§bSchneefuchs", "§7Ein Fuchs aus kalten Biomen")); - gui.setItem(38, createItem(Material.RABBIT_SPAWN_EGG, "§fKaninchen", "§7Ein schneller Hopper")); - gui.setItem(39, createItem(Material.AXOLOTL_SPAWN_EGG,"§dAxolotl", "§7Ein seltener Wasserfreund")); - gui.setItem(40, createItem(Material.OCELOT_SPAWN_EGG, "§6Ozelot", "§7Ein wachsamer Begleiter")); - gui.setItem(41, createItem(Material.POLAR_BEAR_SPAWN_EGG, "§fEisbär", "§7Ein starker Eisbär")); - gui.setItem(42, createItem(Material.BEE_SPAWN_EGG, "§eBiene", "§7Eine fleißige Biene")); - gui.setItem(43, createItem(Material.CHICKEN_SPAWN_EGG,"§fHuhn", "§7Ein gackerndes Huhn")); - // Armadillo Erwachsen entfernt, da auf Seite 2 - - gui.setItem(48, createItem(Material.ARROW, "§7Zurück", "§8Zum Hauptmenü")); - gui.setItem(50, createItem(Material.ARROW, "§7Weiter", "§8Seite 2")); - player.openInventory(gui); - } - - private void openPetGUI2(Player player) { - Inventory gui = Bukkit.createInventory(null, 54, PET2_TITLE); - fillEdges(gui); - - // Seite 2: Armadillo (Baby und Erwachsen) - gui.setItem(19, createItem(Material.ARMADILLO_SPAWN_EGG, "§7Baby-Armadillo", "§7Ein kleiner Gürteltier")); - gui.setItem(28, createItem(Material.ARMADILLO_SPAWN_EGG, "§7Armadillo", "§7Ein Gürteltier")); - - gui.setItem(48, createItem(Material.ARROW, "§7Zurück", "§8Seite 1")); - gui.setItem(50, createItem(Material.ARROW, "§7Weiter", "§8Seite 3")); - player.openInventory(gui); - } - - private void openPetGUI3(Player player) { - Inventory gui = Bukkit.createInventory(null, 54, PET3_TITLE); - fillEdges(gui); - - // Seite 3: bisherige Seite 2 Inhalte (Papagei, Allay, Sniffer) - gui.setItem(19, createItem(Material.PARROT_SPAWN_EGG, "§cPapagei", "§7Ein bunter Begleiter")); - gui.setItem(20, createItem(Material.ALLAY_SPAWN_EGG, "§bAllay", "§7Ein magischer Helfer")); - gui.setItem(21, createItem(Material.SNIFFER_SPAWN_EGG,"§aSniffer", "§7Ein uraltes Tier")); - - gui.setItem(48, createItem(Material.ARROW, "§7Zurück", "§8Seite 2")); - gui.setItem(50, createItem(Material.ARROW, "§7Hauptmenü", "§8Zum Hauptmenü")); + gui.setItem(11, createItem(Material.BONE, "§fWolf", "§7Ein treuer Begleiter")); + gui.setItem(13, createItem(Material.CAT_SPAWN_EGG, "§6Katze", "§7Ein verschmuster Freund")); + gui.setItem(15, createItem(Material.PANDA_SPAWN_EGG,"§aPanda", "§7Ein gemütlicher Zeitgenosse")); + gui.setItem(22, createItem(Material.ARROW, "§7Zurück", "§8Zum Hauptmenü")); player.openInventory(gui); } @@ -357,20 +295,12 @@ public class GadgetModule implements Module, Listener { private void openFunGUI(Player player) { Inventory gui = Bukkit.createInventory(null, 27, FUN_TITLE); fillEdges(gui); - // Layout wie im Screenshot: gui.setItem(10, createItem(Material.FISHING_ROD, "§b§lEnterhaken", "§7Zieh dich durch die Luft! §8(3s CD)")); gui.setItem(11, createItem(Material.PACKED_ICE, "§b§lFreeze-Ray", "§7Friere andere ein! §8(10s CD)")); gui.setItem(12, createItem(Material.GOLDEN_HOE, "§6§lPaintball-Gun","§7Male die Lobby bunt aus!")); - gui.setItem(13, createItem(Material.FEATHER, "§f§lMini-Tornado", "§7Wirbele dich herum!")); gui.setItem(14, createItem(Material.FIRE_CHARGE, "§c§lMeteorit", "§7Lass es krachen! §8(15s CD)")); gui.setItem(15, createItem(Material.SHIELD, "§5§lSchutzzone", "§7Halte andere auf Distanz")); gui.setItem(16, createItem(Material.EGG, "§f§lChicken-Rain","§7Gack-Gack! Hühner überall!")); - // Slot 17 und 18 bleiben leer, TNT kommt auf Slot 23 (ganz rechts mittlere Reihe) - gui.setItem(23, createItem(Material.TNT, "§c§lFake-TNT", "§7Täusche andere mit einer harmlosen Explosion!")); - // Zeile 2 - gui.setItem(19, createItem(Material.SLIME_BALL, "§a§lMob-Party", "§7Lustige Mini-Mobs tanzen um dich!")); - gui.setItem(20, createItem(Material.NOTE_BLOCK, "§d§lTanz-Emote", "§7Führe einen Tanz auf!")); - gui.setItem(21, createItem(Material.FIREWORK_ROCKET, "§c§lKonfetti-Kanone", "§7Schieße Konfetti in die Luft!")); gui.setItem(22, createItem(Material.ARROW, "§7Zurück", "§8Zum Hauptmenü")); player.openInventory(gui); } @@ -384,21 +314,7 @@ public class GadgetModule implements Module, Listener { ItemStack item = event.getCurrentItem(); if (item == null || item.getType() == Material.AIR) return; - if (item.getType() == Material.ARROW) { - String displayName = item.hasItemMeta() && item.getItemMeta().hasDisplayName() - ? item.getItemMeta().getDisplayName() : ""; - if (displayName.equals("§7Weiter")) { - if (title.equals(PET_TITLE)) { openPetGUI2(player); return; } - if (title.equals(PET2_TITLE)) { openPetGUI3(player); return; } - } - if (displayName.equals("§7Zurück")) { - if (title.equals(PET2_TITLE)) { openPetGUI(player); return; } - if (title.equals(PET3_TITLE)) { openPetGUI2(player); return; } - openGUI(player); - return; - } - if (displayName.equals("§7Hauptmenü")) { openGUI(player); return; } - } + if (item.getType() == Material.ARROW) { openGUI(player); return; } if (title.equals(MAIN_TITLE)) { if (item.getType() == Material.LEAD) openBalloonGUI(player); @@ -416,73 +332,11 @@ public class GadgetModule implements Module, Listener { player.closeInventory(); } } else if (title.equals(PET_TITLE)) { - String displayName = item.hasItemMeta() && item.getItemMeta().hasDisplayName() - ? item.getItemMeta().getDisplayName() : ""; - boolean spawned = true; - if (displayName.equals("§fBaby-Wolf")) PetManager.spawnEntityPet(player, "WOLF", true); - else if (displayName.equals("§fWolf")) PetManager.spawnEntityPet(player, "WOLF", false); - else if (displayName.equals("§7Baby-Ashen Wolf")) PetManager.spawnEntityPet(player, "WOLF", true, "ASHEN"); - else if (displayName.equals("§7Ashen Wolf")) PetManager.spawnEntityPet(player, "WOLF", false, "ASHEN"); - else if (displayName.equals("§6Baby-Katze")) PetManager.spawnEntityPet(player, "CAT", true); - else if (displayName.equals("§6Katze")) PetManager.spawnEntityPet(player, "CAT", false); - else if (displayName.equals("§aBaby-Panda")) PetManager.spawnEntityPet(player, "PANDA", true); - else if (displayName.equals("§aPanda")) PetManager.spawnEntityPet(player, "PANDA", false); - else if (displayName.equals("§6Baby-Fuchs")) PetManager.spawnEntityPet(player, "FOX", true); - else if (displayName.equals("§6Fuchs")) PetManager.spawnEntityPet(player, "FOX", false); - else if (displayName.equals("§bBaby-Schneefuchs")) PetManager.spawnEntityPet(player, "FOX", true, "SNOW"); - else if (displayName.equals("§bSchneefuchs")) PetManager.spawnEntityPet(player, "FOX", false, "SNOW"); - else if (displayName.equals("§6Baby-Ozelot")) PetManager.spawnEntityPet(player, "OCELOT", true); - else if (displayName.equals("§6Ozelot")) PetManager.spawnEntityPet(player, "OCELOT", false); - else if (displayName.equals("§aBaby-Frosch")) PetManager.spawnEntityPet(player, "FROG", true); - else if (displayName.equals("§aFrosch")) PetManager.spawnEntityPet(player, "FROG", false); - else if (displayName.equals("§2Baby-Schildkröte")) PetManager.spawnEntityPet(player, "TURTLE", true); - else if (displayName.equals("§2Schildkröte")) PetManager.spawnEntityPet(player, "TURTLE", false); - else if (displayName.equals("§fBaby-Kaninchen")) PetManager.spawnEntityPet(player, "RABBIT", true); - else if (displayName.equals("§fKaninchen")) PetManager.spawnEntityPet(player, "RABBIT", false); - else if (displayName.equals("§dBaby-Axolotl")) PetManager.spawnEntityPet(player, "AXOLOTL", true); - else if (displayName.equals("§dAxolotl")) PetManager.spawnEntityPet(player, "AXOLOTL", false); - - else if (displayName.equals("§fBaby-Eisbär")) PetManager.spawnEntityPet(player, "POLAR_BEAR", true); - else if (displayName.equals("§fEisbär")) PetManager.spawnEntityPet(player, "POLAR_BEAR", false); - else if (displayName.equals("§eBaby-Biene")) PetManager.spawnEntityPet(player, "BEE", true); - else if (displayName.equals("§eBiene")) PetManager.spawnEntityPet(player, "BEE", false); - else if (displayName.equals("§fKüken")) PetManager.spawnEntityPet(player, "CHICKEN", true); - else if (displayName.equals("§fHuhn")) PetManager.spawnEntityPet(player, "CHICKEN", false); - else if (displayName.equals("§7Baby-Armadillo")) PetManager.spawnEntityPet(player, "ARMADILLO", true); - else if (displayName.equals("§7Armadillo")) PetManager.spawnEntityPet(player, "ARMADILLO", false); - else spawned = false; - - if (spawned) { - player.sendMessage("§8[§6Nexus§8] §dDein Pet wurde gerufen!"); - player.closeInventory(); - } - } else if (title.equals(PET2_TITLE)) { - String displayName = item.hasItemMeta() && item.getItemMeta().hasDisplayName() - ? item.getItemMeta().getDisplayName() : ""; - boolean spawned = true; - - if (displayName.equals("§7Baby-Armadillo")) PetManager.spawnEntityPet(player, "ARMADILLO", true); - else if (displayName.equals("§7Armadillo")) PetManager.spawnEntityPet(player, "ARMADILLO", false); - else spawned = false; - - if (spawned) { - player.sendMessage("§8[§6Nexus§8] §dDein Pet wurde gerufen!"); - player.closeInventory(); - } - } else if (title.equals(PET3_TITLE)) { - String displayName = item.hasItemMeta() && item.getItemMeta().hasDisplayName() - ? item.getItemMeta().getDisplayName() : ""; - boolean spawned = true; - - if (displayName.equals("§cPapagei")) PetManager.spawnEntityPet(player, "PARROT", false); - else if (displayName.equals("§bAllay")) PetManager.spawnEntityPet(player, "ALLAY", false); - else if (displayName.equals("§aSniffer")) PetManager.spawnEntityPet(player, "SNIFFER", false); - else spawned = false; - - if (spawned) { - player.sendMessage("§8[§6Nexus§8] §dDein Pet wurde gerufen!"); - player.closeInventory(); - } + if (item.getType() == Material.BONE) PetManager.spawnEntityPet(player, "WOLF"); + else if (item.getType() == Material.CAT_SPAWN_EGG) PetManager.spawnEntityPet(player, "CAT"); + else if (item.getType() == Material.PANDA_SPAWN_EGG) PetManager.spawnEntityPet(player, "PANDA"); + player.sendMessage("§8[§6Nexus§8] §dDein Pet wurde gerufen!"); + player.closeInventory(); } else if (title.equals(BALLOON_TITLE)) { if (item.getType().toString().endsWith("_WOOL")) { if (activeBalloons.containsKey(player.getUniqueId())) activeBalloons.get(player.getUniqueId()).remove(); @@ -522,130 +376,11 @@ public class GadgetModule implements Module, Listener { player.sendMessage("§8[§6Nexus§8] §5Schutzzone aktiviert!"); } player.closeInventory(); - } else if (item.getType() == Material.FEATHER) { - // Mini-Tornado: Spieler wird schnell im Kreis gedreht und Partikel erscheinen (weiter oben) - Bukkit.getScheduler().runTaskTimer(NexusLobby.getInstance(), new Runnable() { - int ticks = 0; - @Override - public void run() { - if (ticks >= 20) return; - float yaw = player.getLocation().getYaw() + 36; - // Spieler leicht anheben - org.bukkit.Location loc = player.getLocation().clone(); - loc.setYaw(yaw); - loc.setY(loc.getY() + 0.5); - player.teleport(loc); - // Partikel deutlich höher - player.getWorld().spawnParticle(Particle.CLOUD, loc.clone().add(0,1.5,0), 14, 0.4,0.2,0.4,0.02); - player.setVelocity(player.getVelocity().setY(0.13)); - ticks++; - } - }, 0L, 1L); - player.playSound(player.getLocation(), Sound.ENTITY_PHANTOM_FLAP, 1, 1.2f); - player.sendMessage("§8[§6Nexus§8] §fMini-Tornado: Du wirbelst herum!"); - player.closeInventory(); - } else if (item.getType() == Material.TNT) { - // Fake-TNT: Platziert eine harmlose TNT-Attrappe - org.bukkit.Location tntLoc = player.getLocation().add(0, 0.5, 0); - player.getWorld().spawnParticle(Particle.SMOKE, tntLoc, 16, 0.4, 0.2, 0.4, 0.01); - player.getWorld().playSound(tntLoc, Sound.ENTITY_TNT_PRIMED, 1, 1); - Bukkit.getScheduler().runTaskLater(NexusLobby.getInstance(), () -> { - player.getWorld().spawnParticle(Particle.EXPLOSION, tntLoc, 2, 0.5, 0.2, 0.5, 0.1); - player.getWorld().playSound(tntLoc, Sound.ENTITY_GENERIC_EXPLODE, 1, 1.1f); - }, 30L); - player.sendMessage("§8[§6Nexus§8] §cFake-TNT gezündet! Keine Sorge, alles harmlos."); - player.closeInventory(); - } else if (item.getType() == Material.SLIME_BALL) { - // Mob-Party: Spawnt harmlose Mini-Mobs mit Partikeleffekten - org.bukkit.World world = player.getWorld(); - org.bukkit.Location baseLoc = player.getLocation(); - org.bukkit.entity.EntityType[] types = new org.bukkit.entity.EntityType[] { - org.bukkit.entity.EntityType.ZOMBIE, - org.bukkit.entity.EntityType.SKELETON, - org.bukkit.entity.EntityType.CREEPER, - org.bukkit.entity.EntityType.SLIME - }; - List spawned = new ArrayList<>(); - for (int i = 0; i < types.length; i++) { - org.bukkit.Location mobLoc = baseLoc.clone().add(Math.cos(i * Math.PI/2) * 1.5, 0, Math.sin(i * Math.PI/2) * 1.5); - org.bukkit.entity.Entity ent = world.spawnEntity(mobLoc, types[i]); - if (ent instanceof org.bukkit.entity.LivingEntity mob) { - mob.setCustomName("§aParty-Mob"); - mob.setCustomNameVisible(true); - mob.setAI(false); - mob.setInvulnerable(true); - mob.setCollidable(false); - mob.setSilent(true); - mob.setGlowing(true); - // setBaby() ist nicht für alle EntityTypes verfügbar, daher nur für passende Typen aufrufen - try { - if (mob instanceof org.bukkit.entity.Zombie zombie) { - zombie.setBaby(true); - } else if (mob instanceof org.bukkit.entity.Slime slime) { - slime.setSize(1); - } - } catch (Exception ignored) {} - spawned.add(mob); - } - } - // Partikel und "Tanz" für 4 Sekunden, dann despawnen - Bukkit.getScheduler().runTaskTimer(NexusLobby.getInstance(), new Runnable() { - int ticks = 0; - @Override - public void run() { - if (ticks >= 80) { - spawned.forEach(e -> e.remove()); - return; - } - for (org.bukkit.entity.LivingEntity mob : spawned) { - mob.getWorld().spawnParticle(Particle.NOTE, mob.getLocation().add(0,1,0), 6, 0.3,0.2,0.3,0.01); - mob.teleport(mob.getLocation().add(0, 0.08 * Math.sin(ticks/2.0), 0)); - } - ticks++; - } - }, 0L, 2L); - player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_CELEBRATE, 1, 1.2f); - player.sendMessage("§8[§6Nexus§8] §aMob-Party gestartet! Die Mobs tanzen um dich."); - player.closeInventory(); - } else if (item.getType() == Material.FIREWORK_ROCKET) { - // Konfetti-Kanone: Bunte Partikel und Knall - for (int i = 0; i < 3; i++) { - Bukkit.getScheduler().runTaskLater(NexusLobby.getInstance(), () -> { - player.getWorld().spawnParticle(Particle.CRIT, player.getLocation().add(0,1,0), 40, 0.8,0.5,0.8,0.15); - player.getWorld().spawnParticle(Particle.NOTE, player.getLocation().add(0,1,0), 20, 0.7,0.3,0.7,0.1); - player.playSound(player.getLocation(), Sound.ENTITY_FIREWORK_ROCKET_BLAST, 1, 1.1f); - }, i * 6L); - } - player.sendMessage("§8[§6Nexus§8] §cKonfetti-Kanone: Buntes Konfetti überall!"); - player.closeInventory(); - } else if (item.getType() == Material.NOTE_BLOCK) { - // Tanz-Emote: Spieler springt, Partikel und Musik - Bukkit.getScheduler().runTaskTimer(NexusLobby.getInstance(), new Runnable() { - int ticks = 0; - @Override - public void run() { - if (ticks >= 40) return; - if (ticks % 8 == 0) { - player.setVelocity(player.getVelocity().setY(0.4)); - player.getWorld().spawnParticle(Particle.NOTE, player.getLocation().add(0,2,0), 8, 0.5,0.2,0.5,0.01); - player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_BELL, 1, 1.2f); - } - ticks++; - } - }, 0L, 2L); - player.sendMessage("§8[§6Nexus§8] §dTanz-Emote: Du beginnst zu tanzen!"); - player.closeInventory(); } } } private void removeGadgets(Player player) { - // Laufenden Disco-Modus Task abbrechen - UUID uuid = player.getUniqueId(); - Integer discoTask = discoTasks.remove(uuid); - if (discoTask != null) { - Bukkit.getScheduler().cancelTask(discoTask); - } if (activeBalloons.containsKey(player.getUniqueId())) { activeBalloons.get(player.getUniqueId()).remove(); activeBalloons.remove(player.getUniqueId()); diff --git a/src/main/java/de/nexuslobby/modules/gadgets/PetManager.java b/src/main/java/de/nexuslobby/modules/gadgets/PetManager.java index 387597c..f440105 100644 --- a/src/main/java/de/nexuslobby/modules/gadgets/PetManager.java +++ b/src/main/java/de/nexuslobby/modules/gadgets/PetManager.java @@ -3,18 +3,11 @@ package de.nexuslobby.modules.gadgets; import de.nexuslobby.NexusLobby; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.NamespacedKey; -import org.bukkit.Registry; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; -import org.bukkit.entity.Ageable; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; -import org.bukkit.entity.Fox; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.Tameable; -import org.bukkit.entity.Wolf; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageEvent; @@ -57,14 +50,6 @@ public class PetManager implements Listener { * Spawnt ein echtes Tier-Entity für den Spieler. */ public static void spawnEntityPet(Player player, String type) { - spawnEntityPet(player, type, false); - } - - public static void spawnEntityPet(Player player, String type, boolean baby) { - spawnEntityPet(player, type, baby, null); - } - - public static void spawnEntityPet(Player player, String type, boolean baby, String variantName) { removePet(player); EntityType entityType; @@ -78,42 +63,15 @@ public class PetManager implements Listener { Location loc = player.getLocation(); Entity pet = player.getWorld().spawnEntity(loc, entityType); - String agePrefix = baby ? "§bBaby " : ""; - String petName = buildPetDisplayName(type, variantName); - pet.setCustomName(agePrefix + petName); + pet.setCustomName("§d" + player.getName() + "'s " + capitalize(type.toLowerCase())); pet.setCustomNameVisible(true); pet.setInvulnerable(true); pet.setPersistent(false); - applyNeutralPetTeam(pet); if (pet instanceof LivingEntity) { LivingEntity le = (LivingEntity) pet; le.setRemoveWhenFarAway(false); - - if (le instanceof Ageable) { - Ageable ageable = (Ageable) le; - if (baby) { - ageable.setBaby(); - } else { - ageable.setAdult(); - } - } - - if (le instanceof Wolf && variantName != null && !variantName.isEmpty()) { - Wolf.Variant variant = resolveWolfVariant(variantName); - if (variant != null) { - ((Wolf) le).setVariant(variant); - } - } - - if (le instanceof Fox && variantName != null && !variantName.isEmpty()) { - try { - ((Fox) le).setFoxType(Fox.Type.valueOf(variantName)); - } catch (IllegalArgumentException ignored) { - // Ignorieren: Unbekannte Variante - } - } - + // Verhindert, dass das Pet andere angreift if (le instanceof Tameable) { ((Tameable) le).setTamed(true); @@ -160,16 +118,13 @@ public class PetManager implements Listener { public static void removePet(Player player) { if (activePets.containsKey(player.getUniqueId())) { - Entity pet = activePets.get(player.getUniqueId()); - removeFromPetTeam(pet); - pet.remove(); + activePets.get(player.getUniqueId()).remove(); activePets.remove(player.getUniqueId()); } } public static void clearAll() { for (Entity pet : activePets.values()) { - removeFromPetTeam(pet); pet.remove(); } activePets.clear(); @@ -180,49 +135,6 @@ public class PetManager implements Listener { return str.substring(0, 1).toUpperCase() + str.substring(1); } - private static String buildPetDisplayName(String type, String variantName) { - String baseType = capitalize(type.toLowerCase()); - if (variantName == null || variantName.isEmpty()) return baseType; - String variant = capitalize(variantName.toLowerCase()); - return variant + " " + baseType; - } - - private static Wolf.Variant resolveWolfVariant(String variantName) { - String keyName = variantName.toLowerCase(); - NamespacedKey key = NamespacedKey.minecraft(keyName); - return Registry.WOLF_VARIANT.get(key); - } - - private static Team getOrCreatePetTeam() { - Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard(); - Team team = scoreboard.getTeam("nexus_pets"); - if (team == null) { - team = scoreboard.registerNewTeam("nexus_pets"); - team.setPrefix(""); - team.setSuffix(""); - } - return team; - } - - private static void applyNeutralPetTeam(Entity pet) { - Team team = getOrCreatePetTeam(); - String entry = pet.getUniqueId().toString(); - if (!team.hasEntry(entry)) { - team.addEntry(entry); - } - } - - private static void removeFromPetTeam(Entity pet) { - if (pet == null) return; - Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard(); - Team team = scoreboard.getTeam("nexus_pets"); - if (team == null) return; - String entry = pet.getUniqueId().toString(); - if (team.hasEntry(entry)) { - team.removeEntry(entry); - } - } - // --- Events um die Pets zu schützen --- @EventHandler diff --git a/src/main/java/de/nexuslobby/modules/hologram/HoloCommand.java b/src/main/java/de/nexuslobby/modules/hologram/HoloCommand.java index f707990..160787d 100644 --- a/src/main/java/de/nexuslobby/modules/hologram/HoloCommand.java +++ b/src/main/java/de/nexuslobby/modules/hologram/HoloCommand.java @@ -68,6 +68,10 @@ public class HoloCommand implements CommandExecutor { } module.removeHologram(args[1]); player.sendMessage("§8[§6Nexus§8] §cHologramm §e" + args[1] + " §agelöscht."); + } + else if (args[0].equalsIgnoreCase("reload")) { + module.reloadHolograms(); + player.sendMessage("§8[§6Nexus§8] §aHologramme neu geladen."); } else { sendHelp(player); } @@ -79,6 +83,7 @@ public class HoloCommand implements CommandExecutor { player.sendMessage("§8§m-----------§r §6Hologramme §8§m-----------"); player.sendMessage("§e/holo create "); player.sendMessage("§e/holo delete "); + player.sendMessage("§e/holo reload"); player.sendMessage("§7Nutze §b; §7für neue Seiten."); player.sendMessage("§7Nutze §b\\n §7für Zeilenumbruch."); } diff --git a/src/main/java/de/nexuslobby/modules/hologram/HologramModule.java b/src/main/java/de/nexuslobby/modules/hologram/HologramModule.java index 726fc24..af55301 100644 --- a/src/main/java/de/nexuslobby/modules/hologram/HologramModule.java +++ b/src/main/java/de/nexuslobby/modules/hologram/HologramModule.java @@ -153,15 +153,57 @@ public class HologramModule implements Module, Listener { saveHoloConfig(); } + /** + * Lädt die holograms.yml neu und rendert alle Hologramme für Online-Spieler neu. + * Wird von HoloCommand (/holo reload) aufgerufen. + */ + public void reloadHolograms() { + // Alle aktiven Hologramme für alle Spieler entfernen + for (Player player : Bukkit.getOnlinePlayers()) { + holograms.values().forEach(h -> h.removeForPlayer(player)); + } + // Config neu einlesen und Hologramme neu laden + loadConfig(); + loadHolograms(); + } + private void saveHoloConfig() { - try { - config.save(file); - } catch (IOException e) { + try { + // Sicherstellen, dass Placeholder-Strings (z.B. %bungeetotal%) korrekt + // gequotet gespeichert werden, damit SnakeYAML sie nicht als YAML-Direktive + // missinterpretiert. Dazu speichern wir die text-Listen explizit als + // String-Werte mit einfachen Anführungszeichen via eigener Serialisierung. + StringBuilder yaml = new StringBuilder(); + for (String id : config.getKeys(false)) { + yaml.append(id).append(":\n"); + yaml.append(" world: ").append(quoteIfNeeded(config.getString(id + ".world", ""))).append("\n"); + yaml.append(" x: ").append(config.getDouble(id + ".x")).append("\n"); + yaml.append(" y: ").append(config.getDouble(id + ".y")).append("\n"); + yaml.append(" z: ").append(config.getDouble(id + ".z")).append("\n"); + yaml.append(" text:\n"); + for (String line : config.getStringList(id + ".text")) { + yaml.append(" - ").append(quoteIfNeeded(line)).append("\n"); + } + } + java.nio.file.Files.writeString(file.toPath(), yaml.toString()); + } catch (IOException e) { NexusLobby.getInstance().getLogger().severe("Konnte holograms.yml nicht speichern!"); NexusLobby.getInstance().getLogger().severe("Fehler beim Speichern der Hologramme: " + e.getMessage()); } } + /** + * Umschließt Strings mit einfachen Anführungszeichen, wenn sie YAML-Sonderzeichen + * wie '%', ':', '#' enthalten, um Parsing-Fehler zu vermeiden. + */ + private String quoteIfNeeded(String value) { + if (value == null) return "''"; + if (value.contains("%") || value.contains(":") || value.contains("#") || value.contains("'")) { + return "'" + value.replace("'", "''") + "'"; + } + return value; + } + /** * WICHTIG: Diese Methode wird vom LobbyTabCompleter benötigt! * @return Set aller registrierten Hologramm-IDs diff --git a/src/main/java/de/nexuslobby/modules/parkour/ParkourManager.java b/src/main/java/de/nexuslobby/modules/parkour/ParkourManager.java index cccaf7e..40a0968 100644 --- a/src/main/java/de/nexuslobby/modules/parkour/ParkourManager.java +++ b/src/main/java/de/nexuslobby/modules/parkour/ParkourManager.java @@ -324,16 +324,14 @@ public class ParkourManager { // Bestzeiten // ───────────────────────────────────────────────────────────────────────── - private void saveBestTime(Player player, double time) { - int track = activeTrack.getOrDefault(player.getUniqueId(), 1); - String path = "besttimes." + track + "." + player.getUniqueId(); + String path = "besttimes." + player.getUniqueId(); double currentTime = config.getDouble(path, 99999.9); if (time < currentTime) { config.set(path, time); - config.set("names." + track + "." + player.getUniqueId(), player.getName()); + config.set("names." + player.getUniqueId(), player.getName()); save(); - player.sendMessage("§8[§6Parkour§8] §6§lNeuer Rekord auf Strecke " + track + "! §7Du hast dich verbessert."); + player.sendMessage("§8[§6Parkour§8] §6§lNeuer Rekord! §7Du hast dich verbessert."); } } @@ -342,22 +340,19 @@ public class ParkourManager { * Die Strecken-Konfiguration (tracks) bleibt vollständig erhalten. * Wird durch "/nexus parkour clear" aufgerufen. */ - public void clearStats() { config.set("besttimes", null); config.set("names", null); save(); } - - public String getTopTen(int track) { - String base = "besttimes." + track; - if (!config.contains(base) || config.getConfigurationSection(base) == null) - return "§6§l🏆 TOP 10 PARKOUR Strecke " + track + " 🏆\n§7Noch keine Rekorde."; + public String getTopTen() { + if (!config.contains("besttimes") || config.getConfigurationSection("besttimes") == null) + return "§6§l🏆 TOP 10 PARKOUR 🏆\n§7Noch keine Rekorde."; Map allTimes = new HashMap<>(); - for (String uuidStr : config.getConfigurationSection(base).getKeys(false)) { - allTimes.put(uuidStr, config.getDouble(base + "." + uuidStr)); + for (String uuidStr : config.getConfigurationSection("besttimes").getKeys(false)) { + allTimes.put(uuidStr, config.getDouble("besttimes." + uuidStr)); } List> sortedList = allTimes.entrySet().stream() @@ -365,10 +360,10 @@ public class ParkourManager { .limit(10) .toList(); - StringBuilder builder = new StringBuilder("§6§l🏆 TOP 10 PARKOUR Strecke " + track + " 🏆"); + StringBuilder builder = new StringBuilder("§6§l🏆 TOP 10 PARKOUR 🏆"); int rank = 1; for (Map.Entry entry : sortedList) { - String name = config.getString("names." + track + "." + entry.getKey(), "Unbekannt"); + String name = config.getString("names." + entry.getKey(), "Unbekannt"); builder.append("\n§e#").append(rank).append(" §f").append(name) .append(" §8» §a").append(String.format("%.2f", entry.getValue())).append("s"); rank++; diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index ea96e46..3274c35 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -278,6 +278,31 @@ player_inspect: gui_title: "&8Statistiken von &6{PLAYER}" # ══════════════════════════════════════════════════════════════════════════════ +# SUPPRESSOR / GLOBAL CHAT EINSTELLUNGEN +# ══════════════════════════════════════════════════════════════════════════════ +# Join/Quit-Nachrichten Unterdrückung und BungeeCord-Messaging +suppressor: + # Aktiviert das Suppressor-System (true = an, false = aus) + enabled: false + + # Unterdrückt Join- und Quit-Nachrichten für neue Spieler temporär + # true = Nachrichten werden unterdrückt, false = normale Anzeige + # Nützlich um Spam zu vermeiden wenn viele Spieler gleichzeitig joinen/leaven + suppress-join-quit: true + + # Dauer der Unterdrückung in Ticks (20 Ticks = 1 Sekunde) + # Nach dieser Zeit werden Join/Quit-Nachrichten wieder normal angezeigt + suppress-duration-ticks: 40 + + # BungeeCord Plugin-Messaging Channels + # Diese Channels werden für die Kommunikation zwischen Servern verwendet + channels: + # Channel für Join/Quit-Suppression-Control + control: "global:control" + + # Channel für globales Chat-Relay über alle Server + chat: "global:chat" + # ══════════════════════════════════════════════════════════════════════════════ # LOGGING EINSTELLUNGEN # ══════════════════════════════════════════════════════════════════════════════ diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 50b9d3e..b7f8fcd 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: NexusLobby main: de.nexuslobby.NexusLobby -version: "1.6" +version: "1.7" api-version: "1.21" author: M_Viper description: Modular Lobby Plugin with an invisible Particle-Parkour system. diff --git a/src/main/resources/visuals.yml b/src/main/resources/visuals.yml index f2d433b..46fa389 100644 --- a/src/main/resources/visuals.yml +++ b/src/main/resources/visuals.yml @@ -77,7 +77,7 @@ scoreboard: - "&6&lNETZWERK" - " &8» &fOnline: &e%bungee_total%" - "&4 " - - "&8&o Viper-Network.de" + - "&8&o m-viper.de" owner: title: "&4&l&nNEXUS &c&lADMIN" lines: