- Суть решения: ловим изменения во время WorldEdit-операции
- Шаг 1: загрузить схематик и выполнить вставку через EditSession
- Шаг 2: получить Region места установки
- Шаг 3: как собрать список изменённых блоков
- Сравнение подходов
- Практическая логика для “проверки, сломал ли игрок”
- Тонкости, из-за которых “не работает”
- Где найти “правильные точки входа” в коде
- Что такое WorldEdit и почему он так удобен для вставки схем
- Краткий итог
Если вы пишете плагин и вам нужно не просто вставить схему/схематик, а ещё понять, какие именно блоки были изменены, то вы быстро упираетесь в неожиданную деталь: после вставки вы получаете не “список изменённых блоков”, а объекты, похожие на область/поток изменений. Ниже — практичный способ решить задачу: получить 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и журналируйте установку блоков с обязательным сравнением “до/после”.
Так вы получите точный результат: какие материалы/блоки реально изменились, и сможете корректно проверить “сломан ли блок” игроком после вставки.