Помогите Как при убийстве моба получать дроп словно с зачарованием заговор огня?

Статус
Закрыто для дальнейших ответов.

Ильми

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
IlmiGirafe
Мне нужно каким-то образом сделать так, чтобы при убийстве (коровы) мне выпадала не сырая говядина, а уже готовый стейк, словно с зачарованием - заговор огня на мече.
Код:
public class handlerrr implements Listener {
    @EventHandler(priority = EventPriority.HIGHEST)
    public void mobDeathEvent(EntityDeathEvent e) {
    Monster m = (Monster) e.getEntity();
    Player p = m.getKiller();
    Location loc = m.getLocation();
    if(!p.hasPermission("gfpuse.furnacemob"))
        return;
    if(!p.hasPermission("gfpuse.furnacemobon"))
        return;
    if(m.getType() == EntityType.COW) {
 
Последнее редактирование:
Проверяй в начале энтити на корову. Чисти дроп и выкидывай готовый стейк
 
Мне нужно каким-то образом сделать так, чтобы при убийстве (коровы) мне выпадала не сырая говядина, а уже готовый стейк, словно с зачарованием - заговор огня на мече.
Код:
public class handlerrr implements Listener {
    @EventHandler(priority = EventPriority.HIGHEST)
    public void mobDeathEvent(EntityDeathEvent e) {
    Monster m = (Monster) e.getEntity();
    Player p = m.getKiller();
    Location loc = m.getLocation();
    if(!p.hasPermission("gfpuse.furnacemob"))
        return;
    if(!p.hasPermission("gfpuse.furnacemobon"))
        return;
    if(m.getType() == EntityType.COW) {
А не легче будет использовать, ItemSpawnEvent, проверять на то что это сырая говядина и изменять на жареную
 
PHP:
    @EventHandler
    public void onSpawnItem(ItemSpawnEvent e)
    {
        /*Берём предмет который заспавнился в мире
        * Это может быть выкинутый предмет
        * Так же выпавший из раздатчика*/
        ItemStack itemStack = e.getEntity ().getItemStack ();
        /*
        Проверяем предмет на мясо
         */
        if(itemStack.getType ().equals (Material.BEEF))
        {
            /*
            Отменяем его спавн
             */
            e.setCancelled (true);
            /*
            Берём локацию и выкидываем уже обжаренные куски
             */
            World w = e.getLocation ().getWorld ();
            w.dropItemNaturally (e.getLocation (), new ItemStack (Material.COOKED_BEEF, itemStack.getAmount ()));
        }
    }

    @EventHandler
    public void onEntityDamage(EntityDamageByEntityEvent e)
    {
        /*
        Проверяем получившего урон на корову
         */
        if(e.getEntity () instanceof Cow) {
            /*
            Создаём переменную что бы было проще работать
             */
            Cow cow = (Cow) e.getEntity ();
            /*
            Если урон больше или равен количеству хп
             */
            if(e.getFinalDamage () >= cow.getHealth ())
            {
                /*
                Проверяем того кто ударил на игрока
                 */
                if(e.getDamager () instanceof Player)
                {
                    Player p = (Player) e.getDamager ();
                    /*
                    Получаем права
                     */
                    if(!p.hasPermission("gfpuse.furnacemob")) return;
                    Location loc = cow.getLocation ();
                    /*
                    Удаляем корову что-бы не выпал лут
                     */
                    cow.remove ();
                    /*
                    Спавним свой лут в виде жаренного мяса
                     */
                    loc.getWorld ().dropItemNaturally (loc, new ItemStack (Material.COOKED_BEEF));
                }
            }
        }
    }
Описал 2 варианта, так, я подумал и понял что если удалять корову то будет выглядеть не красиво, так что попробуй как-то заменить лут, там мне кажется уже в Bukkit такое есть
 
PHP:
    @EventHandler
    public void onSpawnItem(ItemSpawnEvent e)
    {
        /*Берём предмет который заспавнился в мире
        * Это может быть выкинутый предмет
        * Так же выпавший из раздатчика*/
        ItemStack itemStack = e.getEntity ().getItemStack ();
        /*
        Проверяем предмет на мясо
         */
        if(itemStack.getType ().equals (Material.BEEF))
        {
            /*
            Отменяем его спавн
             */
            e.setCancelled (true);
            /*
            Берём локацию и выкидываем уже обжаренные куски
             */
            World w = e.getLocation ().getWorld ();
            w.dropItemNaturally (e.getLocation (), new ItemStack (Material.COOKED_BEEF, itemStack.getAmount ()));
        }
    }

    @EventHandler
    public void onEntityDamage(EntityDamageByEntityEvent e)
    {
        /*
        Проверяем получившего урон на корову
         */
        if(e.getEntity () instanceof Cow) {
            /*
            Создаём переменную что бы было проще работать
             */
            Cow cow = (Cow) e.getEntity ();
            /*
            Если урон больше или равен количеству хп
             */
            if(e.getFinalDamage () >= cow.getHealth ())
            {
                /*
                Проверяем того кто ударил на игрока
                 */
                if(e.getDamager () instanceof Player)
                {
                    Player p = (Player) e.getDamager ();
                    /*
                    Получаем права
                     */
                    if(!p.hasPermission("gfpuse.furnacemob")) return;
                    Location loc = cow.getLocation ();
                    /*
                    Удаляем корову что-бы не выпал лут
                     */
                    cow.remove ();
                    /*
                    Спавним свой лут в виде жаренного мяса
                     */
                    loc.getWorld ().dropItemNaturally (loc, new ItemStack (Material.COOKED_BEEF));
                }
            }
        }
    }
Описал 2 варианта, так, я подумал и понял что если удалять корову то будет выглядеть не красиво, так что попробуй как-то заменить лут, там мне кажется уже в Bukkit такое есть
Всё идеально 0_0. Второй способ всё-равно лучше, чем первый, мне не нужны лишние проблемы из-за этого. Спасибо за помощь, я думаю, что исчезновение коровы - это ничего плохого, если она будет пропадать только у тех, кто имеет право ("gfpuse.furnacemob"), тем-более "плагин" этот я пишу под сервер, никуда я кидать свой парашный плагин на переплавку блоков и мобов не буду).
 
Всё идеально 0_0. Второй способ всё-равно лучше, чем первый, мне не нужны лишние проблемы из-за этого. Спасибо за помощь, я думаю, что исчезновение коровы - это ничего плохого, если она будет пропадать только у тех, кто имеет право ("gfpuse.furnacemob"), тем-более "плагин" этот я пишу под сервер, никуда я кидать свой парашный плагин на переплавку блоков и мобов не буду).
2 вариант мне кажется можно начиная с cow.remove() и до конца переделать, найти что то по типу cow.dropItems и переписать на своё
 
2 вариант мне кажется можно начиная с cow.remove() и до конца переделать, найти что то по типу cow.dropItems и переписать на своё
Слушай, можно просто отменить дроп и заново написать свой. Не подскажешь как написать шанс на выпадение айтема? К примеру, при 'убийстве' коровы она будет удаляться, но при этом лут от неё остаётся, поэтому мы его отключаем, после этого добавляем свой лут - кожу и стейки, на них мы ставим % выпадения, можно будет поискать процент выпадения при обычном убийстве коровы и подогнать под них. Теперь у меня есть вопрос, а можно ли поставить свои проценты на выпадение предмета? Если да, то это хорошо, если нет, то у меня проблемы). Сам если что не знаю такого ивента, который будет именно Заменять дроп и именно с Убитого игроком моба.
 
На сколько я помню, список дропа мобов спокойно меняется ивентом и без отмены и ручного дропа. Котел сервер не считаются, там это не работает. Там все ивенты через жопу реализованы.
 
На сколько я помню, список дропа мобов спокойно меняется ивентом и без отмены и ручного дропа.
Буду очень благодарен, если поможете с этим ивентом. Я уже писал вроде, что не знаю такого ивента, поэтому и собирался удалить дроп и полностью его переписать.
 
PHP:
public void onEntityDeath(EntityDeathEvent event){
     if(event.getEntity() instanceof Cow)
     {
       //Проверь на убийцу сам(сорь без среды)
       List<ItemStack> items = new ArrayList<>();
       for(ItemStack item : event.getDrops())
       {
            if(item.getType().equals(Material.BEEF)
            {
                 item = new ItemStack(Material.COOCKED_BEEF, item.getAmount());
            }
            items.add(item);
       }
       event.getDrops().clear();
       items.foreach(event.getDrops()::add);
     }
}
 
Буду очень благодарен, если поможете с этим ивентом. Я уже писал вроде, что не знаю такого ивента, поэтому и собирался удалить дроп и полностью его переписать.
Ну, как то так, на примере говядены.
Код:
    @EventHandler
    public void onTest(EntityDeathEvent e) {
        e.getDrops().replaceAll(new UnaryOperator<ItemStack>() {
            @Override
            public ItemStack apply(ItemStack stack) {
                if (stack.getType() == Material.BEEF) {
                    stack.setType(Material.COOKED_BEEF);
                }
                return stack;
            }
        });
    }
 
Спасибо за помощь, всё-же я уже использую то, что написал @CriticaMobslps, спасибо, @alexandrage тоже спасибо за помощь, всё работает. Я закрываю вопрос.
Код:
public class handlerrr implements Listener {
    
    @EventHandler
    public void onEntityDeath(EntityDeathEvent event){
        if(event.getEntity () instanceof Cow) {
        Cow cow = (Cow) event.getEntity ();
        if(cow.getKiller() instanceof Player)
        {
            Player p = (Player) cow.getKiller();
            if(!p.hasPermission("gfpuse.furnacemob")) return;
        }
           List<ItemStack> items = new ArrayList<>();
           for(ItemStack item : event.getDrops())   
           {
                if(item.getType().equals(Material.RAW_BEEF))
                {
                     item = new ItemStack(Material.COOKED_BEEF, item.getAmount());
                }
                items.add(item);
           }
           event.getDrops().clear();
           items.forEach(event.getDrops()::add);
         }
}
}
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх