Помогите [Решено] Как правильно реализовать?

Статус
Закрыто для дальнейших ответов.
Отменяем евент.
getBlock().getLoc.getWorld.dropItemNaturally (getBlock.getItemStack, getBlock.getLoc);
block.setType ();
task;
 
Нет бы лишний раз погуглить где какие методы, мы будем разводить тему до состояния грязи. Фу быть таким.
 
Отменяем евент.
getBlock().getLoc.getWorld.dropItemNaturally (getBlock.getItemStack, getBlock.getLoc);
block.setType ();
task;
Мне кажется мы не много ушли с темы)
Дело в том, что мне нужно следующие:
Когда я ломаю блок, который есть в проверке, он как обычно должен сломаться (дропнуться), далее на его месте должен появится обсидиант, а потом (спустя 3 секунды) - светокамень.
Нет бы лишний раз погуглить где какие методы, мы будем разводить тему до состояния грязи. Фу быть таким.
Вот так нечего нужного не нашёл.
Вот так нашёл только эту тему, из которой нашёл следующие 2 строчки:
loc.setBlock(Material.AIR); //Вроде, точно не помню
loc.getBlock().setType(Material.AIR); //Это должно работать 100% :cool:
А как и с чем их юзать не понятно.
понятное дело что под loc подразумевается локация, но что то не хочет оно работать вот так:
Location loc = _block.getLocation();
loc.setBlock...
 
Мне кажется мы не много ушли с темы)
Дело в том, что мне нужно следующие:
Когда я ломаю блок, который есть в проверке, он как обычно должен сломаться (дропнуться), далее на его месте должен появится обсидиант, а потом (спустя 3 секунды) - светокамень.
Ну то что я написал это и делает.
Тебе же написали что когда вызывается евент, то блок еще не сломан. А когда ты меняешь блок в этом евенте, то выпадет блок тот, на который ты его заменил.
Решение такое:
Отменить евент.
Дропнуть нужный блок вручную.
Заменить блок на земле.
Запустить шедулер.
 
Ну то что я написал это и делает.
Тебе же написали что когда вызывается евент, то блок еще не сломан. А когда ты меняешь блок в этом евенте, то выпадет блок тот, на который ты его заменил.
Решение такое:
Отменить евент.
Дропнуть нужный блок вручную.
Заменить блок на земле.
Запустить шедулер.
Сделал так и получил то, что мне нужно было.
Java:
@EventHandler
    public void BlockBreakEvent(BlockBreakEvent event) {

        for (Block _block : api.ListCheckingBlocks) {
            if (_block.equals(event.getBlock())) {

                Bukkit.getScheduler().runTaskLater(this, () -> {
                    event.getBlock().setType(Material.OBSIDIAN);
                }, 10L);
             
                Bukkit.getScheduler().runTaskLater(this, () -> {
                    event.getBlock().setType(Material.REDSTONE_ORE);
                }, 60L);
                return;
            }
        }
     
        event.setCancelled(false);
    }
Сам дроп нормально выпадает, ставится обсидиант через секунду и через еще 2 заменяется на светокамень.

Заменил
Java:
event.getBlock().setType(Material.REDSTONE_ORE);
//на
event.getBlock().setType(_block.getType());
и после обсидиана нечего не спавнится. Перед этой строкой сделал проверку
Bukkit.broadcastMessage(_block.getType().toString());
Тип блока определяется нормально.
 
Последнее редактирование:
Это костыль.
Если уж так делаешь, то запускай шедулер на следующий тик.
 
Это костыль.
Если уж так делаешь, то запускай шедулер на следующий тик.
Что значит запустить на следующий тик и на сколько подобный способ глупый?
P.S. обновил сообщение выше.
 
Bukkit.getScheduler().runTask(this, ()-> event.getBlock().getLocation.getBlock().setType(Material.OBSIDIAN));
Выполнит задачу на следующий тик.
20 тиков == 1 секунда.
 
Bukkit.getScheduler().runTask(this, ()-> event.getBlock().getLocation.getBlock().setType(Material.OBSIDIAN));
Выполнит задачу на следующий тик.
20 тиков == 1 секунда.
Вау, сразу ставится) Этот момент решили.
Что скажите по поводу этого? http://joxi.ru/E2pgylZsBly97m
На сколько я понял, я же его и заменяю, по этому блок и не меняется, так как ставится на точно такой же.

UPD
Решил просто. Записал в переменную тип блока до изменения, а после вставил его сюда
event.getBlock().setType(material);
В общем то вопрос решен, не знаю на сколько правильным будет такое решение, но мне нравится и всё получилось то, что хотел.
Если у кого будут категоричные возражения против такого способа, то с радостью с ними ознакомлюсь (если в лс напишите).
Тема закрыта, всем большое спасибо за помощь.
 
Последнее редактирование:
Статус
Закрыто для дальнейших ответов.
Назад
Верх