fix(player): спавн в 0,0 если точка спавна удалена (порт)

spawnEnabled из project_data; при false игрок появляется в (0, поверхность+2, 0).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
min 2026-06-05 02:21:38 +03:00
parent 6c05c5631d
commit c3260e0395

View File

@ -5480,7 +5480,17 @@ export class BabylonScene {
});
if (this._onPlayerHpChange) this.player.setOnHpChange(this._onPlayerHpChange);
if (this._onPlayerDeath) this.player.setOnDeath(this._onPlayerDeath);
this.player.start(this._spawnPoint);
// Точка спавна удалена → игрок появляется в (0, безопасная высота, 0).
let startPoint = this._spawnPoint;
if (this._spawnEnabled === false) {
let sy = 3;
try {
const surf = this.physics?._sampleRobloxSurface?.(0, 0);
if (surf !== null && surf !== undefined) sy = surf + 2;
} catch (e) { /* ignore */ }
startPoint = { x: 0, y: sy, z: 0 };
}
this.player.start(startPoint);
// Запускаем пользовательские скрипты (этап 2.1).
// Async PlayerController.start даёт нам тик чтобы дать ему собрать сцену,
@ -7460,8 +7470,10 @@ export class BabylonScene {
// Точка спавна
if (state.scene.spawnPoint) {
this._spawnPoint = { ...state.scene.spawnPoint };
this._updateSpawnMarker();
this._updateSpawnMarker?.();
}
// Удалена ли точка спавна (плеер: спавн в 0,0 при отсутствии).
this._spawnEnabled = state.scene.spawnEnabled !== false;
// === Авто-fix спавна для smooth terrain ===
// Если есть RobloxTerrain и spawnPoint оказался НИЖЕ поверхности —
// поднимаем его, чтобы игрок не провалился в момент нажатия "Запустить".