Помогите Проблема с проверкой по всем игрокам

Статус
Закрыто для дальнейших ответов.

RIPEX

Новичок
Пользователь
Баллы
6
Имя в Minecraft
RIPEX_RU
Создаю плагин для своего сервера, суть плагина в том что если игрок находится под дождем, то он получает урон и эффекты. И сначала все работало, но я решил добавить шлем, который будет защищать от дождя (Пока что наоборот, урон проходит только в нем, но это для теста). Проблема в том, что урон проходит только если первый игрок зашедший на сервер одевает шлем, а второй уже как будто зависит от него. То есть если первый игрок наденет шлем, тогда будет идти проверка на второго игрока. Если же у первого игрока шлема нет, проверка по второму не проходит. Однако если убрать фишку с защитой то сам дождь будет дамажить всех игроков по отдельности. То есть проблема появилась только с добавлением этого шлема. Буду рад помощи, так как я впервые занимаюсь написанием плагинов. Заранее спасибо)

Код:
            public void run() {
                if(w.hasStorm() == true) {
                    boolean bool = false;
                    
                    double maxHeight = w.getMaxHeight();
                    
                    for(Player player: Bukkit.getOnlinePlayers()) {
                        
                        ItemStack curHelm = player.getEquipment().getHelmet();
                        
                        double x = player.getLocation().getX();
                        double z = player.getLocation().getZ();
                        double blockUp = player.getLocation().getY() + 2;
                        double difference = maxHeight - blockUp;
                        
                        World w = player.getWorld();
                        
                        for (int i2 =0; i2<difference; i2++) {
                            Location l;
                            Block b = w.getBlockAt(l = new Location (w, x, blockUp + i2, z));
                            if (b.getType().isAir()) {
                                bool = false;
                            }
                            else {
                                bool = true;
                                break;
                            }
                        }
                        if (bool == false && curHelm.getItemMeta().getLore().equals(helmet.getItemMeta().getLore())) {
                            player.sendMessage(player.getName());
                            player.sendMessage(String.valueOf(x));
                            player.sendMessage(String.valueOf(curHelm));
                            player.sendMessage("Урон");
                            player.damage(2);
                            player.addPotionEffect(poison);
                            player.addPotionEffect(blind);
                        }
                    }   
                }
            }
 
curHelm.getItemMeta().getLore().equals(helmet.getItemMeta().getLore())
Ват?
Мне больно было на это смотреть, по этому попытался немного укоротить, хз как будет работать.
Код:
    public void run() {
        if (!w.hasStorm()) return;
       
        for(Player player: Bukkit.getOnlinePlayers()) {
            Location loc = player.getLocation();
            if (player.getWorld().getHighestBlockAt(loc).getY() > loc.getY()) return; // Если самый верхний блок выше игрока
            String lore = "Текст";
            if (!player.getEquipment().getHelmet().getItemMeta().getLore().equals(lore)) return; // Если описание шлема не совпадает
            // Делаешь свои грязные дела
            player.sendMessage(player.getName());
            player.sendMessage(String.valueOf(x));
            player.sendMessage(String.valueOf(curHelm));
            player.sendMessage("Урон");
            player.damage(2);
            player.addPotionEffect(poison);
            player.addPotionEffect(blind);
        }  
    }
}
 
Ват?
Мне больно было на это смотреть, по этому попытался немного укоротить, хз как будет работать.
Код:
    public void run() {
        if (!w.hasStorm()) return;
      
        for(Player player: Bukkit.getOnlinePlayers()) {
            Location loc = player.getLocation();
            if (player.getWorld().getHighestBlockAt(loc).getY() > loc.getY()) return; // Если самый верхний блок выше игрока
            String lore = "Текст";
            if (!player.getEquipment().getHelmet().getItemMeta().getLore().equals(lore)) return; // Если описание шлема не совпадает
            // Делаешь свои грязные дела
            player.sendMessage(player.getName());
            player.sendMessage(String.valueOf(x));
            player.sendMessage(String.valueOf(curHelm));
            player.sendMessage("Урон");
            player.damage(2);
            player.addPotionEffect(poison);
            player.addPotionEffect(blind);
        } 
    }
}
*continue покинул чат*
 
PHP:
public void run() {
    for (Player p : Bukkit.getOnlinePlayers()) {
        if (!p.getWorld().hasStorm())
            continue;
        if (p.getWorld().getHighestBlockAt(p.getLocation()).getY() > p.getLocation().getY())
            continue;
        if (p.getInventory().getHelmet() != null)
            if (p.getInventory().getHelmet().isSimilar(helmet()))
                continue;
        p.sendMessage("Damage");
        p.damage(2);
    }
}
 
Последнее редактирование:
PHP:
public void run() {
    for (Player p : Bukkit.getOnlinePlayers()) {
        if (!p.getWorld().hasStorm())
            continue;
        if (p.getWorld().getHighestBlockAt(p.getLocation()).getY() > p.getLocation().getY())
            continue;
        if (p.getInventory().getHelmet() != null)
            if (p.getInventory().getHelmet().isSimilar(helmet()))
                continue;
        p.sendMessage("Damage");
        p.damage(2);
    }
}
Спасибо огромное) Попытаюсь сегодня разобраться. И если не сложно у меня буквально пара вопросов. Чем отличается GetInventory от GetEquipment? Почему isSimilar, а не equals? И почему сначала идет проверка на то есть ли шлем, а потом уже сравнение?
 
Спасибо огромное) Попытаюсь сегодня разобраться. И если не сложно у меня буквально пара вопросов. Чем отличается GetInventory от GetEquipment? Почему isSimilar, а не equals? И почему сначала идет проверка на то есть ли шлем, а потом уже сравнение?
isSimilar игнорит кол-во предметов в слоте, в отличии от equals
 
И почему сначала идет проверка на то есть ли шлем, а потом уже сравнение
Потому что getHelmet может оказаться null (см. javadoc PlayerInventory#getHelmet)
Чем отличается GetInventory от GetEquipment?
Тем, что возвращает разные инвентари (getInventory - PlayerInventory, getEquipment - EntityEquipment)
 
Последнее редактирование:
Тема решена? Если да - поставь метку "решено" и закрой тему.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх