# Студия Рублокса

Open-source веб-студия для создания игр Рублокса — платформы 3D-игр в стиле Roblox.

Построена на **Babylon.js 7** + **React 18** + **Vite 5** + **Monaco Editor**. Делай вокселные карты, ставь модели, пиши скрипты на JS в Web Worker-песочнице. Опубликованные игры открываются в [Плеере Рублокса](https://git.rublox.pro/rublox/player) (отдельный репозиторий).

[![Лицензия: AGPL-3.0](https://img.shields.io/badge/%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F-AGPL--3.0-blue.svg)](./LICENSE)
[![Коммерческая лицензия](https://img.shields.io/badge/%D0%9A%D0%BE%D0%BC%D0%BC%D0%B5%D1%80%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D0%B0-green.svg)](./LICENSE-COMMERCIAL.md)

---

## Быстрый старт (5 минут)

**Требования:**
- Node.js 18+ и npm 10+
- Браузер с WebGL2 (Chrome 90+ / Firefox 90+ / Safari 15+)
- 8 ГБ свободной памяти (студия тяжелее плеера — Monaco + большой ландшафт)

**Установка:**
```bash
git clone ssh://git@git.rublox.pro:2222/rublox/studio.git
cd studio
npm install
cp .env.example .env       # дефолты указывают на публичный staging — работает сразу
npm run dev
```

Открой `http://localhost:5174/edit/<gameId>` — например `http://localhost:5174/edit/265`.

**Без JWT** ты увидишь экран авторизации. Чтобы обойти:
```js
// В DevTools браузера:
localStorage.setItem('Authorization', '<твой-jwt-с-rublox.pro>');
location.reload();
```

---

## Ассеты (GLB-модели / текстуры / звуки)

Папка `public/kubikon-assets/` (~93 МБ) **не хранится в git** чтобы репозиторий был лёгким. Скачать отдельно:

```bash
curl -L -o assets.zip https://git.rublox.pro/rublox/studio/releases/download/latest/kubikon-assets.zip
unzip assets.zip -d public/
```

Без ассетов студия запустится, но ландшафт будет пустой (нет текстур блоков).

---

## Standalone-режим (без бэкенда)

Хочешь попробовать без авторизации?

```bash
echo "VITE_STANDALONE=true" >> .env
npm run dev
```

Открой `http://localhost:5174/edit/sample` — пустой редактор, авторизация-мок, save отключён.

---

## Структура проекта

```
src/
├── editor/           # Главный редактор (KubikonEditor) ~37к строк
│   ├── engine/       # Babylon-движок — 66 файлов, ~28к строк
│   │                 # BabylonScene, GameRuntime, MultiplayerSync,
│   │                 # PlayerController, BlockManager, TerrainVoxelBuilder,
│   │                 # ModelManager, DecoManager, ScriptSandbox,
│   │                 # 30+ GD-гейммодов
│   └── *Panel.jsx, *Modal.jsx — UI редактора (Hierarchy/Inspector/Terrain/ScriptEditor)
├── preview-player/   # Встроенный мини-плеер для теста («Play»-кнопка в редакторе)
├── community/        # Витрина/лента: KubikonFeed, KubikonStudio, KubikonDocs,
│                     # KubikonLearn, KubikonGamePage, KubikonHeroKit, RealtimeTest
├── gd-shop/          # Geometry Dash: GdMenu, GdShop, GdRules, GdCoverArt, GdPlayWrapper
├── admin-preview/    # Превью-каталоги для дизайнеров: GdSkins, GdBosses,
│                     # GdSpikes, GdArches, GdFinishes, GdPortals, GdMusic,
│                     # GdSfx, GdShipSkins, GdDeco
├── components/       # Общий UI: KubikonBugReport, KubikonLeaderboard,
│                     # KubikonPerfOverlay, EmailConfirmNotice, PleeseReg,
│                     # RublocsLogo
├── api/              # API.js (конфиг) + Kubikon3DService.js + KubikonCadService
│                     # + SanctionsService + playTicket
├── auth/             # AuthContext, SanctionsContext (лёгкие версии,
│                     # без UserService от минки)
├── hooks/            # useDeviceType
├── utils/            # kubikonTheme, kubikonTime
├── App.jsx           # Router + Suspense (15+ роутов)
├── main.jsx
├── index.css
└── LoadingScreen.jsx
```

Подробнее об архитектуре — в [ARCHITECTURE.md](./ARCHITECTURE.md).

---

## Переменные окружения

Скопируй `.env.example` в `.env` и поправь:

| Переменная | Дефолт | Что означает |
|---|---|---|
| `VITE_API_BASE` | _(пустая)_ | Базовый URL HTTP-API. Пустой = vite-proxy (для dev). |
| `VITE_API_PROXY_TARGET` | `https://dev-api.rublox.pro` | (dev) куда vite-proxy шлёт `/api-*`. |
| `VITE_REALTIME_HTTP` | `https://dev-api.rublox.pro/api-game` | Colyseus HTTP. |
| `VITE_REALTIME_WS` | `wss://dev-api.rublox.pro/api-game` | Colyseus WS. |
| `VITE_RUBLOX_HOME` | `https://rublox.pro/app` | Редирект на главный сайт если нет авторизации. |
| `VITE_PLAYER_URL` | `https://player.rublox.pro` | URL плеера (для кнопки «Тест в плеере»). |
| `VITE_STANDALONE` | `false` | Пропустить API, открыть пустой редактор. |

---

## Команды

```bash
npm run dev         # Dev-сервер (vite, порт 5174)
npm run build       # Прод-билд → build/
npm run preview     # Превью прод-билда локально
npm run lint        # ESLint
npm run format      # Prettier (записать)
npm run format:check  # Prettier (проверить)
```

---

## Контрибьютинг

Мы рады PR'ам! Перед первым:

1. Прочитай [CONTRIBUTING.md](./CONTRIBUTING.md) — стиль, ветки, шаблон PR.
2. Подпиши [CLA](./CLA.md) (через `https://team.rublox.pro/developer/cla` или комментарий `/sign-cla`).
3. Открывай issues через шаблоны в `.gitea/ISSUE_TEMPLATE/`.

**Быстрый цикл:**
```bash
git checkout -b feature/моя-фича
# ...пишешь код...
npm run lint && npm run format
git commit -m "feat: описание"
git push origin feature/моя-фича
```

---

## Лицензия

Двойная лицензия:

- **[AGPL-3.0-or-later](./LICENSE)** — для open-source использования. Форки и производные работы (включая SaaS) обязаны публиковать свой исходник под той же лицензией.
- **[Коммерческая лицензия](./LICENSE-COMMERCIAL.md)** — для проприетарных продуктов. Контакт: `maksimivankov26@yandex.ru`.

Все контрибьюторы обязаны подписать [CLA](./CLA.md) перед первым merge.

© 2026 Иванкова Виктория Сергеевна (ИП). Все права защищены.

---

## Ссылки

- Главный сайт: https://rublox.pro
- Студия (демо): https://studio.rublox.pro
- Плеер (отдельный репо): https://git.rublox.pro/rublox/player
- Issues и PR: https://git.rublox.pro/rublox/studio
- Безопасность: [SECURITY.md](./SECURITY.md)

<!-- e2e-test 2026-06-07: проверка workflow разработчиков после восстановления -->
