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

Вставить регион и заменить сундуки WE API

Тема в разделе "Разработка плагинов для новичков", создана пользователем Snowmaze, 6 июн 2019.

  1. Автор темы
    Snowmaze

    Snowmaze Участник Пользователь

    Баллы:
    36
    Мне нужно вставить регион скопированный с помощью //copy и заменить в нём сундуки на воздух. Как можно сделать? Версия 1.12.2
     
  2. HauserGrim

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

    Баллы:
    96
    Вставить с помощью //paste, а потом выделить новое место и заменить сундуки на воздух с помощью //replace chest air
     
  3. Автор темы
    Snowmaze

    Snowmaze Участник Пользователь

    Баллы:
    36
    World Edit API, кодом надо
     
  4. LuckyZeeRo

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

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Не по разделу отвечаешь
     
  5. HauserGrim

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

    Баллы:
    96
    Опять... Сорян
    Какого меня вообще сюда занесло?!
     
  6. alexandrage

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

    Баллы:
    173
    Код:
    WorldEdit.getInstance().getEventBus().register(new MyEventHandler());
    Код:
    package Example;
    
    import com.sk89q.worldedit.event.extent.EditSessionEvent;
    import com.sk89q.worldedit.util.eventbus.Subscribe;
    import com.sk89q.worldedit.EditSession;
    
    public class MyEventHandler {
        @Subscribe
        public void onEditSessionChange(EditSessionEvent event) {
            if (event.getStage() == EditSession.Stage.BEFORE_CHANGE) {
                event.setExtent(new DelegateExtent(event.getExtent()));
            }
        }
    }
    Код:
    package Example;
    
    import com.sk89q.worldedit.WorldEditException;
    import com.sk89q.worldedit.extent.AbstractDelegateExtent;
    import com.sk89q.worldedit.extent.Extent;
    import com.sk89q.worldedit.math.BlockVector3;
    import com.sk89q.worldedit.world.block.BlockStateHolder;
    
    public class DelegateExtent extends AbstractDelegateExtent {
        public DelegateExtent(Extent extent) {
            super(extent);
        }
    
        @Override
        public boolean setBlock(BlockVector3 location, BlockStateHolder block) throws WorldEditException {
            BlockStateHolder oldBlock = getBlock(location);
            if(block.getAsString().equals("minecraft:chest")) {
                //TODO не знаю пока как поменять стату). Не искал, потому просто пропуск.
                return true;
            }
            return super.setBlock(location, block);
        }
    }
     
    Последнее редактирование: 6 июн 2019
  7. Автор темы
    Snowmaze

    Snowmaze Участник Пользователь

    Баллы:
    36
    2019-06-06_11-31-58.png Посмотреть вложение 54027 Посмотреть вложение 54026
    Почему-то не работает, я проставил логи, там метод onEditSessionChange ещё вызывается,а setBlock уже не вызывается. Сундук остаётся
     
    Последнее редактирование: 6 июн 2019
  8. alexandrage

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

    Баллы:
    173
    Касячек допустил. Там блок проверялся не в клипбоарде, а на карте). Поправил.
     
  9. alexandrage

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

    Баллы:
    173
    Пошамань с EditSession.Stage, может тебе на другой стадии ловить надо.
     
  10. Автор темы
    Snowmaze

    Snowmaze Участник Пользователь

    Баллы:
    36
    Пошаманил, но сам метод setBlock не вызывается, хотя
    Код:
    event.getStage() == EditSession.Stage.BEFORE_CHANGE
    возвращает true два раза
     
  11. alexandrage

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

    Баллы:
    173
    Ну все значит работает, если только еще какой то плагин не подменяет Extent.
     
  12. Автор темы
    Snowmaze

    Snowmaze Участник Пользователь

    Баллы:
    36
    Это локалка, тут нету ничего не заменяет. А сундуки как были так и остаются. У меня стоит API 7.0.0 версии если надо
     

    Вложения:

  13. alexandrage

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

    Баллы:
    173
    Уж не знаю как ты сломал, то что юзалось и работало. На той же версии причем. Ток у меня проверялся блок в мире, вся разница.
     
  14. Автор темы
    Snowmaze

    Snowmaze Участник Пользователь

    Баллы:
    36
    Я всё точно перекопил. Если происходит проверка, то по идее должен вызываться метод setBlock, но он так и не вызывался
    2019-06-06_14-00-28.png 2019-06-06_14-00-42.png 2019-06-06_14-00-52.png
     
  15. alexandrage

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

    Баллы:
    173
    Вот собрал тебе, там нужно было вот так.

    Код:
    public class DelegateExtent extends AbstractDelegateExtent {
        public DelegateExtent(Extent extent) {
            super(extent);
        }
    
        @Override
        public boolean setBlock(BlockVector3 location, BlockStateHolder block) throws WorldEditException {
            if (block.getAsString().contains("minecraft:chest")) {
                return true;
            }
            return super.setBlock(location, block);
        }
    }
     
    Последнее редактирование: 6 июн 2019
  16. Автор темы
    Snowmaze

    Snowmaze Участник Пользователь

    Баллы:
    36
    Ссылка почему-то не работает и сундуки всё равно вставляются xD
    Как не изменяй этот setBlock внутри, факт - этот метод вообще не вызывается
    Надеюсь, этот Extent используется до paste,а не после
     

    Вложения:

    Последнее редактирование: 6 июн 2019
  17. alexandrage

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

    Баллы:
    173
    Все, нашел как сетнуть воздух. Обновил плаг. Ссылку поправил.
    Код:
            if (block.getAsString().contains("minecraft:chest")) {
                return super.setBlock(location, BukkitAdapter.adapt(Bukkit.createBlockData(Material.AIR)));
            }
     
  18. alexandrage

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

    Баллы:
    173
    Он и юзается во время set и paste.
     
  19. Автор темы
    Snowmaze

    Snowmaze Участник Пользователь

    Баллы:
    36
    Вы видимо в том плагине в ссылке забыли добавить либу, у меня всю консоль заспамило наллами :D
     
  20. alexandrage

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

    Баллы:
    173
    Какими либами? we и spigot, все.
     

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