Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

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

Discussion in 'Разработка плагинов для новичков' started by Exception_Prototype, Sep 17, 2016.

Thread Status:
Not open for further replies.
  1. Автор темы
    Exception_Prototype

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

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

    Правильно ли будет так сделать? Какие проблемы могут возникнуть?
     
  2. Хостинг MineCraft
    <
  3. Mr_RoboMan

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

    Trophy Points:
    123
    Не правильно.
    Гугли "Bukkit Scheduler"
     
  4. ZONCCK

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

    Trophy Points:
    78
    Skype:
    car-donate
    Имя в Minecraft:
    ZONCCK
    А почему нельзя реализовать так, как описал ТС?
     
  5. Mr_RoboMan

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

    Trophy Points:
    123
    ХЗ... Поэтому призываю @CoolBoy @Dereku ибо я сам хз как это объяснить :D
     
  6. Автор темы
    Exception_Prototype

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

    Trophy Points:
    46
    Code:
    Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
           public void run() {
             //что то делать?
           }
    }, 20, 20);
    
    Но на сколько я понял, это таймер с постоянным вызовом, но мне надо только 1 раз поставить блок и закрыть поток.

    Хм... Bukkit.getScheduler().runTask(plugin, runnable); ...
     
    Last edited: Sep 17, 2016
  7. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    runTaskLater
     
  8. Автор темы
    Exception_Prototype

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

    Trophy Points:
    46
    А как временно остановить поток ? Так же как и обычно?
    Thread.sleep(3000); ?

    Code:
    
    @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);
                        }
                    });
                }
            }
    
        }
    
    
    [DOUBLEPOST=1474129773,1474126273][/DOUBLEPOST]Чёт сколько сижу пытаюсь не получается, явно видно, что подобной шнягой виснет на это время весь сервак.
     
  9. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    runTaskLater
     
  10. Автор темы
    Exception_Prototype

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

    Trophy Points:
    46
    Пример выше не правильный, я сразу использовал Later.
    Code:
    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 ?
    И как в данном случае работает поток?
     
  11. xDark

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

    Trophy Points:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    L - лонг (длинна)
     
  12. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Убрать.
    20 == 1 секунда
     
  13. Автор темы
    Exception_Prototype

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

    Trophy Points:
    46
    Можете пожалуйста примером показать, до меня чёт не доходит.[DOUBLEPOST=1474131911,1474131858][/DOUBLEPOST]
    А что одна секунда? Для чего она? Перезапустится задача спустя 1 секунду или что?
     
  14. xDark

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

    Trophy Points:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    ну единица измерения типо.
    есть инты, есть даблы, а есть лонг.
     
  15. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Выполнится задача через одну секунду.
     
  16. Автор темы
    Exception_Prototype

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

    Trophy Points:
    46
    Ага, понятно. Спасибо огромное) То что нужно было получилось, единственное что, мне не понятен момент 1.
    Code:
    if (_block.equals(event.getBlock())) {
    
                    event.getBlock().setType(Material.OBSIDIAN);
    
                    Bukkit.getScheduler().runTaskLater(this, () -> {
                        event.getBlock().setType(Material.GLOWSTONE);
                    }, 60L);
    
                }
    
    Почему блок обсидиана не появляется?
    Просто спустя 3 секунды появляется GLOWSTONE.
     
  17. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Пробуй отменять евент.
     
  18. Автор темы
    Exception_Prototype

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

    Trophy Points:
    46
    А смысл?
     
  19. xDark

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

    Trophy Points:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    yes
     
  20. Автор темы
    Exception_Prototype

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

    Trophy Points:
    46
    Code:
    @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
     
  21. Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Потому что для сервера ты ещё не сломал блок.
     
Thread Status:
Not open for further replies.

Share This Page