Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

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

Discussion in 'Разработка плагинов для новичков' started by jamesg101, Jun 28, 2016.

  1. 0x1EE7C0DE

    0x1EE7C0DE Участник Пользователь

    Trophy Points:
    36
    Как и где ты добавляешь игроков и как частицы создаёшь?
     
  2. Хостинг MineCraft
    <
  3. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    В главном классе в самом начале объявил ArrayList:

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

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

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

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

    Code:
        @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 не тот ивент скинул.
     
    Last edited: Jun 28, 2016
  4. 0x1EE7C0DE

    0x1EE7C0DE Участник Пользователь

    Trophy Points:
    36
    Так ты игроков в список не добавляешь.
    В onBlooding добавь перед p.addPotionEffect
    Code:
    plugin.blooding_players.add(p.getName());
    
    А когда игрок останавливает кровотечение, пиши
    Code:
    plugin.blooding_players.remove(p.getName());
    
    [DOUBLEPOST=1467141590,1467141276][/DOUBLEPOST]
    ...
     
  5. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    Все равно блин не заносит, что в коде не так (

    Code:
    @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);
            }
        }
    [DOUBLEPOST=1467142373,1467142060][/DOUBLEPOST]Просто строчка в конфиге появилась, а игроки не заносятся
     
  6. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    Эм...
     
  7. alexandrage

    alexandrage Администратор

    Trophy Points:
    173
    Skype:
    alexandr0116
    Вот пример.
    HashMap<Player, Boolean> effect = new HashMap<Player, Boolean>();
    ..............
    effect.put(e.getPlayer(), true);
    ..............
    effect.get(e.getPlayer());
    ..............
    effect.remove(e.getPlayer());
     
  8. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    А зачем тут хешмэп, если можно юзать ArrayList. Чем он лучше?
     
  9. alexandrage

    alexandrage Администратор

    Trophy Points:
    173
    Skype:
    alexandr0116
    В удобстве и тем что можно повесить на игрока не 1 эффект.
     
  10. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    Соглашусь, но как мне его добавить? Ввел его в самое начало в мейн класс, назвал blooding_players.

    В ивентах не знаю, какую строчку внести. Все строчки ругаются, что не могут вытянуть игрока, пытался вытянуть, но не вышло
     
  11. alexandrage

    alexandrage Администратор

    Trophy Points:
    173
    Skype:
    alexandr0116
    Если с использованием конструктора, то this.plugin.mapuser.get() и тп.
     
  12. Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    От греха подальше лучше хранить UUID игрока.
     
  13. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    Вот так что ли? Я с хеш мэпом мало работал.
    Code:
        @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));
                }
            }
        }
    [DOUBLEPOST=1467189604,1467175970][/DOUBLEPOST]Правильно я сделал?
     
  14. Reality_SC

    Reality_SC Старожил Пользователь

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    Минимальное замечание 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, но это всё-таки решение ТС-а.
     
  15. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    Поправил недочеты, что надо внести во второй аргумент?
    plugin.blooding_players.add(p.getPlayer().getName(), arg2);[DOUBLEPOST=1467201908,1467198884][/DOUBLEPOST]Вроде бы получилось. Немного подумав и почитав книжку по джаву я понял, как делается.
    Code:
        @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);
            }
        }
    Кажется так, не знаю, но это работает.
     
    Last edited: Jun 29, 2016
  16. Reality_SC

    Reality_SC Старожил Пользователь

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

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

Share This Page