From 4906c827922fd4da48405c656bb001fada4552a4 Mon Sep 17 00:00:00 2001 From: min Date: Fri, 5 Jun 2026 08:46:34 +0300 Subject: [PATCH] =?UTF-8?q?fix(studio):=20=D0=BF=D0=BE=D1=80=D1=82=D0=B0?= =?UTF-8?q?=D0=BB=20=D0=B8=D1=89=D0=B5=D1=82=20=D0=B2=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=BF=D0=BE=D1=80=D1=82=D0=B0=D0=BB=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8,=20=D0=B4=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=8C=20=D1=83=D0=B5=D0=B7=D0=B6=D0=B0=D0=B5=D1=82=20?= =?UTF-8?q?=D0=B2=D0=B1=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Портал: вместо хардкода +8 по X — findOne('Портал B') в момент касания и телепорт к реальной позиции второго портала (его можно двигать куда угодно). findOne на старте давал null (sceneSnapshot через rAF) → искать в onTouch. - Дверь по E: сдвиг вбок (+3 по X) вместо ухода вниз (выглядело как исчезновение). Текст подсказки «Открыть / закрыть». Co-Authored-By: Claude Opus 4.8 --- src/editor/engine/GameplayKits.js | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/editor/engine/GameplayKits.js b/src/editor/engine/GameplayKits.js index d3517d3..738a193 100644 --- a/src/editor/engine/GameplayKits.js +++ b/src/editor/engine/GameplayKits.js @@ -233,14 +233,16 @@ game.self.onTouch(() => { { type: 'cylinder', x: 8, y: 1.5, z: 0, sx: 0.4, sy: 3, sz: 3, color: '#4dffd6', material: 'neon', name: 'Портал B', canCollide: false }, ], scripts: [{ attachTo: 'on-target', code: -`// Портал A: касание → телепорт к порталу B (стоит правее на +8 по X). -// Передвинь «Портал B» куда нужно и поправь координаты ниже. +`// Портал A: касание → телепорт к «Портал B» (ищем его по имени в момент входа). +// Передвигай «Портал B» куда угодно — телепорт всегда попадёт к нему. let cd = false; game.self.onTouch(() => { - if (cd) return; cd = true; - const p = game.self.position; - game.player.teleport(p.x + 8, p.y + 1, p.z); // к месту портала B - game.after(1, () => { cd = false; }); + if (cd) return; + const b = game.scene.findOne('Портал B'); // ищем второй портал + if (!b || !b.position) return; + cd = true; + game.player.teleport(b.position.x, b.position.y + 1, b.position.z); + game.after(1.2, () => { cd = false; }); // защита от повторного входа });` }], }, { @@ -265,14 +267,15 @@ game.self.onTouch(() => { icon: 'door', category: 'world', prims: [{ type: 'cube', x: 0, y: 2, z: 0, sx: 1, sy: 4, sz: 3, color: '#8a5a3c', material: 'matte', name: 'Дверь' }], scripts: [{ attachTo: 'on-target', code: -`// Дверь по E: открыта/закрыта — уезжает вниз и возвращается. +`// Дверь по E: уезжает В СТОРОНУ (вбок) и возвращается. Ширина двери sx=1, +// сдвигаем на 3 единицы вбок — проход открывается. let open = false; const p0 = game.self.position; // закрытое положение game.self.onInteract(() => { open = !open; - if (open) game.self.move(p0.x, p0.y - 4.2, p0.z); // уехала вниз (открыта) - else game.self.move(p0.x, p0.y, p0.z); // вернулась (закрыта) -}, { text: open ? 'Закрыть' : 'Открыть', key: 'e', distance: 5 });` }], + if (open) game.self.move(p0.x + 3, p0.y, p0.z); // уехала вбок (открыта) + else game.self.move(p0.x, p0.y, p0.z); // вернулась (закрыта) +}, { text: 'Открыть / закрыть', key: 'e', distance: 5 });` }], }, ];