138 lines
4.5 KiB
Java
138 lines
4.5 KiB
Java
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());
|
|
}
|
|
} |