Tutoriel [Guide] [MAJ 12/07/14]Créer un launcher pour 1.6.2/1.6.4 avec mods

Statut
N'est pas ouverte pour d'autres réponses.
ok, ba de toute façon c'était juste une petite modif :
Code:
package net.minecraft.launcher;
 
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
 
public class OldModDeleter
{
    public static void run(File workingDirectory)
    {
        List<URL> modList = getFullModFile();
        File modsFolder = new File(workingDirectory, "mods");
        if(modsFolder.exists())
        {
            File[] modsList = modsFolder.listFiles();
            for(File mods : modsList)
            {
                if(!valideFile(mods, modList))
                {
                    mods.delete();
                }
            }
        }
    }
 
    public static List<URL> getFullModFile()
    {
        List<URL> result = Collections.synchronizedList(new ArrayList<URL>());
        try
        {
            URL resourceUrl = new URL(LauncherConstants.URL_DOWNLOAD_MODS);
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(resourceUrl.openStream());
            NodeList nodeLst = doc.getElementsByTagName("Contents");
 
            long start = System.nanoTime();
            for(int i = 0; i < nodeLst.getLength(); i++)
            {
                Node node = nodeLst.item(i);
 
                if(node.getNodeType() == 1)
                {
                    Element element = (Element)node;
                    String key = element.getElementsByTagName("Key").item(0).getChildNodes().item(0).getNodeValue();
                    long size = Long.parseLong(element.getElementsByTagName("Size").item(0).getChildNodes().item(0).getNodeValue());
 
                    if(size > 0L)
                    {
                        result.add(new URL(LauncherConstants.URL_DOWNLOAD_MODS + key));
                    }
                }
            }
            long end = System.nanoTime();
            long delta = end - start;
            Launcher.getInstance().println("Delta time to compare mods: " + delta / 1000000L + " ms ");
        }
        catch(Exception ex)
        {
            Launcher.getInstance().println("Couldn't download mods", ex);
        }
        return result;
    }
 
    public static boolean valideFile(File file, List<URL> urlList)
    {
        System.out.println("Vérification de : " + file.getName());
        if(file.isDirectory())
        {
            File[] fileInSubfolder = file.listFiles();
            for(File subFile : fileInSubfolder)
            {
                if(!valideFile(subFile, urlList))
                {
                    subFile.delete();
                }
            }
            return true;
        }
        for(URL remoteMods : urlList)
        {
            String remoteFileName = remoteMods.getFile().substring(remoteMods.getFile().lastIndexOf('/') + 1);
            System.out.println("Comparaison avec : " + remoteFileName);
            if(file.getName().equals(remoteFileName))
            {
                System.out.println("Fichier validé : " + file.getName());
                return true;
            }
        }
        System.out.println("Fichier non validé : " + file.getName());
        return false;
    }
}


Et puis de toute façon c'est pas nécessaire de faire du récursive, car FML ne charge que les mods dans le dossier mods ou mods/<version de minecraft>
Le premier code que j'ai envoyé suffisait largement.
On ne sait jamais ;) Au moins ça reste plus sûr. Bon je vais tester le mien maintenant ^^
 
ttttt.png


Le comparateur fonctionne, si j'ai le temps demain je le finis, (pour l'instant il fonctionne en appli externe donc je dois l'intégrer).

MERCI :D maintenant que ça marche j'ai une dixième question >< comment modifier les boutons inGame pour genre quand tu clique ça te connect automatiquement dans le server voulu svp :)
 
MERCI :D maintenant que ça marche j'ai une dixième question >< comment modifier les boutons inGame pour genre quand tu clique ça te connect automatiquement dans le server voulu svp :)

Ca a été dit et re-dit dans le sujet... cherches les messages de robin4002 tu trouveras ce que tu cherches ;)
 
Bon ben merci beaucoup pour la mise à jour du tuto !
Mais maintenant grâce à toi j'ai une nouvelle question :p

Vu que j'ai déja fait mon launcher ( et beaucoup galéré d'ailleurs, robin4002 peut en témoigner ;) ), je n'ai pas vraiment envie de refaire tout depuis le début pour rajouter la fonction de suppression des ex-mods ...

Donc comment puis-je faire pour rajouter cette fonction au launcher ? Y a t'il moyen de passer par un .class que j'ajoute simplement au launcher.jar ou bootstrap.jar, ou puis-je inserer le code que vous avez donné dans les commentaire précédents directement quelque par dans le projet ? [ Et celui de qui ? Celui de robin ou de jambon ? ;) ]

Si oui, dans quel fichier dois-je l'inserer, et à quel endroit ?

Merci d'avance, et merci beaucoup pour ce tuto hyper bien construit :D
 
Bon ben merci beaucoup pour la mise à jour du tuto !
Mais maintenant grâce à toi j'ai une nouvelle question :p

Vu que j'ai déja fait mon launcher ( et beaucoup galéré d'ailleurs, robin4002 peut en témoigner ;) ), je n'ai pas vraiment envie de refaire tout depuis le début pour rajouter la fonction de suppression des ex-mods ...

Donc comment puis-je faire pour rajouter cette fonction au launcher ? Y a t'il moyen de passer par un .class que j'ajoute simplement au launcher.jar ou bootstrap.jar, ou puis-je inserer le code que vous avez donné dans les commentaire précédents directement quelque par dans le projet ? [ Et celui de qui ? Celui de robin ou de jambon ? ;) ]

Si oui, dans quel fichier dois-je l'inserer, et à quel endroit ?

Merci d'avance, et merci beaucoup pour ce tuto hyper bien construit :D

Tout comme robin, j'ai créé une classe supplémentaire dans le package net.minecraft.launcher. Cette classe s'appelle "Lister.java". Pour exécuter les méthodes de cette classe, il suffit d'ajouter un ligne dans "Launcher.java" situé dans le même package :
Code:
Lister.run(workingDirectory); //A ajouter après la ligne : job.startDownloading(versionManager.getExecutorService());

Le fichier pom.xml à la racine doit ressembler à ceci :
Code:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>net.minecraft</groupId>
  <artifactId>minecraft-launcher</artifactId>
  <version>1.0.1</version>
 
  <dependencies>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.0</version>
    </dependency>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.2.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.directory.studio</groupId>
        <artifactId>org.apache.commons.codec</artifactId>
        <version>1.8</version>
    </dependency>
  </dependencies>
 
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
Moi et Robin on fait des vérifications différentes, lui par nom de mods, moi par hash md5(valeur unique par fichier) et j'exclu les fichiers .cfg et .yml de la suppression. Si il y a besoin j’exclurai d'autres types de fichiers.
 
Salut, le TUTO est super j'admire :)

J'ai pu créer un launcher 1.6.4 avec des mods forge.
Mais le seul problème c'est qu'on entends pas les sons de minecraft.
Et c'est parce que le dossier assets ne se télécharge pas automatiquement.

Donc là je suis en train de upload manuellement le dossier assets mais il met très longtemps.
Mais sinon faudrait ajouter le téléchargement du dossier assets avec les vrais liens officiel ?
 
Le launcher le fait déjà, le problème c'est que les serveurs de mojang ont des problèmes ces dernier temps.

C'est vrai que Minecraft a des gros problème avec Amazon ces temps ci.
Eventuellement tu peux remplacer :
Code:
public static final String URL_RESOURCE_BASE = "https://s3.amazonaws.com/Minecraft.Resources/"
Par :
Code:
public static final String URL_RESOURCE_BASE = "https://s3.amazonaws.com/MinecraftResources/
Dans LauncherConstants. ;)
 
Donc en résumé, je remplace mon fichier pom.xml par celui que tu as envoyé, je créer une nouvelle classe sans option supplémentaire "Lister.java" et je rajoute le code Lister.run(workingDirectory); sur une des lignes du Launcher.java, et à la ligne juste en dessous je met ceci : job.startDownloading(versionManager.getExecutorService()); .

C'est tout ?


Merci encore de vos réponses !
 
Statut
N'est pas ouverte pour d'autres réponses.