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

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

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

Статус темы:
Закрыта.
  1. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Вообще. где метод setBlock? Как его правильно юзать?
     
  2. Хостинг MineCraft
    <
  3. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Отменяем евент.
    getBlock().getLoc.getWorld.dropItemNaturally (getBlock.getItemStack, getBlock.getLoc);
    block.setType ();
    task;
     
  4. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Нет бы лишний раз погуглить где какие методы, мы будем разводить тему до состояния грязи. Фу быть таким.
     
  5. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Мне кажется мы не много ушли с темы)
    Дело в том, что мне нужно следующие:
    Когда я ломаю блок, который есть в проверке, он как обычно должен сломаться (дропнуться), далее на его месте должен появится обсидиант, а потом (спустя 3 секунды) - светокамень.[DOUBLEPOST=1474134968,1474134827][/DOUBLEPOST]
    Вот так нечего нужного не нашёл.
    Вот так нашёл только эту тему, из которой нашёл следующие 2 строчки:
    loc.setBlock(Material.AIR); //Вроде, точно не помню
    loc.getBlock().setType(Material.AIR); //Это должно работать 100% :cool:
    А как и с чем их юзать не понятно.
    понятное дело что под loc подразумевается локация, но что то не хочет оно работать вот так:
    Location loc = _block.getLocation();
    loc.setBlock...
     
  6. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Ну то что я написал это и делает.
    Тебе же написали что когда вызывается евент, то блок еще не сломан. А когда ты меняешь блок в этом евенте, то выпадет блок тот, на который ты его заменил.
    Решение такое:
    Отменить евент.
    Дропнуть нужный блок вручную.
    Заменить блок на земле.
    Запустить шедулер.
     
  7. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Сделал так и получил то, что мне нужно было.
    Код:
    
    @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 заменяется на светокамень.

    Заменил
    Код:
    event.getBlock().setType(Material.REDSTONE_ORE);
    //на
    event.getBlock().setType(_block.getType());
    
    и после обсидиана нечего не спавнится. Перед этой строкой сделал проверку
    Bukkit.broadcastMessage(_block.getType().toString());
    Тип блока определяется нормально.
     
    Последнее редактирование: 17 сен 2016
  8. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Это костыль.[DOUBLEPOST=1474136107,1474136038][/DOUBLEPOST]Если уж так делаешь, то запускай шедулер на следующий тик.
     
  9. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Что значит запустить на следующий тик и на сколько подобный способ глупый?
    P.S. обновил сообщение выше.
     
  10. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Bukkit.getScheduler().runTask(this, ()-> event.getBlock().getLocation.getBlock().setType(Material.OBSIDIAN));
    Выполнит задачу на следующий тик.
    20 тиков == 1 секунда.
     
  11. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Вау, сразу ставится) Этот момент решили.
    Что скажите по поводу этого? http://joxi.ru/E2pgylZsBly97m
    На сколько я понял, я же его и заменяю, по этому блок и не меняется, так как ставится на точно такой же.

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

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