Comment lancer un MMORPG où les agents IA et les humains jouent en égaux
Je suis récemment tombé sur le dépôt OpenMMO. L'auteur du projet construit quelque chose que beaucoup n'ont discuté que de façon théorique : un bac à sable où les agents IA incarnent des personnages et se déplacent dans le monde aux côtés de vraies personnes. Le serveur ne fait aucune distinction entre eux. Bots et humains sont servis par le même protocole WebSocket, sans gestionnaires spéciaux ni points de terminaison cachés.
Le projet est développé par un seul développeur. La pile technologique ici est plus intéressante que les projets personnels habituels : un serveur en Rust, un client navigateur construit avec Svelte et Three.js pour les graphiques 3D utilisant WebGPU, plus un client Rust séparé pour les agents IA avec support du protocole MCP.
En quoi consiste le projet
L'idée tourne autour de l'égalité de traitement. Si un humain doit envoyer un paquet WebSocket pour se déplacer vers une case adjacente ou attaquer un monstre, l'agent IA fait exactement la même chose. Le serveur traite ces actions de manière identique, sans accommodements spéciaux pour l'automatisation.
Le monde est en vue isométrique avec une perspective en quart de vue. Les graphiques sont assemblés à partir d'un mélange de modèles sourcés et de ressources générées algorithmiquement. La musique d'ambiance avec environ cinquante pistes a été créée en utilisant Suno et les outils Google Flow Music.
Examinons comment ce monde est structuré en interne.
Géographie procédurale et construction
L'espace de jeu couvre une zone de 32 par 32 kilomètres. La carte est générée de manière procédurale : biomes, lignes de côte et un système fluvial complexe.

Les rivières forment des deltas lorsqu'elles se jettent dans l'océan et se divisent en branches. Le long du réseau routier, le serveur place automatiquement des ponts en bois là où les routes croisent les canaux fluviaux.

Le jeu présente des moments de la journée et des saisons changeants. La durée du jour et de la nuit dépend de la position de la planète sur son orbite. Deux satellites avec des phases et orbites indépendantes sont présents dans le ciel simultanément.

L'atmosphère est améliorée par l'éclairage. Les torches projettent des ombres dynamiques avec une chute de lumière réaliste.

Les joueurs ont accès à la construction modulaire. Vous pouvez construire des maisons allant de deux à quatre étages, placer des portes, des fenêtres et des meubles.

La physique des objets tient compte des étages. Si un personnage lance une épée au deuxième étage d'une maison, seule une personne sur le même étage peut la ramasser. Le serveur vérifie les coordonnées le long des trois axes avant de transférer un objet du monde vers un inventaire.
Système de combat et mécaniques dans l'esprit de D&D
Le combat s'inspire des règles des jeux de rôle classiques comme NetHack ou Donjons & Dragons. Lors de la création d'un personnage, le joueur lance six attributs principaux : force, dextérité, constitution, intelligence, sagesse et charisme.
La génération suit la règle 4d6 avec un équilibrage ultérieur. Tous les calculs mathématiques, les jets de toucher et les dégâts sont gérés par le serveur.

L'inventaire est limité en poids. La marionnette du personnage a 11 emplacements d'équipement : tête, deux mains, corps, ceinture, pantalons, chaussures, cou, oreilles et deux anneaux. Une armure lourde ou un inventaire complet de pierres vous forceront à choisir ce que vous portez avec vous et ce que vous laissez dans le coffre.
Éditeur intégré directement dans le client
Pour éditer le monde, vous n'avez pas besoin de redémarrer le serveur ou d'ouvrir des utilitaires externes. Un éditeur de carte est intégré au client.

Il comprend des pinceaux pour modifier la hauteur du terrain, lisser les collines, poser des routes et placer des objets. Vous pouvez sélectionner des zones rectangulaires : par exemple, déclarer des zones urbaines sûres sans spawns de monstres ou définir des zones de spawn pour des mobs spécifiques.
Les modifications de carte sont envoyées au serveur via l'API REST, où les droits d'accès sont vérifiés via un jeton d'autorisation Google.
Architecture et pile technique
Le projet est divisé en trois blocs majeurs au sein d'un monorepo.
Le côté client est écrit en Svelte et TypeScript. Le rendu de scène 3D passe par Threlte et Three.js avec un accent sur WebGPU.
Le côté serveur est construit sur Rust en utilisant le runtime asynchrone Tokio. Les mises à jour de l'état du monde frais sont distribuées via des canaux de diffusion. La communication client-serveur passe par WebSocket basé sur la bibliothèque tokio-tungstenite, tandis que les points de terminaison REST pour la carte sont servis par le framework Axum.
Le client agent est séparé dans son propre projet Rust. Il peut faire tourner un serveur MCP (Model Context Protocol), permettant aux modèles LLM de se connecter directement au gameplay.
L'auteur a appliqué une solution intéressante pour la logique partagée. Le code du dossier shared se compile en WASM pour le navigateur et est utilisé directement par le serveur. Cela élimine la duplication des règles de calcul des mécaniques entre le client et le serveur.
Comment déployer le projet en local
Vous aurez besoin de Rust, Cargo, Node.js et npm installés.
Pour un déploiement pratique, le développeur utilise un Cargo Workspace. Vous pouvez démarrer la partie serveur avec reconstruction automatique lors des changements de code depuis la racine du projet :
cargo install cargo-watch
cargo watch -w server -w shared -w data-src -x "run -p onlinerpg-server"
Le serveur va démarrer un WebSocket sur le port 10006 et l'API REST sur le port 10007.
Pour exécuter le client, vous devez copier le fichier d'environnement et démarrer le serveur de développement Vite :
cd client
cp .env.example .env.local
npm install
npm run dev -- --port 10004
Si vous modifiez la logique partagée dans le dossier shared, cela vaut la peine d'exécuter des constructions WASM automatiques pour le navigateur dans un deuxième terminal :
cargo watch -w shared -s "npm run build:wasm --prefix client"
Le client agent est lancé depuis le dossier agent-client :
cd agent-client
cargo watch -i "data/prompts/memory/" -x run
Pourquoi étudier le code
Le projet sera le plus utile à ceux qui écrivent ou prévoient d'écrire des services réseau et des jeux en Rust. Ici, vous pouvez trouver un exemple fonctionnel d'organisation de courses d'état, de distribution d'événements via des canaux de diffusion et de travail avec Tokio.
Le deuxième domaine intéressant est le graphisme web. La combinaison Svelte, Threlte et Three.js n'est pas si courante, et exécuter WebGPU dans un projet réel démontre les performances du web moderne.
Enfin, OpenMMO sera utile pour les chercheurs sur les agents IA. Le protocole MCP et les droits égaux pour les agents avec les joueurs réguliers fournissent un bac à sable prêt à l'emploi pour tester les scénarios comportementaux LLM dans un environnement continu.
Projets similaires