# WorldWeaver 1.5.1

Application Java pour choisir les dimensions et les inventaires de **plusieurs sauvegardes** de serveurs Minecraft **Java Edition**, puis exporter une nouvelle archive ZIP. Ajoutez autant de mondes que nécessaire : **aucune limite fixe de nombre**, dans la limite des ressources disponibles. Les sources sont uniquement lues. La fusion fonctionne hors ligne et ne nécessite aucun compte. La recherche facultative et l’installation des mises à jour utilisent Internet.

## Windows : démarrer

1. Extraire complètement **WorldWeaver-Windows.zip** dans un nouveau dossier.
2. Ouvrir **WorldWeaver.exe** dans le dossier `WorldWeaver`. Java est déjà inclus.
3. Arrêter les serveurs, puis fournir leurs sauvegardes : glisser **plusieurs dossiers ou ZIP à la fois** dans la liste, ou utiliser **Ajouter des mondes**. Il faut au moins deux mondes. Leurs numéros suivent l'ordre d'ajout ; survoler un monde affiche son chemin complet.
4. Cliquer sur **Analyser les mondes**. Pour chaque dimension, cliquer dans **Conserver** et choisir sa source dans le menu. Faire la même chose dans l'onglet **Joueurs**. La colonne **Disponible dans les mondes** affiche tous les numéros où l'élément existe. Le menu propose uniquement les sources disponibles.
5. Choisir **Inventaires uniquement** ou **Profils complets**, le format de sortie et le nom du dossier final.
6. Cliquer sur **Créer l'archive ZIP**, puis choisir une destination hors des sources.
7. Extraire la nouvelle archive dans un emplacement de test. Lire `LIRE-AVANT-IMPORT.txt`, puis tester le résultat sur un serveur séparé utilisant exactement la même version et les mêmes mods/datapacks nécessaires.

Une archive existante ne sera jamais écrasée. **Annuler** fonctionne pendant l'analyse, la vérification, les opérations de projet et l'export ; les fichiers temporaires sont supprimés à l'arrêt normal du traitement. Le bouton **Vérifier l'export** contrôle les choix, profils et générateurs sans produire de ZIP. Pendant un traitement, la fermeture est bloquée : annuler puis fermer lorsque le traitement est terminé.

L'option **Vérifier tous les fichiers par SHA-256** renforce la détection des changements et nécessite une nouvelle analyse. Elle lit aussi entièrement les régions ; prévoir davantage de temps sur les gros mondes.

**Retirer la sélection** supprime les lignes sélectionnées de la liste, sans toucher aux fichiers d'origine. Après ajout ou retrait d'un monde, l'analyse précédente est invalidée : relancer **Analyser les mondes** avant l'export. Le retrait renumérote les sources ; les anciens choix sont effacés pour éviter une sélection attribuée au mauvais monde. Les doublons sont ignorés à l'ajout, et les alias d'une même sauvegarde sont refusés lors de l'analyse.

Dans l'onglet Joueurs, choisir un monde dans le menu puis **Appliquer aux joueurs présents** pour utiliser cette source pour tous ses joueurs. Les joueurs absents de cette source conservent leur choix précédent.

La version Windows portable est destinée à Windows 10/11 64 bits. Le JAR peut également être lancé avec Java 17 ou supérieur : `java -jar WorldWeaver.jar`.

## Quels dossiers fournir ?

Un monde Java classique contient `level.dat`, `region`, éventuellement `DIM-1` et `DIM1`, ainsi que `playerdata`. Le logiciel reconnaît aussi l'organisation moderne avec `dimensions/minecraft/overworld` et `players/data`.

Pour Paper/Spigot avec dimensions séparées, conserver la structure de la sauvegarde :

```text
Serveur-A/
  world/                ← sélectionner ce dossier, ou un ZIP de Serveur-A
    level.dat
    region/
    playerdata/
  world_nether/
    level.dat
    DIM-1/
  world_the_end/
    level.dat
    DIM1/
  usercache.json        ← facultatif, permet d'afficher les pseudonymes
```

Les noms frères doivent suivre `<nom>_nether` et `<nom>_the_end`. Les mondes séparés aux noms arbitraires / Multiverse ne sont pas regroupés automatiquement. Un dossier ou ZIP contenant plusieurs Overworlds est refusé : sélectionner une seule sauvegarde de monde.

Les dimensions personnalisées au format `dimensions/<namespace>/<dimension>/region` sont proposées. Les anciens dossiers de mods `DIM2`, `DIM7`, etc. sont refusés car leur identifiant n'est pas déductible de manière fiable. Bedrock, les anciens formats sans `DataVersion`, RAR et 7z ne sont pas pris en charge.

## Ce qui est conservé

| Élément | Règle |
| --- | --- |
| Dimensions | Une dimension entière d'une source choisie : terrain, entités, points d'intérêt et données locales. Pas de mélange de chunks dans une même dimension. |
| Réglages globaux | Ils viennent du monde de l'Overworld choisi : seed globale, spawn, règles, cartes, scoreboard, datapacks et autres fichiers partagés. |
| Inventaires uniquement | Pour chaque UUID : inventaire, armure, seconde main et slot actif de la source choisie. Le coffre de l’Ender peut venir d’une autre source. Position, santé, XP et autres données du profil de l'Overworld si ce joueur y existe. |
| Joueur absent du monde de l'Overworld | Son profil complet est conservé depuis la source où il existe. |
| Profils complets | Profil binaire exact de la source choisie, statistiques et progrès de cette même source. Cela inclut position, santé et XP. |
| Identification | UUID exact. Le pseudonyme est affiché si un `usercache.json` local le fournit. Pas de rapprochement automatique entre comptes offline/online ayant des UUID différents. |
| End | État du combat du dragon repris de la source de l'End (métadonnées anciennes ou données locales modernes). |
| Sortie Java unifiée | Un dossier avec toutes ses dimensions. |
| Sortie Paper/Spigot | `world`, `world_nether`, `world_the_end`, avec fichiers `level.dat`, pour la disposition classique. Les dimensions personnalisées restent dans `world/dimensions`. |

Le changement d'organisation introduit par Minecraft 26.1 est décrit dans les [notes officielles Minecraft](https://feedback.minecraft.net/hc/en-us/articles/44551668333837-Minecraft-Java-Edition-26-1). L'export Paper séparé est bloqué pour cette organisation moderne ; utiliser le format Java unifié et vérifier la disposition attendue par votre serveur.

## Limites à connaître

- Toutes les sources doivent avoir exactement le même `DataVersion` et la même organisation classique/moderne. Chaque monde est vérifié, y compris les dernières sources ajoutées. L'application n'effectue aucune conversion de version. Si nécessaire, mettre à niveau **des copies** avec Minecraft avant la fusion.
- Les plugins, leurs inventaires spéciaux, les données d'économie, permissions, bases de données et fichiers de configuration du serveur ne sont pas fusionnés.
- Les cartes utilisent des identifiants partagés : les cartes provenant des autres mondes peuvent afficher une carte du monde de l'Overworld choisi ou ne pas fonctionner. Les identifiants ne sont pas remappés, dans les inventaires comme dans les coffres du terrain.
- Avec des seeds différentes, de nouveaux chunks peuvent présenter des bordures. Les définitions de dimensions reconnues sont copiées, mais la seed globale reste celle de l'Overworld.
- Un datapack/mod nécessaire à une dimension peut manquer dans les fichiers du monde de l'Overworld choisi. Installer les dépendances compatibles sur le serveur de test.
- Une position de joueur conservée peut devenir dangereuse après remplacement de sa dimension. Préparer un point d'arrivée sûr avant ouverture du serveur aux joueurs.
- Les fichiers de régions sont conservés tels quels : le logiciel ne répare pas les régions corrompues et n'inspecte pas chaque chunk.
- Les changements des sources sont contrôlés avant/après l'export : chemins, tailles, dates et identité des fichiers. Les fichiers `.dat` sont aussi vérifiés par SHA-256 ; le mode renforcé couvre tous les fichiers, y compris les régions. `session.lock` est ignoré. Le mode normal peut manquer un changement de région conservant les mêmes métadonnées. Ces vérifications ne remplacent pas l'arrêt du serveur.
- Les profils complets sont validés avant leur copie. Le transfert ciblé refuse des profils dont les `DataVersion` explicites diffèrent. Le NBT est limité à 64 Mio décompressés, 200 000 tags, profondeur 100 et un million d'éléments par tableau ; certains profils de mods exceptionnels peuvent dépasser ces limites.
- Un profil joueur plus récent que le monde est refusé, y compris en mode complet. Les empreintes des fichiers copiés sont vérifiées sur les octets réellement écrits : un changement temporaire puis annulé ne peut plus contourner ce contrôle pour les fichiers couverts par SHA-256.
- Les collisions de casse sont détectées aussi dans les dossiers implicites des ZIP et les sources Linux. Les archives tronquées ou sans fin ZIP valide sont refusées ; profondeur maximale 128 et chemin maximal 4 096 caractères. Les archives multipart ne sont pas prises en charge.
- Les liens symboliques, jonctions et noms de fichiers non portables sont refusés. Les ZIP doivent utiliser `/`, sans antislash, nom réservé Windows, segment vide ou point/espace final. Il faut une destination stable et de confiance hors de toutes les sources. La publication utilise un lien physique sans écrasement ; sur un système qui ne le permet pas, une copie avec création exclusive protège les fichiers existants, mais le fichier final peut être visible pendant cette copie. Une coupure brutale peut laisser des fichiers temporaires.
- La copie NBT préserve les tags inconnus. Le champ `equipment` est également transféré pour l'armure et la seconde main des versions récentes, selon les [notes officielles de 1.21.5](https://www.minecraft.net/sv-se/article/minecraft-java-edition-1-21-5). Les inventaires de mods stockés dans d'autres champs ne sont pas remplacés en mode inventaire ; choisir le profil complet si adapté.
- ZIP : extraction temporaire sur le disque, limite de 256 Gio décompressés et 2 millions d'entrées. Prévoir l'espace nécessaire ; les gros mondes sont plus rapides à fournir en dossiers. L'export lit les régions progressivement et produit un ZIP compatible ZIP64.

## Debian : sans interface

Installer Java 17 ou supérieur si nécessaire :

```sh
sudo apt update
sudo apt install default-jre-headless
```

Extraire `WorldWeaver-Debian.zip`, ouvrir un terminal dans son dossier, puis :

```sh
sh worldweaver.sh --help

sh worldweaver.sh --inspect \
  --world /srv/sauvegarde-1/world \
  --world /srv/sauvegarde-2/world \
  --world /srv/sauvegarde-3/world

sh worldweaver.sh \
  --world /srv/sauvegarde-1/world \
  --world /srv/sauvegarde-2/world \
  --world /srv/sauvegarde-3/world \
  --out /srv/exports/fusion.zip \
  --name world \
  --dim minecraft:overworld=1 \
  --dim minecraft:the_nether=2 \
  --dim minecraft:the_end=3 \
  --default-players 1 \
  --player 00000000-0000-0000-0000-000000000001=3 \
  --mode inventory \
  --format vanilla
```

Répéter `--world` autant de fois que nécessaire. Les numéros 1, 2, 3… suivent leur ordre dans la commande. Remplacer l'UUID d'exemple par un UUID affiché par `--inspect`. Les options `--dim` et `--player` sont répétables. Une source absente pour la sélection ou un numéro hors limites est refusé. Les dimensions et joueurs non spécifiés viennent de la **première source où ils existent**. `--default-players 3` donne priorité au troisième monde pour les joueurs qui y sont présents. `--mode full` conserve les profils complets. `--format bukkit` produit les dossiers Paper/Spigot séparés classiques.

Les anciennes commandes avec la paire `--a` / `--b` et les sélections `A` / `B` restent compatibles (A = 1, B = 2). Il est interdit de mélanger `--world` et `--a` / `--b` dans une même commande.

La commande `java -jar WorldWeaver.jar` peut remplacer `sh worldweaver.sh`. Si aucun argument n'est fourni et aucun écran n'est disponible, l'application indique comment utiliser le mode terminal. Code de sortie 0 pour succès, 1 pour erreur, 2 pour demande d'interface sans écran.

### Préparer les sélections sur Windows pour Debian

Le bouton **Sauver un projet** exporte un fichier `.properties` versionné contenant les choix, le mode, le format et le nom. **Charger un projet** restaure ces paramètres après analyse. Les projets v2 ajoutent les choix Ender et la compression, et identifient aussi les dossiers vides. Les projets v1 restent chargeables avec leur ancien calcul d’identité. Les sources sont identifiées par leur contenu SHA-256 : leur ordre et leur emplacement peuvent changer. Une source modifiée ou manquante est refusée. Cette identification relit tous les fichiers et refuse les sources au contenu identique, car leur association serait ambiguë ; les choix Properties classiques restent utilisables dans ce cas.

Sur Debian :

```sh
sh worldweaver.sh --world /srv/1/world --world /srv/2/world --load-plan projet.properties --dry-run
sh worldweaver.sh --world /srv/2/world --world /srv/1/world --load-plan projet.properties --out /srv/fusion.zip
```

`--dry-run` valide sans créer de ZIP ni de dossier de destination. `--verify sha256` active les empreintes de tous les fichiers dès l'analyse. `--save-plan projet.properties --dry-run` enregistre un projet depuis le terminal, avec création des dossiers de destination manquants. Les fichiers de projet existants ne sont pas écrasés. Les options explicites de commande prennent priorité sur le projet, puis les sélections `--dim` et `--player` sont appliquées.

Les anciens fichiers de sélections restent utilisables avec :

```sh
sh worldweaver.sh --world /srv/1/world --world /srv/2/world --world /srv/3/world --out /srv/fusion.zip --config selections.properties
```

Pour écrire ce fichier manuellement, échapper le deux-points des identifiants de dimensions, conformément au format Java Properties :

```properties
dimension.minecraft\:overworld=1
dimension.minecraft\:the_nether=2
dimension.minecraft\:the_end=3
player.00000000-0000-0000-0000-000000000001=3
```

Un fichier classique écrit manuellement ne contient que les dimensions et joueurs. **Conserver le même ordre des mondes pour ces anciens fichiers** : un choix est identifié par son numéro. Les anciens fichiers avec A/B restent utilisables. `--config` accepte aussi les projets versionnés ; ne pas le combiner avec `--load-plan`.

## Sources et construction

Les sources Java sont fournies dans `src/`. Aucune bibliothèque externe et aucun téléchargement ne sont nécessaires pour construire l'application avec un JDK 17+.

- Windows : `powershell -ExecutionPolicy Bypass -File build.ps1`
- Debian : `sh build.sh`
- Les scripts compilent, exécutent les tests puis génèrent `WorldWeaver.jar`.

Les tests sont dans `tests/`, séparés du JAR distribué. Pour les relancer sans reconstruire : `powershell -ExecutionPolicy Bypass -File test.ps1`, ou `sh test.sh`. Ajouter `-Gui` sous Windows / `--gui` sous Linux avec un écran pour les tests graphiques. Chaque scénario d'audit est exécuté dans son propre processus Java ; les résultats individuels et un bilan JSON/TSV sont écrits dans `test-results/`. La construction échoue si un test échoue. Un JDK est nécessaire pour les sources ; le paquet Debian prêt à utiliser demande uniquement un JRE.

Les fondations des évolutions sont déjà utilisées : `WorldLayout` distingue les dispositions, `SafetyIO` centralise les chemins et la publication, `PlanFiles` définit les projets v1, et `MergeEngine.prepare` sépare la validation de l'écriture. Cela prépare de nouveaux formats et une meilleure prévisualisation. La fusion de chunks, le remappage des cartes et les adaptateurs de plugins restent à développer.

Le runtime Windows fourni provient du JDK Zulu installé localement. Ses fichiers de licence sont conservés dans `WorldWeaver/runtime/legal`. Les sources du programme sont sous licence MIT, voir `LICENSE.txt`. Projet indépendant, non affilié à Mojang ou Microsoft.

## Validation de cette livraison

Voir `AUDIT-1.2.1.txt`, le rapport historique `AUDIT-1.2.txt`, `TESTS.txt` et `test-results/` pour les résultats exécutés et les corrections. La campagne inclut 204 scénarios indépendants, les 69 vérifications antérieures, 14 scénarios Swing et un export de 2 000 profils supplémentaires sous 128 Mio de mémoire. Le moteur, le script Linux et 12 cas du JAR ont aussi été exécutés sur **Debian 12 avec Java 25**, dans un dossier de test isolé du VPS. Les données sont **synthétiques**. Le dépôt est testé par le gestionnaire de fichiers de Swing, sans geste physique de souris. **Pas de démarrage d'un serveur Minecraft réel.** Les dispositions modernes sont testées avec des fixtures, pas avec une sauvegarde réelle de 26.1. Aucune suite finie ne garantit toutes les situations possibles.

## Nouveautés 1.3.0

- Recherche des joueurs par nom ou UUID, sans modifier les sélections masquées.
- Colonne **Coffre de l’Ender** : choix indépendant de l’inventaire. Tant que cette colonne n’est pas modifiée, elle suit automatiquement l’inventaire. Le mode profil complet conserve toujours un seul profil exact et efface les choix Ender séparés dans l’interface.
- Compression **Rapide** (défaut), **Équilibrée**, ou **Archive compacte** : compromis temps/taille ; données identiques après extraction. Les régions Minecraft étant déjà compressées, le gain peut être faible.
- **Rapport JSON** : prévalidation enregistrée pour les automatisations et l’assistance. Il contient chemins sources, UUID et choix ; le partager seulement si ces informations peuvent être communiquées.
- ZIP UTF-8 et anciens noms CP437 sans indicateur UTF-8. Les encodages locaux arbitraires ne sont pas devinés.
- Dimensions et sous-dossiers vides préservés, y compris dimensions personnalisées avec dossier `region` vide et dispositions Paper séparées.

Exemple Debian (aucun ZIP créé) :

```sh
sh worldweaver.sh --world /srv/a/world --world /srv/b/world \
  --player 00000000-0000-0000-0000-000000000001=2 \
  --ender-player 00000000-0000-0000-0000-000000000001=1 \
  --compression balanced --report /srv/rapports/fusion.json --dry-run
```

`--ender-player` est répétable et exige le mode `inventory`. Les UUID et versions des profils sont vérifiés ; aucun rapprochement de comptes ou conversion de versions n’est effectué.
Site : https://retrominecraft.gpxkiller.com/WorldWeaver/

## Corrections 1.3.1

Lecture NBT progressive avec mémoire réduite et flux gzip fermés, collisions de noms Unicode refusées pour l’export Windows, vérification finale des sources lors de l’enregistrement des projets et annulation des rapports sans boîte d’erreur.

Le mode inventaire valide les données effectivement conservées : un inventaire remplacé n’empêche plus de récupérer le profil depuis une source valide. Les données choisies et le profil final sont toujours contrôlés, ainsi que les versions et empreintes. Les fichiers NBT binaires illisibles restent refusés.

Les destinations `--out`, `--save-plan` et `--report` doivent être distinctes et non imbriquées. Les conflits détectables sont refusés avant création d’un fichier. Une panne ultérieure peut néanmoins laisser un projet ou rapport complet déjà enregistré : ces sorties ne constituent pas une transaction unique.


## Version web 1.4.0

Ouvrir https://retrominecraft.gpxkiller.com/WorldWeaver/#outil-web sur ordinateur ou mobile. Aucun logiciel à installer. Ajouter au moins deux ZIP, un par serveur ; analyser, choisir les sources des dimensions, inventaires et coffres Ender, puis créer et télécharger la nouvelle archive. Les fichiers restent sur votre appareil, dans un traitement séparé de l’interface. Aucun envoi au VPS. Les entrées ZIP sont vérifiées (CRC, index, chemins et quotas) avant analyse.

Limites pratiques : 128 MiB de ZIP au total, 256 MiB décompressés, 100 000 entrées, 16 MiB par NBT. La mémoire disponible peut imposer une limite inférieure, surtout sur mobile. ZIP64 exige l’application Java. Les dossiers directs ne sont pas proposés dans cette première version web : utiliser des ZIP. La page nécessite une connexion pour son chargement initial ; ce n’est pas une application hors ligne installable.

Le web reprend les organisations classique/moderne, les dossiers Paper séparés dans un même ZIP, les dimensions personnalisées reconnues, les profils complets, les inventaires et coffres indépendants, la recherche et l’exclusion des données de joueurs/dimensions. Les projets Java ne sont pas importés dans le web. Le format moderne exige un export unifié. Les exclusions omettent les fichiers ; Minecraft peut régénérer les dimensions suivant les réglages du monde.

La source du moteur web, sa bibliothèque ZIP et les tests sont fournis dans web/ du paquet Sources. fflate 0.8.2 est distribué sous MIT avec sa licence. Le codec NBT préserve les longs 64 bits, le UTF modifié Java, les tableaux et les bits des flottants.

## Corrections 1.4.0

Validation complète et bornée des en-têtes centraux et des métadonnées ZIP64, y compris cohérence avec les noms des fichiers locaux. Sept archives malformées auparavant acceptées sont maintenant refusées ; les ZIP64 valides restent acceptés. Voir AUDIT-1.4.0.txt.

## Corrections 1.4.1

Sélection des ZIP homonymes, exclusion des joueurs avec coffre Ender indépendant, téléchargement conservé après changement de langue, contrôles des navigateurs non compatibles et traduction des statuts corrigés. Validation du CRC d’en-tête GZIP et refus des choix dupliqués renforcés. Voir AUDIT-1.4.1.txt et FOUR-PASSES.json pour les quatre passes de régression et leurs limites.


## Mises à jour — version 1.5.0

Au démarrage de l’interface, WorldWeaver recherche une nouvelle version en arrière-plan.
La fenêtre s’ouvre immédiatement. Sans connexion, la fusion reste utilisable ; aucune
boîte d’erreur ne bloque le démarrage. Le bouton « Rechercher une mise à jour » permet
de relancer la vérification. Il reste dans son style normal si la version est à jour.
Il est mis en évidence uniquement quand une version plus récente est disponible.

Si une nouvelle version existe, WorldWeaver propose « Installer » ou « Plus tard ».
Une opération de fusion déjà en cours retarde cette proposition jusqu’à sa fin.
Choisissez un dossier existant : la version est téléchargée et installée dans un
nouveau sous-dossier WorldWeaver-VERSION, après vérification de sa taille, de son
empreinte SHA-256 et de son contenu. Un dossier de cette version déjà existant
n’est jamais écrasé. L’installation peut être annulée ; les fichiers temporaires
sont supprimés. Les dossiers des mondes ajoutés ne sont pas des destinations autorisées.

Après installation, « Ouvrir » lance la nouvelle version. L’ancienne fenêtre reste
ouverte pour permettre d’enregistrer un projet. Les choix non enregistrés ne sont
pas transférés automatiquement. Utilisez ensuite le lanceur du nouveau dossier :
les anciens raccourcis continuent à lancer l’ancienne copie. Aucun remplacement
automatique des fichiers exécutables utilisés ni élévation administrateur.

Sur Debian, la vérification est explicite :

```sh
sh worldweaver.sh --check-update
sh worldweaver.sh --update --update-dir /dossier/existant
```

Ces commandes sont indépendantes des options de fusion. Elles ne lancent pas de
serveur Minecraft. Le nouveau JAR est installé dans le nouveau dossier ; lancez-le
ensuite avec `sh worldweaver.sh` depuis ce dossier. `--version` affiche la version.
La mise à jour utilise le site HTTPS officiel et refuse les redirections. Aucun
monde, inventaire ou profil de joueur n’est envoyé. Seul le téléchargement public
du manifeste puis du paquet choisi est effectué.

Les copies 1.4.1 et antérieures doivent être remplacées une première fois par la
version 1.5.0 ou ultérieure téléchargée sur le site pour bénéficier de cette fonction.
La version web reçoit ses nouveautés par le rechargement de la page.

## Corrections 1.5.1

Une annulation demandée entre la fin du calcul de l’analyse et son affichage empêche désormais la publication du résultat et ferme ses sources temporaires. Les messages de progression web suivent la langue choisie, y compris pendant un traitement.

Les types Unix spéciaux inscrits dans les ZIP (liens symboliques, tubes, sockets et périphériques) sont refusés, au lieu d’être aplatis en fichiers ordinaires. Les fichiers Unix ordinaires restent acceptés.

La découverte des mondes dans les dossiers de serveur et les ZIP explore jusqu’à 128 niveaux. Les sauvegardes profondément imbriquées sont reconnues ; plusieurs Overworlds sont refusés même lorsqu’un seul apparaît près de la racine.
