67 lines
2.1 KiB
Java
67 lines
2.1 KiB
Java
package net.voltexstudios.applicationLobby.util;
|
|
|
|
import net.voltexstudios.applicationLobby.holograms.HologramService;
|
|
import org.bukkit.Location;
|
|
import org.bukkit.entity.Entity;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.scheduler.BukkitRunnable;
|
|
import org.bukkit.util.RayTraceResult;
|
|
import org.bukkit.util.Vector;
|
|
|
|
public class EyeTrace extends BukkitRunnable {
|
|
|
|
private static final double MAX_DISTANCE = 15.0;
|
|
|
|
private final Player player;
|
|
|
|
public EyeTrace(Player player) {
|
|
this.player = player;
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
if (player == null || !player.isOnline()) {
|
|
cancel();
|
|
return;
|
|
}
|
|
|
|
Location eyeLocation = player.getEyeLocation();
|
|
Location closestHologramLocation = HologramService.getInstance().getClosestHologramLocation(player);
|
|
if (closestHologramLocation == null || eyeLocation.getWorld() != closestHologramLocation.getWorld()) {
|
|
return;
|
|
}
|
|
|
|
if (eyeLocation.distance(closestHologramLocation) > MAX_DISTANCE) {
|
|
//unhover if player is too far away
|
|
HologramService.getInstance().handleHologramHover(player, null);
|
|
return;
|
|
}
|
|
|
|
checkPlayerLookingAtEntity(player);
|
|
}
|
|
|
|
private void checkPlayerLookingAtEntity(Player player) {
|
|
|
|
Location eyeLocation = player.getEyeLocation();
|
|
Vector direction = eyeLocation.getDirection();
|
|
|
|
// RayTrace durchführen
|
|
RayTraceResult rayTraceResult = player.getWorld().rayTraceEntities(
|
|
eyeLocation,
|
|
direction,
|
|
MAX_DISTANCE,
|
|
entity -> entity != player && HologramService.getInstance().isHologram(entity.getUniqueId())
|
|
);
|
|
|
|
if (rayTraceResult != null) {
|
|
Entity targetEntity = rayTraceResult.getHitEntity();
|
|
if (targetEntity != null) {
|
|
// Spieler betrachtet ein Interaktions-Entity
|
|
HologramService.getInstance().handleHologramHover(player, targetEntity);
|
|
return;
|
|
}
|
|
}
|
|
HologramService.getInstance().handleHologramHover(player, null);
|
|
}
|
|
}
|