Помогите Получить блоки из схематика

  • Автор темы Автор темы Kurumi
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Kurumi

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Kurumi
Надо получить все блоки из схематика и как-то их "пометить". Неважно, записав в лист их локации или повесить какой-нибудь тэг.

Нужно это для того, чтобы при поломке блока игроком проверять, вставлен ли был этот блок схематиком или нет.

Знатоки, направьте на путь истинный
 
А как вставляется схематик?
 
Надо получить все блоки из схематика и как-то их "пометить". Неважно, записав в лист их локации или повесить какой-нибудь тэг.

Нужно это для того, чтобы при поломке блока игроком проверять, вставлен ли был этот блок схематиком или нет.

Знатоки, направьте на путь истинный
Используй api WE тут есть код от которого можно оттолкнуться http://rubukkit.org/threads/teleport-na-arenu.128026/#post-1392216
 
А как вставляется схематик?
Код:
 final ClipboardFormat format = ClipboardFormats.findByFile(file);
        try (final ClipboardReader reader = format.getReader(new FileInputStream(file))) {
            final Clipboard clipboard = reader.read();
            try (final EditSession editSession = WorldEdit.getInstance().getEditSessionFactory().getEditSession(adaptedWorld, -1)) {
                final Operation operation = new ClipboardHolder(clipboard).createPaste(editSession).to(BlockVector3.at(most.getX() + config.getInt("offset.x"), most.getY() + config.getInt("offset.y"), most.getZ() + config.getInt("offset.z"))).ignoreAirBlocks(true).build();
                try {
                    Operations.complete(operation);
                    editSession.flushSession();
                }
                catch (WorldEditException ex) {
                    ex.printStackTrace();
                }
            }
        }
        catch (FileNotFoundException ex2) {
            ex2.printStackTrace();
        }
 
Код:
 final ClipboardFormat format = ClipboardFormats.findByFile(file);
        try (final ClipboardReader reader = format.getReader(new FileInputStream(file))) {
            final Clipboard clipboard = reader.read();
            try (final EditSession editSession = WorldEdit.getInstance().getEditSessionFactory().getEditSession(adaptedWorld, -1)) {
                final Operation operation = new ClipboardHolder(clipboard).createPaste(editSession).to(BlockVector3.at(most.getX() + config.getInt("offset.x"), most.getY() + config.getInt("offset.y"), most.getZ() + config.getInt("offset.z"))).ignoreAirBlocks(true).build();
                try {
                    Operations.complete(operation);
                    editSession.flushSession();
                }
                catch (WorldEditException ex) {
                    ex.printStackTrace();
                }
            }
        }
        catch (FileNotFoundException ex2) {
            ex2.printStackTrace();
        }
В РеА очень много легаси, но триггер на изменения WE реализован - может подойдёт для какого-то референса, но отличить "свою" сессию от "чужой" в ивенте, на первый взгляд, невозможно. Там реализовано так - сделать враппер для существующего Extent'а, и подменить его в ивенте. В методе setBlock враппера можно записывать координаты блоков.
 
Как то так.
Код:
public class DelegateExtent extends AbstractDelegateExtent {
    public DelegateExtent(Extent extent) {
        super(extent);
    }

    @Override
    public <T extends BlockStateHolder<T>> boolean setBlock(BlockVector3 location, T block) throws WorldEditException {
        //TODO
        return super.setBlock(location, block);
    }
}
Код:
public class MyEventHandler {
    @Subscribe
    public void onEditSessionChange(EditSessionEvent event) {
        if (event.getStage() == EditSession.Stage.BEFORE_CHANGE) {
            event.setExtent(new DelegateExtent(event.getExtent()));
        }
    }
}

Код:
...
    public void onEnable() {
        WorldEdit.getInstance().getEventBus().register(new MyEventHandler());
    }
Как я и писал - не отличить свою сессию от какой-то другой.
 
Про отличить речи не было.
Речь про получение блоков из схематика. Описанный метод будет отдавать вообще все изменения WE.
Выхода вообще нет?
Честно? Без понятия. В EditSessionFactory и EditSessionBuilder можно своего Actor добавить. В теории, можно было бы реализовать своего актёра и сверять в ивенте по своему классу, но не знаю, дружит ли WE с такими делами вообще.
 
Последнее редактирование:
Честно? Без понятия. В EditSessionFactory и EditSessionBuilder можно своего Actor добавить. В теории, можно было бы реализовать своего актёра и сверять в ивенте по своему классу, но не знаю, дружит ли WE с такими делами вообще.
Если не сработает, можно попробовать заранее просчитать блоки из полученного клипборда, добавив координаты относительно локации.
 
Решил свою проблему другим способлм. Всем спасибо
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх