Upload folder via GUI - src

This commit is contained in:
Git Manager GUI
2026-04-18 08:39:58 +02:00
parent b46af01475
commit c3a8f15f6d
9 changed files with 102 additions and 394 deletions

View File

@@ -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;
}

View File

@@ -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<UUID, Integer> discoTasks = new HashMap<>();
private final Map<UUID, Balloon> activeBalloons = new HashMap<>();
private final Map<UUID, ParticleEffect> 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<org.bukkit.entity.LivingEntity> 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());

View File

@@ -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

View File

@@ -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 <id> <NONE|FAST|SLOW> <text>");
player.sendMessage("§e/holo delete <id>");
player.sendMessage("§e/holo reload");
player.sendMessage("§7Nutze §b; §7für neue Seiten.");
player.sendMessage("§7Nutze §b\\n §7für Zeilenumbruch.");
}

View File

@@ -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

View File

@@ -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<String, Double> 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<Map.Entry<String, Double>> 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<String, Double> 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++;

View File

@@ -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
# ══════════════════════════════════════════════════════════════════════════════

View File

@@ -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.

View File

@@ -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: