>_ DevTrendsnl

Taal

Home

Talen

Secties

Frontend Backend Mobiel DevOps AI / ML GameDev Blockchain Embedded Beveiliging
Rust

Een MMORPG lanceren waar AI-agents en mensen als gelijken spelen

Ik ben onlangs de OpenMMO-repository tegengekomen. De auteur van het project bouwt iets waar veel mensen alleen theoretisch over hebben gediscussieerd: een sandbox waar AI-agents personages aannemen en door de wereld rennen samen met echte mensen. De server heeft geen idee wie er aan de andere kant zit. Bots en mensen worden bediend via hetzelfde WebSocket-protocol, zonder speciale handlers of verborgen eindpunten.

Het project wordt gebouwd door één ontwikkelaar. De tech stack is interessanter dan typische hobbyprojecten: een Rust-server, een browser-client gebouwd met Svelte en Three.js voor 3D-graphics met WebGPU, plus een aparte Rust-client voor AI-agents met MCP-protocolondersteuning.

Waar het project over gaat

Het idee draait om eerlijke gelijkwaardigheid. Als een mens een WebSocket-pakket moet sturen om naar een aangrenzend vakje te bewegen of een mob aan te vallen, doet de AI-agent exact hetzelfde. De server verwerkt deze acties identiek, zonder speciale uitzonderingen voor automatisering.

De wereld is isometrisch met een kwart- view perspectief. De graphics zijn samengesteld uit een mix van bronnenmodellen en algoritmisch gegenereerde assets. De achtergrondmuziek met ongeveer vijftig tracks is gemaakt met Suno en Google Flow Music tools.

Laten we eens kijken hoe deze wereld intern is opgebouwd.

Procedurele geografie en bouwen

De speelruimte beslaat een gebied van 32 bij 32 kilometer. De kaart wordt procedureel gegenereerd: biomen, kustlijnen en een complex riviersysteem.

Procedural world map

Rivieren vormen delta's wanneer ze in de oceaan stromen en splitsen zich in takken. Langs het wegennet plaatst de server automatisch houten bruggen waar wegen rivierkanalen kruisen.

River delta with branching tributaries

Het spel heeft veranderende dagdelen en seizoenen. De lengte van dag en nacht hangt af van de positie van de planeet in zijn baan. Twee manen met onafhankelijke fasen en banen zijn tegelijkertijd aanwezig in de hemel.

Celestial orbit panel with sun, planet, and two moons

De sfeer wordt versterkt door verlichting. Fakkels werpen dynamische schaduwen met realistische lichtafval.

Night scene with torch lighting

Spelers hebben toegang tot modulair bouwen. Je kunt huizen bouwen variërend van twee tot vier verdiepingen, deuren, ramen en meubels plaatsen.

Wooden frame house with a bed inside

Itemfysica houdt rekening met verdiepingen. Als een personage een zwaard op de tweede verdieping van een huis gooit, kan alleen iemand op dezelfde verdieping het oppakken. De server controleert coördinaten langs alle drie de assen voordat een item van de wereld naar een inventaris wordt overgedragen.

Gevechtssysteem en mechanieken in de geest van D&D

Gevechten zijn gebaseerd op de regels van klassieke rollenspellen zoals NetHack of Dungeons & Dragons. Bij het maken van een personage rolt de speler zes kernattributen: kracht, behendigheid, constitutie, intelligentie, wijsheid en charisma.

Generatie volgt de 4d6-regel met subsequent balancing. Alle wiskundige berekeningen, treffercontroles en schade worden afgehandeld door de server.

Character sheet with attributes and inventory

Inventaris is gewichtsgebonden. De personagepop heeft 11 uitrustingsslots: hoofd, beide handen, lichaam, riem, broek, schoenen, nek, oren en twee ringen. Zware pantser of een volledige inventaris van stenen dwingt je om te kiezen wat je meeneemt en wat je in de kist laat.

Ingebouwde editor rechtstreeks in de client

Om de wereld te bewerken hoef je de server niet opnieuw op te starten of externe hulpprogramma's te openen. Er is een kaarteditor ingebouwd in de client.

Map editor with active height brush

Het bevat penselen voor het wijzigen van terreinhoogte, het gladmaken van heuvels, het leggen van wegen en het plaatsen van objecten. Je kunt rechthoekige zones selecteren: bijvoorbeeld veilige stadsgebieden zonder monsterspawns of spawngebieden voor specifieke mobs.

Kaartwijzigingen worden via REST API naar de server verzonden, waar toegangsrechten worden geverifieerd via een Google-autorisatietoken.

Architectuur en technische stack

Het project is opgedeeld in drie grote blokken binnen een monorepo.

De client-side is geschreven in Svelte en TypeScript. 3D-scène-rendering gaat via Threlte en Three.js met focus op WebGPU.

De server-side is gebouwd op Rust met behulp van de Tokio async runtime. Verse wereldstatustoestand wordt gedistribueerd via broadcast channels. Client-servercommunicatie gaat over WebSocket op basis van de tokio-tungstenite-bibliotheek, terwijl REST-eindpunten voor de kaart worden bediend door het Axum-framework.

De agent-client is gescheiden in zijn eigen Rust-project. Het kan een MCP-server (Model Context Protocol) draaien, waardoor LLM-modellen rechtstreeks kunnen verbinden met het gameplay.

De auteur heeft een interessante oplossing toegepast voor de gedeelde logica. Code uit de shared-map compileert naar WASM voor de browser en wordt direct door de server gebruikt. Dit elimineert het dupliceren van mechanische berekeningsregels tussen client en server.

Hoe het project lokaal te deployen

Je hebt Rust, Cargo, Node.js en npm geïnstalleerd nodig.

Voor handige deployment gebruikt de ontwikkelaar een Cargo Workspace. Je kunt het serverdeel starten met automatisch herbouwen bij codewijzigingen vanuit de projectroot:

cargo install cargo-watch
cargo watch -w server -w shared -w data-src -x "run -p onlinerpg-server"

De server zal een WebSocket op poort 10006 en REST API op poort 10007 starten.

Om de client te draaien, moet je het environment-bestand kopiëren en de Vite dev server starten:

cd client
cp .env.example .env.local
npm install
npm run dev -- --port 10004

Als je gedeelde logica bewerkt in de shared-map, is het de moeite waard om automatische WASM-builds voor de browser in een tweede terminal te draaien:

cargo watch -w shared -s "npm run build:wasm --prefix client"

De agent-client wordt gestart vanuit de agent-client-map:

cd agent-client
cargo watch -i "data/prompts/memory/" -x run

Waarom je de code zou moeten bestuderen

Het project zal het meest nuttig zijn voor degenen die netwerkservices en games in Rust schrijven of plannen te schrijven. Hier vind je een werkend voorbeeld van state race-organisatie, eventdistributie via broadcast channels en werken met Tokio.

Het tweede interessante gebied is web graphics. De Svelte-, Threlte- en Three.js-combinatie is niet zo gebruikelijk, en het draaien van WebGPU in een echt project demonstreert de prestaties van modern web.

Tot slot zal OpenMMO nuttig zijn voor AI-agent onderzoekers. Het MCP-protocol en gelijke rechten voor agents met reguliere spelers bieden een kant-en-klare sandbox voor het testen van LLM-gedragsscenario's in een continue omgeving.

Gerelateerde projecten