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 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 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()); } }