(Решено)Не накладываются potion effects

  • Автор темы Автор темы Kurumi
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Kurumi

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Kurumi
Всем привет. Написал простенький плагин на выдачу potion effects из конфига при входе в игру, но ничего не выдается =(
Попробовал даже проверить через выведение сообщения, что эффект действительно есть в списке, сообщение выводится, а вот сам эффект не накладывается =(
PHP:
    public void addAllPotionsToPlayer(Player player)
    {
        for(PotionEffect pe : getAllPotionsEffects())
        {
            player.addPotionEffect(pe);
            Bukkit.broadcastMessage(pe.getType().getName());
        }
    }

    public List<PotionEffect> getAllPotionsEffects()
    {
        ArrayList<PotionEffect> potions = new ArrayList<>();
        for(String potion : Main.getInstance().getConfig().getConfigurationSection("Effects").getKeys(false))
        {
            PotionEffectType type = PotionEffectType.getByName(Main.getInstance().getConfig().getString("Effects."+potion+".type"));
            int duration = Main.getInstance().getConfig().getInt("Effects."+potion+".duration".replace("infinity", String.valueOf(Integer.MAX_VALUE)));
            int amplifier = Main.getInstance().getConfig().getInt("Effects."+potion+".amplifier");
            potions.add(new PotionEffect(type, duration, amplifier));
        }
        return  potions;
    }
PHP:
 @EventHandler
    public void onJoin(PlayerJoinEvent event)
    {
        Player player = event.getPlayer();
        if(!player.hasPermission("joineffects.effects")) return;
      Bukkit.getScheduler().runTaskLater(Main.getInstance(), () -> Main.getInstance().getEffectsManager().addAllPotionsToPlayer(player), 20L);
    }
PHP:
Effects:
  effectJump:
    type: JUMP
    duration: infinity
    amplifier: 10
  effectSlow:
    type: SLOW
    duration: infinity
    amplifier: 10
Ивент зарегистрировал. Он точно срабатывает, но эффект не накладывается =(
 
Длительность задаешь черт-знает-как. Тебе нужно сначала проверить, является ли секция с длительностью в конфиге int; если является - задаешь время из конфига; иначе Integer.MAX_VALUE.
 
Длительность задаешь черт-знает-как. Тебе нужно сначала проверить, является ли секция с длительностью в конфиге int; если является - задаешь время из конфига; иначе Integer.MAX_VALUE.
Возможно, так как описал ты будет более правилбным вариантом, но тем не менее, мой разве нерабочий? По сути так тоже должен пахать. Неужели трабл в этом?
 
Возможно, так как описал ты будет более правилбным вариантом, но тем не менее, мой разве нерабочий? По сути так тоже должен пахать. Неужели трабл в этом?
Трабл в твоём коде. Нужно писать по-человечески - и не будет таких траблов.
У тебя:
int duration = Main.getInstance().getConfig().getInt("Effects."+potion+".duration".replace("infinity", String.valueOf(Integer.MAX_VALUE)));
А ты хотел сделать так:
int duration = Main.getInstance().getConfig().getInt("Effects."+potion+".duration").replace("infinity", String.valueOf(Integer.MAX_VALUE));
Но даже это работать не будет, потому что ты с числом работаешь, а не со строкой.
Короче код - полная дичь. Преписывай.
Сделай, как посоветовал человек выше, можешь ещё переписать всё на ConfigurationSection, чтобы в будущем не ложать с точками в путях ключей.
 
int duration = Main.getInstance().getConfig().getInt("Effects."+potion+".duration").replace("infinity", String.valueOf(Integer.MAX_VALUE));
Мы же получим int - там не получится replace использовать. Тогда уж что-то вроде
Код:
int duration = Integer.valueOf(Main.getInstance().getConfig().getString("Effects."+potion+".duration").replace("infinity", String.valueOf(Integer.MAX_VALUE))));
Но это как-то упорото.

Возможно, так как описал ты будет более правилбным вариантом, но тем не менее, мой разве нерабочий? По сути так тоже должен пахать. Неужели трабл в этом?
Ты пытаешься заменить "infinity" только из строки ".duration"
Код:
".duration".replace("infinity", String.valueOf(Integer.MAX_VALUE))
К тому же здесь ты ещё не получаешь нужное тебе значение из конфига, а только начинаешь получать его
Код:
getConfig().getInt("Effects."+potion+".duration".replace("infinity", String.valueOf(Integer.MAX_VALUE)))
 
Мы же получим int - там не получится replace использовать. Тогда уж что-то вроде
Код:
int duration = Integer.valueOf(Main.getInstance().getConfig().getString("Effects."+potion+".duration").replace("infinity", String.valueOf(Integer.MAX_VALUE))));
Но это как-то упорото.
Ну, ты это ТСу объясни. Уверен, он хотел сделать именно так. Но ошибся и начал реплейсить в ключе, а не в значении из конфига )
Сам я бы это совершенно иначе сделал.
 
Последнее редактирование:
Мы же получим int - там не получится replace использовать. Тогда уж что-то вроде
Код:
int duration = Integer.valueOf(Main.getInstance().getConfig().getString("Effects."+potion+".duration").replace("infinity", String.valueOf(Integer.MAX_VALUE))));
Но это как-то упорото.


Ты пытаешься заменить "infinity" только из строки ".duration"
Код:
".duration".replace("infinity", String.valueOf(Integer.MAX_VALUE))
К тому же здесь ты ещё не получаешь нужное тебе значение из конфига, а только начинаешь получать его
Код:
getConfig().getInt("Effects."+potion+".duration".replace("infinity", String.valueOf(Integer.MAX_VALUE)))
Вроде допёр где я накосячил, чуть позже трайну, спасибо

Трабл в твоём коде. Нужно писать по-человечески - и не будет таких траблов.
У тебя:
int duration = Main.getInstance().getConfig().getInt("Effects."+potion+".duration".replace("infinity", String.valueOf(Integer.MAX_VALUE)));
А ты хотел сделать так:
int duration = Main.getInstance().getConfig().getInt("Effects."+potion+".duration").replace("infinity", String.valueOf(Integer.MAX_VALUE));
Но даже это работать не будет, потому что ты с числом работаешь, а не со строкой.
Короче код - полная дичь. Преписывай.
Сделай, как посоветовал человек выше, можешь ещё переписать всё на ConfigurationSection, чтобы в будущем не ложать с точками в путях ключей.
Меня сейчас хейтят за одну строчку кода или что?
Если написал "пиши по-человечески", соизволь уж рассказать, как ты понимаешь это свое "по-человечески".
Я здесь вижу одну косячную строку, которую можно отнести к говнокоду. Не более.
Если всё остальное так плохо написано, будь добр, укажи на ошибки
 
Вроде допёр где я накосячил, чуть позже трайну, спасибо


Меня сейчас хейтят за одну строчку кода или что?
Если написал "пиши по-человечески", соизволь уж рассказать, как ты понимаешь это свое "по-человечески".
Я здесь вижу одну косячную строку, которую можно отнести к говнокоду. Не более.
Если всё остальное так плохо написано, будь добр, укажи на ошибки
https://hastebin.com/rebacajago.java - EffectsManager.java
https://hastebin.com/jopeleyece.java - JoinEvent.java
 
Последнее редактирование:
Вроде допёр где я накосячил, чуть позже трайну, спасибо


Меня сейчас хейтят за одну строчку кода или что?
Если написал "пиши по-человечески", соизволь уж рассказать, как ты понимаешь это свое "по-человечески".
Я здесь вижу одну косячную строку, которую можно отнести к говнокоду. Не более.
Если всё остальное так плохо написано, будь добр, укажи на ошибки
Тебя хейтят за весь код, он действительно не очень. За 2 года можно было бы и получше научиться.
 
Последнее редактирование:
Меня сейчас хейтят за одну строчку кода или что?
Если написал "пиши по-человечески", соизволь уж рассказать, как ты понимаешь это свое "по-человечески".
Я здесь вижу одну косячную строку, которую можно отнести к говнокоду. Не более.
Если всё остальное так плохо написано, будь добр, укажи на ошибки
Как минимум следущее бросается в глаза:
1. Сишный стиль скобок, нет отступов там где надо и т.д., ужасный стиль в целом. Ничего плохого нет до тех пор, пока это не придется читать кому то другому кроме тебя. Да и если зайти слишком далеко, самому будет тяжело. Вот здесь базовые правила, ознакомся:
https://www.oracle.com/technetwork/java/codeconvtoc-136057.html
А еще и в IntelliJ IDEA и в Eclipse есть возможность форматировать код.
Почаще юзай и учись на их примере.
2. Main.getInstance() - не лучший способ, используй передачу инстанса в конструкторы других классов при onEnable(). Не используй статики там, где они не являются необходимыми.
3. Ты очень часто повторяешь одни и те же операции (напр. Main.getInstance().getConfig()). Вынось это в новые переменные, не делай "кучи". Делай код понятнее и чище.
4. Ты выкатываешь параметры конфига каждый раз когда они нужны. Очень неэффективный вариант. Сохраняй в переменные при чтении конфига один раз, не делай "запрос" в конфиге каждый раз.
 
Меня сейчас хейтят за одну строчку кода или что?
Не хейтит тебя никто. Как хочешь - так и пиши код. Только сам потом с ним будешь сексом заниматься. С моей стороны был лишь совет научиться писать нормальный код.
Если написал "пиши по-человечески", соизволь уж рассказать, как ты понимаешь это свое "по-человечески".
Так я и написал, нет? Даже сказал, как конкретно это стоит исправить. И выше ещё коммент с конкретикой. По-человечески - это так, чтобы ты не путался в своём же коде ни через неделю, ни через год. Ну, и чтобы другим людям его тоже было удобно читать, в идеале.
Я здесь вижу одну косячную строку, которую можно отнести к говнокоду. Не более.
Если всё остальное так плохо написано, будь добр, укажи на ошибки
Ну, как знаешь, спорить не буду. Остальной код я не смотрел, ибо не интересно. Но судя по тем двум строкам, подозреваю, что там тоже весело. Опять же - мне от твоего кода ни тепло, ни холодно, я тебя не пытаюсь задеть или "захейтить". Просто ты тратишь своё время на поиск и решение проблем, которых можно было бы избежать.
 
Всем большое спасибо)
За критику тоже, я постараюсь учесть это в своих будущих работах =)
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх