[1.8.9] [РЕШЕНО] Неломаемое дерево.

Статус
В этой теме нельзя размещать новые ответы.
Хотел сделать не ломаемое рукой дерево. Получился вот такой код:
Код:
@SubscribeEvent
public void UnbreakeableWood(BlockEvent.BreakEvent event)
        {
            if(event.state.getBlock() == Blocks.log)
                    {
                if(event.getPlayer().getHeldItem().getItem() != Items.wooden_axe)
                    {
                        event.state.getBlock().setBlockUnbreakable();
                    }
            }
    }

В результате я словил баг: если я ломаю дерево деревянным топором или другим предметом, то оно ломается и выпадает дроп, но если я ломаю его рукой оно пропадает не оставляя дроп и оставляет после себя невидимый, непроходимый барьер. Почему так происходит и как это исправить?
 
1,976
68
220
Похоже потому что ты вызываешь его ПОСЛЕ того, как блок сломан, хотя я не уверен :D
 
Agravaine написал(а):
Не тот ивент. Ты вообще не то делаешь.
Отменяй PlayerEvent.BreakSpeed и все.

Я пробовал такой код:
Код:
@SubscribeEvent
public void UnbreakeableWood(PlayerEvent.BreakSpeed event)
    {
        if(event.state.getBlock() == Blocks.log)
            {
                if(event.entityPlayer.getHeldItem().getItem() != Items.wooden_axe)
                    {
                        event.isCanceled();
                    }
            }
    }

При поломке блока рукой или каким-нибудь предметом игра крашится.
 

timaxa007

Модератор
5,831
409
672
Может хотя-бы попробуешь проверять, что у игрока в руке на null?
 
timaxa007 написал(а):
Может хотя-бы попробуешь проверять, что у игрока в руке на null?

Так? Всё равно крашит.
Код:
@SubscribeEvent
        public void UnbreakeableWood(PlayerEvent.BreakSpeed event)
        {
            if(event.state.getBlock() == Blocks.log)
                {
                    if(event.entityPlayer.getHeldItem().getItem() == null)
                        {
                            event.state.getBlock().setBlockUnbreakable();
                        }
                }
        }
    }
[merge_posts_bbcode]Добавлено: 27.06.2016 13:41:05[/merge_posts_bbcode]

Может это вообще не через ивент делается?

[merge_posts_bbcode]Добавлено: 27.06.2016 13:42:00[/merge_posts_bbcode]

Кстати могу дать ссылку на код мода в котором это было реализовано. Я сам чужой код вообще разбирать не умею.

[merge_posts_bbcode]Добавлено: 27.06.2016 13:42:24[/merge_posts_bbcode]

https://github.com/SlimeKnights/IguanaTweaksTConstruct
 

timaxa007

Модератор
5,831
409
672
Max Shader написал(а):
Код:
if(event.entityPlayer.getHeldItem().getItem() == null)
На:
Код:
if(event.entityPlayer.getHeldItem() == null)
Руку, не предмет.
[merge_posts_bbcode]Добавлено: 27.06.2016 12:54:30[/merge_posts_bbcode]

И используй:
Agravaine написал(а):
Вроде должно сработать, по-крайней мере у на 1.7.10 сработало.
 
timaxa007 написал(а):
Max Shader написал(а):
Код:
if(event.entityPlayer.getHeldItem().getItem() == null)
На:
Код:
if(event.entityPlayer.getHeldItem() == null)
Руку, не предмет.
[merge_posts_bbcode]Добавлено: 27.06.2016 12:54:30[/merge_posts_bbcode]

И используй:
Agravaine написал(а):
Вроде должно сработать, по-крайней мере у на 1.7.10 сработало.

Вроде сработало, но мне надо это проделать с функцией
Код:
if(event.harvester.getHeldItem().getItem() != Items.wooden_axe){}
Так как по логике дерево можно срубить только топором, а с этим кодом дерево можно срубить и мотыгой, не говоря уже о куске мяса. А вообще код работает правильно. Только майн вылетел через десять минут когда мне захотелось попрыгать...
 
Может мне всё таки ответят...
[merge_posts_bbcode]Добавлено: 28.06.2016 22:47:10[/merge_posts_bbcode]

может...
 

timaxa007

Модератор
5,831
409
672
На что?
 
На моё последнее сообщение. Я пытался сделать код, который делает дерево невосприимчивым к любому предмету кроме топора. 
Я пытался и так:
Код:
@SubscribeEvent
        public void UnbreakeableWood(PlayerEvent.BreakSpeed event)
        {
            if(event.state.getBlock() == Blocks.log)
                {
                    if(event.entityPlayer.getHeldItem() == null)
                        {
                            event.newSpeed = -1.0f;
                            event.setCanceled(true);
                        }
                    if(event.entityPlayer.getHeldItem().getItem() != Items.wooden_axe)
                        {
                            event.newSpeed = -1.0f;
                            event.setCanceled(true);
                        }
                    
                }
        }
    }

И сяк:
Код:
@SubscribeEvent
        public void UnbreakeableWood(PlayerEvent.BreakSpeed event)
        {
            if(event.state.getBlock() == Blocks.log)
                {
                    if(event.entityPlayer.getHeldItem().getItem() != Items.wooden_axe)
                        {
                            event.newSpeed = -1.0f;
                            event.setCanceled(true);
                        }
                    if(event.entityPlayer.getHeldItem() == null)
                        {
                            event.newSpeed = -1.0f;
                            event.setCanceled(true);
                        }
                }
        }
    }
И даже так:
Код:
@SubscribeEvent
        public void UnbreakeableWood(PlayerEvent.BreakSpeed event)
        {
            if(event.entityPlayer.getHeldItem().getItem() != Items.wooden_axe)
                {
                    if(event.state.getBlock() == Blocks.log)
                        {
                            event.newSpeed = -1.0f;
                            event.setCanceled(true);
                        }
            if(event.entityPlayer.getHeldItem() == null)
                {
                    if(event.state.getBlock() == Blocks.log)
                        {
                            event.newSpeed = -1.0f;
                            event.setCanceled(true);
                        }        
                }
        }
    }
}

И в каждом из этих вариантов при поломке дерева рукой майн вылетает.
 
608
5
15
Действительно, почему же крашит?
Код:
event.entityPlayer.getHeldItem()


Почитай как с крашами работать.
 

timaxa007

Модератор
5,831
409
672
Код:
    @SubscribeEvent
    public void unbreakeableWood(PlayerEvent.BreakSpeed event) {
        if (event.block == Blocks.log) {
            if (canBlockItemAxe(event.entityPlayer.getHeldItem())) event.setCanceled(true);
        } else if (event.block == Blocks.log2) {
            if (canBlockItemAxe(event.entityPlayer.getHeldItem())) event.setCanceled(true);
        }
    }

    private static boolean canBlockItemAxe(ItemStack itemStack) {
        return itemStack == null || !(itemStack.getItem() instanceof ItemAxe);
    }
 
svk2140 написал(а):
Действительно, почему же крашит?
Код:
event.entityPlayer.getHeldItem()


Почитай как с крашами работать.

1. А что не так конкретно в этом коде? Он работает, если не добавить:
Код:
 if(event.entityPlayer.getHeldItem().getItem() != Items.wooden_axe)
                        {
                            event.newSpeed = -1.0f;
                            event.setCanceled(true);
                        }

2. Можно ссылочку?
[merge_posts_bbcode]Добавлено: 29.06.2016 20:31:00[/merge_posts_bbcode]

timaxa007 написал(а):
Код:
    @SubscribeEvent
    public void unbreakeableWood(PlayerEvent.BreakSpeed event) {
        if (event.block == Blocks.log) {
            if (canBlockItemAxe(event.entityPlayer.getHeldItem())) event.setCanceled(true);
        } else if (event.block == Blocks.log2) {
            if (canBlockItemAxe(event.entityPlayer.getHeldItem())) event.setCanceled(true);
        }
    }

    private static boolean canBlockItemAxe(ItemStack itemStack) {
        return itemStack == null || !(itemStack.getItem() instanceof ItemAxe);
    }

Моя не понимать как работать этот код полностью, но моя удовлетворён и говорит пасиба.

Только я его немного подправил:
Код:
@SubscribeEvent
    public void unbreakeableWood(PlayerEvent.BreakSpeed event) 
        {
            if (event.state.getBlock() == Blocks.log) 
                {
                    if (canBlockItemAxe(event.entityPlayer.getHeldItem())) event.setCanceled(true);
                }     
            else if (event.state.getBlock() == Blocks.log2) {
            if (canBlockItemAxe(event.entityPlayer.getHeldItem())) event.setCanceled(true);
        }
    }

    private static boolean canBlockItemAxe(ItemStack itemStack) {
        return itemStack == null || !(itemStack.getItem() instanceof ItemAxe);
    }
}

Это конечный (↑) код. Спасибо всем за ответы и участие в проблеме.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху