1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Kurumi, 20 июн 2019.

Статус темы:
Закрыта.
  1. Автор темы
    Kurumi

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

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

        public List<
    PotionEffectgetAllPotionsEffects()
        {
            
    ArrayList<PotionEffectpotions = 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(typedurationamplifier));
            }
            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:
        
    typeJUMP
        duration
    infinity
        amplifier
    10
      effectSlow
    :
        
    typeSLOW
        duration
    infinity
        amplifier
    10
    Ивент зарегистрировал. Он точно срабатывает, но эффект не накладывается =(
     
  2. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Длительность задаешь черт-знает-как. Тебе нужно сначала проверить, является ли секция с длительностью в конфиге int; если является - задаешь время из конфига; иначе Integer.MAX_VALUE.
     
  3. Автор темы
    Kurumi

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

    Баллы:
    76
    Возможно, так как описал ты будет более правилбным вариантом, но тем не менее, мой разве нерабочий? По сути так тоже должен пахать. Неужели трабл в этом?
     
  4. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Трабл в твоём коде. Нужно писать по-человечески - и не будет таких траблов.
    У тебя:
    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, чтобы в будущем не ложать с точками в путях ключей.
     
  5. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Мы же получим 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)))
     
  6. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ну, ты это ТСу объясни. Уверен, он хотел сделать именно так. Но ошибся и начал реплейсить в ключе, а не в значении из конфига )
    Сам я бы это совершенно иначе сделал.
     
    Последнее редактирование: 20 июн 2019
  7. Автор темы
    Kurumi

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

    Баллы:
    76
    Вроде допёр где я накосячил, чуть позже трайну, спасибо

    Меня сейчас хейтят за одну строчку кода или что?
    Если написал "пиши по-человечески", соизволь уж рассказать, как ты понимаешь это свое "по-человечески".
    Я здесь вижу одну косячную строку, которую можно отнести к говнокоду. Не более.
    Если всё остальное так плохо написано, будь добр, укажи на ошибки
     
  8. TheZefirrkka

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

    Баллы:
    76
    https://hastebin.com/rebacajago.java - EffectsManager.java
    https://hastebin.com/jopeleyece.java - JoinEvent.java
     
    Последнее редактирование: 20 июн 2019
  9. TheZefirrkka

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

    Баллы:
    76
    Тебя хейтят за весь код, он действительно не очень. За 2 года можно было бы и получше научиться.
     
    Последнее редактирование: 20 июн 2019
  10. LuckyZeeRo

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

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

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Не хейтит тебя никто. Как хочешь - так и пиши код. Только сам потом с ним будешь сексом заниматься. С моей стороны был лишь совет научиться писать нормальный код.
    Так я и написал, нет? Даже сказал, как конкретно это стоит исправить. И выше ещё коммент с конкретикой. По-человечески - это так, чтобы ты не путался в своём же коде ни через неделю, ни через год. Ну, и чтобы другим людям его тоже было удобно читать, в идеале.
    Ну, как знаешь, спорить не буду. Остальной код я не смотрел, ибо не интересно. Но судя по тем двум строкам, подозреваю, что там тоже весело. Опять же - мне от твоего кода ни тепло, ни холодно, я тебя не пытаюсь задеть или "захейтить". Просто ты тратишь своё время на поиск и решение проблем, которых можно было бы избежать.
     
  12. Автор темы
    Kurumi

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

    Баллы:
    76
    Всем большое спасибо)
    За критику тоже, я постараюсь учесть это в своих будущих работах =)
     
Статус темы:
Закрыта.

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