1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем RIPEX, 13 янв 2021.

Метки:
Статус темы:
Закрыта.
  1. Автор темы
    RIPEX

    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);
                            }
                        }   
                    }
                }
     
  2. HauserGrim

    HauserGrim Активный участник Пользователь

    Баллы:
    96
    Ват?
    Мне больно было на это смотреть, по этому попытался немного укоротить, хз как будет работать.
    Код:
        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);
            }  
        }
    }
    
     
  3. LOVEC3327

    LOVEC3327 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    LOVEC3327
    *continue покинул чат*
     
  4. LOVEC3327

    LOVEC3327 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    LOVEC3327
    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);
        }
    }
     
    Последнее редактирование: 13 янв 2021
  5. Автор темы
    RIPEX

    RIPEX Новичок Пользователь

    Баллы:
    6
    Имя в Minecraft:
    RIPEX_RU
    Спасибо огромное) Попытаюсь сегодня разобраться. И если не сложно у меня буквально пара вопросов. Чем отличается GetInventory от GetEquipment? Почему isSimilar, а не equals? И почему сначала идет проверка на то есть ли шлем, а потом уже сравнение?
     
  6. _MRDen3000YT_

    _MRDen3000YT_ Активный участник Пользователь

    Баллы:
    76
    isSimilar игнорит кол-во предметов в слоте, в отличии от equals
     
  7. Автор темы
    RIPEX

    RIPEX Новичок Пользователь

    Баллы:
    6
    Имя в Minecraft:
    RIPEX_RU
    Ааааааааа понял, спасибо)
     
  8. LOVEC3327

    LOVEC3327 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    LOVEC3327
    Потому что getHelmet может оказаться null (см. javadoc PlayerInventory#getHelmet)
    Тем, что возвращает разные инвентари (getInventory - PlayerInventory, getEquipment - EntityEquipment)
     
    Последнее редактирование: 13 янв 2021
  9. Автор темы
    RIPEX

    RIPEX Новичок Пользователь

    Баллы:
    6
    Имя в Minecraft:
    RIPEX_RU
    Спасибо, ты просто боженька. Все работает
     
  10. _MRDen3000YT_

    _MRDen3000YT_ Активный участник Пользователь

    Баллы:
    76
    Тема решена? Если да - поставь метку "решено" и закрой тему.
     
Статус темы:
Закрыта.

Поделиться этой страницей