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

fx8320e

Активный участник
Пользователь
Баллы
66
Приветствую! Есть необходимость модифицировать дроп с блока. Есть набросок (нерабочего) кода:
PHP:
@EventHandler
    public void gc(BlockBreakEvent e)
    {
        //Player p = e.getPlayer();
        Block b = (Block) e.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));
    }
Подскажите, пожалуйста, что нужно исправить. Дополнительной задачей является настройка дропа с блока, имеющего определенный опознавательный знак (название, лор или еще что-то), есть ли вариант это реализовать? Если да, то какой? Сразу сообщу, я в этом ремесле дилетант, потому прошу отнестись к глупым вопросам с пониманием.
 
Код:
@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);
        }
    }
 
Код:
@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);
        }
    }
Благодарю за помощь! Но, к сожалению, по какой-то причине код не работает.
Block block = e.getBlock() - данная строка значится ошибочной, среда разработки предлагает изменить на это: org.bukkit.block.Block block = e.getBlock(); , что, однако, не помогает. Притом, с Player p = e.getPlayer(); проблем нет. Подскажите, пожалуйста, в чем проблема.
 
Да.
PHP:
 public class ColdWeaponForSB extends JavaPlugin implements Listener {
. Могу скинуть весь код, но он очень длинный.
Это не регистрация - ты просто объявил, что твой класс - слушатель. Регистрация в твоем случае будет Bukkit.getPluginManager().registerListeners(this, this) где-то в onEnable().
 
Понял, спасибо! Извините за некомпетентность.
 
Да ладно, этот раздел и нужен для помощи в таких ситуациях.
И последний вопрос. Есть ли какая-то возможность добавить блоку нечто, что позволит его опознать и выборочно изменять дроп?
 
И последний вопрос. Есть ли какая-то возможность добавить блоку нечто, что позволит его опознать и выборочно изменять дроп?
Подобное можно сделать в основном только для тайл-энтити на 1.14-1.16 - для сундуков, печей, голов, всякого такого. Вот гайд на английском - PersistentData API. Для обычных же блоков, да до версии 1.14, придется хранить локации и типы блоков как-то самому, в некой базе данных.
 
Подобное можно сделать в основном только для тайл-энтити на 1.14-1.16 - для сундуков, печей, голов, всякого такого. Вот гайд на английском - PersistentData API. Для обычных же блоков, да до версии 1.14, придется хранить локации и типы блоков как-то самому, в некой базе данных.
А на 1.16+? Если печкой можно это сделать, то тоже вариант. Нужно только как-то запретить игроку ее использовать как печку.
 
А на 1.16+? Если печкой можно это сделать, то тоже вариант. Нужно только как-то запретить игроку ее использовать как печку.
Можно. В гайде написано, как использовать. Вот список доступных тайл-энтити. Для запрета - просто блокируй PlayerInteractEvent, коль на печке стоит тэг соответствующий. Но через воронку можно будет положить все равно - в таком случае стоит смотреть за ивентом воронки, но это может напрягать сервер. Мб стоит взять выбрасыватель и отменять ивент выбрасывания - вряд ли кому понадобится закидывать предметы через воронку в бесполезный блок.
 
Можно спавнер использовать, на него через внутренний ентити можно текстуры блоков натягивать используя ресурспак.
 
Можно спавнер использовать, на него через внутренний ентити можно текстуры блоков натягивать используя ресурспак.
Отличная идея! Спасибо! Только как проверить внутреннего entity в плагине, какой метод за это отвечает?
 
Назад
Верх