Почему «EntityDamageByEntityEvent» не активируется? - PullRequest
3 голосов
/ 05 июня 2019

Итак, я пытаюсь создать плагин для команд, в котором в каждой команде есть игрок1 и игрок2.Теперь я хотел добавить Friendyfire, используя EntityDamageByEntityEvent, но либо мой код не работает, либо событие не активируется.Я довольно новичок в плагинах, так что мой код немного глуп.Кстати, "groups2" это ArrayList с объектами "Team" в нем, каждый из которых содержит 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 Ответ

1 голос
/ 06 июня 2019

Так как вы не опубликовали весь свой исходный код, я начну с одного простого вопроса, что многие люди, плохо знакомые с программированием на Bukkit, ошибаются (даже случается со мной несколько раз): вы регистрировали свои события?

public class YourPlugin extends JavaPlugin {

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

}

listener - это экземпляр вашего класса Listener.Так что, если у вас есть этот код, который вы разместили в своем вопросе в главном классе, он должен выглядеть так:

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, так что вы могли бы иметьизменить это, если вы взяли какое-то другое имя класса, как вы хотели бы попробовать мой код.

...