Если вы пишете плагин и вам нужно не просто вставить схему/схематик, а ещё понять, какие именно блоки были изменены, то вы быстро упираетесь в неожиданную деталь: после вставки вы получаете не “список изменённых блоков”, а объекты, похожие на область/поток изменений. Ниже — практичный способ решить задачу: получить Region места установки и корректно собрать изменённые блоки.


Что именно обычно “ломается” в процессе

Поиск “как загрузить схему worldedit” обычно появляется, когда выполнено “основное” действие (схема вставляется через EditSession), но дальше нужно два ответа:

  • какие блоки реально поменялись на карте;
  • где именно была вставлена схема — то есть получить регион (Region) под эту операцию.

У многих получается “загрузить схему просто”, но при попытке “достать” результат из Extent видят SurvivalExtent или другое не то представление, и список изменений не находится.


Суть решения: ловим изменения во время WorldEdit-операции

Правильный подход — не “после операции спросить мир”, а “во время вставки перехватить, что было set”. Для этого нужно использовать проксирование Extent и журналирование замен.

Идея в одном абзаце

Вставка схемы в WorldEdit меняет мир через вызовы setBlock/setBlockState по Extent. Значит, если обернуть Extent в свой слой и сохранять каждую попытку установки (или итоговую разницу), вы получите точный список материалов/блоков, которые схема пыталась изменить.


Шаг 1: загрузить схематик и выполнить вставку через EditSession

Схематик (например, .schematic) вставляется так:

  • создаёте EditSession;
  • берёте Clipboard из файла (или потока);
  • делаете вставку в выбранной позиции (offset).

Во время вставки создайте “наблюдатель” поверх Extent.

С точки зрения архитектуры вам важно, что EditSession реализует Extent, а значит туда можно подставить ваш прокси-объект.


Шаг 2: получить Region места установки

В большинстве случаев Region можно получить так:

  • вы знаете точку вставки (минимальный угол/позиция);
  • знаете размеры схемы (width/height/length).

Тогда Region легко вычисляется: это прямоугольный объём, который накрывает вставку.

Именно поэтому попытка “получить Region из Extent после вставки” часто заканчивается не тем объектом. Проще и надёжнее — вычислить регион по данным схемы и позициям.

Если схема “вставляться” должна с поворотом/смещением, то используйте итоговые размеры после преобразования (или применяйте bounding-box результат, если вы делаете transform внутри clipboard).


Шаг 3: как собрать список изменённых блоков

Ниже — рабочий принцип “журналирования”.

Что именно записывать

Собирайте изменения в структуру данных, где ключ — координаты блока, а значение — например:
- старый блок → новый блок (или хотя бы новый);
- или итог: “изменился ли реально”.

Критически важно сравнить “до” и “после”. Иначе вы получите “запросы на установку”, а не “реальные изменения”.

Почему это важно

WorldEdit может:
- пытаться установить блоки одинакового типа (особенно при переносе/масках);
- пропускать часть из-за ограничений;
- менять только часть массива.

Поэтому проверка “было/стало” — это ваш способ гарантировать “сломан ли игрок тот блок”, который реально поменялся.


Сравнение подходов

Подход Что получится Главный минус Когда подходит
“Сразу после операции спросить EditSession/Extent” часто ничего полезного или не тот объект (например, SurvivalExtent) не видно списка изменений почти всегда нет
“Вычислить Region по размерам” точное место установки (bounding box) отдельно нужно собирать изменения всегда нужно для контекста
“Перехватить setBlock через обёртку Extent и сравнивать до/после” точный список изменённых блоков нужно аккуратно написать обёртку основной и лучший способ

Практическая логика для “проверки, сломал ли игрок”

После того как вы собрали изменённые блоки, логика проверки обычно такая:

  • у вас есть список координат изменённых блоков;
  • вы храните “до” (например, снимок состояний перед вставкой) или хотя бы умеете получить старое состояние до операции;
  • после операции сравниваете и находите, что стало другим;
  • по событиям (например, BlockBreakEvent) вы связываете, совпали ли изменения с действиями конкретного игрока.

Так вы сможете сказать не “WorldEdit поставил”, а “какой именно блок был затронут”.


Тонкости, из-за которых “не работает”

Есть несколько частых ошибок, которые делают решение бесполезным:

  • Собирать изменения “по факту вызова set”, а не по факту изменения состояния. Тогда список будет шумным.
  • Не учитывать преобразования (повороты/перевороты), из‑за чего угол и итоговый bounding box региона могут быть не теми.
  • Думать, что объект, похожий на Extent, после вставки содержит историю изменений. Обычно он нет: он просто способ писать в мир.

Где найти “правильные точки входа” в коде

Чтобы ваш код был понятным и поддерживаемым, делайте так:

  • Отдельно функция: “вычислить Region по позиции и размерам схемы”.
  • Отдельно функция: “создать журнал изменённых блоков через обёртку Extent”.
  • Отдельно функция: “выполнить вставку Clipboard в EditSession”.
  • Отдельно функция: “сверить список изменённых блоков и проверить, совпадает ли с действиями игрока”.

Так вы получите решение “сначала просто вставить, потом сделать проверку” — ровно то, что нужно для вашей задачи.


Что такое WorldEdit и почему он так удобен для вставки схем

WorldEdit — это библиотека/модуль для работы с регионами, командами и редактированием мира. В вашем плагине он полезен тем, что:
- умеет загружать и вставлять схемы (схема, схематик);
- даёт единый интерфейс EditSession и Extent;
- позволяет применять трансформации и работу с выделениями (регион, bounding box).

Поэтому основная ценность не в командах (хотя они тоже есть), а в том, что вы можете встроиться в процесс записи блоков и собрать данные.


Краткий итог

Чтобы загрузить схему через WorldEdit и получить список реально изменённых блоков:

  • используйте EditSession и вставку Clipboard;
  • получите регион вставки не “из непонятного Extent”, а вычислением bounding box по позиции и размерам;
  • оберните Extent и журналируйте установку блоков с обязательным сравнением “до/после”.

Так вы получите точный результат: какие материалы/блоки реально изменились, и сможете корректно проверить “сломан ли блок” игроком после вставки.