fix(studio): портал ищет второй портал по имени, дверь уезжает вбок

- Портал: вместо хардкода +8 по X — findOne('Портал B') в момент касания и
  телепорт к реальной позиции второго портала (его можно двигать куда угодно).
  findOne на старте давал null (sceneSnapshot через rAF) → искать в onTouch.
- Дверь по E: сдвиг вбок (+3 по X) вместо ухода вниз (выглядело как исчезновение).
  Текст подсказки «Открыть / закрыть».

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
min 2026-06-05 08:46:34 +03:00
parent cfc79f325f
commit 4906c82792

View File

@ -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 });` }],
},
];