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

Помогите Собственный дроп с определенного блока

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

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

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

    Баллы:
    66
    Приветствую! Есть необходимость модифицировать дроп с блока. Есть набросок (нерабочего) кода:
    PHP:
    @EventHandler
        
    public void gc(BlockBreakEvent e)
        {
            
    //Player p = e.getPlayer();
            
    Block b = (Blocke.getBlock();
            if(
    e.getBlock().getType() != Material.STONE) return;
            
    e.getBlock().setType(Material.AIR);
            
    e.getBlock().getWorld().dropItemNaturally(e.getBlock().getLocation(), new ItemStack(Material.IRON_INGOT));
        }
    Подскажите, пожалуйста, что нужно исправить. Дополнительной задачей является настройка дропа с блока, имеющего определенный опознавательный знак (название, лор или еще что-то), есть ли вариант это реализовать? Если да, то какой? Сразу сообщу, я в этом ремесле дилетант, потому прошу отнестись к глупым вопросам с пониманием.
     
  2. Sneyzi

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

    Баллы:
    76
    Код:
    @EventHandler
        public void onBlockBreak(BlockBreakEvent e) {
            Block block = e.getBlock();
         
            if (block.getType() == Material.DIAMOND_BLOCK) {
                Location location = block.getLocation();
                ItemStack itemStack = new ItemStack(Material.GRASS, 1);
    
                e.setDropItems(false);
                location.getWorld().dropItemNaturally(location, itemStack);
            }
        }
    
     
  3. Автор темы
    fx8320e

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

    Баллы:
    66
    Благодарю за помощь! Но, к сожалению, по какой-то причине код не работает.
    Block block = e.getBlock() - данная строка значится ошибочной, среда разработки предлагает изменить на это: org.bukkit.block.Block block = e.getBlock(); , что, однако, не помогает. Притом, с Player p = e.getPlayer(); проблем нет. Подскажите, пожалуйста, в чем проблема.
     
  4. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    У тебя, кажется, неправильный импорт - глянь где-то вверху своего кода, вероятно, другой import ...Block;
     
  5. Автор темы
    fx8320e

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

    Баллы:
    66
    Действительно! Исправил, но это ничего не изменило. Все еще не работает.
     
  6. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    А ты свой слушатель ивентов зарегистрировал?
     
  7. Автор темы
    fx8320e

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

    Баллы:
    66
    Да.
    PHP:
     public class ColdWeaponForSB extends JavaPlugin implements Listener 
    . Могу скинуть весь код, но он очень длинный.
     
  8. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Это не регистрация - ты просто объявил, что твой класс - слушатель. Регистрация в твоем случае будет Bukkit.getPluginManager().registerListeners(this, this) где-то в onEnable().
     
  9. Автор темы
    fx8320e

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

    Баллы:
    66
    Понял, спасибо! Извините за некомпетентность.
     
  10. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Да ладно, этот раздел и нужен для помощи в таких ситуациях.
     
  11. Автор темы
    fx8320e

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

    Баллы:
    66
    И последний вопрос. Есть ли какая-то возможность добавить блоку нечто, что позволит его опознать и выборочно изменять дроп?
     
  12. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Подобное можно сделать в основном только для тайл-энтити на 1.14-1.16 - для сундуков, печей, голов, всякого такого. Вот гайд на английском - PersistentData API. Для обычных же блоков, да до версии 1.14, придется хранить локации и типы блоков как-то самому, в некой базе данных.
     
  13. Автор темы
    fx8320e

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

    Баллы:
    66
    А на 1.16+? Если печкой можно это сделать, то тоже вариант. Нужно только как-то запретить игроку ее использовать как печку.
     
  14. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Можно. В гайде написано, как использовать. Вот список доступных тайл-энтити. Для запрета - просто блокируй PlayerInteractEvent, коль на печке стоит тэг соответствующий. Но через воронку можно будет положить все равно - в таком случае стоит смотреть за ивентом воронки, но это может напрягать сервер. Мб стоит взять выбрасыватель и отменять ивент выбрасывания - вряд ли кому понадобится закидывать предметы через воронку в бесполезный блок.
     
  15. _MRDen3000YT_

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

    Баллы:
    76
  16. alexandrage

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

    Баллы:
    173
    Можно спавнер использовать, на него через внутренний ентити можно текстуры блоков натягивать используя ресурспак.
     
  17. Автор темы
    fx8320e

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

    Баллы:
    66
    Отличная идея! Спасибо! Только как проверить внутреннего entity в плагине, какой метод за это отвечает?
     

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