All checks were successful
Сегодня доведены до играбельного состояния:
- UI модалка импорта подключена в KubikonStudio (кнопка для МИНа в навигации)
- Converter: SCALE 0.35 (карта пропорциональна R15-персонажу),
playerModelType='skin_bacon-hair', Lua упакован в поле code с маркером
// @roblox-lua (storys API сохраняет только {id,code,target,name})
- vite.config: api+статика через rublox.pro/minecraftia-school.ru
- GameRuntime: распознаёт маркер, запускает через RobloxLuaSandbox
+ wasmoon Worker. Фильтрация: target!=null + lua<2500б +
лимит 50 sandbox'ов (WASM OOM при >50 VM)
- roblox-shim: nullStub (Proxy с no-op методами) вместо null
для FindFirstChild/WaitForChild — цепочки не падают
- require() заменён на nullStub
- RobloxLuaSandbox: совместимость с интерфейсом ScriptSandbox
(sendGlobalEvent/SceneSnapshot/etc — no-op заглушки)
- RobloxLuaWorker: pcall обёртка над user-кодом
- remoteDevlog.js + /devlog endpoint: автосбор browser-логов
- PlayerController._loadSkinManifest: dev-fallback на studio.rublox.pro
Тест на Easy Obby:
- 8205 instances → 2245 primitives + 742 Lua-scripts
- 50/742 Lua-VM запущены (KillBrick handlers и т.п.),
151 отфильтровано как admin/chat services, 541 пропущено по памяти
- Скин bacon-hair виден, FPS 20-25
- Сцена играется, можно ходить, прыгать
TODO (следующая итерация):
- Single-VM mode для wasmoon (один Lua-state на 742 скрипта,
убрать WASM OOM)
- Реализовать select/focus в иерархии для импортированных карт
- Touched events от Babylon impostor → Lua-shim сигналы
- Поддержка GUI (ScreenGui/Frame/TextLabel) в конвертере
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
68 lines
2.8 KiB
JavaScript
68 lines
2.8 KiB
JavaScript
import { defineConfig, loadEnv } from 'vite';
|
||
import react from '@vitejs/plugin-react';
|
||
|
||
// Vite-конфиг студии Рублокса.
|
||
//
|
||
// - порт 5174 фиксирован (плеер на 5173, чтобы можно было гонять оба
|
||
// проекта параллельно на одной машине)
|
||
// - outDir 'build' (деплоится в nginx /var/www/rublox-studio/build/)
|
||
// - manualChunks: babylon/monaco/colyseus в отдельные чанки
|
||
// (movie engine ~46к строк + monaco ~5МБ — без разделения тормозит)
|
||
// - define для process.env.NODE_ENV — шим для engine-кода
|
||
// - dev-proxy по умолчанию на staging (dev-api.rublox.pro);
|
||
// переопределяй через VITE_API_PROXY_TARGET если нужно свой бэкенд.
|
||
export default defineConfig(({ mode }) => {
|
||
const env = loadEnv(mode, process.cwd(), '');
|
||
const PROXY_TARGET = env.VITE_API_PROXY_TARGET || 'https://dev-api.rublox.pro';
|
||
|
||
// Префиксы которые проксируем на бэкенд.
|
||
// Для prod-target (minecraftia-school.ru) — режем напрямую на S2 IP (85.175.6.22),
|
||
// т.к. на S1 user-service остался старый JWT_SECRET после ротации 2026-06-04,
|
||
// и токены выданные S2 на S1 не валидируются.
|
||
const proxyPrefixes = ['/api-user', '/api-storys', '/api-game'];
|
||
const isProdTarget = PROXY_TARGET.includes('minecraftia-school.ru');
|
||
const proxyOpts = {
|
||
target: PROXY_TARGET,
|
||
changeOrigin: true,
|
||
secure: true,
|
||
ws: true,
|
||
};
|
||
const proxy = Object.fromEntries(proxyPrefixes.map((p) => [p, proxyOpts]));
|
||
// /api-rbxl — отдельный target (VM 130 rbxl-importer на S1).
|
||
// В dev: ходим напрямую через CF DNS (proxied=false → 85.175.7.40 → NPM → VM 130).
|
||
proxy['/api-rbxl'] = {
|
||
target: env.VITE_RBXL_PROXY_TARGET || 'http://api-rbxl.rublox.pro',
|
||
changeOrigin: true,
|
||
secure: false,
|
||
rewrite: (path) => path.replace(/^\/api-rbxl/, ''),
|
||
};
|
||
// Вся статика (kubikon-assets, assets, wiki, dev-*.json) лежит в public/ —
|
||
// vite сама отдаёт. Никаких proxy не нужно. См. setup-public.ps1 если папок нет.
|
||
|
||
return {
|
||
plugins: [react()],
|
||
server: {
|
||
host: '127.0.0.1',
|
||
port: 5174,
|
||
strictPort: true,
|
||
proxy,
|
||
},
|
||
build: {
|
||
outDir: 'build',
|
||
sourcemap: false,
|
||
rollupOptions: {
|
||
output: {
|
||
manualChunks: {
|
||
babylon: ['@babylonjs/core', '@babylonjs/loaders'],
|
||
monaco: ['@monaco-editor/react'],
|
||
colyseus: ['colyseus.js'],
|
||
},
|
||
},
|
||
},
|
||
},
|
||
define: {
|
||
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development'),
|
||
},
|
||
};
|
||
});
|