Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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. Коменты в коде
 
Потому что event.setDamage(0.0) - говнокод, а event.setCancelled(true) - хороший код.
Выглядят по разному, а работают одинаково.
 
Потому что event.setDamage(0.0) - говнокод, а event.setCancelled(true) - хороший код.
Выглядят по разному, а работают одинаково.
Я согласен что они выполняют одинаковую функцию, но есть одно НО:
Первый "говнокод"(как он написал) работает, а он спрашивает про вторую.
 
Я согласен что они выполняют одинаковую функцию, но есть одно НО:
Первый "говнокод"(как он написал) работает, а он спрашивает про вторую.
но по-моему это (даже хоть и чуть-чуть) сильнее нагружает. Все равно, если не работает, стоит попробовать setCancelled
 
А можно тут задать вопрос, чтобы не создавать лишние темы. Как "произвести" команду от лица игрока?
 
Последнее редактирование:
Потому что event.setDamage(0.0) - говнокод, а event.setCancelled(true) - хороший код.
Выглядят по разному, а работают одинаково.
На сколько я знаю, в первом случае отправляется пакет с отображением нанесения урона, а во втором -- нет. Так же могут быть плагины которые ignoreCancelled = true и в них event.setCancelled(false), а в первом случае урон однозначно не пройдёт. Так же возможно сработает и отбрасывание/накладывание эффектов при уроне.
Всем привет!
Есть обработчик события:
Код:
    @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. Коменты в коде
По поводу ошибки не скажу, но настораживает это место:
i.setDurability((short) (i.getDurability() + 5));
if ((int) p.getItemInHand().getDurability() <= (int) 0)
p.getItemInHand().getDurability() == 0 если вещь имеет полную прочность, если Вы хотите уничтожить "разбитую" вещь, то в условии нужно использовать p.getItemInHand().getDurability()>p.getItemInHand().getType().getMaxDurability()
 
На сколько я знаю, в первом случае отправляется пакет с отображением нанесения урона, а во втором -- нет. Так же могут быть плагины которые 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()
Спасибо
Шта? Зачем event.setDamage(0.0) дважды выполнять?!
Первый(перед ифом) я не выполняю, просто написал, и говорю что первый срабатывает, а второй, который в ифе нет, хотя сообщение из ифа выводится.
Сделал так, но 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);              
                }
                                              
            }
        }
    }
 
Сделал так, но 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);            
                }
                                            
            }
        }
    }
На каком ядре тестируешь?
 
Спасибо

Первый(перед ифом) я не выполняю, просто написал, и говорю что первый срабатывает, а второй, который в ифе нет, хотя сообщение из ифа выводится.
Сделал так, но 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);             
                }
                                             
            }
        }
    }
Попробуй сделать
event.setCancelled(true);
player.damage(1);
вместо event.setDamage(0.0);
P.S. Хотя это может быть неправильно.
 
Мне интересно: где вообще было взято такое ядро? Может это 1.7.2 R0.3? Попробуй сменить ядро на 1.6 и проверить на нём.
да 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));                               
                    }                                                           
                }                                         
            }
        }
      
    }
, но как это обойти, помогите пожалуйста.
 
да 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));                               
                    }                                                           
                }                                         
            }
        }
      
    }
, но как это обойти, помогите пожалуйста.
Это назвается 1.7 билды ведра ещё не стабильны. У меня есть билд в котором при создании новых чанков(не начальная генерация мира) сервер падает.
 
Это назвается 1.7 билды ведра ещё не стабильны. У меня есть билд в котором при создании новых чанков(не начальная генерация мира) сервер падает.
Ну может как-то все таки обойти это можно?
 

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

Назад
Верх