¿Por qué el "EntityDamageByEntityEvent" se activan?

ARIIX:

Por lo tanto, yo estoy tratando de hacer un plugin de equipos, donde cada equipo tiene una jugador1 y jugador2. Ahora quería añadir friendyfire utilizando el EntityDamageByEntityEvent, pero o mi código no funciona, o el evento no se activan. Soy bastante nuevo en plugins, por lo que podría ser que mi código es un poco estúpida. Por cierto, "teams2" es un ArrayList con objetos "equipo" en él, cada uno contiene jugador1, jugador2 y la teamname.

Esta es la función:

public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {

        if (((event.getEntity() instanceof Player)) && ((event.getDamager() instanceof Player))) {
            Player player = (Player)event.getEntity();
            Player damager = (Player)event.getDamager();
            for(int i = 0; i < teams2.size(); i++){
                if((teams2.get(i).player1 == player || teams2.get(i).player2 == player) && (teams2.get(i).player1 == damager || teams2.get(i).player2 == damager)){
                    event.setCancelled(true);
                }
            }
        }
        else if (((event.getEntity() instanceof Arrow)) && ((event.getDamager() instanceof Player))) {
            Entity arrow = event.getEntity();
            if ((((Projectile)arrow).getShooter() instanceof Player)) {
                Player player = (Player)arrow;
                Player damager = (Player)event.getDamager();
                for(int i = 0; i < teams2.size(); i++){
                    if((teams2.get(i).player1 == player || teams2.get(i).player2 == player) && (teams2.get(i).player1 == damager || teams2.get(i).player2 == damager)){
                        event.setCancelled(true);
                    }
                }
            }
        }
    }

Se debe cancelar el evento, por lo que los jugadores del mismo equipo no pueden atacar a los demás, pero eso no es el caso. ¿Por qué? También puede sugerir otras maneras de crear una función FriendlyFire.

Nicola Uetz:

Puesto que no publique toda su código fuente Voy a comenzar con una simple pregunta que muchas personas nuevas a la programación Bukkit consiguen mal hecho (incluso me sucede algunas veces): ¿Te has registrado tus eventos?

public class YourPlugin extends JavaPlugin {

    @Override
    public void onEnable() {
        super.onEnable();
        Bukkit.getServer().getPluginManager().registerEvents(listener, this);
    }

}

listeneres una instancia de la clase de escucha. Así que si usted tiene este código que envió en su pregunta en sus MainClass que debería tener este aspecto:

public class YourPlugin extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        super.onEnable();
        Bukkit.getServer().getPluginManager().registerEvents(this, this);
    }

    @EventHandler
    public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
        //your event
    }

}

y si usted tiene una clase separada que debe tener este aspecto:

public class YourPlugin extends JavaPlugin {

    @Override
    public void onEnable() {
        super.onEnable();
        Bukkit.getServer().getPluginManager().registerEvents(new YourListener(), this);
    }

}
public class YourListener implements Listener {

    @EventHandler
    public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
        //your event
    }

}

Es muy importante que usted pone este @EventHandleruna línea por encima de su EntityDamageByEntntyEvent. Esto también podría ser un problema por las que su caso no funciona.

Miré a través de su oyente y debería funcionar totalmente bien. Me tomó el tiempo para apretarlo un poco:

@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent e) {
    if (!(e.getEntity() instanceof Player)) return;
    Player player = (Player) e.getEntity();
    Player damager;
    if (e.getDamager() instanceof Arrow) {
        Arrow a = (Arrow) e.getDamager();
        if (!(a.getShooter() instanceof Player)) return;
        damager = (Player) a.getShooter();
    } else {
        if (!(e.getDamager() instanceof Player)) return;
        damager = (Player) e.getDamager();
    }
    for (Team t : teams2) {
        if ((t.player1 == player || t.player2 == player) && (t.player1 == damager || t.player2 == damager)) {
            e.setCancelled(true);
        }
    }
}

No sé qué clase se almacena en teams2pero me tomó una suposición sería Teamlo que podría tener el cambio que si se toma alguna otra clase y nombre que le gustaría probar mi código.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=214253&siteId=1
Recomendado
Clasificación