es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comprueba si el jugador se está moviendo o no.

Estoy creando un complemento para un evento, el evento consiste en simplemente: si dejas de moverte, pierdes. He creado todo, pero mi verificación para saber si un jugador se mueve o no no funciona:

Intenté crear un arreglo y agregar el evento de movimiento del jugador, pero no funciona,

@EventHandler
public static void OnPlayerMoov(PlayerMoveEvent e) {
if(!playerHaveMooved.contains(e.getPlayer())) {
playerHaveMooved.add(e.getPlayer());
}
}

public static boolean isMoving(Player p){
System.out.println(Respawn.playerHaveMooved.contains(p));
return Respawn.playerHaveMooved.contains(p);
}

Intenté usar la velocidad, pero no funciona,

public static boolean isMoving(Player p){
return (p.getVelocity().length() == 0);
}

No funciona. Me mata cuando me estoy moviendo.

¿Tienes una solución?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que está teniendo problemas para detectar con precisión el movimiento del jugador. Hay algunas cosas que podría probar para que funcione mejor:

    1. Compruebe si el jugador se ha movido una distancia significativa desde la última comprobación:
    public static boolean isMoving(Player p) {
        Location lastLoc = lastPlayerLocation.get(p.getUniqueId());
        if(lastLoc == null) {
            lastPlayerLocation.put(p.getUniqueId(), p.getLocation());
            return false;
        }
        double distance = lastLoc.distance(p.getLocation());
        lastPlayerLocation.put(p.getUniqueId(), p.getLocation());
        return distance > MIN_DISTANCE;
    }
    

    lastPlayerLocation es un hashmap para hacer un seguimiento de la última ubicación conocida de cada jugador. MIN_DISTANCE es una constante para definir cuánta distancia debe recorrer el jugador para considerarse en movimiento.

    1. Utilice tareas programadas para verificar el movimiento a una velocidad más baja:
    public static void startCheckingMovement() {
        Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
            @Override
            public void run() {
                for(Player p : Bukkit.getOnlinePlayers()) {
                    if(!isMoving(p)) {
                        // El jugador ha dejado de moverse, activar evento de pérdida
                        // ...
                    }
                }
                startCheckingMovement();
            }
        }, CHECKING_INTERVAL);
    }
    

    CHECKING_INTERVAL es una constante para definir con qué frecuencia se debe ejecutar la comprobación de movimiento. De esta manera, se puede comprobar el movimiento con menos frecuencia, sin comprometer la precisión.

    ¡Espero que estas sugerencias le ayuden a resolver su problema!

Comments are closed.