Newer
Older
ChallengeSystem / src / main / java / de / fanta / challenges / utils / CoordsTargeter.java
@fanta fanta on 28 Apr 2024 3 KB ForceQuest und 1.20.5
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);
    }
}