为什么未激活“ EntityDamageByEntityEvent”?

时间:2019-06-05 18:57:25

标签: java bukkit

因此,我正在尝试制作一个球队插件,其中每个球队都有一个player1和player2。 现在,我想使用EntityDamageByEntityEvent添加Friendyfire,但是我的代码不起作用,或者事件未激活。我是Plugins的新手,所以我的代码可能有点愚蠢。 顺便说一句,“ teams2”是一个包含“ Team”对象的ArrayList,每个对象都包含player1,player2和组名。

这是功能:

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);
                    }
                }
            }
        }
    }

它应该取消该事件,以使同一团队的玩家无法互相攻击,但事实并非如此。为什么?您还可以建议其他方法来创建FriendlyFire函数。

1 个答案:

答案 0 :(得分:1)

由于您没有发布整个源代码,所以我将首先提出一个简单的问题,即许多不熟悉Bukkit编程的人做错了(甚至在我身上有时发生过):您是否注册了事件?

public class YourPlugin extends JavaPlugin {

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

}

listener是您的Listener类的实例。因此,如果您有此代码,并在MainClass的问题中发布了该代码,则该代码应如下所示:

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
    }

}

如果您有一个单独的类,它应该像这样:

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
    }

}

@EventHandler放在EntityDamageByEntntyEvent上方一行非常重要。这也可能是您的活动不起作用的原因。

我通过您的侦听器查看,它应该可以正常工作。我只是花些时间将其收紧:

@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);
        }
    }
}

我不知道teams2中存储了什么类,但是我大胆地猜测它将是Team,因此如果您采用其他一些类名,则可能需要更改它喜欢尝试我的代码。