feat: ���� 3D-�������-��������� � ����� + dev JWT-������ #9

Merged
min merged 14 commits from feat/arrow-pointer into main 2026-05-30 19:41:40 +00:00

14 Commits

Author SHA1 Message Date
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
fe68248b57 ci: S1-деплой не блокирующий (continue-on-error + ConnectTimeout 20с)
Some checks failed
CI / Lint (pull_request) Failing after 56s
CI / Build (pull_request) Successful in 1m36s
CI / Secret scan (pull_request) Successful in 2m28s
CI / PR size check (pull_request) Successful in 7s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
S1 в downtime — деплой не должен валиться, главное доставить на S2.
S1 rsync/verify помечены continue-on-error; S2 остаётся строгим.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 22:20:03 +03:00
1c568728b5 fix(ci): убрать flat eslint.config.js (несовместим с eslint 8.57) — вернуть .eslintrc.json
Some checks failed
CI / Lint (pull_request) Failing after 56s
CI / Build (pull_request) Successful in 1m41s
CI / Secret scan (pull_request) Successful in 2m32s
CI / PR size check (pull_request) Successful in 6s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
CI Lint падал: ERR_MODULE_NOT_FOUND eslint-plugin-react-refresh + flat-config
(defineConfig/configs.flat) — это API eslint 9, а в lock eslint 8.57.1.
У студии (lint=success) рабочая схема — legacy .eslintrc.json. Привёл плеер
к ней: удалён eslint.config.js, .eslintrc.json дополнен правилами движка,
lint-скрипт с --ext .js,.jsx.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 22:13:55 +03:00
70bbd2f7d4 chore: не коммитить .env.production (только .env.example)
Some checks failed
CI / Lint (pull_request) Failing after 41s
CI / Build (pull_request) Successful in 1m32s
CI / Secret scan (pull_request) Successful in 2m31s
CI / PR size check (pull_request) Successful in 7s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 21:49:59 +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
66375e26c8 fix(player): управление камерой 02 как в студии + фикс рандомного меню
Привёл _setupInput/onPointerLockChange к рабочей студийной реализации:
- onCanvasMouseDownGlobal/onWindowMouseUpGlobal — ПКМ-orbit с проверкой
  needPermLock() (как в студии), вместо самодельных onRmbDown/onRmbUp.
- onPointerLockChange: при потере lock выход из Play (меню) ТОЛЬКО если
  needPermLock (first/lockfirst/sideview/shiftLock). В third потеря lock =
  отпустили ПКМ → остаёмся в Play. Это убирает рандомное открытие меню.
- onCanvasClick лочит только в perma-режимах.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 12:45:06 +03:00
7b869c83bd fix(player): клик по 3D-табличкам в third-person (свободный курсор)
_handlePlayClick пикал билборд из ЦЕНТРА экрана (w/2,h/2) — верно только при
pointer-lock. В third курсор свободен, юзер кликает мышью НЕ в центре →
pick промахивался, кнопки табличек не нажимались (Ферма 1981 и др).

Фикс: onMouseDown передаёт реальные canvas-координаты клика в
_handlePlayClick(clickX,clickY); при locked — центр, иначе — точка клика.
Добавлен console.log [billboard] для диагностики попадания.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 12:32:34 +03:00
fe23d099cd feat(player): hud.setHotbarVisible / hud.setHpVisible (паритет со студией)
Игры со студии (1995/2037/2046) звали game.hud.setHotbarVisible/setHpVisible —
в движке плеера были только hud.setVisible (весь HUD). Без них скрипт падал
на первой строке и игра не работала (нет монет, кнопки не жмутся).

Добавлено во все 3 слоя:
- ScriptSandboxWorker: методы hud.setHotbarVisible/setHpVisible → _send
- GameRuntime: обработчики cmd hud.setHotbarVisible/setHpVisible
- BabylonScene: _setHotbarVisible/_setHpVisible + колбэки видимости

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 12:16:37 +03:00
85f8198c7c fix(player): порядок чтения скина + управление камерой 02 + авто-меню
1. Стартовый скин не ставился: блок чтения scene.skins/playerModelType стоял
   НИЖЕ предзагрузки модели и enterPlayMode. Перенёс ВЫШЕ — теперь
   PlayerController при старте видит корректный _playerModelType.
2. Меню открывалось каждые ~4с: onPointerLockChange звал _onExitRequest при
   любой потере lock. В third/front потеря lock = отпустили ПКМ (orbit), это
   НЕ выход. Меню (Esc) только из perma-режимов (first/lockfirst/sideview/
   shift-lock).
3. Управление 02: start() лочит только в perma-режимах; onCanvasClick не лочит
   в third (курсор свободен для GUI/3D-табличек); ПКМ-orbit (onRmbDown/Up);
   onWheel авто-переход third<->first; _isPermaLockMode/_applyCursorVisibility.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 09:17:19 +03:00
6a2aeefee5 Merge remote-tracking branch 'origin/main' into feat/sync-engine-week4 2026-05-30 08:28:08 +03:00
2afd6a287a fix(player): кнопки 3D-табличек + управление камерой как в Roblox (задачи 01, 02)
Задача 01 — billboard-клик не работал: _handlePlayClick не проверял кнопки
табличек. Добавил pick по billboard-мешу из центра экрана → pickButtonAt →
fireClick (BabylonScene._handlePlayClick).

Задача 02 — управление было старым (всегда pointer-lock, ПКМ не работал):
- start(): lock только в perma-режимах (first/lockfirst/sideview/shift-lock),
  в third курсор виден свободно
- onCanvasClick: не лочит в third (курсор для GUI/3D-табличек)
- ПКМ-orbit: зажал ПКМ в third → lock+вращение, отпустил → курсор вернулся
- onWheel: авто-переход third↔first при зуме (порог 0.7), экспоненциальный шаг
- onPointerLockChange: отпускание ПКМ в third НЕ выходит из Play (раньше выходило)
- _applyCursorVisibility / _isPermaLockMode хелперы

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