1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Баллы:
    96
    Сделал так и получил то, что мне нужно было.
    Код:
    
    @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
  7. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooo
    Это костыль.
    Если уж так делаешь, то запускай шедулер на следующий тик.
     
  8. Автор темы
    Exception_Prototype

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

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

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

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

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

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

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

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