package de.fanta.challenges.utils;
import de.fanta.challenges.Challenges;
import de.fanta.challenges.events.TimerChangedEvent;
import de.fanta.challenges.schedular.CancellableTask;
import org.bukkit.Location;
import org.bukkit.Particle;
import org.bukkit.Vibration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerQuitEvent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.UUID;
public class CoordsTargeter implements Listener {
private static final Challenges plugin = Challenges.getPlugin();
private static final HashMap<UUID, Location> locationMap = new HashMap<>();
private static final Collection<UUID> autoDetectionList = new ArrayList<>();
private CancellableTask task;
@EventHandler
public void onTimer(TimerChangedEvent e) {
if (e.isRunning()) {
startUpdateTask();
} else {
locationMap.clear();
stopUpdateTask();
}
}
@EventHandler
public void onLeave(PlayerQuitEvent e) {
if (locationMap.containsKey(e.getPlayer().getUniqueId())) {
removeLocation(e.getPlayer().getUniqueId());
}
}
public void updateTargeter() {
for (Player p : plugin.getVanish().getPlayerListWithoutVanishPlayers()) {
if (locationMap.containsKey(p.getUniqueId())) {
Location targetLocation = locationMap.get(p.getUniqueId());
if (targetLocation != null && targetLocation.getWorld() == p.getWorld()) {
Location playerlocation;
if (p.getVehicle() != null) {
playerlocation = p.getLocation().clone().add(0, 0.5, 0);
} else {
playerlocation = p.getLocation().clone().add(0, 1, 0);
}
int distance = (int) playerlocation.toVector().subtract(targetLocation.toVector()).length();
Vibration vibration = new Vibration(new Vibration.Destination.BlockDestination(targetLocation.getBlock()), distance * 2);
p.spawnParticle(Particle.VIBRATION, playerlocation, 1, vibration);
if (autoDetectionList.contains(p.getUniqueId()) && distance < 5) {
removeLocation(p.getUniqueId());
ChatUtil.sendNormalMessage(p, "Sie haben ihr Ziel erreicht!");
}
} else if (autoDetectionList.contains(p.getUniqueId())) {
removeLocation(p.getUniqueId());
ChatUtil.sendWarningMessage(p, "Du bist nicht mehr in der Welt vom Waypoint, der Weg wird nicht mehr angezeigt!");
}
}
}
}
public void startUpdateTask() {
task = plugin.getScheduler().runGlobalAtFixedRate(this::updateTargeter, 5L, 5L);
}
public void stopUpdateTask() {
if (task != null) {
task.cancel();
}
task = null;
}
public static void addLocation(UUID uuid, Location location) {
addLocation(uuid, location, true);
}
public static void addLocation(UUID uuid, Location location, boolean autoDetection) {
locationMap.put(uuid, location);
if (autoDetection) {
autoDetectionList.add(uuid);
}
}
public static void removeLocation(UUID uuid) {
locationMap.remove(uuid);
autoDetectionList.remove(uuid);
}
public static boolean containsLocation(UUID uuid) {
return locationMap.containsKey(uuid);
}
}