Update from Git Manager GUI

This commit is contained in:
2026-01-23 10:43:53 +01:00
parent 9fd0690ba8
commit 5f2c05d85e
13 changed files with 984 additions and 114 deletions

View File

@@ -4,28 +4,37 @@ import de.nexuslobby.NexusLobby;
import de.nexuslobby.api.Module;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerFishEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
public class GadgetModule implements Module, Listener {
private final Map<UUID, Balloon> activeBalloons = new HashMap<>();
private final Map<UUID, ParticleEffect> activeEffects = new HashMap<>();
private final Set<UUID> activeShields = new HashSet<>();
// Titel für die verschiedenen Inventare zur Identifikation
private final String MAIN_TITLE = "§b§lGadgets §8- §7Menü";
private final String BALLOON_TITLE = "§b§lGadgets §8- §eBallons";
private final String PARTICLE_TITLE = "§b§lGadgets §8- §dPartikel";
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";
@Override
public String getName() { return "Gadgets"; }
@@ -33,39 +42,104 @@ public class GadgetModule implements Module, Listener {
@Override
public void onEnable() {
Bukkit.getPluginManager().registerEvents(this, NexusLobby.getInstance());
Bukkit.getScheduler().runTaskTimer(NexusLobby.getInstance(), () -> {
PetManager.updatePets();
activeBalloons.values().forEach(Balloon::update);
activeEffects.forEach((uuid, effect) -> {
Player p = Bukkit.getPlayer(uuid);
if (p != null && p.isOnline()) effect.update(p);
});
for (Player p : Bukkit.getOnlinePlayers()) {
UUID uuid = p.getUniqueId();
handleSpecialHatEffects(p);
if (activeEffects.containsKey(uuid)) activeEffects.get(uuid).update(p);
if (activeShields.contains(uuid)) ShieldTask.handleShield(p);
}
}, 1L, 1L);
}
// --- GUI ÖFFNER ---
private void handleSpecialHatEffects(Player p) {
ItemStack hat = p.getInventory().getHelmet();
if (hat == null || hat.getType() == Material.AIR) return;
switch (hat.getType()) {
case CAMPFIRE:
p.getWorld().spawnParticle(Particle.CAMPFIRE_COSY_SMOKE, p.getLocation().add(0, 2.2, 0), 1, 0.05, 0.05, 0.05, 0.02);
break;
case SPAWNER:
p.getWorld().spawnParticle(Particle.FLAME, p.getLocation().add(0, 2.1, 0), 1, 0.12, 0.12, 0.12, 0.02);
break;
case SEA_LANTERN:
case BEACON:
p.getWorld().spawnParticle(Particle.END_ROD, p.getLocation().add(0, 2.1, 0), 1, 0.1, 0.1, 0.1, 0.03);
break;
case ENCHANTING_TABLE:
p.getWorld().spawnParticle(Particle.ENCHANT, p.getLocation().add(0, 2.3, 0), 1, 0.2, 0.2, 0.2, 0.5);
break;
}
}
public void openGUI(Player player) {
Inventory gui = Bukkit.createInventory(null, 27, MAIN_TITLE);
fillEdges(gui);
gui.setItem(10, createItem(Material.LEAD, "§e§lBallons", "§7Wähle einen fliegenden Begleiter"));
gui.setItem(13, createItem(Material.FIREWORK_ROCKET, "§6§lLustiges", "§7Witzige Effekte für zwischendurch"));
gui.setItem(16, createItem(Material.NETHER_STAR, "§d§lPartikel", "§7Wähle magische Effekte"));
gui.setItem(11, createItem(Material.GOLDEN_HELMET, "§a§lHüte", "§7Setze dir etwas auf den Kopf"));
gui.setItem(13, createItem(Material.BONE, "§d§lBegleiter", "§7Echte Tiere, die dir folgen"));
gui.setItem(15, createItem(Material.FIREWORK_ROCKET, "§6§lLustiges", "§7Witzige Effekte"));
gui.setItem(16, createItem(Material.NETHER_STAR, "§d§lPartikel", "§7Magische Auren & Effekte"));
gui.setItem(22, createItem(Material.BARRIER, "§c§lStopp", "§7Alle Gadgets entfernen"));
player.openInventory(gui);
}
private void openHatGUI(Player player) {
Inventory gui = Bukkit.createInventory(null, 45, HAT_TITLE);
fillEdges(gui);
gui.setItem(10, createItem(Material.JACK_O_LANTERN, "§6Kürbis-Hut", "§7Es ist immer Halloween!"));
gui.setItem(11, createItem(Material.SEA_LANTERN, "§bMeeres-Leuchten", "§7§oEffekt: Glitzern"));
gui.setItem(12, createItem(Material.GLOWSTONE, "§eGlowstone-Kopf", "§7Werde zur Lampe"));
gui.setItem(13, createItem(Material.TNT, "§cExplosiv-Hut", "§7Vorsicht, heiß!"));
gui.setItem(14, createItem(Material.GLASS, "§fAstronaut", "§7Bereit für den Mond?"));
gui.setItem(15, createItem(Material.DRAGON_HEAD, "§5Enderdrache", "§7Der König der Lüfte"));
gui.setItem(16, createItem(Material.CAKE, "§dKuchen-Kopf", "§7Jeder mag Kuchen!"));
gui.setItem(19, createItem(Material.SLIME_BLOCK, "§aGlibber-Block", "§7Ziemlich klebrig..."));
gui.setItem(20, createItem(Material.MELON, "§aMelonen-Helm", "§7Frisch und saftig"));
gui.setItem(21, createItem(Material.HAY_BLOCK, "§eStrohhut", "§7Sommer auf dem Land"));
gui.setItem(22, createItem(Material.SPAWNER, "§8Monster-Käfig", "§7§oEffekt: Flammen"));
gui.setItem(23, createItem(Material.CRAFTING_TABLE, "§6Werkbank", "§7Immer am Basteln"));
gui.setItem(24, createItem(Material.BOOKSHELF, "§fBücherregal", "§7Ein wahrer Schlaukopf"));
gui.setItem(25, createItem(Material.HONEY_BLOCK, "§6Honig-Hut", "§7Süß und klebrig"));
gui.setItem(28, createItem(Material.GOLD_BLOCK, "§6Gold-Bonze", "§7Zeig was du hast"));
gui.setItem(29, createItem(Material.DIAMOND_ORE, "§bDiamant-Erz", "§7Bau mich bloß nicht ab!"));
gui.setItem(30, createItem(Material.BEACON, "§fLeuchtfeuer", "§7§oEffekt: Glitzern"));
gui.setItem(31, createItem(Material.CONDUIT, "§3Auge des Meeres", "§7Die Macht von Atlantis"));
gui.setItem(32, createItem(Material.ENCHANTING_TABLE, "§dMagier", "§7§oEffekt: Runen"));
gui.setItem(33, createItem(Material.CAMPFIRE, "§cHeißer Kopf", "§7§oEffekt: Rauch"));
gui.setItem(34, createItem(Material.SKELETON_SKULL, "§7Skelett", "§7Ein wenig gruselig"));
gui.setItem(40, createItem(Material.ARROW, "§7Zurück", "§8Zum Hauptmenü"));
player.openInventory(gui);
}
private void openPetGUI(Player player) {
Inventory gui = Bukkit.createInventory(null, 27, PET_TITLE);
fillEdges(gui);
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);
}
private void openBalloonGUI(Player player) {
Inventory gui = Bukkit.createInventory(null, 36, BALLOON_TITLE);
fillEdges(gui);
Material[] wools = {Material.WHITE_WOOL, Material.ORANGE_WOOL, Material.MAGENTA_WOOL, Material.LIGHT_BLUE_WOOL,
Material.YELLOW_WOOL, Material.LIME_WOOL, Material.PINK_WOOL, Material.GRAY_WOOL,
Material.CYAN_WOOL, Material.PURPLE_WOOL, Material.BLUE_WOOL, Material.BROWN_WOOL,
Material.GREEN_WOOL, Material.RED_WOOL};
int slot = 10;
for (Material m : wools) {
if (slot == 17) slot = 19;
@@ -78,11 +152,9 @@ public class GadgetModule implements Module, Listener {
private void openParticleGUI(Player player) {
Inventory gui = Bukkit.createInventory(null, 27, PARTICLE_TITLE);
fillEdges(gui);
gui.setItem(11, createItem(Material.POPPY, "§cHerzchen-Aura", "§7Verbreite Liebe"));
gui.setItem(13, createItem(Material.BLAZE_POWDER, "§6Flammen-Ring", "§7Werde feurig"));
gui.setItem(15, createItem(Material.WATER_BUCKET, "§bRegenwolke", "§7Lass es regnen"));
gui.setItem(11, createItem(Material.POPPY, "§cHerzchen-Aura", "§7Verbreite Liebe in der Lobby"));
gui.setItem(13, createItem(Material.BLAZE_POWDER, "§6Flammen-Ring", "§7Lass es brennen!"));
gui.setItem(15, createItem(Material.WATER_BUCKET, "§bRegenwolke", "§7Deine persönliche Abkühlung"));
gui.setItem(22, createItem(Material.ARROW, "§7Zurück", "§8Zum Hauptmenü"));
player.openInventory(gui);
}
@@ -90,70 +162,91 @@ public class GadgetModule implements Module, Listener {
private void openFunGUI(Player player) {
Inventory gui = Bukkit.createInventory(null, 27, FUN_TITLE);
fillEdges(gui);
gui.setItem(13, createItem(Material.EGG, "§f§lChicken-Rain", "§7Lass es Küken regnen!"));
gui.setItem(11, createItem(Material.FISHING_ROD, "§b§lEnterhaken", "§7Zieh dich durch die Luft!"));
gui.setItem(13, createItem(Material.SHIELD, "§5§lSchutzzone", "§7Halte andere auf Distanz"));
gui.setItem(15, createItem(Material.EGG, "§f§lChicken-Rain", "§7Gack-Gack! Hühner überall!"));
gui.setItem(22, createItem(Material.ARROW, "§7Zurück", "§8Zum Hauptmenü"));
player.openInventory(gui);
}
// --- EVENT HANDLER ---
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
String title = event.getView().getTitle();
if (!title.equals(MAIN_TITLE) && !title.equals(BALLOON_TITLE) && !title.equals(PARTICLE_TITLE) && !title.equals(FUN_TITLE)) return;
if (!title.startsWith("§b§lGadgets")) return;
event.setCancelled(true);
Player player = (Player) event.getWhoClicked();
ItemStack item = event.getCurrentItem();
if (item == null || item.getType() == Material.AIR) return;
// Zurück-Button Logik
if (item.getType() == Material.ARROW) {
openGUI(player);
return;
}
if (item.getType() == Material.ARROW) { openGUI(player); return; }
// HAUPTMENÜ LOGIK
if (title.equals(MAIN_TITLE)) {
if (item.getType() == Material.LEAD) openBalloonGUI(player);
else if (item.getType() == Material.GOLDEN_HELMET) openHatGUI(player);
else if (item.getType() == Material.BONE) openPetGUI(player);
else if (item.getType() == Material.NETHER_STAR) openParticleGUI(player);
else if (item.getType() == Material.FIREWORK_ROCKET) openFunGUI(player);
else if (item.getType() == Material.BARRIER) {
removeGadgets(player);
else if (item.getType() == Material.BARRIER) { removeGadgets(player); player.closeInventory(); }
}
else if (title.equals(HAT_TITLE)) {
if (item.getType() != Material.GRAY_STAINED_GLASS_PANE) {
HatManager.setHat(player, item.getType(), item.getItemMeta().getDisplayName());
player.playSound(player.getLocation(), Sound.ITEM_ARMOR_EQUIP_GENERIC, 1, 1);
player.closeInventory();
}
}
// BALLON MENÜ LOGIK
else if (title.equals(PET_TITLE)) {
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();
activeBalloons.put(player.getUniqueId(), new Balloon(player, item.getType()));
player.sendMessage("§8[§6Nexus§8] §aBallon ausgerüstet!");
player.sendMessage("§8[§6Nexus§8] §aBallon aktiviert!");
player.closeInventory();
}
}
// PARTIKEL MENÜ LOGIK
else if (title.equals(PARTICLE_TITLE)) {
if (item.getType() == Material.POPPY) activeEffects.put(player.getUniqueId(), new ParticleEffect("hearts"));
else if (item.getType() == Material.BLAZE_POWDER) activeEffects.put(player.getUniqueId(), new ParticleEffect("flames"));
else if (item.getType() == Material.WATER_BUCKET) activeEffects.put(player.getUniqueId(), new ParticleEffect("cloud"));
if (item.getType() != Material.GRAY_STAINED_GLASS_PANE) {
player.sendMessage("§8[§6Nexus§8] §aEffekt aktiviert!");
player.closeInventory();
}
player.sendMessage("§8[§6Nexus§8] §aPartikel aktiviert!");
player.closeInventory();
}
// FUN MENÜ LOGIK
else if (title.equals(FUN_TITLE)) {
if (item.getType() == Material.EGG) {
ChickenRain.start(player);
player.sendMessage("§8[§6Nexus§8] §fEs regnet jetzt Hühner!");
player.sendMessage("§8[§6Nexus§8] §fHühnerregen gestartet!");
player.closeInventory();
} else if (item.getType() == Material.FISHING_ROD) {
player.getInventory().addItem(createItem(Material.FISHING_ROD, "§b§lEnterhaken", "§7Rechtsklick zum Katapultieren"));
player.closeInventory();
} else if (item.getType() == Material.SHIELD) {
if (activeShields.contains(player.getUniqueId())) {
activeShields.remove(player.getUniqueId());
player.sendMessage("§8[§6Nexus§8] §cSchutzzone deaktiviert.");
} else {
activeShields.add(player.getUniqueId());
player.sendMessage("§8[§6Nexus§8] §5Schutzzone aktiviert!");
}
player.closeInventory();
}
}
}
@EventHandler
public void onFish(PlayerFishEvent event) {
Player player = event.getPlayer();
ItemStack item = player.getInventory().getItemInMainHand();
if (item != null && item.getType() == Material.FISHING_ROD && item.hasItemMeta() && item.getItemMeta().getDisplayName().equals("§b§lEnterhaken")) {
if (event.getState() == PlayerFishEvent.State.IN_GROUND || event.getState() == PlayerFishEvent.State.REEL_IN || event.getState() == PlayerFishEvent.State.CAUGHT_ENTITY) {
if (event.getHook() != null) {
GrapplingHook.pullPlayer(player, event.getHook().getLocation());
}
}
}
}
@@ -164,15 +257,17 @@ public class GadgetModule implements Module, Listener {
activeBalloons.remove(player.getUniqueId());
}
activeEffects.remove(player.getUniqueId());
player.sendMessage("§8[§6Nexus§8] §cAlle Gadgets wurden entfernt.");
activeShields.remove(player.getUniqueId());
PetManager.removePet(player);
HatManager.removeHat(player);
player.getInventory().remove(Material.FISHING_ROD);
player.sendMessage("§8[§6Nexus§8] §cAlle Gadgets abgelegt.");
}
private void fillEdges(Inventory inv) {
ItemStack glass = createItem(Material.GRAY_STAINED_GLASS_PANE, " ", null);
for (int i = 0; i < inv.getSize(); i++) {
if (i < 9 || i >= inv.getSize() - 9 || i % 9 == 0 || (i + 1) % 9 == 0) {
inv.setItem(i, glass);
}
if (i < 9 || i >= inv.getSize() - 9 || i % 9 == 0 || (i + 1) % 9 == 0) inv.setItem(i, glass);
}
}
@@ -182,7 +277,7 @@ public class GadgetModule implements Module, Listener {
if (meta != null) {
meta.setDisplayName(name);
if (lore != null) {
java.util.List<String> l = new java.util.ArrayList<>();
List<String> l = new ArrayList<>();
l.add(lore);
meta.setLore(l);
}
@@ -193,8 +288,10 @@ public class GadgetModule implements Module, Listener {
@Override
public void onDisable() {
PetManager.clearAll();
activeBalloons.values().forEach(Balloon::remove);
activeBalloons.clear();
activeEffects.clear();
activeShields.clear();
}
}

View File

@@ -0,0 +1,37 @@
package de.nexuslobby.modules.gadgets;
import org.bukkit.Location;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
public class GrapplingHook {
public static void pullPlayer(Player player, Location target) {
Location playerLoc = player.getLocation();
// Vektor vom Spieler zum Ziel berechnen
double distance = target.distance(playerLoc);
// Wenn das Ziel zu nah oder zu weit weg ist, nichts tun
if (distance < 2 || distance > 50) return;
// Berechnung des Wurfs (Vektor)
Vector v = target.toVector().subtract(playerLoc.toVector());
// Den Vektor normalisieren und skalieren (Stärke des Zugs)
v.multiply(0.3); // Basis-Geschwindigkeit
v.setY(v.getY() * 0.6 + 0.5); // Etwas mehr Höhe für den Bogen-Effekt
// Geschwindigkeit begrenzen, damit man nicht aus der Map schießt
if (v.length() > 2.5) {
v.normalize().multiply(2.5);
}
player.setVelocity(v);
// Sound-Effekt für das "Ziehen"
player.playSound(playerLoc, Sound.ENTITY_WIND_CHARGE_WIND_BURST, 1.0f, 1.2f);
player.playSound(playerLoc, Sound.ITEM_TRIDENT_RIPTIDE_1, 0.5f, 1.5f);
}
}

View File

@@ -0,0 +1,26 @@
package de.nexuslobby.modules.gadgets;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
public class HatManager {
public static void setHat(Player player, Material material, String name) {
ItemStack hat = new ItemStack(material);
ItemMeta meta = hat.getItemMeta();
if (meta != null) {
meta.setDisplayName("§6Hut: " + name);
hat.setItemMeta(meta);
}
// Den Gegenstand auf den Kopf setzen
player.getInventory().setHelmet(hat);
player.sendMessage("§8[§6Nexus§8] §aDu trägst nun: " + name);
}
public static void removeHat(Player player) {
player.getInventory().setHelmet(null);
}
}

View File

@@ -0,0 +1,138 @@
package de.nexuslobby.modules.gadgets;
import de.nexuslobby.NexusLobby;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class PetManager implements Listener {
private static final Map<UUID, Entity> activePets = new HashMap<>();
public PetManager() {
Bukkit.getPluginManager().registerEvents(this, NexusLobby.getInstance());
}
/**
* Spawnt ein echtes Tier-Entity für den Spieler.
*/
public static void spawnEntityPet(Player player, String type) {
removePet(player);
EntityType entityType;
try {
entityType = EntityType.valueOf(type);
} catch (IllegalArgumentException e) {
player.sendMessage("§cFehler: Tier-Typ nicht gefunden.");
return;
}
Location loc = player.getLocation();
Entity pet = player.getWorld().spawnEntity(loc, entityType);
pet.setCustomName("§d" + player.getName() + "'s " + capitalize(type.toLowerCase()));
pet.setCustomNameVisible(true);
pet.setInvulnerable(true);
pet.setPersistent(false);
if (pet instanceof LivingEntity) {
LivingEntity le = (LivingEntity) pet;
le.setRemoveWhenFarAway(false);
// Verhindert, dass das Pet andere angreift
if (le instanceof Tameable) {
((Tameable) le).setTamed(true);
((Tameable) le).setOwner(player);
}
}
activePets.put(player.getUniqueId(), pet);
}
/**
* Steuert das Folgen der Tiere. Wird vom GadgetModule-Timer aufgerufen.
*/
public static void updatePets() {
for (Map.Entry<UUID, Entity> entry : activePets.entrySet()) {
Player owner = Bukkit.getPlayer(entry.getKey());
Entity pet = entry.getValue();
if (owner == null || !owner.isOnline() || pet.isDead()) {
continue;
}
// Wenn das Pet in einer anderen Welt ist oder zu weit weg, teleportiere es
if (!pet.getWorld().equals(owner.getWorld()) || pet.getLocation().distance(owner.getLocation()) > 10) {
pet.teleport(owner.getLocation());
continue;
}
// Sanftes Folgen: Wenn das Pet weiter als 3 Blöcke weg ist
if (pet.getLocation().distance(owner.getLocation()) > 3) {
Location target = owner.getLocation().clone().add(owner.getLocation().getDirection().multiply(-1.5));
target.setY(owner.getLocation().getY());
// Teleportiert das Pet leicht zum Ziel (simuliert Laufen)
pet.teleport(pet.getLocation().add(target.toVector().subtract(pet.getLocation().toVector()).normalize().multiply(0.2)));
// Blickrichtung anpassen
Location lookAt = pet.getLocation();
lookAt.setDirection(owner.getLocation().toVector().subtract(pet.getLocation().toVector()));
pet.teleport(lookAt);
}
}
}
public static void removePet(Player player) {
if (activePets.containsKey(player.getUniqueId())) {
activePets.get(player.getUniqueId()).remove();
activePets.remove(player.getUniqueId());
}
}
public static void clearAll() {
for (Entity pet : activePets.values()) {
pet.remove();
}
activePets.clear();
}
private static String capitalize(String str) {
if (str == null || str.isEmpty()) return str;
return str.substring(0, 1).toUpperCase() + str.substring(1);
}
// --- Events um die Pets zu schützen ---
@EventHandler
public void onPetDamage(EntityDamageEvent event) {
if (activePets.containsValue(event.getEntity())) {
event.setCancelled(true);
}
}
@EventHandler
public void onPetTarget(EntityTargetEvent event) {
if (activePets.containsValue(event.getEntity())) {
event.setCancelled(true);
}
}
@EventHandler
public void onQuit(PlayerQuitEvent event) {
removePet(event.getPlayer());
}
}

View File

@@ -0,0 +1,32 @@
package de.nexuslobby.modules.gadgets;
import org.bukkit.Particle;
import org.bukkit.Sound;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
public class ShieldTask {
public static void handleShield(Player owner) {
// Erzeuge einen Partikel-Ring um den Spieler
for (double i = 0; i < Math.PI * 2; i += Math.PI / 8) {
double x = Math.cos(i) * 2.2;
double z = Math.sin(i) * 2.2;
owner.getWorld().spawnParticle(Particle.WITCH, owner.getLocation().add(x, 0.5, z), 1, 0, 0, 0, 0);
}
// Stoße andere Spieler weg
for (Entity entity : owner.getNearbyEntities(2.2, 2.0, 2.2)) {
if (entity instanceof Player && entity != owner) {
Player target = (Player) entity;
Vector direction = target.getLocation().toVector().subtract(owner.getLocation().toVector()).normalize();
direction.multiply(0.4).setY(0.2);
target.setVelocity(direction);
target.playSound(target.getLocation(), Sound.ENTITY_CHICKEN_EGG, 0.5f, 0.5f);
}
}
}
}