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

Помогите Нужна помощь с добавлением эффекта

Тема в разделе "Разработка плагинов для новичков", создана пользователем TAB_mk, 4 май 2014.

  1. Автор темы
    TAB_mk

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

    Баллы:
    173
    Имя в Minecraft:
    TAB_mk
    Мне нужно сделать так что при команде /pot давался эффект который вписанный в конфиг.
    Помогите пожалуйста.
    Код:
        public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){
            if(cmd.getName().equalsIgnoreCase("pot"))
            {
        Player player = (Player) sender;
           
           Вот сюда
            
            }
            return false;
     
    BeLkA нравится это.
  2. Хостинг MineCraft
    <
  3. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Player player = (Player) sender;
    Забыли проверить тип.
     
    makssof нравится это.
  4. Автор темы
    TAB_mk

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

    Баллы:
    173
    Имя в Minecraft:
    TAB_mk
    А можно узнать как это сделать?
    Я просто первый день во всем этом.[DOUBLEPOST=1399216402,1399216174][/DOUBLEPOST]if(sender instanceof Player) {
    //....
    }
    Так?
     
    BeLkA нравится это.
  5. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Да.
     
    ПриветОтЛайки нравится это.
  6. Автор темы
    TAB_mk

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

    Баллы:
    173
    Имя в Minecraft:
    TAB_mk
    Код:
    player.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.HEALTH_BOOST, 1200, 1));
    Вот что я нашел, а теперь вопрос как сделать так чтоб эффект нужно было писать в конфиге.
    Нашел вот что но не пойму как их соеденить
    Код:
    (this.getConfig().getString("message", "Test"))
     
    BeLkA нравится это.
  7. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    У enum'ов есть метод valueOf(). Можно передавать туда параметр, получаемый из конфига. Ну или использовать простой switch ... case.
     
  8. Автор темы
    TAB_mk

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

    Баллы:
    173
    Имя в Minecraft:
    TAB_mk
    А что с чем делать? Пытался что-то найди и сам пробовал, вообще ничего не понял.
     
    BeLkA нравится это.
  9. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Смотри, дело все в том что тип эффекта - ENUM. Это перечислительный тип и в конфиг ты его не запишешь
    Варианта у тебя 3:
    1) Пишем в конфиг название типа, например HEALTH_BOOST и затем получаем тип как уже и сказали через valueOf()
    Пример:
    Код:
    String effectName = this.getConfig().getString("Test");
    player.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.valueOf(effectName, 1200, 1));
    
    Так же я думаю стоит добавить проверку на то что такой эффект существует.
    Это будет самый простой и правильный вариант.
    2) Так же можно использовать не название Enum'a а его "номер" который можно получить при помощи метода ordinal(), но как по мне это минус к юзерфрендли, и вообще в этом мало смысла.

    И способ 3
    Можно, но смысла мало и он довольно индусский, хотя в определенных ситуациях может пригодится
    Используем switch()
    Пример:
    Код:
    String effectName = this.getConfig().getString("Test");
    switch(effectName)
    {
             case "Health_boost":
             player.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.HEALTH_BOOST, 1200, 1));
             break;
            case "Fire_Resistance":
             player.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE, 1200, 1));
             break;
             default:
             player.sendMessage(ChatColor.RED + "Неизвестный эффект");
             break;
    }
    
    К плюсам способа 3 стоит добавить что ты можешь использовать не только стандартные эффекты, а допустим делать команды которые будут давать сразу несколько эффектов да и вообще производить любые действия.

    Про Enum подробнее почитать тут

    Желаю удачи.
     
    Gentalion и serega6531 нравится это.
  10. Автор темы
    TAB_mk

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

    Баллы:
    173
    Имя в Minecraft:
    TAB_mk
    Так?
    Код:
        public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){
            if(cmd.getName().equalsIgnoreCase("pot"))
            { 
        Player player = (Player) sender;
        if(sender instanceof Player) {
            String effectName = this.getConfig().getString("effect");
            switch(effectName)
            {
                    case "1":
                    player.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 1200, 1));
                    break;
                    case "Fire_Resistance":
                        player.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE, 1200, 1));
                        break;
                        default:
                        player.sendMessage(ChatColor.RED + "Неизвестный эффект");
                        break;
            }
           
               
            }
            return false;
        }
    {
    
    }
    return false;
        }
    }
    
     
    BeLkA нравится это.
  11. makssof

    makssof Старожил Девелопер Пользователь

    Баллы:
    103
    Skype:
    makssofez
    Никто не гарантирует что в конфиге будет реально зелье, а не предположим "OloloZel'ece"
     
  12. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
     
  13. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Не в первый раз повторюсь, что не стоит опираться на номера енумов.
    Java не гарантирует того, что каждому енуму будет соответствовать определенный номер. Если в Bukkit API произойдут изменения, или же разработчики станут использовать другой компилятор, номера могут сдвинуться.

    Берите его с помощью Enum.valueOf(java.lang.Class, java.lang.String) в блоке try, перехватывая при этом IllegalArgumentException и NullPointerException
    Можно так:
    Код:
    String effectName = getConfig().getString("Test");
    PotionEffectType effectType = null;
    try{
        effectType = PotionEffectType.getByName(effectName);
        /* тут добавляем эффект игроку */
    } catch (IllegalArgumentException e) {
        sender.sendMessage("Нет такого эффекта: "+effectName);
    } catch (NullPointerException e) {
        sender.sendMessage("Вы не указали тип эффекта в конфиге");
    }
    
    а используя switch по String вы отказываетесь от работы плагина на Java 6 и старше.

    PS: забыл о методе getByName. Он безопасен относительно IllegalArgumentException, а также не учитывает регистр.
     
  14. makssof

    makssof Старожил Девелопер Пользователь

    Баллы:
    103
    Skype:
    makssofez
    Я так, мельком глянул, не вникая, и не заметил, что это уже написано)
     
  15. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Switch по String отлично работает как на 6, так и на 7 Java
    А вот getByName действительно правильная хорошая штука.
     

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