61 Commits

Author SHA1 Message Date
min
4a3192ea67 Merge remote-tracking branch 'origin/main' into feat/rbxl-import
All checks were successful
CI / Lint (pull_request) Successful in 55s
CI / Build (pull_request) Successful in 1m35s
CI / Secret scan (pull_request) Successful in 20s
CI / PR size check (pull_request) Successful in 6s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
# Conflicts:
#	src/engine/GameRuntime.js
#	src/engine/ScriptSandboxWorker.js
2026-06-10 00:56:26 +03:00
min
adc950accf feat(player): обновлённый LoadingScreenOverlay с blur-фоном из студии
All checks were successful
CI / Lint (pull_request) Successful in 52s
CI / Build (pull_request) Successful in 1m31s
CI / Secret scan (pull_request) Successful in 21s
CI / PR size check (pull_request) Successful in 6s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
В студии был обновлён loading-экран:
- размытый фон из cover-картинки
- квадратная обложка по центру вместо широкой
- имя автора под названием
- более крупный прогресс с процентом

Плеер остался на старой версии (синий фон, широкая обложка),
поэтому в проде разница была заметна — фикс делает плеер
1-в-1 со студией.
2026-06-10 00:48:36 +03:00
min
60f0ba009d chore(player): удалён мёртвый worker-based Lua стек после миграции на LuaSharedSandbox (Фаза 4)
All checks were successful
CI / Lint (pull_request) Successful in 55s
CI / Build (pull_request) Successful in 1m27s
CI / Secret scan (pull_request) Successful in 26s
CI / PR size check (pull_request) Successful in 10s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
2026-06-10 00:15:54 +03:00
min
bbc82af819 feat(player): синхронизация JS-API + BabylonScene._meshToTarget(npc) + GUI cmd-handlers (Фаза 3)
- ScriptSandboxWorker: добавлены отсутствующие методы game.self.* (rotate, rotateY,
  setVisible, setCollide, setColor, setLabel, clearLabel) — критично для GUI-карточек
  и интерактивных объектов сцены.
- Добавлены namespace'ы game.remote (RemoteEvent), game.tools (custom Tool.create),
  game.items.define, game.leaderstats (define/set/add/get/onChange/me-shortcut),
  game.achievements (define/unlock/has/bindToStat/setButtonVisible/openPage).
- inventory: добавлены inv2-методы (give/take/open/closeUi/toggle/sort/setActiveHotbar).
- giveTool теперь принимает Tool-объект из tools.create (поле customToolId).
- Роутинг globalEvent: добавлены leaderstatsChange, achievementUnlocked, toolEquipped,
  toolUnequipped, remoteEvent; toolUse теперь вызывает per-tool onActivated.
- tween() нормализует ref через _normRef — теперь принимает не только строку,
  но и объект из scene.spawn/find.
- BabylonScene._meshToTarget: добавлен случай md.npcId != null → kind='npc'.
- BabylonScene._handlePlayClick: в 3-м лице (без pointer-lock) клик теперь
  пикает по реальным координатам мыши, а не из центра экрана. Это чинит
  клики по GUI/3D-карточкам и интерактивным объектам в третьем лице.

Не тронуты старые worker-файлы (roblox-shim.js и т.п.) — снос будет позже.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-10 00:09:49 +03:00
min
7389dfc660 feat(player): GameRuntime запускает Lua через LuaSharedSandbox + cmd-handlers (Фаза 2) 2026-06-10 00:02:52 +03:00
min
3478ffafd1 feat: перенос Lua-стека из студии (Фаза 1: shim + sandbox + LabelManager + rbxl-integration + HudOverlay) 2026-06-09 23:58:04 +03:00
min
f34320db91 feat(rbxl-import): Lua-runtime (wasmoon) для Roblox-скриптов
All checks were successful
CI / Lint (pull_request) Successful in 54s
CI / Build (pull_request) Successful in 1m33s
CI / Secret scan (pull_request) Successful in 20s
CI / PR size check (pull_request) Successful in 6s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Часть тест-фичи импорта Roblox-карт (см. rublox/studio rbxl-importer/).

Что добавлено:
- wasmoon (Lua 5.4 WASM) как dep.
- RobloxLuaWorker.js — Worker-хост Lua-VM.
- RobloxLuaSandbox.js — main-side обёртка (по аналогии с ScriptSandbox).
- roblox-shim.js — math (Vector3/Color3/CFrame/UDim2),
  Instance прокси (game/workspace/script/GetService/IsA),
  Part свойства (Position/Color/Material/Anchored/CanCollide),
  RBXScriptSignal (Touched/Heartbeat/Stepped/Connect/Wait).
- roblox-scheduler.js — корутины + wait/task.wait/task.delay/task.spawn,
  автоматический fire Heartbeat/Stepped/RenderStepped на tick.
- roblox-tween.js — TweenService с 10 easing-функциями
  (Linear, Quad, Cubic, Quart, Quint, Sine, Bounce, Elastic, Back, Exponential).
- roblox-services.js — Players/LocalPlayer/Character/Humanoid
  (Health, WalkSpeed, JumpPower, TakeDamage, Died, LoadAnimation),
  UserInputService, RemoteEvent (FireServer/FireClient),
  RemoteFunction, DataStoreService, HttpService.
- roblox-physics.js — BodyVelocity/BodyGyro/BodyPosition/BodyForce/
  BodyAngularVelocity/AlignPosition/LinearVelocity.

Интеграция в GameRuntime:
- В start() проверяется script.kind === 'roblox-lua' →
  _startRobloxLuaScript() запускает RobloxLuaSandbox.
- _handleRobloxLuaCommand() мапит IPC команды (partSet/partVel/playerCmd)
  на PrimitiveManager и game.player API.
- _buildRobloxLuaSceneSnap() готовит snap для workspace:GetChildren.

Тесты: **36/36 passed**.
- mvp (9): math, Instance proxy, Part, IsA.
- wait (5): корутины, wait/task.wait/task.delay.
- tween (2): TweenInfo + Linear easing.
- services (8): Humanoid, DataStore, HttpService, RemoteEvent.
- integration (12): KillBrick, WalkSpeed, Tween-door, BodyVelocity конвейер,
  leaderstats, Checkpoint, циклы с wait, task.spawn, Color/Material,
  RemoteEvent client→server, Heartbeat, Vector3.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-07 18:23:32 +03:00
min
fed48dd701 fix(player): убрать self-assign text=text в FloaterManager (lint error, блокировал CI)
All checks were successful
CI / Lint (pull_request) Successful in 56s
CI / Build (pull_request) Successful in 1m33s
CI / Secret scan (pull_request) Successful in 27s
CI / PR size check (pull_request) Successful in 8s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 16:48:19 +03:00
min
37d1acbba1 fix(player): порт — self.delete снимает interact-подсказку
Some checks failed
CI / Lint (pull_request) Failing after 35s
CI / Build (pull_request) Failing after 29s
CI / Secret scan (pull_request) Failing after 32s
CI / PR size check (pull_request) Failing after 33s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 14:59:26 +03:00
min
5f789764a6 fix(player): порт — инвентарь hotbar-first + поднят над подсказкой
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 14:51:28 +03:00
min
4cc33daa1a feat(player): порт задачи 44 — drag-drop инвентарь
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 14:45:26 +03:00
min
d36059e5ce fix(player): порт — бластер от 3-го лица стреляет в точку клика
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 14:01:15 +03:00
min
909af7a5d8 fix(player): порт — NPC pickable+npcId для попаданий оружия (авто-floater)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 13:49:07 +03:00
min
08143b837c feat(player): порт — авто-floater над мобами + урон NPC от оружия (задача 40 доп)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 13:41:45 +03:00
min
8f229e2cfb feat(player): порт задачи 40 — damage floaters (game.fx.damageFloater)
FloaterManager + fx.damageFloater API/обработчик. Прогон 2676: стек -25×10,
мана -50, 0 ошибок.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 11:05:28 +03:00
min
3eee24ff48 fix(player): mainMenu.show подхватывает opts.onPlay/onShow/onHide (кнопка ИГРАТЬ не запускала игру)
show() игнорировал колбэки из опций — onPlay из mainMenu.show({onPlay}) не
регистрировался, кнопка ИГРАТЬ ничего не делала. Теперь опции-колбэки пушатся
в _onPlay/_onShow/_onHide.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 12:17:42 +03:00
min
d08497ef3b fix(player): scene.setLabel — import LabelManager вместо require (require крашит в браузере)
ReferenceError: require is not defined при game.self.setLabel/scene.setLabel
в плеере. Заменён require('./LabelManager') на статический import (как в студии).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 11:56:34 +03:00
min
b87d1e2525 feat(player): порт задачи 20 — лидерборды + достижения
LeaderstatsManager + AchievementsManager скопированы в плеер, интегрированы
в BabylonScene/worker/GameRuntime (те же точки, что в студии): HUD-таблица,
toast, кубок+страница, bindToStat, сохранение прогресса в БД (savegame, JWT),
мост onChange→worker. Прогон 2616 в плеере: таблица в DOM, 0 ошибок. Полная
фича-парность задачи 20.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 10:48:05 +03:00
min
192e721ba2 fix(player): SkyboxManager.hexToRgb короткий хекс #fff (порт)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 09:49:02 +03:00
min
88f4307308 fix(player): порт — анимация атаки NPC (setAttacking, R15 attack), scene.setVisible по ref
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 20:26:26 +03:00
min
53f9f3be00 fix(player): тени normalBias 0.02 (порт)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 20:12:54 +03:00
min
0417d60bdd fix(player): NPC анимация ходьбы + короткие тени (порт)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 19:47:29 +03:00
min
624bb2a05f fix(player): game.self.setLabel/clearLabel (порт)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 19:27:13 +03:00
min
b6397a3ad0 fix(player): scene.setColor по ref + scene.setScale (порт)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 19:13:05 +03:00
min
e4125e6488 fix(player): folderId в serialize/load (парность со студией)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 19:00:38 +03:00
min
fe7e402ebc fix(player): canCollide в metadata примитива (камера не цепляется за зоны, порт)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 18:49:18 +03:00
min
ffc5341922 fix(player): csm.frustumEdgeFalloff=8 (затухание длинной тени, порт)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 18:19:05 +03:00
min
fd1d6c7fdb fix(player): game.self.setColor (порт)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 09:31:49 +03:00
min
8cc608ca2a fix(player): game.self.setVisible/setCollide (порт для китов Вики)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 07:41:25 +03:00
min
c3260e0395 fix(player): спавн в 0,0 если точка спавна удалена (порт)
spawnEnabled из project_data; при false игрок появляется в (0, поверхность+2, 0).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 02:21:38 +03:00
min
6c05c5631d fix(player): game.self.rotate (порт) — фича-парность с студией
self.rotate(ry)/rotateY шлёт scene.rotate с ref носителя (обработчик
scene.rotate в плеере уже был). Иначе вращающиеся объекты падали бы в плеере.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 02:05:17 +03:00
min
a22832628f fix(player): единая система неба — убрать второе солнце (порт)
Фича-парность: Environment не рисует жёлтую сферу/луну (флаг _drawSkyBodies),
SkyboxManager — единый источник неба и света (lights в конструкторе). Порт
правок студии 1:1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 00:44:25 +03:00
min
151b95f395 feat(player): задача 16 — порт кастомного неба (SkyboxManager)
Фича-парность со студией: SkyboxManager (gradient-купол + горы + облака +
туман + звёзды + пресеты + fadeTo), game-API scene.setSkybox/setClouds/setFog
+ skybox.fadeTo/setSunDirection, сериализация неба, tick облаков/перехода.

Проверено на тест-игре 2541 «Небесная демка» в локальном плеере — небо,
кнопки пресетов и облачность работают.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 00:30:25 +03:00
min
eb6430182b feat(14): Vehicle System V1+V2 — порт в плеер
All checks were successful
CI / Lint (pull_request) Successful in 57s
CI / Build (pull_request) Successful in 1m34s
CI / Secret scan (pull_request) Successful in 2m30s
CI / PR size check (pull_request) Successful in 7s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Фича-парность со студией (задача 14):
- VehicleManager + VehicleHud (спидометр-стрелка) идентичны студийным.
- game.scene.spawn('vehicle:car'), onVehicleEnter/Exit, hold-F/E, камера follow/V.
- Звук мотора (рокот+LFO), оседание машины на землю (_settle+повторы),
  скрытие водителя, респавн при падении, shadow-caster фильтр (фикс FPS).
- incrementPlay(id, userId) — передаём user_id для cooldown.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 02:25:15 +03:00
min
b2cff903ba feat(13): главное меню игры (game.mainMenu) — порт в плеер
All checks were successful
CI / Lint (pull_request) Successful in 59s
CI / Build (pull_request) Successful in 1m37s
CI / Secret scan (pull_request) Successful in 2m30s
CI / PR size check (pull_request) Successful in 7s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Фича-парность со студией: namespace game.mainMenu (show/hide/setCamera/
setPatchNotes/колбэки) + зацикливание облёта через onCutsceneDone +
game.player.setInputBlocked в worker + handler в runtime + passthrough
scene.mainMenu в load. Проверено: меню работает в плеере на игре 2434.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 00:07:47 +03:00
min
302db5e1f4 feat(12): внутриигровой Loading Screen (game.loading) — порт в плеер
All checks were successful
CI / Lint (pull_request) Successful in 58s
CI / Build (pull_request) Successful in 1m36s
CI / Secret scan (pull_request) Successful in 2m40s
CI / PR size check (pull_request) Successful in 7s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Фича-парность со студией: LoadingScreenOverlay.js (DOM-оверлей),
namespace game.loading в worker (хэндл local→real + колбэки через
globalEvent), cmd loading.* + _ensureLoadingScreen в GameRuntime,
class-ref + tick + load конфига в BabylonScene. Проверено: экран
загрузки работает в плеере на тест-игре «Такси-босс» 2427.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 22:00:42 +03:00
min
91af8514c5 fix(11): порт game.format в worker плеера (money/number/time)
All checks were successful
CI / Lint (pull_request) Successful in 55s
CI / Build (pull_request) Successful in 1m29s
CI / Secret scan (pull_request) Successful in 2m30s
CI / PR size check (pull_request) Successful in 6s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Скрипт «Мой завод» (id 2345) падал в плеере на game.format.money —
неймспейс был только в worker студии. Из-за краха в синхронной части
не доходило до inventoryUi.create/placement → инвентарь не показывался.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 20:09:27 +03:00
min
517545b0cf feat(11): порт placement mode в плеер (фича-парность со студией)
Some checks failed
CI / Lint (pull_request) Successful in 54s
CI / Build (pull_request) Successful in 1m30s
CI / Secret scan (pull_request) Failing after 12s
CI / PR size check (pull_request) Successful in 8s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
PlacementManager + ShopInventoryUi + проводка game.placement.*/inventoryUi.*
в worker/GameRuntime/BabylonScene — опубликованные tycoon-игры с расстановкой
теперь работают в плеере. + TerrainManager backFaceCulling=false (воксели не
просвечивают), cleanup usermodel при Stop, Hotbar скрыт при пустом инвентаре.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 19:06:51 +03:00
322dd089d9 merge main into feat/studs-material-09
All checks were successful
CI / Lint (pull_request) Successful in 1m1s
CI / Build (pull_request) Successful in 1m34s
CI / Secret scan (pull_request) Successful in 2m31s
CI / PR size check (pull_request) Successful in 6s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
2026-05-31 14:09:39 +03:00
8504549928 fix(09): _recreateMesh studs пересоздаёт материал (паритет со студией)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 13:37:44 +03:00
ae83926a5a feat(09): per-face UV studs + studDensity (паритет со студией)
All checks were successful
CI / Lint (pull_request) Successful in 56s
CI / Build (pull_request) Successful in 1m31s
CI / Secret scan (pull_request) Successful in 2m30s
CI / PR size check (pull_request) Successful in 6s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
faceUV для куба (кружки одного размера на всех гранях) + studDensity
(плотность кружков) — портировано из студии.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 13:26:52 +03:00
d5968f7cb8 feat(09): сочные круглые studs (v4) — паритет со студией
- Текстура studs v4 (круглые, объём+тени, сочный цвет), URL studs_v4_*.
- PrimitiveManager: emissive 45% цвета + новые константы (GRID 4, UNIT 1).
- BlockManager/BlockTypes: studs-block на v4-текстуре, specular убран.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 12:22:03 +03:00
80e546eb08 feat(09): материал studs + studs-block + лего-сет (паритет со студией)
Портирование задачи 09 в плеер:
- PrimitiveManager: material 'studs' (diffuse×color + normal, тайлинг по размеру).
- BlockTypes: studs-block ('Окрашиваемые', colorable).
- BlockManager: per-instance color через ThinInstance color buffer
  (useVertexColors + thinInstanceSetBuffer('color')), addBlock с color,
  _setBlockColorAt/setBlockColor, serialize/load с color.
- GameRuntime: scene.setColor блока + spawn block с color.
- ScriptSandboxWorker: spawn блока прокидывает color.
- ModelTypes: лего-сет 19 compound-моделей (паритет).

Текстуры: public/kubikon-assets/materials/studs_{diffuse,normal}.png.
Проверено: рендер studs-блоков/примитивов/лего-моделей.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 11:11:09 +03:00
acb5b0b133 fix(player): меню ESC — toggle вместо открытия поверх + чинит orbit-камеру по ПКМ
All checks were successful
CI / Lint (pull_request) Successful in 58s
CI / Build (pull_request) Successful in 1m35s
CI / Secret scan (pull_request) Successful in 2m29s
CI / PR size check (pull_request) Successful in 6s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Два бага меню в плеере:
1. Повторный ESC открывал меню ПОВЕРХ первого (не закрывал).
2. После открытия/закрытия меню переставала работать orbit-камера по
   зажатой ПКМ (игры задачи 2 camera_mouse_controls).

Первопричина: ESC слушали ДВА обработчика — движок (setOnExitRequest →
_onEscMenu) и React (отдельный keydown при topMenuOpen). На одно нажатие
срабатывали оба → гонка: меню дублировалось, а _uiCursorMode застревал в
true, из-за чего onCanvasMouseDownGlobal (if _uiCursorMode return) игнорировал
ПКМ → orbit-камера не включалась.

Фикс — единый источник истины в движке:
- BabylonScene: флаг _playerMenuOpen + toggle в setOnExitRequest (открыто→
  закрыть+setUiCursorMode(false), закрыто→открыть). _onEscMenu(open) передаёт
  состояние в UI. setPlayerMenuOpen(open) — синхронизация при закрытии из UI
  (кнопка «Продолжить»). Сброс флага в enterPlayMode.
- KubikonPlayer: setOnEscMenu((open)=>setTopMenuOpen(open)); УБРАН дублирующий
  React ESC-обработчик; onClose меню → setPlayerMenuOpen(false); синхронизация
  _playerMenuOpen=true в onLockChange (perma) и setOnPlayChange.
- PlayerController.setUiCursorMode(true): сброс _rmbHeld=false (иначе если меню
  открыли при зажатой ПКМ, флаг застревал → orbit «думал» что ПКМ активна).

Проверено: ESC открыл→ESC закрыл (1 меню в DOM), ПКМ-orbit работает после меню.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 09:55:58 +03:00
256f147568 fix(engine): findOne(x).onTouch + findOne на старте + паритет Instance-proxy
All checks were successful
CI / Lint (pull_request) Successful in 55s
CI / Build (pull_request) Successful in 1m42s
CI / Secret scan (pull_request) Successful in 2m30s
CI / PR size check (pull_request) Successful in 6s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Портирование фикса из studio (фича-парность движков). Баг: стрелка-указатель
game.fx.pointer не переключалась на следующую цель.

- find/findOne/all раньше возвращали голую строку-ref → .onTouch невозможен.
  Приведены к студийному Instance-proxy (_getOrCreateInstance, coerces в строку
  через Symbol.toPrimitive → обратно совместимо со старым кодом).
- Instance-proxy: + onTouch/onUntouch/onClick → inst.watchTouch{ref}.
  Worker: _instTouchHandlers + маршрут instTouch/instUntouch/instClick;
  _detectSnapshotDeltas для changed/destroying-событий.
- GameRuntime: inst.watchTouch/watchClick → _watchedTouchRefs; routeInstEvent.
- BabylonScene._detectTouchEvents: блок watched-объектов + _refToTarget;
  _touchState.clear() в enterPlayMode.
- Первичный snapshot сцены в init (setInitialScene) → findOne на старте.

Проверено на проде player.rublox.pro/333: стрелка переключается
red-cube→blue-sphere→gold-chest, на финале удаляется.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 08:28:55 +03:00
9c79da4ce5 fix(lint): устранить 8 eslint-ошибок (предсущ., всплыли после починки конфига)
All checks were successful
CI / Lint (pull_request) Successful in 58s
CI / Build (pull_request) Successful in 1m34s
CI / Secret scan (pull_request) Successful in 2m28s
CI / PR size check (pull_request) Successful in 6s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
- no-dupe-keys: дубль ключа эмодзи '🟧' в Icon.jsx
- no-useless-escape: лишний \- в regex (ticketExchange, EmoteGlbParser)
- no-extra-semi: висячие ; в PreviewSkin-route (auto-fix)
Лок. eslint: 0 errors, 118 warnings (< max-warnings 200).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 22:30:50 +03:00
8f0524cbb3 feat: порт 3D-стрелки-указателя в плеер (фича-парность) + dev JWT-панель
- game.fx.pointer + расширенный game.fx.beam: BeamManager (текстуры/curved/
  градиент/quest-marker), ScriptSandboxWorker (_normFxPoint от DataCloneError),
  GameRuntime (fx.createPointer/pointerTarget/pointerUpdate/beamUpdate/
  beamVisible), BabylonScene._activatePointers. 1-в-1 со студией.
- Dev JWT-панель на экране «Нужен JWT» (только localhost): кнопка → инпут →
  localStorage.player_jwt + reload.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 21:46:24 +03:00
bec3ee830c fix(player): смена скина - манифест объединяет статичный JSON + rublox/avatars (фикс исчезновения скина при setSkin non-humanoid) 2026-05-30 14:06:56 +03:00
f794fbe2d4 fix(player): чат — русская модалка вместо англ. кода при неподтверждённом email
REST-fallback чата при ошибке email_not_confirmed попадал в else-ветку и
показывал сырой код email_not_confirmed (англ). WS-путь уже показывал
русскую модалку EmailConfirmNotice. Добавил ту же ветку в REST-catch:
email_not_confirmed → setEmailNotice(true). Игра 2046 не-мультиплеерная,
чат часто идёт REST-фоллбэком → баг был виден именно там.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 13:30:37 +03:00
e26f854578 fix(player): меню больше не открывается на отпускание ПКМ (orbit)
React onLockChange в KubikonPlayer считал ЛЮБУЮ потерю pointer-lock за
нажатие ESC и открывал меню. В third отпускание ПКМ (orbit-камера) тоже
снимает lock → меню выскакивало на каждый поворот камеры.

Теперь меню открывается только если lock потерян в perma-режиме
(first/lockfirst/sideview/shiftLock) — там потеря lock = реальный ESC.
В third отпускание ПКМ игнорируется.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 13:15:09 +03:00