fix(import): spawn point выше пола + auto-fallback если SpawnLocation нет

Юзер: "персонаж в стене заспавнился, ходить не может".

Проблема: SpawnLocation в старых .rbxl ставится по CFrame с минимальным
отступом от пола. Наш +1.5 недостаточно — толстые Floor'ы 2-3 units
high полностью утопляют персонажа. Anchored=True (наш фикс) не даёт
выпрыгнуть.

Фиксы:
1. SpawnLocation +1.5 → +5 единиц выше плиты.
2. Auto-fallback: если spawnPoint остался дефолтом (0,2,0) = в карте
   не было SpawnLocation вообще — ставим над самой высокой Part:
   y = max(part.y + part.sy/2) + 5. Игрок упадёт на крышу/верх.

Deploy converter.py на VM 130. Юзер должен переимпортировать карту
чтобы получить новый spawnPoint.
This commit is contained in:
min 2026-06-08 21:05:15 +03:00
parent 6b53ed0477
commit 08817925b5
2 changed files with 17 additions and 3 deletions

View File

@ -294,6 +294,19 @@ class Converter:
for inst in self.model.instances: for inst in self.model.instances:
self._convert_one(inst, scene) self._convert_one(inst, scene)
# Spawn fallback: если SpawnLocation в карте НЕ был (или дефолт 0,2,0
# остался) — поднимаем выше самой высокой Part'ы. Иначе игрок
# появляется внутри Anchored=True геометрии и не может двигаться.
sp = scene.get('spawnPoint', {'x': 0, 'y': 2, 'z': 0})
if sp.get('x') == 0 and sp.get('y') == 2 and sp.get('z') == 0:
prims = scene.get('primitives', [])
if prims:
max_top = max(
(p['y'] + p.get('sy', 1) / 2) for p in prims
if isinstance(p.get('y'), (int, float))
)
scene['spawnPoint'] = {'x': 0, 'y': max_top + 5, 'z': 0}
# Финальный отчёт о скипнутых классах # Финальный отчёт о скипнутых классах
for cls, n in sorted(self.stats.skipped_classes.items(), key=lambda x: -x[1])[:30]: for cls, n in sorted(self.stats.skipped_classes.items(), key=lambda x: -x[1])[:30]:
self.stats.warnings.append(f"skipped {n}× {cls}") self.stats.warnings.append(f"skipped {n}× {cls}")
@ -690,11 +703,12 @@ class Converter:
'neutral': not bool(props.get('Neutral', True)) and team_color.code != 0, 'neutral': not bool(props.get('Neutral', True)) and team_color.code != 0,
}) })
# Spawn должен быть чуть выше — Roblox SpawnLocation это плоская плита, # Spawn должен быть значительно выше — старые Roblox-карты часто имеют
# юзер появляется на её верхней грани. # толстый Floor выше плиты, юзер появляется внутри стены/пола если
# не дать запас. +5 единиц достаточно — гравитация уронит на пол.
scene['spawnPoint'] = { scene['spawnPoint'] = {
'x': pos['x'], 'x': pos['x'],
'y': pos['y'] + 1.5, # отступ вверх чтобы не залипнуть в плите 'y': pos['y'] + 5,
'z': pos['z'], 'z': pos['z'],
} }