
OmniGen
Stop Server Lag. Start Shared Generation. Unleash your CPU with OmniGen's distributed architecture.
Список изменений
OmniGen v0.3.24-BETA — Changelog
⚠️ Version non testée en conditions réelles Cette version a été codée mais n'a pas encore pu être testée en multijoueur faute de disponibilité. Elle est publiée en avance pour les early adopters. Si vous rencontrez des régressions par rapport à la v0.3.23, revenez à cette dernière en attendant un correctif.
Nouveauté principale — Grille virtuelle alignée 5×5
Le problème ciblé
En v0.3.23, chaque worker générait un bloc 5×5 centré exactement sur le chunk demandé. Résultat : deux workers traitant des chunks proches l'un de l'autre pouvaient avoir des blocs 5×5 qui se chevauchent de façon asymétrique. Les frontières entre blocs tombaient à des positions différentes selon l'ordre d'arrivée des requêtes → artefacts visuels visibles tous les quelques chunks en exploration multijoueur.
La solution
Le serveur ancre désormais tous les blocs 5×5 sur une grille virtuelle fixe, alignée depuis l'origine du monde avec un pas de 5 chunks :
Centre du bloc = ( floor(cx / 5) × 5 + 2 , floor(cz / 5) × 5 + 2 )
Conséquence : les frontières inter-blocs tombent toujours aux mêmes coordonnées absolues, quelle que soit l'ordre des requêtes ou le nombre de workers. Deux workers calculant des blocs adjacents utilisent exactement la même position → même seed → même bruit → même terrain de chaque côté de la frontière. Les seams aux frontières de blocs deviennent structurellement impossibles.
Changements techniques détaillés
Côté serveur — ServerOrchestratorManager
- Grid snap :
submitChunkRequest()calcule le centre de grille avant tout dispatch. Si le chunk demandé n'est pas le centre de son bloc, la demande est redirigée vers le centre. gridBlockFutures: nouvelle map(dim, gcx, gcz) → CompletableFuture— une entrée par bloc 5×5 en vol. Les doublons partagent ce future au lieu de créer un nouveau dispatch.gridMemberFutures: future individuel par chunk du ring 3×3 (non-central). Complété automatiquement à la réception desextraChunksdu payload résultat.- Fallback grille : si le bloc tombe en timeout/vanilla, tous les futurs membres du bloc sont complétés avec
null→ chaque chunk du ring bascule en vanilla indépendamment, sans deadlock. - Nettoyage dimension-change : purge des maps de grille à la traversée de portail (évite les fuites mémoire).
Côté client — ClientChunkWorker
generateGrid(): nouvelle méthode publique — génère le bloc 5×5 complet, appliquebuildSurface+applyCarverssur les 9 chunks du ring intérieur (au lieu du seul chunk central), et retourne uneMap<ChunkPos, byte[]>des 9 sérialisations.doGenerateGrid5x5(): pipeline interne identique au mode 5×5 classique, mais le ring extérieur (16 chunks) sert uniquement de contexte — seuls les 9 chunks intérieurs sont renvoyés au serveur.
Côté client — ClientPayloadHandler
- Détection
block5x5: si le payload reçu ablock5x5 = true,executeGeneration()appellegenerateGrid()au lieu degenerate(). ChunkResultPayloadgridMode : le résultat envoyé au serveur contient le chunk central en principal + les 8 autres chunks enExtraChunk[](un seul paquet réseau pour 9 chunks).
Protocole réseau — ChunkResultPayload
- Champ
gridMode : boolean+ tableauextraChunks : ExtraChunk[](déjà introduit en v0.3.23 dans le code, activé en v0.3.24). - Rétrocompatible : un serveur v0.3.24 peut recevoir des résultats d'un client v0.3.23 (gridMode sera false, comportement classique).
Ce qui ne change pas
- Le mode solo fonctionne exactement comme avant (pas de régression attendue).
- La compatibilité avec Tectonic, Terralith, BoP et autres mods de génération est maintenue.
- Les mécanismes v0.3.23 (anti-seam v3, CAS1-allOf, queue_full fix, cache TTL 120s) sont conservés intacts.
Notes pour les testeurs
Les points à valider en priorité en duo/multijoueur :
- Absence de seams visibles aux frontières de blocs (surface, falaises, plages)
- Absence de régression sur les zones de caves (pas de truncation nouvelle)
- Comportement correct au premier chargement d'une zone vierge (9 chunks en un seul dispatch)
- Pas de deadlock ou chunk bloqué indéfiniment (tous les chunks finissent par se charger, en distribué ou en vanilla fallback)
Merci de reporter tout bug ou régression sur le projet — cette version est une étape clé vers des artefacts zéro en multijoueur.
👾 Rejoindre le Discord pour informer des bugs trouver ! : https://discord.gg/F8T2UBFzYz
