From 65aa26996ddf8eb57ad408ab4e0ef20e56077ed2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=98=D0=9D?= Date: Sun, 31 May 2026 11:10:58 +0300 Subject: [PATCH 1/4] =?UTF-8?q?feat(09):=20=D0=BC=D0=B0=D1=82=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=D0=B0=D0=BB=20studs=20+=20=D0=BE=D0=BA=D1=80=D0=B0=D1=88?= =?UTF-8?q?=D0=B8=D0=B2=D0=B0=D0=B5=D0=BC=D1=8B=D0=B9=20=D0=B1=D0=BB=D0=BE?= =?UTF-8?q?=D0=BA=20studs-block=20+=20=D0=BB=D0=B5=D0=B3=D0=BE-=D1=81?= =?UTF-8?q?=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Задача 09 «Studs материал» (лего-кружки): - PrimitiveManager: material 'studs' — diffuse-текстура (серые кружки) × цвет меша + normal map (выпуклость). Тайлинг _studsTiling по размеру меша (STUD_UNIT=1, GRID=4), пересчёт в _recreateMesh при ресайзе. _studsDims на меше. - InspectorPanel: «Studs» 5-й материал в палитре примитивов. - BlockTypes: studs-block ('Окрашиваемые', colorable:true, normal, defaultColor). - BlockManager: per-instance color через ThinInstance color buffer (thinInstanceSetBuffer('color'), useVertexColors) — тысячи блоков любых цветов один draw call. addBlock(x,y,z,type,color), _setBlockColorAt/setBlockColor, serialize/loadFromArray с color, batch flush. - GameRuntime: scene.setColor для блока (ref 'block:x,y,z'), spawn block с color. - ScriptSandboxWorker: spawn блока прокидывает color. - ModelTypes: лего-сет 19 compound-моделей (кирпичи/плиты/скаты/дерево/куст/ дом/машина/ступеньки/человечек) — все части material:'studs'. - Вики: карточка g5 #56 «Лего-полигон» + урок guide-lego. Текстуры: public/kubikon-assets/materials/studs_{diffuse,normal}.png (в .gitignore, доставить на S2 build/ вручную). Проверено визуально: куб 6×6 кружков, 2×2 блока разных цветов, лего-дом/дерево/машина. Co-Authored-By: Claude Opus 4.8 --- src/community/docsGames.js | 5 ++ src/community/docsLessons.jsx | 82 +++++++++++++++++++++ src/editor/InspectorPanel.jsx | 1 + src/editor/engine/BlockManager.js | 91 +++++++++++++++++++++++- src/editor/engine/BlockTypes.js | 9 +++ src/editor/engine/GameRuntime.js | 13 +++- src/editor/engine/ModelTypes.js | 91 ++++++++++++++++++++++++ src/editor/engine/PrimitiveManager.js | 82 +++++++++++++++++++++ src/editor/engine/ScriptSandboxWorker.js | 3 +- 9 files changed, 373 insertions(+), 4 deletions(-) diff --git a/src/community/docsGames.js b/src/community/docsGames.js index 3c2b525..d16b363 100644 --- a/src/community/docsGames.js +++ b/src/community/docsGames.js @@ -323,4 +323,9 @@ export const GAMES = [ desc: '3D-стрелка-указатель «иди сюда»: дорожка из бегущих шевронов + парящий маркер над целью. Дошёл — стрелка прыгает на следующую.', mechanics: ['game.fx.pointer', 'preset стрелки', 'setTarget/update', 'onTouch цели'], previewShot: 'guide-strelka-scene.png', openProjectId: 333, ready: true }, + { id: 'guide-lego', num: 56, group: 'g5', stars: 1, icon: 'cube', + title: 'Лего-полигон — studs материал', + desc: 'Лего-кружки (studs) на блоках и примитивах любого цвета: зелёный пол, оранжевая стена, разноцветные кубы + готовый лего-сет (дерево, дом, машина).', + mechanics: ['material: studs', 'studs-block (цвет на блок)', 'тайлинг по размеру', 'лего-сет моделей'], + previewShot: 'guide-lego-scene.png', openProjectId: 0, ready: true }, ]; diff --git a/src/community/docsLessons.jsx b/src/community/docsLessons.jsx index a6f657a..07d451f 100644 --- a/src/community/docsLessons.jsx +++ b/src/community/docsLessons.jsx @@ -7900,6 +7900,88 @@ game.after(0.4, () => { ), }, + 'guide-lego': { + body: ( + <> +

Что получится

+

+ Лего-полигон в стиле Roblox: зелёный пол и оранжевая + стена из окрашиваемых блоков, жёлтая ступенька, синий + куб и фиолетовые кубики — все с узнаваемой текстурой + «studs» (лего-кружки). В углу — готовый лего-сет: + деревья, дом и машина. Один и тот же материал, любой цвет — как + настоящий конструктор. +

+ + + +

Чему научишься

+
    +
  • material: 'studs' — лего-текстура на любом примитиве + (куб, сфера, цилиндр), цвет берётся из обычного color;
  • +
  • studs-block — окрашиваемый блок: один тип, цвет + задаётся на каждый блок (per-instance), тысячи блоков — один + draw call;
  • +
  • тайлинг по размеру — кружки не растягиваются: куб 4×4 + покажет 4×4 studs, куб 1×1 — один;
  • +
  • лего-сет — готовые модели (кирпичи, плиты, скаты, + дерево, дом, машина, человечек) из studs-примитивов.
  • +
+ +

Шаг 1. Пол и стена из studs-блоков

+ + + В палитре блоков открой категорию «Окрашиваемые» — там + блок Лего-кирпич (studs-block). Под + палитрой появится выбор цвета. + + + Поставь зелёным цветом большой пол (30×30), затем оранжевым — + стену вдоль дальнего края. Цвет каждого блока сохраняется + отдельно — стена и пол из одного типа блока. + + +

Шаг 2. Studs на примитивах

+ + Поставь куб (Примитив → cube). В инспекторе справа выбери + материал «Studs» (пятый рядом с Матовый/Металл/Стекло/Неон) + и задай цвет. Готово — лего-кружки на всех гранях. + + + Размер кружков считается автоматически от размера меша: растяни + куб — studs останутся того же масштаба, просто их станет больше. + + +

Шаг 3. Через код

+ + {`// Окрашиваемый блок — пол: +for (let x = -15; x < 15; x++) + for (let z = -15; z < 15; z++) + game.scene.spawn('block:studs-block', { x, y: 0, z, color: '#5cba35' }); + +// Примитив с лего-текстурой: +game.scene.spawn('primitive:cube', { + x: 0, y: 1, z: 0, sx: 2, sy: 2, sz: 2, + color: '#3a7aff', material: 'studs', +}); + +// Готовая модель из лего-сета: +game.scene.spawn('model:lego-house-small', { x: 10, y: 0, z: -10 }); + +// Сменить цвет блока на лету: +game.scene.setColor('block:0,0,0', '#ff0000');`} + + + Собери из лего-кирпичей разных размеров (1×2, 2×4, 2×8) свою + постройку, покрась каждый ряд в свой цвет — и поставь сверху + готовую лего-машину из набора. + + + ), + }, + }; /** Есть ли готовый текст урока для игры с таким id. */ diff --git a/src/editor/InspectorPanel.jsx b/src/editor/InspectorPanel.jsx index 6c91732..a602e8a 100644 --- a/src/editor/InspectorPanel.jsx +++ b/src/editor/InspectorPanel.jsx @@ -267,6 +267,7 @@ const PRIMITIVE_MATERIALS = [ { id: 'metal', name: 'Металл' }, { id: 'glass', name: 'Стекло' }, { id: 'neon', name: 'Неон' }, + { id: 'studs', name: 'Studs' }, // задача 09 — лего-кружки (любой цвет) ]; /** Форматирование массы — без хвоста из десятичных. Целые без запятой. */ diff --git a/src/editor/engine/BlockManager.js b/src/editor/engine/BlockManager.js index de4dcc1..0a3ed3b 100644 --- a/src/editor/engine/BlockManager.js +++ b/src/editor/engine/BlockManager.js @@ -94,6 +94,10 @@ export class BlockManager { this._lavaSurfaceBaseY = null; this._lavaDirty = false; this._animTime = 0; + // Окрашиваемые блоки (studs-block, задача 09): per-instance color через + // ThinInstance color buffer. blockTypeId → Float32Array(maxBlocks*4 RGBA). + this._colorsByProto = new Map(); + this._STUDS_MAX = 20000; // макс блоков одного окрашиваемого типа } /** Вызывать каждый кадр для анимации воды/лавы. */ @@ -359,6 +363,22 @@ export class BlockManager { const mat = new StandardMaterial(name, this.scene); mat.specularColor = new Color3(0, 0, 0); + // Окрашиваемый блок (studs-block): цвет берётся per-instance из vertex + // color буфера ThinInstance и умножается на серую текстуру. Включаем + // useVertexColors, normal map (выпуклость кружков), мягкий спекуляр. + if (blockType.colorable) { + const tex = new Texture(texturePath, this.scene); + mat.diffuseTexture = tex; + mat.diffuseColor = new Color3(1, 1, 1); // нейтраль — цвет идёт из vertex color + if (blockType.normal) { + try { mat.bumpTexture = new Texture(blockType.normal, this.scene); } catch (e) {} + } + mat.specularColor = new Color3(0.2, 0.2, 0.2); + mat.specularPower = 24; + mat.useVertexColors = true; + return mat; + } + if (texturePath) { const tex = new Texture(texturePath, this.scene); tex.updateSamplingMode(Texture.NEAREST_SAMPLINGMODE); @@ -439,7 +459,7 @@ export class BlockManager { * один meshes-prototype на тип блока, тысячи позиций в одном draw call. * Жидкости (water/lava) идут по старому пути — у них свой single-surface. */ - addBlock(x, y, z, blockTypeId) { + addBlock(x, y, z, blockTypeId, color) { const ix = Math.round(x); const iy = Math.round(y); const iz = Math.round(z); @@ -449,6 +469,9 @@ export class BlockManager { const typeDef = getBlockType(blockTypeId); const isWater = !!typeDef?.isWater; const isLava = !!typeDef?.isLava; + // Окрашиваемый блок: цвет инстанса (из аргумента или дефолт типа). + const colorable = !!typeDef?.colorable; + const instColor = colorable ? (color || typeDef.defaultColor || '#cccccc') : null; // Для жидкостей оставляем старую логику: невидимый куб + единый surface if (isWater || isLava) { @@ -496,6 +519,9 @@ export class BlockManager { keysArr[idx] = key; this._cellToInst.set(key, { typeId: blockTypeId, idx }); + // Окрашиваемый блок — пишем цвет инстанса в color buffer. + if (colorable) this._setBlockColorAt(blockTypeId, idx, instColor); + // Логический «meshProxy» — объект, имитирующий API mesh для совместимости. // НЕ создаёт реального меша. Используется selection / removeBlockByMesh. const meshProxy = { @@ -511,6 +537,7 @@ export class BlockManager { mass: 1, folderId: null, _thinIdx: idx, + color: instColor, // per-instance цвет окрашиваемого блока }, // Минимальные методы, которые ожидает остальной код position: new Vector3(ix, iy + 0.5, iz), @@ -538,6 +565,18 @@ export class BlockManager { proto.material = material; if (isMulti) this._setupSubmeshes(proto); + // Окрашиваемый блок — включаем per-instance color buffer (vertex colors). + const _bt = getBlockType(blockTypeId); + if (_bt && _bt.colorable) { + proto.useVertexColors = true; + proto.hasVertexAlpha = false; + const buf = new Float32Array(this._STUDS_MAX * 4); + // Дефолт-цвет (белый) для всех слотов — иначе невыставленные = чёрные. + buf.fill(1); + proto.thinInstanceSetBuffer('color', buf, 4, false); + this._colorsByProto.set(blockTypeId, buf); + } + proto.checkCollisions = false; // коллизии через thin-instances не работают штатно; // PlayerController в Play-режиме читает blocks Map напрямую (см. PhysicsAABB). proto.isPickable = true; @@ -569,6 +608,44 @@ export class BlockManager { /** Подписка для уведомлений о создании prototype-меша (для shadow setup). */ setOnProtoCreated(cb) { this._onProtoCreated = cb; } + /** + * Записать цвет инстанса окрашиваемого блока в color buffer (RGBA float). + * idx — индекс thin-instance. hex — '#rrggbb'. В batch-режиме обновление + * GPU откладывается (флаг dirty), иначе сразу thinInstanceBufferUpdated. + */ + _setBlockColorAt(blockTypeId, idx, hex) { + const buf = this._colorsByProto.get(blockTypeId); + if (!buf) return; + const c = Color3.FromHexString(hex || '#cccccc'); + const o = idx * 4; + buf[o] = c.r; buf[o + 1] = c.g; buf[o + 2] = c.b; buf[o + 3] = 1; + const proto = this._protoMeshes.get(blockTypeId); + if (!proto) return; + if (this._batchMode) { + if (!this._colorDirtyProtos) this._colorDirtyProtos = new Set(); + this._colorDirtyProtos.add(blockTypeId); + } else { + try { proto.thinInstanceBufferUpdated('color'); } catch (e) { /* ignore */ } + } + } + + /** + * Сменить цвет окрашиваемого блока в (x,y,z) на лету (для scene.setColor / + * color-пикера). Возвращает true если блок окрашиваемый и цвет применён. + */ + setBlockColor(x, y, z, hex) { + const key = this._key(Math.round(x), Math.round(y), Math.round(z)); + const inst = this._cellToInst.get(key); + if (!inst) return false; + const bt = getBlockType(inst.typeId); + if (!bt || !bt.colorable) return false; + this._setBlockColorAt(inst.typeId, inst.idx, hex); + const mp = this.blocks.get(key); + if (mp && mp.metadata) mp.metadata.color = hex; + this._notifyChange(); + return true; + } + /** Установить флаг anchored у блока. */ setBlockAnchored(x, y, z, anchored) { const mesh = this.blocks.get(this._key(x, y, z)); @@ -765,6 +842,8 @@ export class BlockManager { canCollide: m.canCollide !== false, visible: m.visible !== false, mass: m.mass ?? 1, + // per-instance цвет окрашиваемого блока (studs-block); иначе пропускаем + ...(m.color ? { color: m.color } : {}), }); } return out; @@ -776,7 +855,7 @@ export class BlockManager { this._batchMode = true; try { for (const b of arr) { - const mesh = this.addBlock(b.x, b.y, b.z, b.type); + const mesh = this.addBlock(b.x, b.y, b.z, b.type, b.color); if (!mesh) continue; if (b.anchored === false) { mesh.metadata.anchored = false; @@ -800,6 +879,14 @@ export class BlockManager { proto.thinInstanceRefreshBoundingInfo(true); } catch (e) { /* ignore */ } } + // Финальный refresh color-буферов окрашиваемых блоков (batch). + if (this._colorDirtyProtos) { + for (const typeId of this._colorDirtyProtos) { + const proto = this._protoMeshes.get(typeId); + try { proto?.thinInstanceBufferUpdated('color'); } catch (e) { /* ignore */ } + } + this._colorDirtyProtos.clear(); + } } clear() { diff --git a/src/editor/engine/BlockTypes.js b/src/editor/engine/BlockTypes.js index b8da9ac..c58181f 100644 --- a/src/editor/engine/BlockTypes.js +++ b/src/editor/engine/BlockTypes.js @@ -105,6 +105,14 @@ export const BLOCK_TYPES = [ // top = stone, side = oven (4 стороны с дверцей — лучше чем раньше), // bottom = stone. В будущем для одной двери понадобится 6-face формат. multiCube('oven', 'Печь', 'Особые', `${TEX}/stone.png`, `${TEX}/oven.png`, `${TEX}/stone.png`), + + // === ОКРАШИВАЕМЫЕ (задача 09) === + // studs-block: лего-кирпич, цвет задаётся per-instance (vertex color на + // ThinInstance умножается на серую studs-текстуру). colorable:true говорит + // палитре показать color-пикер, BlockManager — включить color buffer. + cube('studs-block', 'Лего-кирпич', 'Окрашиваемые', + '/kubikon-assets/materials/studs_diffuse.png', + { colorable: true, normal: '/kubikon-assets/materials/studs_normal.png', defaultColor: '#3a7aff' }), ]; /** Все доступные категории в порядке появления. */ @@ -121,6 +129,7 @@ export const CATEGORY_COLORS = { 'Особые': '#9966ff', 'Природа': '#5a8c3e', 'Тест': '#3357FF', + 'Окрашиваемые': '#3a7aff', }; /** diff --git a/src/editor/engine/GameRuntime.js b/src/editor/engine/GameRuntime.js index 2aaae16..de0c3f9 100644 --- a/src/editor/engine/GameRuntime.js +++ b/src/editor/engine/GameRuntime.js @@ -2550,6 +2550,16 @@ export class GameRuntime { try { const color = payload?.color; if (typeof color !== 'string') return; + // Окрашиваемый блок (studs-block): ref вида 'block:x,y,z' → + // меняем per-instance цвет через BlockManager.setBlockColor. + const ref = payload?.id; + if (typeof ref === 'string' && ref.startsWith('block:')) { + const parts = ref.slice(6).split(',').map(Number); + if (parts.length === 3 && parts.every(Number.isFinite)) { + this.scene3d?.blockManager?.setBlockColor?.(parts[0], parts[1], parts[2], color); + } + return; + } const pm = this.scene3d?.primitiveManager; if (!pm) return; const rid = this._resolvePrimitiveId(payload?.id); @@ -3383,7 +3393,8 @@ export class GameRuntime { if (!this._localToReal) this._localToReal = new Map(); try { if (kind === 'block') { - this.scene3d?.blockManager?.addBlock(payload.x, payload.y, payload.z, subType); + // color — для окрашиваемых блоков (studs-block); иначе игнорируется. + this.scene3d?.blockManager?.addBlock(payload.x, payload.y, payload.z, subType, payload.color); // Для блоков ref детерминированный, но запоминаем — чтобы при // Stop удалить заспавненные скриптом блоки (см. stop()). if (ref) this._localToReal.set(ref, ref); diff --git a/src/editor/engine/ModelTypes.js b/src/editor/engine/ModelTypes.js index 5badaab..cf2a7d5 100644 --- a/src/editor/engine/ModelTypes.js +++ b/src/editor/engine/ModelTypes.js @@ -879,6 +879,97 @@ export const MODEL_TYPES = [ m('pg-fence-planks', 'Забор', 'Площадка', 'nature-kit', 'fence_planks', { targetHeight: 1.5 }), + // ============================================================ + // === ЛЕГО-СЕТ (задача 09) — готовые модели из studs-примитивов === + // Все части material:'studs' (лего-кружки). Цвета базовые из набора LEGO. + // ============================================================ + // --- Кирпичи (стандартные плотности, высота 1) --- + mc('lego-brick-1x1', 'Лего 1×1', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 1, sy: 1, sz: 1, color: '#e02a2a', material: 'studs', dy: 0.5 }, + ], { category: 'Лего-сет' }), + mc('lego-brick-1x2', 'Лего 1×2', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 2, sy: 1, sz: 1, color: '#2a6fe0', material: 'studs', dy: 0.5 }, + ]), + mc('lego-brick-1x4', 'Лего 1×4', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 4, sy: 1, sz: 1, color: '#f0c020', material: 'studs', dy: 0.5 }, + ]), + mc('lego-brick-2x2', 'Лего 2×2', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 2, sy: 1, sz: 2, color: '#35ba5c', material: 'studs', dy: 0.5 }, + ]), + mc('lego-brick-2x4', 'Лего 2×4', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 4, sy: 1, sz: 2, color: '#e07a30', material: 'studs', dy: 0.5 }, + ]), + mc('lego-brick-2x8', 'Лего 2×8', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 8, sy: 1, sz: 2, color: '#9b5cf0', material: 'studs', dy: 0.5 }, + ]), + // --- Плиты (плоские, высота 0.35) --- + mc('lego-plate-1x1', 'Плита 1×1', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 1, sy: 0.35, sz: 1, color: '#cfd2d6', material: 'studs', dy: 0.175 }, + ]), + mc('lego-plate-1x2', 'Плита 1×2', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 2, sy: 0.35, sz: 1, color: '#cfd2d6', material: 'studs', dy: 0.175 }, + ]), + mc('lego-plate-2x2', 'Плита 2×2', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 2, sy: 0.35, sz: 2, color: '#cfd2d6', material: 'studs', dy: 0.175 }, + ]), + mc('lego-plate-4x4', 'Плита 4×4', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 4, sy: 0.35, sz: 4, color: '#9aa0a6', material: 'studs', dy: 0.175 }, + ]), + // --- Скаты (наклонные кирпичи через wedge) --- + mc('lego-slope-30', 'Скат 30°', 'Лего-сет', [ + { kind: 'primitive', type: 'wedge', sx: 2, sy: 1, sz: 2, color: '#e02a2a', material: 'studs', dy: 0.5 }, + ]), + mc('lego-slope-45', 'Скат 45°', 'Лего-сет', [ + { kind: 'primitive', type: 'wedge', sx: 2, sy: 2, sz: 2, color: '#2a6fe0', material: 'studs', dy: 1 }, + ]), + mc('lego-slope-60', 'Скат 60°', 'Лего-сет', [ + { kind: 'primitive', type: 'wedge', sx: 2, sy: 3, sz: 2, color: '#f0c020', material: 'studs', dy: 1.5 }, + ]), + // --- Лего-дерево (ствол коричневый + крона зелёная из кубов) --- + mc('lego-tree', 'Лего-дерево', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 1, sy: 3, sz: 1, color: '#8a5a2b', material: 'studs', dy: 1.5 }, + { kind: 'primitive', type: 'cube', sx: 3, sy: 2, sz: 3, color: '#35ba5c', material: 'studs', dy: 4 }, + { kind: 'primitive', type: 'cube', sx: 2, sy: 1.5, sz: 2, color: '#2e9e4c', material: 'studs', dy: 5.5 }, + ], { targetHeight: 6 }), + // --- Лего-куст (компактный из мелких зелёных кубов) --- + mc('lego-bush', 'Лего-куст', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 2, sy: 1, sz: 2, color: '#2e9e4c', material: 'studs', dy: 0.5 }, + { kind: 'primitive', type: 'cube', sx: 1, sy: 1, sz: 1, color: '#35ba5c', material: 'studs', dy: 1.3, dx: 0.4 }, + { kind: 'primitive', type: 'cube', sx: 1, sy: 1, sz: 1, color: '#35ba5c', material: 'studs', dy: 1.3, dx: -0.5, dz: 0.3 }, + ], { targetHeight: 1.8 }), + // --- Лего-дом (стены красные, крыша синяя, дверь жёлтая) --- + mc('lego-house-small', 'Лего-дом', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 6, sy: 4, sz: 6, color: '#e02a2a', material: 'studs', dy: 2 }, + { kind: 'primitive', type: 'wedge', sx: 7, sy: 2.5, sz: 7, color: '#2a6fe0', material: 'studs', dy: 5.25 }, + { kind: 'primitive', type: 'cube', sx: 1.4, sy: 2.4, sz: 0.3, color: '#f0c020', material: 'studs', dy: 1.2, dz: -3.05 }, + { kind: 'primitive', type: 'cube', sx: 1.2, sy: 1.2, sz: 0.3, color: '#9ad0ff', material: 'studs', dy: 2.6, dz: -3.05, dx: 1.8 }, + ], { targetHeight: 6.5 }), + // --- Лего-машина-гонщик (каркас + кабина + 4 колеса) --- + mc('lego-car-racer', 'Лего-машина', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 6, sy: 1, sz: 3, color: '#e02a2a', material: 'studs', dy: 0.9 }, + { kind: 'primitive', type: 'cube', sx: 2.5, sy: 1.2, sz: 2.6, color: '#2a6fe0', material: 'studs', dy: 1.9, dx: 0.6 }, + { kind: 'primitive', type: 'cylinder', sx: 1, sy: 0.6, sz: 1, color: '#222428', material: 'studs', dy: 0.5, dx: 1.8, dz: 1.6, rz: Math.PI / 2 }, + { kind: 'primitive', type: 'cylinder', sx: 1, sy: 0.6, sz: 1, color: '#222428', material: 'studs', dy: 0.5, dx: 1.8, dz: -1.6, rz: Math.PI / 2 }, + { kind: 'primitive', type: 'cylinder', sx: 1, sy: 0.6, sz: 1, color: '#222428', material: 'studs', dy: 0.5, dx: -1.8, dz: 1.6, rz: Math.PI / 2 }, + { kind: 'primitive', type: 'cylinder', sx: 1, sy: 0.6, sz: 1, color: '#222428', material: 'studs', dy: 0.5, dx: -1.8, dz: -1.6, rz: Math.PI / 2 }, + ], { targetHeight: 2.5 }), + // --- Лего-ступеньки (4 ступени разной высоты) --- + mc('lego-stairs', 'Лего-ступеньки', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 3, sy: 1, sz: 1.2, color: '#cfd2d6', material: 'studs', dy: 0.5, dz: 1.8 }, + { kind: 'primitive', type: 'cube', sx: 3, sy: 2, sz: 1.2, color: '#cfd2d6', material: 'studs', dy: 1.0, dz: 0.6 }, + { kind: 'primitive', type: 'cube', sx: 3, sy: 3, sz: 1.2, color: '#cfd2d6', material: 'studs', dy: 1.5, dz: -0.6 }, + { kind: 'primitive', type: 'cube', sx: 3, sy: 4, sz: 1.2, color: '#cfd2d6', material: 'studs', dy: 2.0, dz: -1.8 }, + ], { targetHeight: 4 }), + // --- Лего-человечек (минифигурка для NPC) --- + mc('lego-minifig', 'Лего-человечек', 'Лего-сет', [ + { kind: 'primitive', type: 'cube', sx: 1.4, sy: 0.6, sz: 0.9, color: '#f0c020', material: 'studs', dy: 0.3 }, + { kind: 'primitive', type: 'cube', sx: 1.2, sy: 1.6, sz: 0.8, color: '#2a6fe0', material: 'studs', dy: 1.4 }, + { kind: 'primitive', type: 'cube', sx: 0.4, sy: 1.4, sz: 0.4, color: '#f0c020', material: 'studs', dy: 1.4, dx: 0.85 }, + { kind: 'primitive', type: 'cube', sx: 0.4, sy: 1.4, sz: 0.4, color: '#f0c020', material: 'studs', dy: 1.4, dx: -0.85 }, + { kind: 'primitive', type: 'cube', sx: 1.1, sy: 1.0, sz: 0.85, color: '#f5c84a', material: 'studs', dy: 2.7 }, + { kind: 'primitive', type: 'cylinder', sx: 0.9, sy: 0.5, sz: 0.9, color: '#e02a2a', material: 'studs', dy: 3.4 }, + ], { targetHeight: 3.8 }), + // TOTAL: 644 ]; diff --git a/src/editor/engine/PrimitiveManager.js b/src/editor/engine/PrimitiveManager.js index a9f0c3b..4f64fec 100644 --- a/src/editor/engine/PrimitiveManager.js +++ b/src/editor/engine/PrimitiveManager.js @@ -24,6 +24,53 @@ import { } from '@babylonjs/core'; import { getPrimitiveType } from './PrimitiveTypes'; +// === Материал «studs» (лего-кружки, задача 09) === +// Серая diffuse-текстура с сеткой выпуклых кружков (multiply на цвет меша) + +// normal map для иллюзии выпуклости. 1 stud = STUD_UNIT юнитов → тайлинг +// считается из реального размера меша (куб 4×4 покажет 4×4 кружка). +const STUDS_DIFFUSE_URL = '/kubikon-assets/materials/studs_diffuse.png'; +const STUDS_NORMAL_URL = '/kubikon-assets/materials/studs_normal.png'; +const STUD_UNIT = 1; // 1 кружок на 1 юнит размера +const STUDS_GRID = 4; // текстура содержит сетку 4×4 studs +// Кэш текстур на сцену: чтобы не грузить один и тот же PNG для каждого меша. +// Map. Каждый меш получает свою +// материал-копию (свой цвет/тайлинг), но текстуры шарятся. +const _studsTexCache = new WeakMap(); +function _getStudsTextures(scene) { + let c = _studsTexCache.get(scene); + if (!c) { + const diffuse = new Texture(STUDS_DIFFUSE_URL, scene); + const normal = new Texture(STUDS_NORMAL_URL, scene); + c = { diffuse, normal }; + _studsTexCache.set(scene, c); + } + return c; +} +/** + * Посчитать тайлинг (uScale/vScale) для studs по размеру меша. Чтобы кружки не + * растягивались: число кружков на грань = размер_грани / STUD_UNIT, делённое на + * число кружков в самой текстуре (STUDS_GRID). + * Для куба/плоскости тайлинг прямой; для сферы/цилиндра — приближённый. + */ +function _studsTiling(type, sx, sy, sz) { + const f = STUD_UNIT * STUDS_GRID; + // По умолчанию (cube/plane/wedge) — горизонтальный размер по U, вертикаль по V. + let u = Math.max(sx, sz) / f; + let v = sy / f; + if (type === 'cylinder') { + // боковая поверхность — по обхвату; торцы по диаметру + u = (Math.PI * sx) / f; + v = sy / f; + } else if (type === 'sphere') { + u = (Math.PI * sx) / f; + v = (Math.PI * sy) / f; + } else if (type === 'plane') { + u = sx / f; + v = sz / f; + } + return { u: Math.max(0.25, u), v: Math.max(0.25, v) }; +} + export class PrimitiveManager { constructor(scene) { this.scene = scene; @@ -110,6 +157,8 @@ export class PrimitiveManager { name: opts.name || null, folderId: opts.folderId ?? null, }; + // Размеры для тайлинга studs-материала (читается в _applyMaterial). + mesh._studsDims = { type, sx, sy, sz }; this._applyMaterial(mesh, typeDef, color, material); this._applyVisible(mesh, visible, typeDef); // Пользовательская текстура — поверх базового материала. @@ -433,6 +482,26 @@ export class PrimitiveManager { mat.emissiveColor = Color3.FromHexString(color || '#888888'); mat.specularColor = new Color3(0, 0, 0); break; + case 'studs': { + // Лего-материал: серая diffuse-текстура с кружками умножается на + // цвет меша (StandardMaterial.diffuseTexture * diffuseColor), normal + // map даёт выпуклость. Тайлинг — по реальному размеру меша. + const tex = _getStudsTextures(this.scene); + // Клон-обёртки текстур: uScale/vScale per-mesh, сама картинка шарится. + const dt = tex.diffuse.clone(); + const nt = tex.normal.clone(); + const dims = mesh._studsDims || { type: 'cube', sx: 1, sy: 1, sz: 1 }; + const tile = _studsTiling(dims.type, dims.sx, dims.sy, dims.sz); + dt.uScale = nt.uScale = tile.u; + dt.vScale = nt.vScale = tile.v; + mat.diffuseTexture = dt; + mat.bumpTexture = nt; + // Цвет меша остаётся как multiply-tint поверх серой текстуры. + mat.diffuseColor = Color3.FromHexString(color || '#cccccc'); + mat.specularColor = new Color3(0.25, 0.25, 0.25); + mat.specularPower = 24; + break; + } case 'matte': default: mat.specularColor = new Color3(0, 0, 0); @@ -601,6 +670,7 @@ export class PrimitiveManager { if (data.mesh.material) { try { data.mesh.material.dispose(); } catch (e) { /* ignore */ } } + data.mesh._studsDims = { type: data.type, sx: data.sx, sy: data.sy, sz: data.sz }; this._applyMaterial(data.mesh, typeDef, data.color, data.material); } // Текстуру переприменяем если: сменили саму текстуру, или @@ -614,6 +684,7 @@ export class PrimitiveManager { if (data.mesh.material) { try { data.mesh.material.dispose(); } catch (e) { /* ignore */ } } + data.mesh._studsDims = { type: data.type, sx: data.sx, sy: data.sy, sz: data.sz }; this._applyMaterial(data.mesh, typeDef, data.color, data.material); } @@ -735,6 +806,17 @@ export class PrimitiveManager { catch (e) { /* ignore */ } data.mesh = newMesh; + newMesh._studsDims = { type: data.type, sx: data.sx, sy: data.sy, sz: data.sz }; + // studs-материал: пересчитать тайлинг под новый размер меша. + if (data.material === 'studs' && oldMat && oldMat.diffuseTexture) { + const tile = _studsTiling(data.type, data.sx, data.sy, data.sz); + oldMat.diffuseTexture.uScale = tile.u; + oldMat.diffuseTexture.vScale = tile.v; + if (oldMat.bumpTexture) { + oldMat.bumpTexture.uScale = tile.u; + oldMat.bumpTexture.vScale = tile.v; + } + } } /** Удалить инстанс. */ diff --git a/src/editor/engine/ScriptSandboxWorker.js b/src/editor/engine/ScriptSandboxWorker.js index eb4469f..e282138 100644 --- a/src/editor/engine/ScriptSandboxWorker.js +++ b/src/editor/engine/ScriptSandboxWorker.js @@ -1466,7 +1466,8 @@ const game = { if (kind === 'block') { const ix = Math.round(x), iy = Math.round(y), iz = Math.round(z); const ref = 'block:' + ix + ',' + iy + ',' + iz; - _send('scene.spawn', { kind: 'block', subType, x: ix, y: iy, z: iz, ref }); + // color — для окрашиваемых блоков (studs-block, задача 09). + _send('scene.spawn', { kind: 'block', subType, x: ix, y: iy, z: iz, ref, color: opts.color }); if (opts.lifetime != null) _scheduleDelete(ref, opts.lifetime); // 6.2: возвращаем Instance вместо строки (он coerces в строку через toString). return _getOrCreateInstance(ref, 'block') || ref; -- 2.47.2 From 7ab66fc4c57b95b18f184c3a01b75a1ba75935c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=98=D0=9D?= Date: Sun, 31 May 2026 12:22:03 +0300 Subject: [PATCH 2/4] =?UTF-8?q?feat(09):=20=D1=81=D0=BE=D1=87=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BA=D1=80=D1=83=D0=B3=D0=BB=D1=8B=D0=B5=20studs=20(?= =?UTF-8?q?v4)=20+=20color-=D0=BF=D0=B8=D0=BA=D0=B5=D1=80=20=D0=BE=D0=BA?= =?UTF-8?q?=D1=80=D0=B0=D1=88=D0=B8=D0=B2=D0=B0=D0=B5=D0=BC=D1=8B=D1=85=20?= =?UTF-8?q?=D0=B1=D0=BB=D0=BE=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Текстура studs v4: круглые кружки с усиленным объёмом (normal strength 4.0, запечённый блик/тень) + контактная тень от каждого кружка. Фон 0.97 — цвет остаётся сочным. emissive 45% от цвета на примитивах (Roblox-look). - Версионные имена файлов (studs_v4_*) — обход browser-кэша Babylon. - Color-пикер блоков: в палитре при выборе окрашиваемого блока (studs-block) под категориями появляется ряд из 8 лего-цветов + input «свой цвет». BabylonScene.setActiveBlockColor → addBlock(...,color) при постановке. - DEV-хук ?dev=<имя> (localhost): грузит /dev-<имя>.json в редактор для локального теста без БД (на проде неактивен). Co-Authored-By: Claude Opus 4.8 --- public/dev-lego-polygon.json | 1 + src/editor/KubikonEditor.jsx | 59 ++++++++++++++++++++++++++- src/editor/engine/BabylonScene.js | 9 +++- src/editor/engine/BlockManager.js | 6 ++- src/editor/engine/BlockTypes.js | 4 +- src/editor/engine/GameRuntime.js | 4 ++ src/editor/engine/PrimitiveManager.js | 25 ++++++------ 7 files changed, 89 insertions(+), 19 deletions(-) create mode 100644 public/dev-lego-polygon.json diff --git a/public/dev-lego-polygon.json b/public/dev-lego-polygon.json new file mode 100644 index 0000000..e898cce --- /dev/null +++ b/public/dev-lego-polygon.json @@ -0,0 +1 @@ +{"version": 1, "scene": {"blocks": [{"x": -15, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -14, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -13, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -12, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -11, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -10, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -9, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -8, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -7, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -6, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -5, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -4, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -3, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -2, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -1, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 0, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 1, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 2, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 3, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 4, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 5, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 6, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 7, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 8, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 9, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 10, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 11, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 12, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 13, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": -15, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": -14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": -13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": -12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": -11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": -10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": -9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": -8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": -7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": -6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": -5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": -4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": -3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": -2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": -1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": 0, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": 1, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": 2, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": 3, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": 4, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": 5, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": 6, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": 7, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": 8, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": 9, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": 10, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": 11, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": 12, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": 13, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": 14, "y": 0, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#5cba35"}, {"x": -15, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -15, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -15, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -15, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -15, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -15, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -14, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -14, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -14, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -14, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -14, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -14, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -13, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -13, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -13, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -13, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -13, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -13, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -12, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -12, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -12, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -12, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -12, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -12, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -11, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -11, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -11, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -11, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -11, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -11, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -10, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -10, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -10, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -10, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -10, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -10, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -9, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -9, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -9, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -9, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -9, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -9, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -8, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -8, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -8, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -8, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -8, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -8, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -7, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -7, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -7, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -7, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -7, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -7, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -6, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -6, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -6, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -6, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -6, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -6, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -5, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -5, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -5, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -5, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -5, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -5, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -4, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -4, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -4, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -4, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -4, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -4, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -3, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -3, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -3, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -3, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -3, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -3, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -2, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -2, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -2, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -2, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -2, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -2, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -1, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -1, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -1, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -1, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -1, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -1, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 0, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 0, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 0, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 0, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 0, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 0, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 1, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 1, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 1, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 1, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 1, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 1, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 2, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 2, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 2, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 2, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 2, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 2, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 3, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 3, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 3, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 3, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 3, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 3, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 4, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 4, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 4, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 4, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 4, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 4, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 5, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 5, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 5, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 5, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 5, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 5, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 6, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 6, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 6, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 6, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 6, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 6, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 7, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 7, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 7, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 7, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 7, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 7, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 8, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 8, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 8, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 8, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 8, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 8, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 9, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 9, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 9, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 9, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 9, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 9, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 10, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 10, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 10, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 10, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 10, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 10, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 11, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 11, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 11, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 11, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 11, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 11, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 12, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 12, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 12, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 12, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 12, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 12, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 13, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 13, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 13, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 13, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 13, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 13, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 14, "y": 1, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 14, "y": 2, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 14, "y": 3, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 14, "y": 4, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 14, "y": 5, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": 14, "y": 6, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#e07a30"}, {"x": -6, "y": 7, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#9b5cf0"}, {"x": -4, "y": 7, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#9b5cf0"}, {"x": -2, "y": 7, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#9b5cf0"}, {"x": 0, "y": 7, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#9b5cf0"}, {"x": 2, "y": 7, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#9b5cf0"}, {"x": 4, "y": 7, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#9b5cf0"}, {"x": 6, "y": 7, "z": 14, "type": "studs-block", "anchored": true, "canCollide": true, "visible": true, "mass": 1, "color": "#9b5cf0"}], "models": [{"type": "lego-tree", "x": -11, "y": 0, "z": -11, "rotationY": 0, "scale": 1, "name": "Лего-дерево 1"}, {"type": "lego-tree", "x": -8, "y": 0, "z": -12, "rotationY": 0.6, "scale": 1, "name": "Лего-дерево 2"}, {"type": "lego-tree", "x": -12, "y": 0, "z": -8, "rotationY": 1.2, "scale": 1, "name": "Лего-дерево 3"}, {"type": "lego-house-small", "x": 10, "y": 0, "z": -10, "rotationY": -0.4, "scale": 1, "name": "Лего-дом"}, {"type": "lego-car-racer", "x": 9, "y": 0, "z": 2, "rotationY": 0, "scale": 1, "name": "Лего-машина"}], "primitives": [{"id": 1, "type": "cube", "x": 0, "y": 1.4, "z": 8, "sx": 4, "sy": 0.8, "sz": 4, "rotationX": 0, "rotationY": 0, "rotationZ": 0, "color": "#f0c020", "material": "studs", "canCollide": true, "visible": true, "anchored": true, "mass": 1, "name": "Жёлтая ступенька", "folderId": null}, {"id": 2, "type": "cube", "x": -6, "y": 2, "z": 8, "sx": 2, "sy": 2, "sz": 2, "rotationX": 0, "rotationY": 0, "rotationZ": 0, "color": "#3a7aff", "material": "studs", "canCollide": true, "visible": true, "anchored": true, "mass": 1, "name": "Синий куб", "folderId": null}, {"id": 3, "type": "cube", "x": 5, "y": 1.0, "z": 8, "sx": 1, "sy": 1, "sz": 1, "rotationX": 0, "rotationY": 0, "rotationZ": 0, "color": "#9b5cf0", "material": "studs", "canCollide": true, "visible": true, "anchored": true, "mass": 1, "name": "Фиолет 1", "folderId": null}, {"id": 4, "type": "cube", "x": 6, "y": 1.6, "z": 8, "sx": 1, "sy": 1, "sz": 1, "rotationX": 0, "rotationY": 0, "rotationZ": 0, "color": "#9b5cf0", "material": "studs", "canCollide": true, "visible": true, "anchored": true, "mass": 1, "name": "Фиолет 2", "folderId": null}, {"id": 5, "type": "cube", "x": 7, "y": 2.2, "z": 8, "sx": 1, "sy": 1, "sz": 1, "rotationX": 0, "rotationY": 0, "rotationZ": 0, "color": "#9b5cf0", "material": "studs", "canCollide": true, "visible": true, "anchored": true, "mass": 1, "name": "Фиолет 3", "folderId": null}], "userModels": [], "terrain": null, "robloxTerrain": null, "decorations": [], "folders": [], "gui": [{"id": "lego_title", "type": "text", "name": "Заголовок", "parentId": null, "x": 50, "y": 8, "w": 50, "h": 10, "anchor": "top", "visible": true, "bgColor": "#1e2da5", "bgOpacity": 0.0, "borderColor": "#000", "borderWidth": 0, "borderRadius": 8, "text": "Тренируйтесь на бегу", "textColor": "#ffffff", "textSize": 30, "textAlign": "center", "fontWeight": 800, "imageUrl": "", "imageAsset": null, "onClickScriptId": null}], "inventory": [], "spawnPoint": {"x": 0, "y": 1.7, "z": -10}, "playerModelType": "character-a", "worldSize": 100, "floorEnabled": false, "jumpPowerMul": 1, "cameraMode": "third", "crosshair": "none", "shadowQuality": "soft", "environment": null, "audio": null, "assets": [], "sounds": [], "glbModels": [], "scripts": [{"id": "lego_main", "name": "Главный скрипт", "target": null, "code": "// Лего-полигон — приветствие\ngame.ui.set('hint', 'Беги и прыгай по лего-блокам!', { x: 50, y: 16, anchor: 'top', color: '#fff', size: 18 });\ngame.log('Лего-полигон загружен.');\n"}]}, "editorCamera": null, "settings": {}, "__devName": "Лего-полигон"} \ No newline at end of file diff --git a/src/editor/KubikonEditor.jsx b/src/editor/KubikonEditor.jsx index 8c23b1e..3be0458 100644 --- a/src/editor/KubikonEditor.jsx +++ b/src/editor/KubikonEditor.jsx @@ -772,6 +772,8 @@ const KubikonEditor = () => { const [gizmoMode, setGizmoMode] = useState('select'); // 'select'|'move'|'rotate'|'scale' const [snapStep, setSnapStep] = useState(1.0); const [blockCategory, setBlockCategory] = useState(BLOCK_CATEGORIES[0]); + // Цвет для окрашиваемых блоков (studs-block, задача 09). + const [activeBlockColor, setActiveBlockColor] = useState('#3a7aff'); const [modelCategory, setModelCategory] = useState(MODEL_CATEGORIES[0]); const [search, setSearch] = useState(''); @@ -1284,6 +1286,27 @@ const KubikonEditor = () => { setActiveTool(prev => prev === 'model' ? 'model' : 'select'); }); + // DEV-хук (только localhost): грузим готовую тест-сцену через ?dev=<имя> + // → fetch /dev-<имя>.json из public/. Работает на ЛЮБОМ id (включая + // существующий проект — dev-сцена заменяет его, БД-загрузка пропускается), + // чтобы не упираться в модал «Новая игра». Позволяет тестировать локально + // без БД (S2/прод). На проде неактивен. + const _isLocalhost = window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1'; + const _devParam = _isLocalhost ? new URLSearchParams(window.location.search).get('dev') : null; + if (_isLocalhost && _devParam) { + fetch('/dev-' + _devParam + '.json') + .then(r => (r.ok ? r.json() : null)) + .then(async (parsed) => { + if (!parsed) return; + try { + await sceneRef.current.loadFromState(parsed); + setProjectName('DEV: ' + (parsed.__devName || 'тест-сцена')); + dirtyRef.current = false; + } catch (e) { console.warn('[DEV scene load] failed', e); } + }) + .catch(() => {}); + } + // Для нового проекта — создаём шаблон папок workspace if (id === 'new') { try { @@ -1342,7 +1365,8 @@ const KubikonEditor = () => { } // Если редактируем существующий проект — грузим из БД. - if (id !== 'new' && /^\d+$/.test(id)) { + // ПРОПУСКАЕМ при активном DEV-хуке (?dev=) — там сцена грузится из файла. + if (id !== 'new' && /^\d+$/.test(id) && !_devParam) { (async () => { try { // Передаём userId — иначе сервер не определит owner для @@ -1578,6 +1602,11 @@ const KubikonEditor = () => { if (sceneRef.current) sceneRef.current.setActiveBlockType(activeBlockType); }, [activeBlockType]); + // Цвет окрашиваемого блока → в сцену (для studs-block при постановке). + useEffect(() => { + if (sceneRef.current) sceneRef.current.setActiveBlockColor?.(activeBlockColor); + }, [activeBlockColor]); + useEffect(() => { if (sceneRef.current) sceneRef.current.setActiveModelType(activeModelType); }, [activeModelType]); @@ -2250,6 +2279,34 @@ const KubikonEditor = () => { )} + {/* Color-пикер для окрашиваемых блоков (studs-block, задача 09). + Показываем когда активный блок имеет colorable:true. */} + {paletteTab === 'blocks' + && BLOCK_TYPES.find(b => b.id === activeBlockType)?.colorable && ( +
+ Цвет блока: + {['#e02a2a', '#e07a30', '#f0c020', '#5cba35', '#3a7aff', '#9b5cf0', '#ffffff', '#222428'].map(c => ( +
+ )} + {/* Сетка блоков или моделей в зависимости от вкладки */} {paletteTab === 'blocks' ? (
diff --git a/src/editor/engine/BabylonScene.js b/src/editor/engine/BabylonScene.js index 561296e..15902b4 100644 --- a/src/editor/engine/BabylonScene.js +++ b/src/editor/engine/BabylonScene.js @@ -3374,7 +3374,7 @@ export class BabylonScene { // _computePlacementCell вернёт нецелый y (реальная высота // поверхности) — округляем, чтобы блок встал ровно в клетку. const by = Math.round(target.y); - const mesh = this.blockManager.addBlock(target.x, by, target.z, this._activeBlockType); + const mesh = this.blockManager.addBlock(target.x, by, target.z, this._activeBlockType, this._activeBlockColor); this._lastPlacedKey = `${target.x},${by},${target.z}`; // Авто-выделение поставленного блока. Тени уже работают через proto-меш // (зарегистрирован в refreshAllShadows и обновляется автоматически). @@ -3506,7 +3506,7 @@ export class BabylonScene { const key = `${target.x},${target.y},${target.z}`; if (key === this._lastPlacedKey) return; if (this.blockManager.hasBlock(target.x, target.y, target.z)) return; - this.blockManager.addBlock(target.x, target.y, target.z, this._activeBlockType); + this.blockManager.addBlock(target.x, target.y, target.z, this._activeBlockType, this._activeBlockColor); this._lastPlacedKey = key; } else if (tool === 'erase') { if (pick.mesh?.metadata?.isBlock) { @@ -4876,6 +4876,11 @@ export class BabylonScene { this._activeBlockType = blockTypeId; } + /** Цвет для постановки окрашиваемых блоков (studs-block). null = дефолт типа. */ + setActiveBlockColor(hex) { + this._activeBlockColor = hex || null; + } + /** Публичный сеттер: выбрать тип модели для постановки. */ setActiveModelType(modelTypeId) { this._activeModelType = modelTypeId; diff --git a/src/editor/engine/BlockManager.js b/src/editor/engine/BlockManager.js index 0a3ed3b..b44ab0e 100644 --- a/src/editor/engine/BlockManager.js +++ b/src/editor/engine/BlockManager.js @@ -373,8 +373,10 @@ export class BlockManager { if (blockType.normal) { try { mat.bumpTexture = new Texture(blockType.normal, this.scene); } catch (e) {} } - mat.specularColor = new Color3(0.2, 0.2, 0.2); - mat.specularPower = 24; + // Сочность (Roblox-look): почти-белая текстура × яркий vertex color, + // specular убран (он белит/тускнит цвет). vertex color (RGBA из + // thin-instance color buffer) умножается на diffuse → цвет насыщенный. + mat.specularColor = new Color3(0, 0, 0); mat.useVertexColors = true; return mat; } diff --git a/src/editor/engine/BlockTypes.js b/src/editor/engine/BlockTypes.js index c58181f..0f6b20d 100644 --- a/src/editor/engine/BlockTypes.js +++ b/src/editor/engine/BlockTypes.js @@ -111,8 +111,8 @@ export const BLOCK_TYPES = [ // ThinInstance умножается на серую studs-текстуру). colorable:true говорит // палитре показать color-пикер, BlockManager — включить color buffer. cube('studs-block', 'Лего-кирпич', 'Окрашиваемые', - '/kubikon-assets/materials/studs_diffuse.png', - { colorable: true, normal: '/kubikon-assets/materials/studs_normal.png', defaultColor: '#3a7aff' }), + '/kubikon-assets/materials/studs_v4_diffuse.png', + { colorable: true, normal: '/kubikon-assets/materials/studs_v4_normal.png', defaultColor: '#3a7aff' }), ]; /** Все доступные категории в порядке появления. */ diff --git a/src/editor/engine/GameRuntime.js b/src/editor/engine/GameRuntime.js index de0c3f9..0c503e6 100644 --- a/src/editor/engine/GameRuntime.js +++ b/src/editor/engine/GameRuntime.js @@ -2573,6 +2573,10 @@ export class GameRuntime { if (data.material === 'neon') { data.mesh.material.emissiveColor = c; } + // studs — emissive = доля цвета (сочность сохраняется при смене). + if (data.material === 'studs') { + data.mesh.material.emissiveColor = new Color3(c.r * 0.45, c.g * 0.45, c.b * 0.45); + } } } } catch (e) { diff --git a/src/editor/engine/PrimitiveManager.js b/src/editor/engine/PrimitiveManager.js index 4f64fec..56ca51d 100644 --- a/src/editor/engine/PrimitiveManager.js +++ b/src/editor/engine/PrimitiveManager.js @@ -28,10 +28,10 @@ import { getPrimitiveType } from './PrimitiveTypes'; // Серая diffuse-текстура с сеткой выпуклых кружков (multiply на цвет меша) + // normal map для иллюзии выпуклости. 1 stud = STUD_UNIT юнитов → тайлинг // считается из реального размера меша (куб 4×4 покажет 4×4 кружка). -const STUDS_DIFFUSE_URL = '/kubikon-assets/materials/studs_diffuse.png'; -const STUDS_NORMAL_URL = '/kubikon-assets/materials/studs_normal.png'; -const STUD_UNIT = 1; // 1 кружок на 1 юнит размера -const STUDS_GRID = 4; // текстура содержит сетку 4×4 studs +const STUDS_DIFFUSE_URL = '/kubikon-assets/materials/studs_v4_diffuse.png'; +const STUDS_NORMAL_URL = '/kubikon-assets/materials/studs_v4_normal.png'; +const STUD_UNIT = 1; // 1 круглый stud на 1 юнит размера +const STUDS_GRID = 4; // текстура содержит сетку 4×4 круглых studs // Кэш текстур на сцену: чтобы не грузить один и тот же PNG для каждого меша. // Map. Каждый меш получает свою // материал-копию (свой цвет/тайлинг), но текстуры шарятся. @@ -483,11 +483,10 @@ export class PrimitiveManager { mat.specularColor = new Color3(0, 0, 0); break; case 'studs': { - // Лего-материал: серая diffuse-текстура с кружками умножается на - // цвет меша (StandardMaterial.diffuseTexture * diffuseColor), normal - // map даёт выпуклость. Тайлинг — по реальному размеру меша. + // Лего-материал: почти белая diffuse-текстура с лёгкими кружками + // умножается на цвет меша → цвет остаётся СОЧНЫМ (как в Roblox). + // emissive = доля цвета → цвет «светится», не тускнеет в тени. const tex = _getStudsTextures(this.scene); - // Клон-обёртки текстур: uScale/vScale per-mesh, сама картинка шарится. const dt = tex.diffuse.clone(); const nt = tex.normal.clone(); const dims = mesh._studsDims || { type: 'cube', sx: 1, sy: 1, sz: 1 }; @@ -496,10 +495,12 @@ export class PrimitiveManager { dt.vScale = nt.vScale = tile.v; mat.diffuseTexture = dt; mat.bumpTexture = nt; - // Цвет меша остаётся как multiply-tint поверх серой текстуры. - mat.diffuseColor = Color3.FromHexString(color || '#cccccc'); - mat.specularColor = new Color3(0.25, 0.25, 0.25); - mat.specularPower = 24; + const sc = Color3.FromHexString(color || '#cccccc'); + mat.diffuseColor = sc; + // Сочность: подмешиваем цвет в emissive (45%) — Roblox-look, + // насыщенный даже без прямого света. specular убираем (он белит). + mat.emissiveColor = new Color3(sc.r * 0.45, sc.g * 0.45, sc.b * 0.45); + mat.specularColor = new Color3(0, 0, 0); break; } case 'matte': -- 2.47.2 From f6828aad2cf2a50dc118776019a6f7931442b1f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=98=D0=9D?= Date: Sun, 31 May 2026 13:26:52 +0300 Subject: [PATCH 3/4] =?UTF-8?q?feat(09):=20per-face=20UV=20studs=20(=D1=82?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=B8=D0=BD=D0=B3=20=D0=BF=D0=BE=20=D0=B3?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D1=8F=D0=BC)=20+=20=D0=BD=D0=B0=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B9=D0=BA=D0=B0=20=D1=80=D0=B0=D0=B7=D0=BC=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=20studs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Тайлинг studs на кубе через faceUV (per-face) — кружки одного размера на всех гранях, не растягиваются на длинной стороне (баг на брусе 10×1×1). _studsCubeFaceUV считает UV каждой грани по её реальным размерам. - studDensity — плотность кружков (множитель): инспектор «Размер studs» Крупные(0.5)/Средние(1)/Мелкие(2)/Меньше(4). Для пола мелкие, для кирпича крупные. Проброс через data/_studsDims/faceUV/_studsTiling, сериализация, updateInstance(patch.studDensity)→пересоздание меша. Co-Authored-By: Claude Opus 4.8 --- public/dev-studstest.json | 1 + src/editor/InspectorPanel.jsx | 34 ++++++++++ src/editor/engine/PrimitiveManager.js | 97 +++++++++++++++++++++------ 3 files changed, 111 insertions(+), 21 deletions(-) create mode 100644 public/dev-studstest.json diff --git a/public/dev-studstest.json b/public/dev-studstest.json new file mode 100644 index 0000000..e85bc0f --- /dev/null +++ b/public/dev-studstest.json @@ -0,0 +1 @@ +{"version": 1, "scene": {"blocks": [], "models": [], "primitives": [{"id": 1, "type": "cube", "x": 0, "y": 1, "z": 0, "sx": 10, "sy": 1, "sz": 1, "rotationX": 0, "rotationY": 0, "rotationZ": 0, "color": "#e8e8e8", "material": "studs", "canCollide": true, "visible": true, "anchored": true, "mass": 1, "name": "Длинный брус", "folderId": null}, {"id": 2, "type": "cube", "x": 0, "y": 1, "z": 4, "sx": 2, "sy": 2, "sz": 2, "rotationX": 0, "rotationY": 0, "rotationZ": 0, "color": "#3a7aff", "material": "studs", "canCollide": true, "visible": true, "anchored": true, "mass": 1, "name": "Куб 2x2", "folderId": null}, {"id": 3, "type": "cube", "x": 6, "y": 1, "z": 2, "sx": 1, "sy": 1, "sz": 6, "rotationX": 0, "rotationY": 0, "rotationZ": 0, "color": "#e07a30", "material": "studs", "canCollide": true, "visible": true, "anchored": true, "mass": 1, "name": "Брус по Z", "folderId": null}], "userModels": [], "terrain": null, "robloxTerrain": null, "decorations": [], "folders": [], "gui": [], "inventory": [], "spawnPoint": {"x": 0, "y": 1.7, "z": -6}, "playerModelType": "character-a", "worldSize": 100, "floorEnabled": true, "scripts": []}, "editorCamera": null, "settings": {}, "__devName": "Studs-тест"} \ No newline at end of file diff --git a/src/editor/InspectorPanel.jsx b/src/editor/InspectorPanel.jsx index a602e8a..28d07f5 100644 --- a/src/editor/InspectorPanel.jsx +++ b/src/editor/InspectorPanel.jsx @@ -317,6 +317,7 @@ const InspectorPanel = ({ const [localSz, setLocalSz] = useState(''); const [localColor, setLocalColor] = useState('#888888'); const [localMaterial, setLocalMaterial] = useState('matte'); + const [localStudDensity, setLocalStudDensity] = useState(1); // плотность studs const [localCanCollide, setLocalCanCollide] = useState(true); const [localVisible, setLocalVisible] = useState(true); const [localAnchored, setLocalAnchored] = useState(true); @@ -362,6 +363,7 @@ const InspectorPanel = ({ setLocalSz((selection.sz || 1).toFixed(2)); setLocalColor(selection.color || '#888888'); setLocalMaterial(selection.material || 'matte'); + setLocalStudDensity(selection.studDensity || 1); setLocalCanCollide(selection.canCollide !== false); setLocalVisible(selection.visible !== false); setLocalAnchored(selection.anchored !== false); @@ -1755,6 +1757,38 @@ const InspectorPanel = ({
+ {/* Размер studs — плотность лего-кружков (только для material studs) */} + {localMaterial === 'studs' && ( +
+
Размер studs
+
+ {[ + { label: 'Крупные', d: 0.5 }, + { label: 'Средние', d: 1 }, + { label: 'Мелкие', d: 2 }, + { label: 'Меньше', d: 4 }, + ].map(opt => ( + + ))} +
+
+ )} + {/* Текстура — своя картинка на гранях примитива */}
diff --git a/src/editor/engine/PrimitiveManager.js b/src/editor/engine/PrimitiveManager.js index 56ca51d..54dfd52 100644 --- a/src/editor/engine/PrimitiveManager.js +++ b/src/editor/engine/PrimitiveManager.js @@ -19,7 +19,7 @@ * При касании игроком обновляет spawnPoint сцены. */ import { - MeshBuilder, StandardMaterial, Color3, Vector3, PointLight, + MeshBuilder, StandardMaterial, Color3, Vector3, Vector4, PointLight, Mesh, VertexData, Texture, DynamicTexture, } from '@babylonjs/core'; import { getPrimitiveType } from './PrimitiveTypes'; @@ -52,8 +52,10 @@ function _getStudsTextures(scene) { * число кружков в самой текстуре (STUDS_GRID). * Для куба/плоскости тайлинг прямой; для сферы/цилиндра — приближённый. */ -function _studsTiling(type, sx, sy, sz) { - const f = STUD_UNIT * STUDS_GRID; +function _studsTiling(type, sx, sy, sz, density) { + // density — множитель плотности кружков (1=стандарт, 2=вдвое мельче/чаще). + const d = density && density > 0 ? density : 1; + const f = (STUD_UNIT * STUDS_GRID) / d; // По умолчанию (cube/plane/wedge) — горизонтальный размер по U, вертикаль по V. let u = Math.max(sx, sz) / f; let v = sy / f; @@ -70,6 +72,31 @@ function _studsTiling(type, sx, sy, sz) { } return { u: Math.max(0.25, u), v: Math.max(0.25, v) }; } +/** + * faceUV для куба со studs — КАЖДАЯ грань тайлится по СВОИМ реальным размерам, + * чтобы кружки были одного размера на всех гранях (не растягивались на длинных). + * Грани CreateBox: 0=front(z-) 1=back(z+) 2=right(x+) 3=left(x-) 4=top(y+) 5=bottom(y-). + * front/back → ширина=sx, высота=sy + * left/right → ширина=sz, высота=sy + * top/bottom → ширина=sx, высота=sz + * UV-диапазон грани = (0,0)..(кол-во_studs_по_ширине, кол-во_по_высоте). + */ +function _studsCubeFaceUV(sx, sy, sz, density) { + const d = density && density > 0 ? density : 1; + const f = (STUD_UNIT * STUDS_GRID) / d; + const nx = Math.max(0.25, sx / f); // studs вдоль X + const ny = Math.max(0.25, sy / f); // studs вдоль Y + const nz = Math.max(0.25, sz / f); // studs вдоль Z + // Vector4(u0, v0, u1, v1) + return [ + new Vector4(0, 0, nx, ny), // front (z-): X×Y + new Vector4(0, 0, nx, ny), // back (z+): X×Y + new Vector4(0, 0, nz, ny), // right (x+): Z×Y + new Vector4(0, 0, nz, ny), // left (x-): Z×Y + new Vector4(0, 0, nx, nz), // top (y+): X×Z + new Vector4(0, 0, nx, nz), // bottom (y-): X×Z + ]; +} export class PrimitiveManager { constructor(scene) { @@ -111,6 +138,8 @@ export class PrimitiveManager { const isGlowingGd = isGdKind; const isGdSpike = typeDef.kind === 'gd_spike'; const material = opts.material ?? (isGlowingGd ? 'neon' : 'matte'); + // studDensity — плотность кружков studs (1=стандарт, >1 мельче/чаще). + const studDensity = Number.isFinite(opts.studDensity) ? opts.studDensity : 1; // canCollide: для всех GD-сущностей и шипов — false (игрок проходит сквозь, логика по дистанции) const canCollide = opts.canCollide !== false && !isGdKind && !isGdSpike; const visible = opts.visible !== false; @@ -128,7 +157,7 @@ export class PrimitiveManager { const rotationY = opts.rotationY ?? 0; const rotationZ = opts.rotationZ ?? 0; - const mesh = this._createMeshForType(typeDef, id, sx, sy, sz); + const mesh = this._createMeshForType(typeDef, id, sx, sy, sz, material, studDensity); mesh.position = new Vector3(x, y, z); mesh.rotation = new Vector3(rotationX, rotationY, rotationZ); mesh.isPickable = true; @@ -150,7 +179,7 @@ export class PrimitiveManager { id, mesh, type, x, y, z, sx, sy, sz, rotationX, rotationY, rotationZ, color, material, canCollide, visible, anchored, mass, - textureAsset, + textureAsset, studDensity, // locked — объект защищён от выделения/перемещения в редакторе // (Фаза 5.11). На геймплей не влияет. locked: opts.locked === true, @@ -158,7 +187,7 @@ export class PrimitiveManager { folderId: opts.folderId ?? null, }; // Размеры для тайлинга studs-материала (читается в _applyMaterial). - mesh._studsDims = { type, sx, sy, sz }; + mesh._studsDims = { type, sx, sy, sz, density: studDensity }; this._applyMaterial(mesh, typeDef, color, material); this._applyVisible(mesh, visible, typeDef); // Пользовательская текстура — поверх базового материала. @@ -236,13 +265,17 @@ export class PrimitiveManager { } /** Создать базовый mesh нужной формы (без материала). */ - _createMeshForType(typeDef, id, sx, sy, sz) { + _createMeshForType(typeDef, id, sx, sy, sz, material, studDensity) { const name = `prim_${typeDef.id}_${id}`; switch (typeDef.id) { case 'cube': - case 'trigger': - return MeshBuilder.CreateBox(name, - { width: sx, height: sy, depth: sz }, this.scene); + case 'trigger': { + const boxOpts = { width: sx, height: sy, depth: sz }; + // studs — per-face UV, чтобы кружки были одного размера на всех + // гранях (не растягивались на длинной стороне). + if (material === 'studs') boxOpts.faceUV = _studsCubeFaceUV(sx, sy, sz, studDensity); + return MeshBuilder.CreateBox(name, boxOpts, this.scene); + } case 'sphere': return MeshBuilder.CreateSphere(name, { diameterX: sx, diameterY: sy, diameterZ: sz, segments: 24 }, this.scene); @@ -490,9 +523,16 @@ export class PrimitiveManager { const dt = tex.diffuse.clone(); const nt = tex.normal.clone(); const dims = mesh._studsDims || { type: 'cube', sx: 1, sy: 1, sz: 1 }; - const tile = _studsTiling(dims.type, dims.sx, dims.sy, dims.sz); - dt.uScale = nt.uScale = tile.u; - dt.vScale = nt.vScale = tile.v; + // Куб/триггер тайлятся через faceUV геометрии (uScale=1) — кружки + // одного размера на всех гранях. Остальные формы — через uScale. + if (dims.type === 'cube' || dims.type === 'trigger') { + dt.uScale = nt.uScale = 1; + dt.vScale = nt.vScale = 1; + } else { + const tile = _studsTiling(dims.type, dims.sx, dims.sy, dims.sz, dims.density); + dt.uScale = nt.uScale = tile.u; + dt.vScale = nt.vScale = tile.v; + } mat.diffuseTexture = dt; mat.bumpTexture = nt; const sc = Color3.FromHexString(color || '#cccccc'); @@ -646,6 +686,12 @@ export class PrimitiveManager { if (patch.sx !== undefined) { data.sx = patch.sx; scaleChanged = true; } if (patch.sy !== undefined) { data.sy = patch.sy; scaleChanged = true; } if (patch.sz !== undefined) { data.sz = patch.sz; scaleChanged = true; } + // Плотность studs (мелкие/крупные кружки) — требует пересоздания меша + // (faceUV для куба зашит в геометрию). + if (patch.studDensity !== undefined) { + data.studDensity = Number.isFinite(patch.studDensity) ? patch.studDensity : 1; + scaleChanged = true; + } if (scaleChanged) { // Поскольку MeshBuilder уже создал mesh с базовыми размерами, // изменения через scaling кажутся правильными. Простой способ — @@ -794,7 +840,7 @@ export class PrimitiveManager { const oldMat = oldMesh.material; const typeDef = getPrimitiveType(data.type); - const newMesh = this._createMeshForType(typeDef, data.id, data.sx, data.sy, data.sz); + const newMesh = this._createMeshForType(typeDef, data.id, data.sx, data.sy, data.sz, data.material, data.studDensity); newMesh.position = oldPos; if (oldRot) newMesh.rotation = oldRot; newMesh.material = oldMat; @@ -807,15 +853,22 @@ export class PrimitiveManager { catch (e) { /* ignore */ } data.mesh = newMesh; - newMesh._studsDims = { type: data.type, sx: data.sx, sy: data.sy, sz: data.sz }; + newMesh._studsDims = { type: data.type, sx: data.sx, sy: data.sy, sz: data.sz, density: data.studDensity }; // studs-материал: пересчитать тайлинг под новый размер меша. + // Куб уже пересоздан с новым faceUV (тайлинг в геометрии) — uScale=1. + // Для остальных форм пересчитываем uScale/vScale по размеру. if (data.material === 'studs' && oldMat && oldMat.diffuseTexture) { - const tile = _studsTiling(data.type, data.sx, data.sy, data.sz); - oldMat.diffuseTexture.uScale = tile.u; - oldMat.diffuseTexture.vScale = tile.v; - if (oldMat.bumpTexture) { - oldMat.bumpTexture.uScale = tile.u; - oldMat.bumpTexture.vScale = tile.v; + if (data.type === 'cube' || data.type === 'trigger') { + oldMat.diffuseTexture.uScale = oldMat.diffuseTexture.vScale = 1; + if (oldMat.bumpTexture) oldMat.bumpTexture.uScale = oldMat.bumpTexture.vScale = 1; + } else { + const tile = _studsTiling(data.type, data.sx, data.sy, data.sz, data.studDensity); + oldMat.diffuseTexture.uScale = tile.u; + oldMat.diffuseTexture.vScale = tile.v; + if (oldMat.bumpTexture) { + oldMat.bumpTexture.uScale = tile.u; + oldMat.bumpTexture.vScale = tile.v; + } } } } @@ -870,6 +923,8 @@ export class PrimitiveManager { ...(d.locked ? { locked: true } : {}), // id пользовательской текстуры (картинка из AssetManager). ...(d.textureAsset ? { textureAsset: d.textureAsset } : {}), + // Плотность studs (если не 1) — мелкие/крупные кружки. + ...(d.studDensity && d.studDensity !== 1 ? { studDensity: d.studDensity } : {}), // Параметры лампы (только для type='light', иначе undefined) ...(d.light ? { brightness: d.brightness, range: d.range } : {}), // Параметр эмиттера (только для type='emitter') -- 2.47.2 From ea80ec3aa63d7e4d4e89025b1f4d9b0aeadfb2e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=98=D0=9D?= Date: Sun, 31 May 2026 13:37:44 +0300 Subject: [PATCH 4/4] =?UTF-8?q?fix(09):=20studs=20=D0=BD=D0=B5=20=D1=80?= =?UTF-8?q?=D0=B0=D1=81=D1=82=D1=8F=D0=B3=D0=B8=D0=B2=D0=B0=D1=8E=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D0=BF=D1=80=D0=B8=20scale-drag=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=D0=BC=D0=B8=D1=82=D0=B8=D0=B2=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit При scale-гизмо mesh.scaling тянул faceUV → studs превращались в полосы. Фикс: во время drag прячем studs-текстуру (плоский цвет), в dragEnd меш пересоздаётся с правильным faceUV. _recreateMesh для studs пересоздаёт материал заново (свежий тайлинг + восстановление текстуры). GizmoController: + onDrag (live) колбэк для scale. Co-Authored-By: Claude Opus 4.8 --- src/editor/engine/BabylonScene.js | 22 ++++++++++++++++++++ src/editor/engine/GizmoController.js | 8 +++++++ src/editor/engine/PrimitiveManager.js | 30 ++++++++++----------------- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/editor/engine/BabylonScene.js b/src/editor/engine/BabylonScene.js index 15902b4..b82b57e 100644 --- a/src/editor/engine/BabylonScene.js +++ b/src/editor/engine/BabylonScene.js @@ -1332,6 +1332,9 @@ export class BabylonScene { // При окончании drag — синхронизируем this._gizmo.setOnDragEnd(() => this._onGizmoDragEnd()); + // Во время scale-drag — live-обновление тайлинга studs (кружки одного + // размера, не растягиваются пока тянешь гизмо). + this._gizmo.setOnDrag((mode) => { if (mode === 'scale') this._onGizmoScaleDrag(); }); // Привязка гизмо к выделенному this.selection.setOnSelectionChange((sel) => this._updateGizmoForSelection(sel)); @@ -3547,6 +3550,25 @@ export class BabylonScene { * Гизмо манипулировал объектом — синхронизируем через SelectionManager. * Тип операции (move/rotate/scale) определяется по режиму гизмо. */ + /** + * Во время scale-drag studs-примитива: текстура (faceUV) растягивается + * вместе с mesh.scaling и кружки превращаются в полосы. Чтобы не показывать + * это — временно прячем diffuse/bump-текстуру (плоский цвет). В dragEnd меш + * пересоздаётся с правильным faceUV и текстура возвращается. + */ + _onGizmoScaleDrag() { + if (!this.selection) return; + const sel = this.selection.getSelection?.(); + if (!sel || sel.type !== 'primitive' || sel.material !== 'studs') return; + const mat = sel.mesh?.material; + if (mat && mat.diffuseTexture && !mat._studsHidden) { + mat._studsStash = { diffuse: mat.diffuseTexture, bump: mat.bumpTexture }; + mat.diffuseTexture = null; + mat.bumpTexture = null; + mat._studsHidden = true; + } + } + _onGizmoDragEnd() { if (!this.selection || !this._gizmo) return; const sel = this.selection.getSelection(); diff --git a/src/editor/engine/GizmoController.js b/src/editor/engine/GizmoController.js index 6de0d49..af2c08f 100644 --- a/src/editor/engine/GizmoController.js +++ b/src/editor/engine/GizmoController.js @@ -38,6 +38,7 @@ export class GizmoController { setOnDragEnd(cb) { this._onDragEnd = cb; } setOnDragStart(cb) { this._onDragStart = cb; } + setOnDrag(cb) { this._onDrag = cb; } /** Главный метод — переключить режим. */ setMode(mode) { @@ -88,6 +89,13 @@ export class GizmoController { gizmo.onDragStartObservable.add(() => { if (this._onDragStart) this._onDragStart(); }); + // onDrag (в процессе перетаскивания) — для live-обновления (напр. тайлинг + // studs, чтобы кружки не растягивались пока тянешь scale-гизмо). + if (gizmo.onDragObservable) { + gizmo.onDragObservable.add(() => { + if (this._onDrag) this._onDrag(mode); + }); + } gizmo.onDragEndObservable.add(() => { if (this._onDragEnd) this._onDragEnd(); }); diff --git a/src/editor/engine/PrimitiveManager.js b/src/editor/engine/PrimitiveManager.js index 54dfd52..b666569 100644 --- a/src/editor/engine/PrimitiveManager.js +++ b/src/editor/engine/PrimitiveManager.js @@ -843,7 +843,15 @@ export class PrimitiveManager { const newMesh = this._createMeshForType(typeDef, data.id, data.sx, data.sy, data.sz, data.material, data.studDensity); newMesh.position = oldPos; if (oldRot) newMesh.rotation = oldRot; - newMesh.material = oldMat; + // studs — материал пересоздаём заново (свежий faceUV/тайлинг + текстура + // могла быть временно спрятана во время scale-drag). Иначе переносим старый. + if (data.material === 'studs') { + newMesh._studsDims = { type: data.type, sx: data.sx, sy: data.sy, sz: data.sz, density: data.studDensity }; + this._applyMaterial(newMesh, typeDef, data.color, data.material); + try { oldMat?.dispose(); } catch (e) { /* ignore */ } + } else { + newMesh.material = oldMat; + } newMesh.isPickable = true; newMesh.metadata = { ...oldMesh.metadata }; newMesh.setEnabled(data.visible); @@ -853,24 +861,8 @@ export class PrimitiveManager { catch (e) { /* ignore */ } data.mesh = newMesh; - newMesh._studsDims = { type: data.type, sx: data.sx, sy: data.sy, sz: data.sz, density: data.studDensity }; - // studs-материал: пересчитать тайлинг под новый размер меша. - // Куб уже пересоздан с новым faceUV (тайлинг в геометрии) — uScale=1. - // Для остальных форм пересчитываем uScale/vScale по размеру. - if (data.material === 'studs' && oldMat && oldMat.diffuseTexture) { - if (data.type === 'cube' || data.type === 'trigger') { - oldMat.diffuseTexture.uScale = oldMat.diffuseTexture.vScale = 1; - if (oldMat.bumpTexture) oldMat.bumpTexture.uScale = oldMat.bumpTexture.vScale = 1; - } else { - const tile = _studsTiling(data.type, data.sx, data.sy, data.sz, data.studDensity); - oldMat.diffuseTexture.uScale = tile.u; - oldMat.diffuseTexture.vScale = tile.v; - if (oldMat.bumpTexture) { - oldMat.bumpTexture.uScale = tile.u; - oldMat.bumpTexture.vScale = tile.v; - } - } - } + // _studsDims и материал studs уже выставлены выше (через _applyMaterial + // на новом меше с правильным faceUV/тайлингом). Для не-studs ничего не надо. } /** Удалить инстанс. */ -- 2.47.2