【问题标题】:Why doesn't the "EntityDamageByEntityEvent" get activated?为什么“EntityDamageByEntityEvent”没有被激活?
【发布时间】:2019-06-06 20:35:54
【问题描述】:

所以,我正在尝试制作一个团队插件,其中每个团队都有一个 player1 和 player2。 现在我想使用 EntityDamageByEntityEvent 添加friendyfire,但是我的代码不起作用,或者事件没有被激活。我对插件很陌生,所以我的代码可能有点愚蠢。 顺便说一句,“teams2”是一个包含“Team”对象的 ArrayList,每个对象都包含 player1、player2 和 teamname。

这是函数:

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 函数。

【问题讨论】:

  • 是否正确输入了if 条件?可能是因为使用== 而不是.equals()

标签: java bukkit


【解决方案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 上方的一行非常重要。这也可能是您的活动不起作用的问题。

我查看了您的 Listener,它应该可以正常工作。我只是花时间把它收紧一点:

@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,所以如果你想尝试使用其他类名,你可能需要更改它我的代码。

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2013-04-03
    • 2019-08-26
    • 2020-09-01
    • 2011-06-24
    相关资源
    最近更新 更多