1) Предметы кита из тулбокса спавнятся на ТВЁРДОЙ поверхности под центром
экрана (getPlacementPointAtCenter: raycast в пол/объект), а не под камерой.
2) Многочастный кит (дверь) теперь реально попадает в папку: insertGameplayKit
ставил folderId, но дерево не пересобиралось (markDirty не трогает
hierarchyDirtyRef) — добавлен hierarchyDirtyRef.current=true.
3) enterPlayMode снимает любое выделение редактора (объект/папка) + убирает
пивот папки и gizmo — в Play больше нет подсветки выбранного.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1) Длинная тень-полоса: csm.frustumEdgeFalloff=8 — тень персонажа больше не
тянется на весь пол.
2) Удаление примитива/модели/блока через ПКМ теперь обновляет дерево
(markDirty + hierarchyDirtyRef) — раньше объект удалялся, но не пропадал.
3) Клик по СЦЕНЕ по объекту в папке → выделяется ВСЯ папка (selectByMesh
проверяет folderId). Отдельную часть — через раскрытие папки в дереве.
4) Free-drag папки: зажал ЛКМ на группе и тянешь — двигается вся папка
(moveFolderBy по дельте центра).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Добавлены все оставшиеся механики из TOOLBOX_KITS_FROM_WIKI.md:
Мир: зона опасности, шипы, светофор, грядка-урожай, падающие предметы.
Интерфейс: счётчик очков, HP-бар, дверь по коду (textbox), метка с именем,
обратный отсчёт, 3D-стрелка-указатель.
Эффекты: костёр (particles fire), магнит монет.
NPC и бой (новая категория): преследователь, торговец (modal.dialog),
мишень, враг с HP, волна врагов, диалог/кат-сцена, машина (vehicle:car).
Экономика (новая категория): магазин-кнопка, кликер, ключ+замок.
+2 категории китов (NPC и бой, Экономика). Всего ~37 китов.
Опущены «Главное меню» и «Экран загрузки» — требуют целой сцены, не «1 клик».
Все 45 скриптов прошли синтаксис-проверку, билд зелёный.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ручка/филёнки уезжали на обратную сторону двери: формула поворота смещения
была правосторонняя, а Babylon mesh.rotation.y — левосторонняя. Единая rotY()
(wx=lx·c+lz·s, wz=-lx·s+lz·c) для полотна И декора → всё открывается синхронно
в одну сторону.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Декор-части находятся по имени (findOne), их локальное смещение от центра
полотна поворачивается вокруг той же петли в place() — теперь филёнки и ручка
открываются вместе с дверью, а не висят в проёме.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Дверь теперь многочастная: полотно из тёмного дерева + 2 филёнки + золотая
ручка + косяк-рамка (2 стойки + перемычка). Уходит в общую папку.
- Плавное открытие: постоянный onTick ведёт угол cur→target со скоростью
~0.5с на 90° (вместо мгновенного скачка). Поворот вокруг петли сохранён.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Было: дверь сдвигалась вбок. Стало: вращение вокруг левой грани (петли) на
90°. Центр двери пересчитывается по дуге вокруг hinge (p0.z - halfW), плюс
self.rotate(angle) — дверь распахивается, как в реальности.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Портал: вместо хардкода +8 по X — findOne('Портал B') в момент касания и
телепорт к реальной позиции второго портала (его можно двигать куда угодно).
findOne на старте давал null (sceneSnapshot через rAF) → искать в onTouch.
- Дверь по E: сдвиг вбок (+3 по X) вместо ухода вниз (выглядело как исчезновение).
Текст подсказки «Открыть / закрыть».
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Партия 1 из TOOLBOX_KITS_FROM_WIKI.md:
- Батут (пружина) — onTouch → setVy(20) подброс вверх.
- Лента ускорения — onTouch → x2 скорости на 3с.
- Портал-телепорт — пара порталов, onTouch → teleport ко второму.
- Исчезающая платформа — onTouch → через 1с пропадает, через 3с возвращается.
- Дверь по кнопке E — onInteract → дверь уезжает вниз/возвращается.
game.self расширен: setVisible(vis) / setCollide(can) (нужны для исчезающей
платформы). Все скрипты прошли синтаксис-проверку (new Function).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
После переработки header убрал .headerInfo (flex:1), который раздвигал
заголовок и крестик → крестик прилип к названию. Добавил margin-left:auto
кнопке закрытия.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Дельта пивота применялась только в dragEnd → объекты телепортировались в
конце. Теперь _onFolderGizmoDrag применяет инкрементальную дельту на каждом
тике (setOnDrag) — движение/вращение/масштаб группы видно в процессе, как
у одиночных объектов.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Кит из нескольких частей (сундук = тело+крышка) теперь кладётся в общую
папку (folderManager.createFolder + assignToFolder), выделяется как группа.
Раньше части лежали отдельно в корне.
- Кит «Стартовая площадка»: on-target скрипт телепортирует игрока НА площадку
в начале игры (game.player.teleport через game.after 0.1с). Теперь игрок
появляется на ней, а не в фолбэк-точке (0,0).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Клик по папке в дереве → выделяется вся группа (подсветка всех объектов
внутри, рекурсивно по подпапкам) + групповой gizmo на пивоте в центре папки.
Манипуляторы двигают/вращают/масштабируют ВСЕ объекты папки сразу. Выбор
отдельной модели внутри — манипулирует только ей (как раньше).
- FolderManager: getFolderObjects (рекурсивный сбор + центр), moveFolderBy,
scaleFolder (от центра, +размеры примитивов), rotateFolderY расширен на модели.
- SelectionManager.selectFolder → multi-подсветка + type:'folder' + пивот-gizmo.
- BabylonScene._attachFolderGizmo/_applyFolderGizmo: пивот-TransformNode,
на dragEnd дельта (move/rotate/scale) применяется ко всей папке, пивот
пересоздаётся в новом центре. Пивот убирается при смене выделения.
- Дерево: клик по строке папки = выделить группу; клик по шеврону = свернуть.
Многокомпонентные модели уже кладутся в авто-папку (ModelManager) — теперь
их можно двигать как единое целое.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Баг: после удаления точки спавна она всё равно появлялась при запуске.
Теперь _spawnEnabled синхронизируется в React (spawnEnabledUI) через
onSceneChange/load/setSpawn/deleteSpawn; пункт «Точка спавна» скрыт из дерева
когда удалён; player.start использует фолбэк (0,поверхность+2,0). Стартовая
площадка теперь срабатывает (игрок не телепортируется на старый спавн).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Киты «Сундук» и «Счётчик монет» связаны через game.broadcast('coins',{add})
+ game.onMessage('coins') — раньше каждый кит в своём worker, счётчик не
обновлялся (был globalThis, не работает между воркерами).
- Точку спавна теперь МОЖНО удалить: Delete (SelectionManager.deleteSelected
обрабатывает type==='spawn' → scene.deleteSpawn) + ПКМ в дереве → контекст-
меню «Навести камеру / Удалить точку спавна».
- Если точка спавна удалена (_spawnEnabled=false) — игрок появляется в
(0, поверхность+2, 0). Постановка новой точки (setSpawnAtCamera) возвращает.
- spawnEnabled сериализуется в project_data.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Было: spawn кубиков в фикс. координатах (0,0.5,0) → конфетти сыпалось в
центре сцены, далеко от шара-источника (непонятно как связано). Стало:
кубики вылетают из game.self.position (позиции самого объекта-источника).
Описание кита уточнено: «фонтан конфетти из этого объекта».
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- game.self.rotate(ry)/rotateY(ry) добавлен в worker (слал scene.rotate с
ref объекта-носителя). Кит «Вращающийся объект» падал 'game.self.rotate is
not a function' каждый кадр в onTick — теперь крутится.
- upsertScript принимает name; вставка кита даёт скрипту имя = название кита
(раньше в дереве был сырой id script_mq03...). Ручное создание скрипта тоже
даёт «Скрипт N» / «Скрипт объекта N» вместо id.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Баг: фильтр дерева был scripts.filter(s => !s.target) → скрипты с
target:'game' (главные скрипты игры) НЕ показывались в группе «Скрипты»
(дерево писало «Скрипты (0)»), хотя в Play исполнялись и удалить их было
нельзя. Теперь глобальный = нет target ИЛИ target==='game'.
- ПКМ по «Точка спавна» в дереве → выбирает её (открывает свойства).
- Кит «Точка спавна» → «Стартовая площадка» (точка спавна уже есть по
умолчанию, дубль путал; её нельзя удалить — это by design).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- F в редакторе теперь фокусирует камеру на ВЫДЕЛЕННОМ объекте (раньше всегда
летел в центр 0,0,0). Если выделения нет — центр сцены. Только в edit-режиме.
- focusOnSelection поддерживает userModel + запасной путь по позиции меша.
- Вставка кита из Тулбокса: объект выделяется И камера наводится на него
(видно, куда добавилось) + переключение на инструмент «Выделить».
- Кит «Двойной прыжок» чинён: был setJumpPower (высокий прыжок) →
game.player.setDoubleJump(true) (настоящий второй прыжок в воздухе по Space).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Плитки категорий: убрал зависимость от CSS-переменных --text/--text-dim
(не заданы в модалке → текст был тёмный на тёмном). Явные светлые цвета.
Иконка теперь слева в одну линию с названием (grid 2 колонки), название 18px,
описание 13px. Верхние вкладки 15px. Советы/«скоро» крупнее. Trending-карточки
читаемее.
Единый Toolbox вместо отдельной кнопки «Модель» в панели «Создать»:
- 4 верхние вкладки как в Roblox: Магазин / Инвентарь / Недавние / Советы.
- Магазин: главный экран с 6 плитками-категориями (3D-объекты / Эффекты /
2D-картинки / Готовые механики / Плагины / Аудио) + ряд «Популярное» (FREE).
- Клик по категории → детальный список с поиском и подкатегориями; «← Категории».
- 3D-объекты = 700+ моделей; Эффекты = эмиттер/луч/указатель/свет/триггер;
Готовые механики = 12 китов; 2D/Плагины/Аудио = «Скоро будет».
- Инвентарь = мои воксельные модели; Недавние = модели сообщества; Советы = гайд.
- TopRibbon: кнопка «Модель» → «Toolbox» (открывает магазин); вкладка «Модель»
переименована в «Редактор моделей» (создание своих воксельных ассетов).
- CSS: topTabs/catGrid/catTile/trendRow/breadcrumb/soon/tips/freeBadge.
Вся прежняя логика моделей (lazy-load, лайки, thumbnails) сохранена внутри
новой структуры. Esc в категории → назад к плиткам.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Карточка g5 #62 guide-skybox (preview guide-skybox-scene.png, openProjectId
2541) + статья в docsLessons (что получится, API setSkybox/setClouds/setFog/
fadeTo, 3 шага, 4 скриншота день/ночь/космос) + иконка cloud в docsIcons.
Скрины в public/wiki (вне git) — на прод донести вручную при возврате CI.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Environment больше НЕ рисует свою жёлтую сферу-солнце/луну/фон (флаг
_drawSkyBodies=false) — иначе на небе было два солнца. Единое небо рисует
SkyboxManager (купол + солнечный диск + облака + горы). SkyboxManager стал
единым источником освещения: каждый пресет выставляет direction/intensity/
color солнца и ambient (lights переданы в конструктор), fadeTo плавно ведёт
и свет. Environment оставлен только для day/night cycle совместимости.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Процедурный gradient-skybox без внешних текстур: купол-сфера с ShaderMaterial
(градиент верх→горизонт→низ + солнечный диск + дымка), low-poly горы на
горизонте, billboard-облака с дрейфом, атмосферный туман, звёзды.
Пресеты: clear-summer-day / lowpoly-roblox / cloudy / sunset / starry-night /
space. Плавный fadeTo между пресетами (анимация цветов купола в tick).
game-API (студия): game.scene.setSkybox/setClouds/setFog,
game.scene.skybox.fadeTo/setSunDirection. Сериализация неба в project_data.
Тик облаков/перехода работает и в редакторе (превью).
Плеер пока НЕ портирован (по указанию — сначала проверка в студии).
Тест-игра «Небесная демка» id=2541 (dev-режим is_test=true, не в ленте).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Дерево «Объекты сцены»: авто-раскрытие ветки + скролл к объекту при
выборе на сцене (HierarchyPanel useEffect на selection).
- Копирование/дублирование примитива сохраняет вращение rotationX/Y/Z
(SelectionManager клал selection без rotation → копия теряла поворот).
- Копирование/дублирование переносит скрипты объекта на копию
(_copyScriptsToNewObject + clip.scripts для Ctrl+C/V).
- userModels (воксельные модели) теперь видны в дереве в группе «Мои
модели», можно выбрать/удалить/прикрепить скрипт (target kind userModel
уже поддержан в GameRuntime).
- Free-drag: перетаскивание объекта ЛКМ как в Roblox Studio — скольжение
по полу/поверх объектов с AABB-коллизией (скольжение вдоль преграды).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
У юзеров, открывавших статью/карточку ДО заливки PNG в build/wiki/,
браузер кэшировал SPA-fallback (HTML index.html вместо картинки) и
Ctrl+Shift+R не помогал (инцидент с guide-taxisim). Добавлен версионный
?v=N ко всем wiki-URL (Shot + карточки) — новый URL обходит битый кэш.
Бампать WIKI_ASSET_V при добавлении новых картинок.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Живое 3D-меню как в топ-играх Roblox: cinematic-камера облетает витрину,
патч-ноуты, логотип, кнопка ИГРАТЬ, музыка, блок управления.
- game.mainMenu.show/hide/setCamera/setPatchNotes/onShow/onPlay/onHide
- 4 режима камеры: cinematic(waypoints)/orbit/static/preset-cuts поверх camera.cutscene
- зацикливание облёта через onCutsceneDone (камера не вылетает за сцену)
- game.player.setInputBlocked экспортирован в worker + handler в runtime
- passthrough scene.mainMenu в toJSON/load
- вики g5 #60 guide-garage, тест-игра «Гараж Босса» id 2434 (GLB-машина Kenney)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Карточка guide-taxi: упоминание 3 локаций (гараж/город/магазин), описание
сжато до 1-2 предложений (как у соседних). Статья: триггер через GUI-кнопку,
интерьер магазина, Try на 4-ю локацию. Заодно сжато описание guide-zavod.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
du -sh натыкался на systemd-private-* в build/wiki/tmp (Permission
denied) → exit 1 → deploy failure, хотя rsync долетел. Теперь verify
проверяет наличие index.html, а du неблокирующий (2>/dev/null||true).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
При частичной загрузке сцены (terrain догрузился, модели/скрипты ещё
нет из-за таймаута) автосейв затирал scene нулями. Блокируем сейв если
ранее загружено >0 объектов, а сейчас 0 и пользователь не редактировал;
loadFailedRef в safety-timer блокирует автосейв при таймауте загрузки.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Движок: PlacementManager (тень-превью формой воксельной модели за курсором,
снап к сетке, стопка, проверка зоны и баланса, поворот R/колесо, ПКМ/Esc),
ShopInventoryUi (магазин-слоты, авто-серые при нехватке валюты); проводка
game.placement.* и game.inventoryUi.* в worker/GameRuntime/BabylonScene.
Попутные фиксы:
- TerrainManager: backFaceCulling=false — воксели не просвечивают (видна была
задняя грань сквозь переднюю);
- KubikonEditor: guard от потери userModels/scripts при частичной загрузке
(terrain догрузился, модели/скрипт нет → автосейв затирал) — критичный
фикс защиты данных для ВСЕХ игр;
- Hotbar: пустой инвентарь не показывает панель (глобальное правило);
- MinimapOverlay: миникарта только по флагу игры (не авто на больших картах);
- cleanup usermodel-инстансов при Stop.
Вики: карточка #58 + статья-урок «Мой завод» (g5 Разбор готовых игр),
openProjectId=2345, скриншоты залиты на прод.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>