Проецируемая валидация мультиблока

Версия Minecraft
1.16.4
API
Forge
205
12
103
Короче, хочу сделать проверку мультиблока относительными координатами, но с назначением заранее заготовленной карты. Сперва покажу на двухмерном примере:
AAAAA
ASSSA
ASCSA
ASSSA
AAAAA
Где А - блоки воздуха, S - блоки камня, а C - центральный блок, от которого идет валидация структуры.

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

Возьмем другой пример уже более сложный, т.к. трехмерный:
AAA
ASA
AAA

AAA
ACA
AAA

AAA
ASA
AAA
Обозначения те же: центральный блок, камень и воздух.

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

Тут степень моего непонимания правильной реализации возросла еще в несколько раз, потому я и пишу сюда. Буду рад идеям или ссылкам на готовые реализации, дабы понять принцип работы.
 
7,099
324
1,510
Как происходит валидация? Как центральный блок узнает, что блок в углу структуры поменялся? Отслеживать изменение соседних блоком можно только со смежных сторон.

Если представить, что вышеописанная проблема решена, то для валидации достаточно двух вещей: задающий структуру трехмерный массив IBlockState и смещение мастер-блока от начала структуры. Когда какой-то блок в структуре меняется - то вычиаем из абсолютных координат измененного блока абсолютные координаты мастер-блока и добавляем относительные координаты мастер-блока, получаем координаты в пределах массива и чекаем, совпадает ли новый блокстейт с ожидаемым блостейтом
 
205
12
103
Да, вопросов нереально много, потому что я в принципе не представляю, как это реализовать на практике. Есть только мелкие теории.

Валидацию структуры нужно проводить из точки триггера, которая и будет центром. В моем случае это блок. Затем, в этом массиве строк нужно объяснить, какой именно блок и на какой позиции является центром. Он будет точкой отсчёта. Затем, нужно определиться с принципом сканирования. Вариантов не так много, как мне кажется: спиральный и линейный, но конкретно в моем случае линейный будет наиболее оптимальным.

Окей, допустим, я заведомо знаю, какая точка у меня является центральной, а значит, у меня есть фиксированная координата для сравнения относительных.
Мне нужно получить весь "массив массивов", который я условно называю "слоем", поочередно вытянуть из него каждую строчку и прошерстить фором. Вроде как на этом вопрос валидации разрешен, т.к. известен старт (на самом деле нет, я все еще не представляю, как это сделать в виде кода).

Что же касается проверки "поврежденности" конструкции: вариант с ивентом разрушения блока сразу отпадает, ибо способов его обойти чрезмерно много. Остается обновление мастер-блока. Данный вариант также вызывает массу подозрений, ибо постоянное сканирование потенциально огромной территории - беды с ТПС. Можно, разве что, выполнять эту процедуру не каждый такт, а раз в секунду, например. Но это всё ещё плохое решение. Я пока не знаю, есть ли ивент, который отлавливает абсолютные изменения блоков в чанке, а не только их разрушение.
 

Sainthozier

Стрелочник
623
11
369
проверки "поврежденности" конструкции
Ну, многоблочная структура может подразумевать под собой множество разновидностей.
Я сомневаюсь, что вообще есть смысл постоянно чекать валидность мультиблока. Лично я чекал всегда на этапе какого-то действия, будь то открытие гуишки или активация тайла, если это многоблочная структура, по типу алтаря какого-то или что-то в этом роде. И пока тикал тайл, я чекал, что структура валидная, если за время ритуала менялась целостность структуры - просто отрубал дальнейший процессинг и выводил инфо о том, что структура не валидна, that's it.

На словах изян, на практике полно говнокода. Я тоже займусь мультиблоками со строковым паттерном, мне пригодятся в будущем, могу потом поделиться своей версией реализации.
 
Сверху