Newer
Older
ChallengeSystem / src / main / java / de / fanta / challenges / CoordsTargeter.java
package de.fanta.challenges;

import de.fanta.challenges.events.TimerChangedEvent;
import de.fanta.challenges.utils.ChatUtil;
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.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 int taskId = -1;

    @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 (distance < 5) {
                        removeLocation(p.getUniqueId());
                        ChatUtil.sendNormalMessage(p, "Sie haben ihr Ziel erreicht!");
                    }
                } else {
                    removeLocation(p.getUniqueId());
                    ChatUtil.sendWarningMessage(p, "Du bist nicht mehr in der Welt vom Waypoint, der Weg wird nicht mehr angezeigt!");
                }
            }
        }
    }

    public void startUpdateTask() {
        taskId = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, this::updateTargeter, 5L, 5L);
    }

    public void stopUpdateTask() {
        plugin.getServer().getScheduler().cancelTask(taskId);
    }

    public static void addLocation(UUID uuid, Location location) {
        locationMap.put(uuid, location);
    }

    public static void removeLocation(UUID uuid) {
        locationMap.remove(uuid);
    }

    public static boolean containsLocation(UUID uuid) {
        return locationMap.containsKey(uuid);
    }
}