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

  • Автор темы Автор темы 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;
 
Player player = (Player) sender;
Забыли проверить тип.
 
Код:
player.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.HEALTH_BOOST, 1200, 1));
Вот что я нашел, а теперь вопрос как сделать так чтоб эффект нужно было писать в конфиге.
Нашел вот что но не пойму как их соеденить
Код:
(this.getConfig().getString("message", "Test"))
 
player.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.HEALTH_BOOST, 1200, 1));
Вот что я нашел, а теперь вопрос как сделать так чтоб эффект нужно было писать в конфиге.
Нашел вот что но не пойму как их соеденить
(this.getConfig().getString("message", "Test"))
У enum'ов есть метод valueOf(). Можно передавать туда параметр, получаемый из конфига. Ну или использовать простой switch ... case.
 
У enum'ов есть метод valueOf(). Можно передавать туда параметр, получаемый из конфига. Ну или использовать простой switch ... case.
А что с чем делать? Пытался что-то найди и сам пробовал, вообще ничего не понял.
 
А что с чем делать? Пытался что-то найди и сам пробовал, вообще ничего не понял.
Смотри, дело все в том что тип эффекта - 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 подробнее почитать тут

Желаю удачи.
 
Смотри, дело все в том что тип эффекта - 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 подробнее почитать тут

Желаю удачи.
Так?
Код:
    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;
    }
}
 
У enum'ов есть метод valueOf(). Можно передавать туда параметр, получаемый из конфига. Ну или использовать простой switch ... case.
Никто не гарантирует что в конфиге будет реально зелье, а не предположим "OloloZel'ece"
 
Никто не гарантирует что в конфиге будет реально зелье, а не предположим "OloloZel'ece"
Так же я думаю стоит добавить проверку на то что такой эффект существует.
Это будет самый простой и правильный вариант.
 
Не в первый раз повторюсь, что не стоит опираться на номера енумов.
Java не гарантирует того, что каждому енуму будет соответствовать определенный номер. Если в Bukkit API произойдут изменения, или же разработчики станут использовать другой компилятор, номера могут сдвинуться.

Берите его с помощью Enum.valueOf(java.lang.Class, java.lang.String) в блоке try, перехватывая при этом IllegalArgumentException и NullPointerException
Можно так:
Java:
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, а также не учитывает регистр.
 
Я так, мельком глянул, не вникая, и не заметил, что это уже написано)
 
а используя switch по String вы отказываетесь от работы плагина на Java 6 и старше.

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

Switch по String отлично работает как на 6, так и на 7 Java
А вот getByName действительно правильная хорошая штука.
 
Назад
Верх