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

Помогите Помогите разобраться в коде:)

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

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

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Всем привет!
    Есть обработчик события:
    Код:
        @EventHandler
        public void onUse(EntityDamageByEntityEvent event)
        {
            if (event.getEntityType() == EntityType.PLAYER)
            {
                Player p = (Player) event.getEntity();
                if(p.isBlocking())
                {
                    ItemStack i = p.getItemInHand();
                    if(i.getType() == Material.WOOD_SWORD || i.getType() == Material.DIAMOND_SWORD || i.getType() == Material.STONE_SWORD || i.getType() == Material.IRON_SWORD)
                    {                                              
                        List<String> str = new ArrayList<String>();
                        str.add("Shield"); 
                        event.setDamage(0.0);  //это срабатывает                   
                        if (i.getItemMeta().hasLore() && i.getItemMeta().getLore().equals(str))
                        {
                            event.setDamage(0.0); // а вот это почему-то не срабатывает
                            getLogger().info("Shield"); // и это срабатывает                                                                                       
                            i.setDurability((short) (i.getDurability() + 5));                      
                            p.setItemInHand(i);                      
                            if ((int) p.getItemInHand().getDurability() <= (int) 0)
                            {
                                i.setType(Material.AIR);                      
                            }
                            p.setItemInHand(i);          
                        }  
                    }
                                                  
                }
            }
        }
    
    
    Проблема в том, что if как бы true и часть if'a выполняется а часть нет.

    Заранее благодарю.

    P.S. Коменты в коде
     
  2. StealerSlain

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

    Баллы:
    88
    Имя в Minecraft:
    StealerSlain
    Потому что event.setDamage(0.0) - говнокод, а event.setCancelled(true) - хороший код.
    Выглядят по разному, а работают одинаково.
     
  3. BeYkeR

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

    Баллы:
    173
    Я согласен что они выполняют одинаковую функцию, но есть одно НО:
    Первый "говнокод"(как он написал) работает, а он спрашивает про вторую.
     
  4. StealerSlain

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

    Баллы:
    88
    Имя в Minecraft:
    StealerSlain
    но по-моему это (даже хоть и чуть-чуть) сильнее нагружает. Все равно, если не работает, стоит попробовать setCancelled
     
  5. JustBlender

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

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    А можно тут задать вопрос, чтобы не создавать лишние темы. Как "произвести" команду от лица игрока?
     
  6. musel70

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

    Баллы:
    88
    player.performCommand(),( п с смотри документацию)
     
    Последнее редактирование: 31 янв 2014
  7. JustBlender

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

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Оу щит, забыл совсем. Спасибо.
     
  8. Den-Xs

    Den-Xs Старожил Пользователь

    Баллы:
    103
    Skype:
    denis_314
    Шта? Зачем event.setDamage(0.0) дважды выполнять?!
     
  9. Ission

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

    Баллы:
    173
    Skype:
    lokivava
    На сколько я знаю, в первом случае отправляется пакет с отображением нанесения урона, а во втором -- нет. Так же могут быть плагины которые ignoreCancelled = true и в них event.setCancelled(false), а в первом случае урон однозначно не пройдёт. Так же возможно сработает и отбрасывание/накладывание эффектов при уроне.
    По поводу ошибки не скажу, но настораживает это место:
    i.setDurability((short) (i.getDurability() + 5));
    if ((int) p.getItemInHand().getDurability() <= (int) 0)
    p.getItemInHand().getDurability() == 0 если вещь имеет полную прочность, если Вы хотите уничтожить "разбитую" вещь, то в условии нужно использовать p.getItemInHand().getDurability()>p.getItemInHand().getType().getMaxDurability()
     
  10. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Спасибо
    Первый(перед ифом) я не выполняю, просто написал, и говорю что первый срабатывает, а второй, который в ифе нет, хотя сообщение из ифа выводится.
    Сделал так, но event.setDamage(0.0) все равно не работает хотя все остальное в операторных скобках работает:(
    Код:
    @EventHandler
        public void onUse(EntityDamageByEntityEvent event)
        {
            if (event.getEntityType() == EntityType.PLAYER)
            {
                Player p = (Player) event.getEntity();
                if(p.isBlocking())
                {
                    List<String> str = new ArrayList<String>();
                    str.add("Shield");
                    ItemStack i = p.getItemInHand();
                    if((i.getType() == Material.WOOD_SWORD || i.getType() == Material.DIAMOND_SWORD || i.getType() == Material.STONE_SWORD || i.getType() == Material.IRON_SWORD) && (i.getItemMeta().hasLore() && i.getItemMeta().getLore().equals(str)))
                    {      
                        event.setDamage(0.0);                                                                                                 
                        i.setDurability((short) (i.getDurability() + 5));                                                                  
                        if (i.getDurability() > i.getType().getMaxDurability())
                        {
                            i.setType(Material.AIR);                      
                        }
                        p.setItemInHand(i);              
                    }
                                                  
                }
            }
        }
     
  11. Ission

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

    Баллы:
    173
    Skype:
    lokivava
    На каком ядре тестируешь?
     
  12. BeYkeR

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

    Баллы:
    173
    Попробуй сделать
    event.setCancelled(true);
    player.damage(1);
    вместо event.setDamage(0.0);
    P.S. Хотя это может быть неправильно.
     
  13. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    А зачем наносить 1 урон?
     
  14. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    event.setCancelled(true) тоже не работает.
    bukkit 1.7.2 R3.0
     
  15. BeYkeR

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

    Баллы:
    173
    Мб Bukkit 1.7.2 R0.3 ?
     
  16. Ission

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

    Баллы:
    173
    Skype:
    lokivava
    Мне интересно: где вообще было взято такое ядро? Может это 1.7.2 R0.3? Попробуй сменить ядро на 1.6 и проверить на нём.
     
  17. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    да 1.7.2 R0.3, опечаточка вышла, попробую на 1.6
    На 1.6 работает, это типа баг что ли?
    Если сделать так, т.е итем в руке не менять, то работает:
    Код:
        @EventHandler
        public void onUse(EntityDamageByEntityEvent event)
        {
            if (event.getEntityType() == EntityType.PLAYER)
            {
                Player p = (Player) event.getEntity();
                if(p.isBlocking())
                {
                    ItemStack i = p.getItemInHand();
                    if(i.getType() == Material.WOOD_SWORD || i.getType() == Material.DIAMOND_SWORD || i.getType() == Material.STONE_SWORD || i.getType() == Material.IRON_SWORD)
                    {                                             
                        List<String> str = new ArrayList<String>();
                        str.add("Shield");                                   
                        if (i.getItemMeta().hasLore() && i.getItemMeta().getLore().equals(str))
                        {
                            event.setDamage(0);  //это срабатывает
                            getLogger().info("Shield"); // и это срабатывает                                                                                     
                            //i.setDurability((short) (i.getDurability() + 5));                               
                        }                                                           
                    }                                         
                }
            }
          
        }
    
    , но как это обойти, помогите пожалуйста.
     
  18. Ission

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

    Баллы:
    173
    Skype:
    lokivava
    Это назвается 1.7 билды ведра ещё не стабильны. У меня есть билд в котором при создании новых чанков(не начальная генерация мира) сервер падает.
     
  19. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Ну может как-то все таки обойти это можно?
     
  20. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Ждите нового билда.
     

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