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.
salut a toi tu n'aurais pas une video a nous passer s'il te plait ?? :)

Il y en a qui ont été déjà posté si tu cherches bien dans ce sujet. Elles ne sont pas de moi mais comme il utilise mes sources tu t'y retrouveras facilement.
J'ai quelque soucis avec l'indexage de sous-dossier dans le comparateur, dès que c'est bon je poste ! ;)
 
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();
                }
       
                if(mods.isDirectory())
                {
                    File[] fileInModSubfolder = mods.listFiles();
                    for(File subFile : fileInModSubfolder)
                    {
                        if(!valideFile(subFile, modList))
                        {
                            subFile.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)
    {
        if(file.isDirectory())
        {
            return true;
        }
        System.out.println("Vérification de : " + file.getName());
        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;
    }
}

Dans la classe Launcher, dans le constructeur, avant le download la fonction downloadResources(); il faut ajouter
Code:
        OldModDeleter.run(workingDirectory);
Et voila, plus de problème de vieux mod qui encombre :D
(vous pouvez enlever les System.out.println c'est juste du débug qui m'a beaucoup servit).

Démonstration dans les logs :
Code:
Vérification de : FFMT-libs-universal-1.1.0.7-mc1.6.4.jar
Comparaison avec : Nanotech_mod-UltimateGraviSuite-universal-1.7.0.165-mc1.6.4.jar
Comparaison avec : Nanotech_mod-city-universal-2.2.2.165-mc1.6.4.jar
Comparaison avec : ejml-0.23.jar
Comparaison avec : FFMT-libs-universal-1.1.0.7-mc1.6.4.jar
Fichier validé : FFMT-libs-universal-1.1.0.7-mc1.6.4.jar
Vérification de : Fichier qui sert à rien.txt
Comparaison avec : Nanotech_mod-UltimateGraviSuite-universal-1.7.0.165-mc1.6.4.jar
Comparaison avec : Nanotech_mod-city-universal-2.2.2.165-mc1.6.4.jar
Comparaison avec : ejml-0.23.jar
Comparaison avec : FFMT-libs-universal-1.1.0.7-mc1.6.4.jar
Comparaison avec : Nanotech_mod-core-universal-2.2.2.165-mc1.6.4.jar
Comparaison avec : industrialcraft-2_2.0.305-experimental.jar
Fichier non validé : Fichier qui sert à rien.txt
Vérification de : ejml-0.23.jar
Comparaison avec : Nanotech_mod-UltimateGraviSuite-universal-1.7.0.165-mc1.6.4.jar
Comparaison avec : Nanotech_mod-city-universal-2.2.2.165-mc1.6.4.jar
Comparaison avec : ejml-0.23.jar
Fichier validé : ejml-0.23.jar
Vérification de : industrialcraft-2_2.0.305-experimental.jar
Comparaison avec : Nanotech_mod-UltimateGraviSuite-universal-1.7.0.165-mc1.6.4.jar
Comparaison avec : Nanotech_mod-city-universal-2.2.2.165-mc1.6.4.jar
Comparaison avec : ejml-0.23.jar
Comparaison avec : FFMT-libs-universal-1.1.0.7-mc1.6.4.jar
Comparaison avec : Nanotech_mod-core-universal-2.2.2.165-mc1.6.4.jar
Comparaison avec : industrialcraft-2_2.0.305-experimental.jar
Fichier validé : industrialcraft-2_2.0.305-experimental.jar
Vérification de : Nanotech_mod-city-universal-2.2.2.165-mc1.6.4.jar
Comparaison avec : Nanotech_mod-UltimateGraviSuite-universal-1.7.0.165-mc1.6.4.jar
Comparaison avec : Nanotech_mod-city-universal-2.2.2.165-mc1.6.4.jar
Fichier validé : Nanotech_mod-city-universal-2.2.2.165-mc1.6.4.jar
Vérification de : Nanotech_mod-core-universal-2.2.2.164-mc1.6.4.jar
Comparaison avec : Nanotech_mod-UltimateGraviSuite-universal-1.7.0.165-mc1.6.4.jar
Comparaison avec : Nanotech_mod-city-universal-2.2.2.165-mc1.6.4.jar
Comparaison avec : ejml-0.23.jar
Comparaison avec : FFMT-libs-universal-1.1.0.7-mc1.6.4.jar
Comparaison avec : Nanotech_mod-core-universal-2.2.2.165-mc1.6.4.jar
Comparaison avec : industrialcraft-2_2.0.305-experimental.jar
Fichier non validé : Nanotech_mod-core-universal-2.2.2.164-mc1.6.4.jar
Vérification de : Nanotech_mod-core-universal-2.2.2.165-mc1.6.4.jar
Comparaison avec : Nanotech_mod-UltimateGraviSuite-universal-1.7.0.165-mc1.6.4.jar
Comparaison avec : Nanotech_mod-city-universal-2.2.2.165-mc1.6.4.jar
Comparaison avec : ejml-0.23.jar
Comparaison avec : FFMT-libs-universal-1.1.0.7-mc1.6.4.jar
Comparaison avec : Nanotech_mod-core-universal-2.2.2.165-mc1.6.4.jar
Fichier validé : Nanotech_mod-core-universal-2.2.2.165-mc1.6.4.jar
Vérification de : Nanotech_mod-UltimateGraviSuite-universal-1.7.0.165-mc1.6.4.jar
Comparaison avec : Nanotech_mod-UltimateGraviSuite-universal-1.7.0.165-mc1.6.4.jar
Fichier validé : Nanotech_mod-UltimateGraviSuite-universal-1.7.0.165-mc1.6.4.jar
Vérification de : X ray - cheat mod.jar
Comparaison avec : Nanotech_mod-UltimateGraviSuite-universal-1.7.0.165-mc1.6.4.jar
Comparaison avec : Nanotech_mod-city-universal-2.2.2.165-mc1.6.4.jar
Comparaison avec : ejml-0.23.jar
Comparaison avec : FFMT-libs-universal-1.1.0.7-mc1.6.4.jar
Comparaison avec : Nanotech_mod-core-universal-2.2.2.165-mc1.6.4.jar
Comparaison avec : industrialcraft-2_2.0.305-experimental.jar
Fichier non validé : X ray - cheat mod.jar
 
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();
                }
             
                if(mods.isDirectory())
                {
                    File[] fileInModSubfolder = mods.listFiles();
                    for(File subFile : fileInModSubfolder)
                    {
                        if(!valideFile(subFile, modList))
                        {
                            subFile.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(urlList.size());
        if(file.isDirectory())
        {
            return true;
        }
        System.out.println("Vérification de : " + file.getName());
        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;
    }
}

Dans la classe Launcher, dans le constructeur, avant le download la fonction downloadResources(); il faut ajouter
Code:
        OldModDeleter.run(workingDirectory);
Et voila, plus de problème de vieux mod qui encombre :D
(vous pouvez enlever les System.out.println c'est juste du débug qui m'a beaucoup servit).

Tu n'as pas utilisé de recursive method pour le dossier mod ?
 
Ha non, j'ai juste vérifier les dossiers dans le dossier mods. S'il y a un autre dossier dans un dossier qui se trouve dans le dossier mods, il vérifiera pas.
Je vais voir pour rendre ça récursive.
 
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.
 
Statut
N'est pas ouverte pour d'autres réponses.