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

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

Exception_Prototype

Активный участник
Пользователь
Баллы
96
Сломался блок. Я перехватил этот блок слушателем. Если это тот блок, который мне нужно, то на его место нужно поставить другой блок через ~3 секунды.
Как думал: при перехвате события проверять какой блок сломался, далее, если сломанный блок есть в проверке, то запустить в отдельном потоке установку нового блока на место сломанного с задержкой Thread.sleep(3000);
setBlock...

Правильно ли будет так сделать? Какие проблемы могут возникнуть?
 
Не правильно.
Гугли "Bukkit Scheduler"
Java:
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
       public void run() {
         //что то делать?
       }
}, 20, 20);
Но на сколько я понял, это таймер с постоянным вызовом, но мне надо только 1 раз поставить блок и закрыть поток.

Хм... Bukkit.getScheduler().runTask(plugin, runnable); ...
 
Последнее редактирование:
Java:
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
       public void run() {
         //что то делать?
       }
}, 20, 20);
Но на сколько я понял, это таймер с постоянным вызовом, но мне надо только 1 раз поставить блок и закрыть поток.
runTaskLater
 
А как временно остановить поток ? Так же как и обычно?
Thread.sleep(3000); ?

Java:
@EventHandler
    public void BlockBreakEvent(BlockBreakEvent event) {
        for (Block _block : api.ListCheckingBlocks) {
            if (_block.equals(event.getBlock())) {
                Bukkit.getScheduler().runTask(this, () -> {
                    try {
                        event.getBlock().setType(Material.OBSIDIAN);
                        Thread.sleep(3000);
                        event.getBlock().setType(Material.GLOWSTONE);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                    }
                });
            }
        }

    }

Чёт сколько сижу пытаюсь не получается, явно видно, что подобной шнягой виснет на это время весь сервак.
 
Пример выше не правильный, я сразу использовал Later.
Java:
Bukkit.getScheduler().runTaskLater(this, () -> {
                    event.getBlock().setType(Material.OBSIDIAN);

                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    event.getBlock().setType(Material.GLOWSTONE);
                }, 20L);
Нашёл в гугле. Что такое 20L ?
И как в данном случае работает поток?
 
Пример выше не правильный, я сразу использовал Later.
Java:
Bukkit.getScheduler().runTaskLater(this, () -> {
                    event.getBlock().setType(Material.OBSIDIAN);

                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    event.getBlock().setType(Material.GLOWSTONE);
                }, 20L);
Нашёл в гугле. Что такое 20L ?
И как в данном случае работает поток?
L - лонг (длинна)
 
Можете пожалуйста примером показать, до меня чёт не доходит.

А что одна секунда? Для чего она? Перезапустится задача спустя 1 секунду или что?
ну единица измерения типо.
есть инты, есть даблы, а есть лонг.
 
Можете пожалуйста примером показать, до меня чёт не доходит.

А что одна секунда? Для чего она? Перезапустится задача спустя 1 секунду или что?
Выполнится задача через одну секунду.
 
Выполнится задача через одну секунду.
Ага, понятно. Спасибо огромное) То что нужно было получилось, единственное что, мне не понятен момент 1.
Java:
if (_block.equals(event.getBlock())) {

                event.getBlock().setType(Material.OBSIDIAN);

                Bukkit.getScheduler().runTaskLater(this, () -> {
                    event.getBlock().setType(Material.GLOWSTONE);
                }, 60L);

            }

Почему блок обсидиана не появляется?
Просто спустя 3 секунды появляется GLOWSTONE.
 
Java:
@EventHandler
    public void BlockBreakEvent(BlockBreakEvent event) {
        
        for (Block _block : api.ListCheckingBlocks) {
            if (_block.equals(event.getBlock())) {

                event.getBlock().setType(Material.OBSIDIAN);

                Bukkit.getScheduler().runTaskLater(this, () -> {
                    event.getBlock().setType(Material.REDSTONE_ORE);
                }, 60L);
                return;
            }
        }
    }
Как только я ломал блок, который есть в проверке (в данном случае там блок красной руды), то мне выпадал обсидиан. wtf
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх