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:
parent
6b53ed0477
commit
08817925b5
Binary file not shown.
@ -294,6 +294,19 @@ class Converter:
|
||||
for inst in self.model.instances:
|
||||
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]:
|
||||
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,
|
||||
})
|
||||
|
||||
# Spawn должен быть чуть выше — Roblox SpawnLocation это плоская плита,
|
||||
# юзер появляется на её верхней грани.
|
||||
# Spawn должен быть значительно выше — старые Roblox-карты часто имеют
|
||||
# толстый Floor выше плиты, юзер появляется внутри стены/пола если
|
||||
# не дать запас. +5 единиц достаточно — гравитация уронит на пол.
|
||||
scene['spawnPoint'] = {
|
||||
'x': pos['x'],
|
||||
'y': pos['y'] + 1.5, # отступ вверх чтобы не залипнуть в плите
|
||||
'y': pos['y'] + 5,
|
||||
'z': pos['z'],
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user