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

Помогите Пропадают эффекты

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

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

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

    Баллы:
    76
    Мне нужно было сделать так, чтобы если у игрока есть специальный нагрудник, ему давалис эффекты. Реализовал я это путем добавления метода. Я сделал метод, в котором проверяю есть ли у игрока нагрудник и если есть, ему даются какие-то эффекты. Потом чтобы эти эффекты давались игроку я этот метод вписал в разные эвенты (эвенты: BlockPlace, BlockBreak, InventoryClick, MoveEvent, JoinEvent). Все работает, когда игрок попадает в какой-либо их этих эвентов, срабатывает мой метод. Но я заметил такую ошибку - если игрок в нагруднике ему даются эффекты и если он пьет какое-нибудь зелье с эффектом, оно сбивается эффектом брони. Как это можно пофиксить?
     
  2. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Ну так асинхронный Runnable раз на n секунд который проверяет есть ли в игроков нагрудник и даёт эффект, зачем костыли с кучей эвентов?
    Ну и давай код этого метода где ты эффект даёшь.
     
  3. Автор темы
    Kurumi

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

    Баллы:
    76
    PHP:
     public void AddEffect()
        {
            final 
    ItemStack helm this.player.getEquipment().getHelmet();
            final 
    ItemStack legs this.player.getEquipment().getLeggings();
            final 
    ItemStack boot this.player.getEquipment().getBoots();
            final 
    ItemStack chest this.player.getEquipment().getChestplate();
            if (
    helm != null && legs != null && boot != null && chest != null)
            {
                for(
    String s plugin.getConfig().getConfigurationSection("Sets").getKeys(false))
                {
                if (
    helm.getTypeId() == this.plugin.getConfig().getInt("Sets."+s+".helmet") && legs.getTypeId() == this.plugin.getConfig().getInt("Sets."+s".leggings") && boot.getTypeId() == this.plugin.getConfig().getInt("Sets."+s+".boots") && chest.getTypeId() == this.plugin.getConfig().getInt("Sets."+s+".chestplate"))
                {
                    for (final 
    String a3 this.plugin.getConfig().getStringList("Sets."+s+".effects"))
                    {
                        final 
    String[] a4 a3.split(" ");
                        
    this.player.addPotionEffect(new PotionEffect(PotionEffectType.getByName(a4[0]), 120Integer.parseInt(a4[1])), true);
                    }
                }
                }
            }
    В этом коде нужен фулл сет с id из конфига. С нагрудником был пример
     
  4. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Зелье любое сбрасывается или только то что даёт нагрудник? Например нагрудник даёт скорость, и если игрок выпил регенерацию её сбрасывает?
     
  5. Автор темы
    Kurumi

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

    Баллы:
    76
    любое сбрасывается
     
  6. Автор темы
    Kurumi

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

    Баллы:
    76
    Хотя нет, я напутал. ПРоверил - там то что дает сет, то и сбрасывает зелье
     
  7. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Ну тогда перед тем как давать эффект проверяй есть ли в игрока эффект с большим временем или силой.
     
  8. Автор темы
    Kurumi

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

    Баллы:
    76
    А через runnable все равно нужно делать?
     
  9. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Ну если хочешь чтобы твой метод проверял игрока при каждом движении и клике - можешь оставить как есть.
     
  10. Автор темы
    Kurumi

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

    Баллы:
    76
    Понял. Спасибо!
     
  11. Автор темы
    Kurumi

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

    Баллы:
    76
    Только сейчас смог заняться плагином. Я чет затупил и не могу сделать проверку. Я хочу сделать првоерку таким образом
    PHP:
        if(player.hasPotionEffect(PotionEffectType.getByName(a4[0])) && Integer.parseInt(a4[1]))
                        {
                           
                        }
    но тут я жестко затупил и не могу понять... Можешь помочь?
     
  12. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Что за a4[]?
    У меня сегодня отдых от экстрасенсорных способностей программиста.
     
  13. Автор темы
    Kurumi

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

    Баллы:
    76
    PHP:
      if (helm.getTypeId() == this.plugin.getConfig().getInt("Sets."+s+".helmet") && legs.getTypeId() == this.plugin.getConfig().getInt("Sets."+s".leggings") && boot.getTypeId() == this.plugin.getConfig().getInt("Sets."+s+".boots") && chest.getTypeId() == this.plugin.getConfig().getInt("Sets."+s+".chestplate"))
                {   
                    for (final 
    String a3 this.plugin.getConfig().getStringList("Sets."+s+".effects"))
                    {
                        final 
    String[] a4 a3.split(" ");
                        if(
    player.hasPotionEffect(PotionEffectType.getByName(a4[0])) && Integer.parseInt(a4[1]) <)
                        {
                            
                        }
                        
                        
    this.player.addPotionEffect(new PotionEffect(PotionEffectType.getByName(a4[0]), 120Integer.parseInt(a4[1])), true);
                    }
                }
     
  14. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    TIME - твоё стандартное время длительности эффекта, 120, если судить с кода выше
    PHP:
    PotionEffectType effect PotionEffectType.getByName(a4[0]);
    Integer amplifier a4[1]
    if(
    player.hasPotionEffect(effect) && (player.getPotionEffect(effect).getAmplifier()>amplifier || player.getPotionEffect(effect).getDuration()>TIME)) {
    //todo, у игрока уже есть эффект
    }
     
  15. Автор темы
    Kurumi

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

    Баллы:
    76
    И если у игрока уже есть эффект, просто return ?
     
  16. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Инвертируй. if(!(та длинная строка))
     
  17. Автор темы
    Kurumi

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

    Баллы:
    76
    upload_2018-2-26_22-14-8.png
     
  18. Автор темы
    Kurumi

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

    Баллы:
    76
  19. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Под какую версию пишешь?
    Если под 1.7 и ниже (проверил по джавадоку) надо проитерировать сквозь .getActivePotionEffects() и найти нужный эффект
     
  20. Автор темы
    Kurumi

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

    Баллы:
    76
    на 1.6.4 пишу
     
Статус темы:
Закрыта.

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