web-dev-qa-db-fra.com

Comment modifier des fichiers .mca à partir de Minecraft?

Introduction

Je veux combiner mes mondes Minecraft séparés en un seul monde et cela m'a semblé être un exploit relativement facile, mais au fur et à mesure de mes recherches, cela a évolué vers la nécessité de créer un programme personnalisé.

La lutte

J'ai commencé par déplacer les fichiers de région et les combiner dans un dossier de région, ce qui semblait être la solution évidente et cela a presque fonctionné. Remarque: j'ai ouvert les fichiers et il semble que des secteurs entiers ont leurs coordonnées stockées, pas des entités, donc le terrain lui-même est spatialement incompatible avec le nom du fichier de la région.

Cela a conduit à un certain décalage lorsque j'ai ouvert le client et les régions n'ont pas pu être rendues. J'ai lu le format de fichier Anvil et imaginé un schéma de lecture des fichiers NBT. J'ai pensé que je pouvais lire manuellement les octets et les éditer, mais dans mes recherches continues, j'ai obtenu des réponses contradictoires quant à savoir si les fichiers de région sont gzippés.

J'ai terminé suffisamment de code pour lire des octets bruts, mais les valeurs d'octets ne sont pas sorties comme je m'y attendais.

Selon les informations que j'ai sur les fichiers NBT, ils commencent tous par un CompoundTag et un CompoundTag commence par un octet unique valant 10 ou x0A. C'est là que j'ai obtenu mes informations de format: https://minecraft.gamepedia.com/NBT_format

Voici une capture d'écran de ce qui est réellement sorti:

Byte-reading code in Java and Output

Remarque: la description de la classe dans la capture d'écran n'est pas exacte. J'ai juste rapidement rempli assez pour lire les octets, pas pour étoffer la fonction de l'interface utilisateur.

Je suppose que ces octets sortant comme non sens est un signe que le fichier est compressé. J'ai trouvé cela comme un début au problème de gzip: http://gnuwin32.sourceforge.net/packages/gzip.htm

J'imagine que si je pouvais installer cela, il décompresserait ce fichier .mca et je pourrais lire les octets comme prévu, mais je ne comprends pas les instructions d'installation. Il dit utiliser les "Commandes Shell, 'configure', 'make' et 'make install'". Pour moi, cela ressemble à Unix, mais le fichier que j'ai téléchargé est pour Windows? Il n'y a pas d'exe, mais il y a pas mal de fichiers C. Je n'ai pas de compilateur C. . .

Remarque: je n'ai toujours pas le logiciel gzip pour fonctionner.

Post Script

J'ai vu des questions similaires posées ici, mais toutes étaient soit anciennes (2016) avec des liens morts vers des logiciels qui fonctionnaient auparavant, soit elles étaient récentes et sans réponse. J'ai trouvé une copie spécifique de cette question posée il y a 5 mois, mais j'ai dû faire un compte pour commenter. Voici le lien: Comment lire les fichiers Minecraft .mca de sorte que dans python je peux extraire des blocs individuels? Sa question concerne un Python implémentation. Il a dit qu'il avait trouvé une bibliothèque NBT pour Python, mais qu'elle rejetait ses fichiers MCA parce qu'ils étaient non gzippés.

J'ai une piste pour comprendre le problème car j'ai le code source de NBTExplorer (voir la réponse que j'ai publiée), mais je vais devoir mettre à jour comment cela se passe. Pour ce qui est de réparer mon monde, je pense avoir une solution viable maintenant.

Si quelqu'un pouvait me diriger vers une bibliothèque Java terminée, avec le code source, qui ouvre .mca ou un forum de discussion lié à ce sujet, ce serait cool. Je suis toujours aussi intéressé par comment la compression de fichiers fonctionne, mais c'est probablement en dehors de la portée de cette question.Je me rends compte que ce n'est pas directement lié à un bogue ou une erreur; ses c'était plus que je ne savais pas quelles autres mesures prendre pour faire un code qui accomplit cette tâche.

Mettre à jour

J'ai trouvé le programme de quelqu'un d'autre pour le faire et l'ai posté comme réponse, mais j'aimerais quand même savoir comment le fichier est converti d'octets en informations utilisables. En utilisant la méthode d'édition manuelle de la réponse que j'ai postée, j'aurai besoin au maximum de 241664 modifications manuelles , donc j'ai toujours besoin d'une meilleure solution.

6
Cakemate

J'ai trouvé un éditeur!

Maintenant je peux éditer, mais je ne sais pas comment l'édition fonctionne. Je n'ai rien appris, mais j'ai finalement trouvé l'éditeur de quelqu'un d'autre. Pas tout à fait ce que je voulais parce que je voulais savoir comment faire cela moi-même.

Mise à jour: Pour corriger une région à l'aide de ce logiciel, je dois modifier manuellement 2 champs, pour un maximum de 32x32 morceaux, et j'ai 118 régions que je dois corriger. ** Cela représente 241664 modifications manuelles potentielles! Cette solution n'est pas viable dans un délai raisonnable, mais c'est la meilleure que j'ai jusqu'à présent:

J'ai trouvé cette page: https://fileinfo.com/extension/mca

Qui lié à cette page: https://fileinfo.com/software/nbtexplorer/nbtexplorer

Qui lié à cette page: https://github.com/jaquadro/NBTExplorer/releases

J'ai installé le logiciel et il est automatiquement lié au dossier .minecraft, voici une capture d'écran de l'interface graphique:

enter image description here

Du bon côté, la page de téléchargement de l'application a également un lien de téléchargement pour la source, donc j'ai l'intention de lire ça! J'ai ouvert jusqu'à présent deux fichiers pour jeter un coup d'œil et ils n'ont pas du tout été commentés. Ils sont également écrits en C #, ce que je n'ai jamais vu auparavant, mais j'ai entendu dire que c'est très similaire à Java, alors peut-être que j'apprendrai aussi ce langage.

1
Cakemate

Tout d'abord: pour autant que je sache, il n'y a plus d'informations sur "où se trouvent les morceaux", stockés dans les fichiers de région. Il y a 32 (direction x) * 32 (direction z) = 1024 morceaux stockés dans un fichier de région et chacun d'eux a sa position de données dans le fichier. Ainsi, les morceaux sont simplement numérotés dans le fichier lui-même et les 8192 premiers octets indiquent à peu près s'il y a des données sur ce morceau spécifique ou non, où il se trouve dans le fichier et quand il a été mis à jour pour la dernière fois. L'endroit où la région complète (ces 1024 morceaux) est positionnée dans le monde peut être déterminé dans le nom du fichier où les régions elles-mêmes sont numérotées dans les directions x et z.

Donc, dans votre cas, vous devriez pouvoir renommer vos fichiers de région de manière à ce qu'ils restent ensemble comme ils le sont dans les mondes d'origine et vous devriez pouvoir les fusionner ensemble.

Deuxièmement: le format NBT n'est pas la première chose à considérer lorsque vous souhaitez décoder les données. Les premiers fichiers de région ont leur propre structure: https://minecraft.gamepedia.com/Region_file_format et quand vous arrivez aux données réelles en utilisant Zlib (RFC1950), cela devient compliqué ...

Quoi qu'il en soit, si vous voulez plus d'informations sur la façon de décoder je peux vous donner quelques informations (depuis les fichiers https://www.rfc-editor.org/rfc/rfc1950.html et https : //tools.ietf.org/html/rfc1951 about Zlib (RFC1950) sont écrits d'une manière difficile à comprendre - du moins c'était pour moi). Mais il y a un point où je me bats moi-même en ce moment, c'est pourquoi je suis tombé sur cette question.

1
M4niboy