Télécharger de nouvelles ressources automatiquement [Moyen]
Posté dans Modding le

! Ce tuto suppose que vous connaissez les bases du java ainsi que le modding de minecraft !

Bonjour à toutes et à tous après avoir cherché un petit moment sur les sites de modding Minecraft sans ne jamais rien trouver je me suis attaqué au code de ce dernier pour trouver comment il télécharge ces ressources (Son, …)

Analyse :

Après avoir observé le moment de créations des fichier ressources je me suis aperçu qu’ils était crée lors du premier lancement de minecraft donc je suppose que la fonction se trouve dans la fonction de lancement de minecraft.

Le fichier se nomme « Minecraft.java » dans le package « net.minecraft.client ».
En observant le début du fichier on peut trouver une variable nommée « downloadResourcesThread » du type « ThreadDownloadResources » en cherchant cette variable vers la ligne 470 nous pouvons trouver :

try
{
    downloadResourcesThread = new ThreadDownloadResources(mcDataDir, this);
    downloadResourcesThread.start();
}
catch (Exception exception1) { }

Allons voir cette fameuse class « ThreadDownloadResources » qui se trouve dans le package « net.minecraft.src ».
Dans cette class on peut voir que dans la fonction run

URL url = new URL("http://s3.amazonaws.com/MinecraftResources/");
DocumentBuilderFactory documentbuilderfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder = documentbuilderfactory.newDocumentBuilder();
Document document = documentbuilder.parse(url.openStream());
NodeList nodelist = document.getElementsByTagName("Contents");

A la première ligne nous pouvons voir http://s3.amazonaws.com/MinecraftResources/ Si vous essayez de regarder ce lien dans votre navigateur vous tomberais sur un fichier XML dans lequel nous pouvons voir des entrées qui ressemblent à celle la :

<Contents>
<Key>music/calm1.ogg/<Key>
<LastModified>2010-10-30T19:51:26.000Z</LastModified>
<ETag>"3c5b792652b43e9876b7e7b19c0b376b"</ETag>
<Size>2530812</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>

« key » est le nom d’un fichier
« LastModified » La date de la dernière modification du fichier
« Etag » La somme MD5 du fichier (pour savoir s’il a était modifié)
« Size » Le poids du fichier
« StorageClass » je ne sais pas pour le moment

Ce fichier est traité par

Document document = documentbuilder.parse(url.openStream());
NodeList nodelist = document.getElementsByTagName("Contents");

La première ligne parse le document et la seconde stock les noeuds Contents dans la variable NodeList

Cette dernière variable et récupérée dans cette boucle, cette dernière récupère « key » et « size » pour le passer à la fonction « downloadAndInstallResource » qui s’occupera de télécharger les fichiers

for (int i = 0; i < 2; i++)
{
    for (int j = 0; j < nodelist.getLength(); j++)
    {
        Node node = nodelist.item(j);

        if (node.getNodeType() != 1)
        {
            continue;
        }

        Element element = (Element)node;
        String s = ((Element)element.getElementsByTagName("Key").item(0)).getChildNodes().item(0).getNodeValue();
        long l = Long.parseLong(((Element)element.getElementsByTagName("Size").item(0)).getChildNodes().item(0).getNodeValue());

        if (l <= 0L)
        {
            continue;
        }

        downloadAndInstallResource(url, s, l, i);

        if (closing)
        {
            return;
        }
    }
}

Voilà notre petite analyse est terminée nous allons pouvoir passer à l’ajout de notre téléchargement.

Développement :

Comme nous l’avons vu dans l’analyse le script récupère un fichier XML et le parse pour connaitre les fichier à télécharger, donc nous allons utiliser la même méthode, car il n’y a pas à revenir sur le fichier à chaque fois qu’on veut ajouter un nouveau fichier.

Commençons par ce fichier, personnellement j’ai préféré copier le fichier de mojang pour éviter d’éventuel souci; une fois vidé il devrait ressembler à ceci :

<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>MinecraftResources</Name>
<Prefix/
<Marker/>
<MaxKeys>1000</MaxKeys>
<IsTruncated>false</IsTruncated>
<Contents>
<Key>Adresse du fichier</Key>
<LastModified>Date</LastModified>
<ETag>Somme MD5</ETag>
<Size>Poid en octet</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>
</ListBucketResult>

L’adresse du fichier correspond au dossier sur votre ftp ainsi que celui du fichier dans le dossier ressources exemple avec le fichier de l’analyse l’adresse est « music/calm1.ogg » ce qui signifie que sur le site il se trouveà  l’adresse http://s3.amazonaws.com/MinecraftResources/music/calm1.ogg et que sur le disque dur il sera stocker dans <racine_de_minecraft>/ressources/music/calm1.ogg.

La somme MD5 peut être généré grâce un logiciel comme MST MD5

La date elle est écrite comme cela « YYYY-MM-DDTHH:MM:SS.000Z ».
Les Y représente l’année.
M les mois.
D le jour.
T est la séparation entre la date et l’heure.
H représente l’heure.
M les minutes.
S les secondes

Size est le poids du fichier en octet

Pour la suite il faut que votre fichier soit nommé index.xml et que votre serveur apache soit configuré pour que ce dernier soit le fichier index afin qu’il soit appelé si on entre l’adresse http://monsite.com/MinecraftResources/.

Si c’est le cas vous n’avez qu’à écrire

URL url1 = new URL("http://monsite.com/MinecraftResources/");
Document document1 = documentbuilder.parse(url1.openStream());
NodeList nodelist1 = document1.getElementsByTagName("Contents");

Dans le cas contraire vous devrez écrire :

URL url1 = new URL("http://monsite.com/MinecraftResources/");
Document document1 = documentbuilder.parse("http://monsite.com/MinecraftResources/index.xml");
NodeList nodelist1 = document1.getElementsByTagName("Contents");

Maintenant que cela est fait il ne nous reste plus qu’à rajouter notre boucle à la suite de la boucle « for (int j = 0; j < nodelist.getLength(); j++) » attention toutes fois à bien la placer à l’intérieur de la boucle « for (int i = 0; i < 2; i++) »

    for (int j = 0; j < nodelist1.getLength(); j++)
    {
        Node node1 = nodelist1.item(j);

        if (node1.getNodeType() != 1)
        {
            continue;
        }

        Element element1 = (Element)node1;
        String s1 = ((Element)element1.getElementsByTagName("Key").item(0)).getChildNodes().item(0).getNodeValue();
        long l1 = Long.parseLong(((Element)element.getElementsByTagName("Size").item(0)).getChildNodes().item(0).getNodeValue());

        if (l <= 0L)
        {
            continue;
        }

        downloadAndInstallResource(url1, s1, l1, i);

        if (closing)
        {
            return;
        }
    }

Voilà maintenant vos fichier seront automatiquement télécharger avec ceux de Minecraft

Tags