Помогите Как в ивенте указать другой ивент

В главном классе в самом начале объявил ArrayList:

public ArrayList<String> blooding_players = new ArrayList<>();

В главном классе, в методе onEnable() добавил эти строчки:

this.saveDefaultConfig();
this.blooding_players.addAll(this.getConfig().getStringList("blooding_players"));

В отдельном классе создал сами ивенты:

JavaScript:
    @EventHandler
    public static void onBlooding(EntityDamageEvent e) {
       
        if(!(e.getEntity() instanceof Player)) return;
       
        Player p = (Player) e.getEntity();
        Random r = new Random();
       
        if(r.nextInt(100) <= 50) {
            if(e.getCause().equals(DamageCause.ENTITY_ATTACK) && p.getLastDamageCause().getDamage() <= 5.0f) {
            MessageManager.getManager().msg(p, MsgType.INFORMATION, "Я получил серьезную рану и из нее течет кровь!");
           
            p.addPotionEffect(new PotionEffect(PotionEffectType.WITHER, Integer.MAX_VALUE, 1));
            }
        }
    }
   
    @EventHandler
    public void onMoveBlooding(PlayerMoveEvent e) {
       
        Player p = e.getPlayer();
       
        if(plugin.blooding_players.contains(e.getPlayer().getName())) {
           
            p.playEffect(p.getLocation(), Effect.HEART, 50);
        }
    }

В принципе все. Класс слушателя объявлял главному классу.

p.s не тот ивент скинул.
 
Последнее редактирование:
Так ты игроков в список не добавляешь.
В onBlooding добавь перед p.addPotionEffect
Java:
plugin.blooding_players.add(p.getName());
А когда игрок останавливает кровотечение, пиши
Java:
plugin.blooding_players.remove(p.getName());

public static void onBlooding(EntityDamageEvent e) {
...
 
Все равно блин не заносит, что в коде не так (

JavaScript:
@EventHandler
    public void onBlooding(EntityDamageEvent e) {
       
        if(!(e.getEntity() instanceof Player)) return;
       
        Player p = (Player) e.getEntity();
        Random r = new Random();
       
        if(r.nextInt(100) <= 50) {
            if(e.getCause().equals(DamageCause.ENTITY_ATTACK) && p.getLastDamageCause().getDamage() <= 5.0f) {
            MessageManager.getManager().msg(p, MsgType.INFORMATION, "Я получил серьезную рану и из нее течет кровь!");
           
            plugin.blooding_players.add(p.getName());
           
            p.addPotionEffect(new PotionEffect(PotionEffectType.WITHER, Integer.MAX_VALUE, 1));
            }
        }
    }
   
    @EventHandler
    public void onMoveBlooding(PlayerMoveEvent e) {
       
        Player p = e.getPlayer();
       
        if(plugin.blooding_players.contains(e.getPlayer().getName())) {
           
            p.playEffect(p.getLocation(), Effect.HEART, 50);
        }
    }

Просто строчка в конфиге появилась, а игроки не заносятся
 
Вот пример.
HashMap<Player, Boolean> effect = new HashMap<Player, Boolean>();
..............
effect.put(e.getPlayer(), true);
..............
effect.get(e.getPlayer());
..............
effect.remove(e.getPlayer());
 
Вот пример.
HashMap<Player, Boolean> effect = new HashMap<Player, Boolean>();
..............
effect.put(e.getPlayer(), true);
..............
effect.get(e.getPlayer());
..............
effect.remove(e.getPlayer());
А зачем тут хешмэп, если можно юзать ArrayList. Чем он лучше?
 
Соглашусь, но как мне его добавить? Ввел его в самое начало в мейн класс, назвал blooding_players.

В ивентах не знаю, какую строчку внести. Все строчки ругаются, что не могут вытянуть игрока, пытался вытянуть, но не вышло
 
Соглашусь, но как мне его добавить? Ввел его в самое начало в мейн класс, назвал blooding_players.

В ивентах не знаю, какую строчку внести. Все строчки ругаются, что не могут вытянуть игрока, пытался вытянуть, но не вышло
Если с использованием конструктора, то this.plugin.mapuser.get() и тп.
 
Вот так что ли? Я с хеш мэпом мало работал.
JavaScript:
    @EventHandler
    public void onBlooding(EntityDamageEvent e) {
       
        if(!(e.getEntity() instanceof Player)) return;
       
        Player p = (Player) e.getEntity();
        Random r = new Random();
        HashMap blooding_players = API.blooding_players;
       
        if(r.nextInt(100) <= 50) {
            if(e.getCause().equals(DamageCause.ENTITY_ATTACK) && p.getLastDamageCause().getDamage() <= 5.0f) {
            MessageManager.getManager().msg(p, MsgType.INFORMATION, "Я получил серьезную рану и из нее течет кровь!");
           
            this.plugin.blooding_players.get(p.getPlayer().getName());
           
            p.addPotionEffect(new PotionEffect(PotionEffectType.WITHER, Integer.MAX_VALUE, 1));
            }
        }
    }

Правильно я сделал?
 
Минимальное замечание 1: Random r = new Random(); можно разместить снаружи метода-обработчика, в теле содержащего класса, пометив private final. Не будет необходимости каждый раз создавать новый объект в памяти.
Минимальное замечание 2: Зачем тебе лишняя ссылка HashMap blooding_players = API.blooding_players;, её можно смело убрать. Они нигде ниже не используется.
Минимальное замечание 3: Random::nextInt(n) возвращает случайное число в пределах [0; n), поэтому, чтобы на множестве сравнений было 50:50, а не по факту 49:51, нужно делать сравнение "строго меньше" (... < 50).

Критическая ошибка 1: this.plugin.blooding_players.get(p.getPlayer().getName()); пытается получить из HashMap объект, которому соответствует ключ = имени игрока. Результат никуда не присваивается и игнорируется, строчка имеет абсолютно нулевое значение. Предполагаю, что ТС хотел всё-таки добавить игрока в карту, но ошибся, написав get вместо put (или add).

Ну я всё-таки склоняюсь к тому, чтобы хранить не имя игрока, а либо его uniqueId(), либо сам объект Player, но это всё-таки решение ТС-а.
 
Минимальное замечание 1: Random r = new Random(); можно разместить снаружи метода-обработчика, в теле содержащего класса, пометив private final. Не будет необходимости каждый раз создавать новый объект в памяти.
Минимальное замечание 2: Зачем тебе лишняя ссылка HashMap blooding_players = API.blooding_players;, её можно смело убрать. Они нигде ниже не используется.
Минимальное замечание 3: Random::nextInt(n) возвращает случайное число в пределах [0; n), поэтому, чтобы на множестве сравнений было 50:50, а не по факту 49:51, нужно делать сравнение "строго меньше" (... < 50).

Критическая ошибка 1: this.plugin.blooding_players.get(p.getPlayer().getName()); пытается получить из HashMap объект, которому соответствует ключ = имени игрока. Результат никуда не присваивается и игнорируется, строчка имеет абсолютно нулевое значение. Предполагаю, что ТС хотел всё-таки добавить игрока в карту, но ошибся, написав get вместо put (или add).

Ну я всё-таки склоняюсь к тому, чтобы хранить не имя игрока, а либо его uniqueId(), либо сам объект Player, но это всё-таки решение ТС-а.
Поправил недочеты, что надо внести во второй аргумент?
plugin.blooding_players.add(p.getPlayer().getName(), arg2);
Вроде бы получилось. Немного подумав и почитав книжку по джаву я понял, как делается.
JavaScript:
    @EventHandler
    public void onBlooding(EntityDamageEvent e) {
       
        if(!(e.getEntity() instanceof Player)) return;
       
        Player p = (Player) e.getEntity();
       
        if(r.nextInt(100) <= 50) {
            if(e.getCause().equals(DamageCause.ENTITY_ATTACK) && p.getLastDamageCause().getDamage() <= 5.0f) {
            MessageManager.getManager().msg(p, MsgType.INFORMATION, "Я получил серьезную рану и из нее течет кровь!");
           
            plugin.blooding_players.put(p, "blood");
           
            p.addPotionEffect(new PotionEffect(PotionEffectType.WITHER, Integer.MAX_VALUE, 1));
            }
        }
    }
   
    @EventHandler
    public void onMoveBlooding(PlayerMoveEvent e) {
       
        Player p = e.getPlayer();
       
        if(plugin.blooding_players.containsKey(p)) {
       
            plugin.blooding_players.get(p);
            p.playEffect(p.getLocation(), Effect.HEART, 50);
        }
    }

Кажется так, не знаю, но это работает.
 
Последнее редактирование:
Зачем опять get, если тебе не нужен результат?
И не забывай удалять игроков из карты через remove, когда они вылечиваются, если это у тебя предусмотрено.
Кстати, можно испольовать не хешмап, а хешсет, не надо думать, что в значение класть, а в остальном аналогично.

P.S. Тут много понятного текста.
https://habrahabr.ru/post/237043/
Для совсем про: https://habrahabr.ru/company/luxoft/blog/157273/
 
Назад
Верх