KubikonEditor подмешивал skin_folder из БД в hash без проверки.
Для ~22 legacy-юзеров БД отдаёт skin_bacon-hair (модель удалена) →
в Play-режиме студии играл бекон. Теперь невалидный скин (не в
MIXAMO_SKINS и не customskin:) подменяется на skin_y-bot, как в
плеере (KubikonPlayer/GameMenu) и кабинете. Дефолты bacon → y-bot.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
After backend CORS rollout users had stale CORS-failure cached for
Mixamo GLB. Adding a query suffix forces browsers to re-fetch the URL
instead of replaying the cached failure.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Синхронизация с rublox-player (Этап 1 ANIMATIONS_PLAN.md):
MIXAMO:
- Добавлен MixamoAnimator.js (полная копия из плеера)
- В PlayerController список MIXAMO_SKINS (78 шт)
- _resolveModelSource ветка для skin_* — грузит GLB с /character-assets/skins/
- _loadPlayerModel создаёт MixamoAnimator для Mixamo-скинов
CROUCH (Ctrl):
- AABB → 0.45, скорость 0.45×walk, приоритет над sprint
- Анимации: crouch_enter → crouch_idle / crouch_walk → crouch_to_stand
- Y-drop по 0.20-0.45м для разных Mixamo-клипов
- Анти-флик debounce + детект one-shot vs loopable
PREVIEW PLAYER:
- Skin приоритет: URL #skin= → БД → localStorage → дефолт
- Дефолт skin_bacon-hair → skin_y-bot
ENTERPLAYMODE:
- BabylonScene при Play читает hash/localStorage и подставляет user skin
поверх projectModelType (тест-режим = играешь СВОИМ скином)
KUBIKONEDITOR:
- handlePlay async: предзагрузка скина из БД (если нет в URL) и инжект в hash
- При Play: requestFullscreen() — блокирует Ctrl+W/D/T/R/S/A/P/F и др.
- Во время Play: window keydown listener блокирует системные хоткеи,
WASD проходят к PlayerController (для crouch+движение)
Фронт студии (studio.rublox.pro) делал POST /import/rbxl/analyze
на minecraftia-school.ru/api-rbxl, preflight (OPTIONS) не получал
Access-Control-Allow-Origin → CORS ошибка.
Фиксы:
- after_request гарантированно ставит CORS-заголовки на ВСЕ ответы
(включая OPTIONS) — раньше flask-cors иногда их не отдавал
- Явный handler для OPTIONS /import/rbxl/analyze + create
- Headers: Allow-Origin=*, Allow-Methods, Allow-Headers content-type+x-user-id
- Убрал ALLOWED_USER_IDS=[1] (импорт открыт всем — кнопка
в UI уже без гейтинга, см. вики «Импорт из Roblox»)
Деплой: вручную через SSH на VM 130 (rbxl-importer не имеет CI/CD).
GraphicsManager: постобработка (bloom/FXAA/виньетка/цветокор/DoF) + тени/SSAO,
10 пресетов, mobile-safe, выкл по умолчанию. Новые материалы примитивов
(chrome/water/iridescent + улучшены glass/neon). API game.graphics.*. Графика +
Стартовый экран (Ken Burns) + Экран загрузки вынесены из Настроек в новый
GameDecorModal, открываются из вкладки «Игра» (группа «Оформление»). Вики-раздел
«Графика и эффекты» (GR1-GR4) + AI-контекст обновлён.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Дополнил коллаб-синхрон: GUI-элементы (guiManager create/update/remove),
папки (folderManager createFolder/renameFolder/removeFolder, id выравнивается
у соавторов через Map), пользовательские модели (userModelManager addInstance
с forceInstanceId / removeInstance). Списки в Hierarchy обновляются штатным
setInterval. Теперь синхронятся: примитивы, модели, блоки, скрипты, GUI,
папки, userModels.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Раньше синхронизировались только примитивы/модели/блоки, а скрипты нет —
у соавтора было 0 скриптов. Перехватываем scene.upsertScript/removeScript,
шлём op scriptUpsert/scriptRemove; applyRemoteOp применяет их у соавтора
(список в Hierarchy обновляется штатным setInterval). Лимит соавторов 5
(MAX_COLLABORATORS в realtime StudioRoom, задеплоен на VM110).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ITERATION 6 (single-VM rewrite):
- RobloxLuaSharedWorker: один wasmoon-state на 742 скрипта (не 742 VM)
- Pre-populated Workspace + Player.PlayerGui перед addScripts
- На каждом Part — Touched/TouchEnded сигналы; на каждом TextButton —
MouseButton1Click/Activated/MouseEnter/Leave; Humanoid с Died/Health
- Двухфазный init: addScriptsBatch ВСЕ скрипты → kickoff() с PlayerAdded
- wait()/task.wait/task.spawn/task.delay через scheduler+coroutines
- guiClick от Rublox-GUI → fireEvent → инстанс.MouseButton1Click.Fire()
- playerTouch → part.Touched.Fire(HumanoidRootPart) + humanoid.Touched
ITERATION 7 (nullStub compatibility):
- debug.setmetatable(nil, ...) + debug.setmetatable(function() end, ...)
с полным набором __index/__newindex/__call/__add/__sub/.../__len/__concat
- Возврат undefined из FindFirstChild/WaitForChild (вместо JS proxy)
- Lua-side __null_stub_singleton с Connect/connect/Wait/Fire (lowercase aliases)
- __rbxl_lookup_part через __rbxl_parts_by_id table (не ipairs на JS array)
- script.Parent гарантированно не nil (либо реальный Part либо null stub)
- RbxSignal: Connect+connect, Wait+wait, Fire+fire, Disconnect+disconnect
- SIGNAL_NAMES whitelist расширен: Tool (Selected/Equipped), Remote (OnInvoke),
ChatMakeSystemMessage, etc.
Converter:
- GUI: UDim2 dataclass правильно резолвится (scale*100 + offset/viewport*100)
- размеры в процентах (как Rublox-GuiOverlay ожидает)
- ScreenGui.Enabled → пропагируется в детей
- Эвристика скрыть HD Admin/Chat/CommandBar/TeleportTo модалки
- rbxasset:// rbxassetid:// фильтруются на пустой URL
Hierarchy:
- scroll-to-selected раскрывает workspace+rootPrims+folders перед scroll
- data-sel-id на всех ItemRow с rAF×2 timing
Известные ограничения:
- Synapse X obfuscated скрипты часто всё равно падают (требуют конкретный Roblox-VM)
- но debug.setmetatable перехват не даёт скриптам валиться на indexing/arithmetic
- реальные пользовательские KillBrick (Touched) теперь работают
- GUI кнопки → MouseButton1Click работают
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1) Стартовый экран загрузки больше НЕ показывается в студии при тестовом
запуске (scene._editorMode), только в плеере на rublox.pro «Играть».
2) Новая игра: коллаб-сессия поднимается сразу после первого сохранения
(без перезагрузки) + кнопка «Пригласить» авто-сохраняет проект.
3) Незалогиненный по collab-ссылке → форма входа rublox.pro/login (origin без
/app, был 404) с ?return → возврат на инвайт-ссылку.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Новые разделы: «Скрипты: рецепты» (S1-S12: килблок/касание/исчезновение/телепорт/
свойства примитивов/таймеры/враги/сохранение), «Контекст для нейронки» (полный
game-API одним copy-paste блоком для ChatGPT), «Вместе с друзьями» (V1-V3 Team
Create). Раздел «Системы» дополнен G7-G12 (лидерборды/floaters/инвентарь/небо/
меню/машины). Иконка users. 80 секций вики.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Бага: при выделении объекта в 3D-сцене иерархия не скроллила к нему
потому что:
- workspaceOpen=false скрывал всю секцию Сцены
- rootPrimsOpen/rootBlocksOpen/rootModelsOpen=false скрывали корневые
группы
- openFolders=пустой Set скрывал все папки с импортированной геометрией
Фикс: effect раскрывает все секции содержащие выбранный объект перед
скроллом. После раскрытия использует rAF×2 чтобы дать React дорендерить
ItemRow'ы, потом scrollIntoView.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- UDim2: scale теперь умножается на viewport reference (1280×720),
раньше игнорировался — фреймы получали 0×0 и фейлились на дефолт 100×30
или наоборот заполняли всё окно
- _udim2_pair(): пара (x,y) через _udim2_to_rublox(axis='x'|'y')
- Фильтр rbxasset:// rbxassetid:// rbxhttp:// rbxthumb:// URL'ов на пустую
строку — браузер их не загружает, спам в console исчезает
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Все 5 задач итерации:
1. Single-VM mode (RobloxLuaSharedWorker/Sandbox):
- один Worker, одна wasmoon-VM на ВСЕ скрипты проекта
- addScript() для каждого, общий tick/event broadcast
- снимает WASM OOM (1 VM 16MB вместо 742 × 16MB)
- убран per-script лимит 50, теперь все 742 загружаются
2. Touched events:
- sendGlobalEvent в shared sandbox распознаёт playerTouch
и пересылает в Worker как 'touched' с primId
- Worker находит Part по __primId в workspace и Fire'ит
его Touched сигнал — Lua-обработчики работают
3. Click в иерархии → scroll-to-selected:
- useEffect в HierarchyPanel ловит изменение selection
и scrollIntoView для нужного ItemRow
- data-sel-id атрибут на primitive/model/block строках
4. GUI Roblox в конвертере:
- ScreenGui/Frame/TextLabel/TextButton/ImageLabel/TextBox →
scene.gui c полным набором свойств (UDim2→pixel, Color3→hex,
BackgroundTransparency→bgOpacity, parentId)
5. Чистка:
- удалены debug-console.warn из PlayerController._loadPlayerModel
(убирает spam '[PlayerController.devlog]' в consoles)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Восстановлена полная ветка работ (задачи 16/17/20/40/44 + UX) из c8a9618 +
применена задача 05 (Ken Burns экран загрузки). Карточки g5: skybox/leaderstats/
floaters/inventory/loadingscreen. Ошибки 'items.define/autoMobFloaters/setSkybox
is not a function' были из-за работы на служебной CI-ветке без задач 40/44.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
LoadingScreenOverlay: Ken-Burns фон (CSS pan+zoom) + 4 стиля (ken-burns/static/
parallax/particles) + карточка-композиция (cover/название места/автор/verified-SVG).
Стартовый экран при входе в Play (showStartupLoadingScreen из enterPlayMode +
поля проекта loadingScreen.* + serialize/deserialize). API game.loading.
setBackground/isVisible/onHide + расширенный show. UI редактора: секция
«Стартовый экран входа (Ken Burns)». Вики g5 #62 + статья. Тест-игра 2713.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>