import { NetworkService } from "./instances/NetworkService.js"; import { RenderService } from "./instances/RenderService.js"; import { ReplicatorService } from "./instances/ReplicatorService.js"; import { DataModel } from "./core/DataModel.js"; import { Workspace } from "./instances/Workspace.js"; import * as THREE from "three"; const dm = new DataModel(); dm.SetParent(null); // === Workspace === const ws = new Workspace(); ws.SetParent(dm); // === RenderService (headless physics) === const render = new RenderService(dm); render.isServer = true; render.start(); render.SetParent(dm); // === Networking === const net = new NetworkService(); net.listen(8080); net.SetParent(dm); // Simple echo handler net.registerHandler(0x01, 0x00, (payload, client) => { console.log("Received from client:", new TextDecoder().decode(payload)); net.sendToClient(client, 0x01, 0x01, payload); }); // === Replication Service === const replication = new ReplicatorService(dm, net); // === Test parts === const { LerpedBasePart } = await import("./instances/LerpedBasePart.js"); // Falling cube // Anchored ground const ground = new LerpedBasePart(); ground.Size = new THREE.Vector3(10, 1, 10); ground.Position.set(0, -0.5, 0); ground.setAnchored(true); ground.SetParent(ws); ground.updateSizes(); // Spin ground let angle = 0; setInterval(() => { angle += 0.01; ground.Orientation.set(0, angle, 0); ground.Position.set(5 * Math.sin(angle * 2), -0.5, 5 * Math.cos(angle * 2)); }, 16); /*setInterval(() => { const part = new LerpedBasePart(); part.Position.set(0, 35, 0); part.SetParent(ws); part.setAnchored(true); part.updateVisual(1 / 60); // Ensure physics is initialized setTimeout(() => { part.updateBodyPosition(); // Reset physics to new position part.setAnchored(false); }, 2000); part.updateSizes(); }, 1000);*/ // Falling cube singularity const part = new LerpedBasePart(); part.Size = new THREE.Vector3(1, 1, 1); part.Position.set(10, 5, 0); part.setAnchored(false); part.SetParent(ws); part.updateSizes();