1. Si vous venez d'arriver sur le forum et que vous êtes un peu perdus, cliquez ici !
    Rejeter la notice

Autres [.NET] Lancer Minecraft en ligne de commande/depuis votre launcher

Discussion dans 'Tutoriels' créé par Hawezo, 5 Mar 2016.

  1. Hawezo

    Hawezo Mineur de Fer

    Inscrit:
    6 Juin 2013
    Messages:
    545
    Points:
    136
    Sexe:
    Homme
    Parce que c'est un petit peu le principe d'un lanceur, je me suis dit qu'après le tutoriel sur l'authentification, il serait pas mal de vous apprendre à lancer Minecraft depuis votre code.

    Je vous préviens tout de suite : il va falloir mettre la main à la patte.
    Vous allez devoir sortir de Visual Studio et trifouiller un peu partout, mais ne vous inquiétez pas, je vais détailler au possible.



    [​IMG]


    I. Préparations

    Déjà, il faut que vous sachiez quelle version de Minecraft vous comptez lancer.
    En fait, il va falloir que vous récupériez quelques lignes de commande, ainsi qu'un dossier.

    Je vous invite à créer un dossier quelque part, histoire de tout foutre dedans le temps d'écrire ce qu'il faut.
    Pour ma part, ce sera « Lanceur Minecraft » sur mon bureau.

    Bien. Commencez donc par ouvrir votre lanceur par défaut, le vrai lanceur. Choisissez une version de Minecraft, éditez le profil et sélectionnez « Keep the launcher open » dans « Launcher visibility ».

    [​IMG]
    Figure 1 - Paramètres du profil

    Cela fait, sauvegardez le profil et lancez Minecraft.
    Sélectionnez l'onglet « Launcher Log » et attendez de voir la ligne commençant par « Half command ». Sélectionnez-la entièrement, puis copiez-la dans un fichier texte que vous placerez dans le dossier créé plus haut.

    Ne fermez pas Minecraft ! Rendez-vous dans les fichiers de ce dernier (rappel : Windows + R > %appdata%), plus précisément dans \.minecraft\versions\<votre version>.

    Il y a un dossier nommé <votre version>-natives-<nombre random>. Copiez ce dossier dans celui créé tout à l'heure, et fermez Minecraft ainsi que votre lanceur.

    [​IMG]
    Figure 2 - Contenu du dossier avant la fermeture de Minecraft

    Attention › Depuis la version 1.6.61 du launcher, la ligne de commande n'est plus affichée dans la console. L'ancienne ligne de commande fonctionne toujours, en modifiant les numéros de versions et en récupérant les natives.


    II. Analyse et modification de la commande

    Ouvrez le fichier texte contenant votre commande.
    Elle devrait commencer par "C:\Users\<votre nom>\Documents\Minecraft\Lanceur\runtime\jre-x64\1.8.0_25\bin\javaw.exe" et terminer par "net.minecraft.client.main.Main".

    Si ce n'est pas le cas chez vous, recommencez les manipulation du I.

    Il va falloir modifier cette commande afin de l'adapter à un lancement dynamique depuis votre lanceur ; mais nous allons déjà commencer par tester que tout fonctionne correctement.

    Si vous avez un nom composé, comme c'est le cas pour moi, vous avez deux solutions.


    1. Récupérer le chemin réduit

    La première méthode consiste à récupérer le chemin réduit qui correspond à votre dossier personnel.

    Exemple :
    C:\Users\Nom Composé\Documents\Minecraft\Lanceur\runtime\jre-x64\1.8.0_25\bin\javaw.exe
    C:\Users\nomcomp~1\Documents\Minecraft\Lanceur\runtime\jre-x64\1.8.0_25\bin\javaw.exe

    Pour ce faire, allez dans C:\Users, et lancez un invité de commande à cet emplacement (Shift + Clic droit > Ouvrir une fenêtre de commande à cet emplacement).
    Tapez-y "dir /x" et regardez à la ligne dont le nom écrit tout à droite est celui de votre session.
    Dans la colonne juste à gauche, vous y trouverez le chemin réduit : vous pouvez alors remplacer toutes les occurrences de votre nom composé par ce chemin.

    [​IMG]
    Figure 3 - Chemin réduit

    Cette méthode à l'inconvénient d'être difficile à mettre en place programmatiquement, c'est-à-dire qu'il est plus compliqué de trouver le chemin réduit directement dans le code (c'est faisable, mais au final inutile).
    Je vous conseille donc plutôt la méthode suivante, la plus simple.


    2. Mettre des guillemets

    L'autre solution consiste simplement à placer des guillemets autour de tous les chemins, ce qui est fastidieux à la main, bien qu'un peu moins à coup de chercher/remplacer.

    Exemple :
    C:\Users\Nom Composé\Documents\Minecraft\Lanceur\runtime\jre-x64\1.8.0_25\bin\javaw.exe
    "C:\Users\Nom Composé\Documents\Minecraft\Lanceur\runtime\jre-x64\1.8.0_25\bin\javaw.exe"

    Tout simplement.

    ***

    Après avoir choisi l'une des méthodes ci-dessus, vous devez maintenant ajouter des guillemets après l'argument -Dos.name (chez moi, ça donne : -Dos.name="Windows 10 -Dos.version=10.0") et ajouter à la fin du fichier, ceci :

    Code (cpp):

    --username <votre pseudo/mail> --version <votre version> --gameDir "C:\Users\<votre nom>\AppData\Roaming\.minecraft" --assetsDir "C:\Users\<votre nom>\AppData\Roaming\.minecraft\assets" --assetIndex <votre asset index> --uuid <uuid> --accessToken <token> --userProperties {} --userType mojang
     
    La valeur de assetIndex correspond au nom du fichier .json se trouvant dans \.minecraft\assets\indexes, et correspondant à la release de votre version (pour moi, 1.8).

    Pour les valeurs de UUID et accessToken, ce sont les résultats obtenus après une requête d'authentification, je vous invite à lire ce tutoriel pour plus d'informations.

    Si vous avez la flemme, vous pouvez aussi les copier ; ils se trouvent dans le fichier « launcher_profiles.json » à la racine du répertoire de Minecraft.

    Attention › L'UUID à renseigner dans la commande est la valeur de "userid" dans le fichier launcher_profiles.json, et non "uuid".

    Enfin, remplacez <version>-natives-<nombres random> au début de votre fichier par <version>-natives, puis copiez le dossier <version>-natives-<nombres random> que nous avons récupéré tout à l'heure dans le dossier \.minecraft\versions\<version>. Renommez-le <version>-natives.

    [​IMG]
    Figure 4 - Contenu du dossier de la version après copie et rennomage

    Vous pouvez maintenant copier votre commande dans un nouveau fichier batch, que j'ai personnellement nommé Lancement.cmd. Si vous l'exécutez, vous verrez sous vos yeux ébahis, Minecraft se lancer.

    [​IMG]
    Figure 5 - Console, après le lancement de Minecraft


    III. Manière programmatique

    Tout ça c'est bien beau, mais nous, nous voulons lancer Minecraft depuis notre lanceur.
    Je ne vais pas vous montrer comment créer quelque chose d'orienter objet, mais si vous êtes bon développeur, vous pourrez le faire tout seul. :)

    Vous pouvez d'ores et déjà rouvrir votre commande dans un fichier texte, et faire un gros rechercher/remplacer de tous les chemins d'accès de type "C:\Users\<votre nom>\AppData\Roaming\.minecraft" par "{0}".

    Ce qui donnerait, partiellement :
    Code (cpp):

    cp {0}\libraries\oshi-project\oshi-core\1.1\oshi-core-1.1.jar;{0}\libraries\net\java\dev\jna\jna\3.4.0\jna-3.4.0.jar;{0}\libraries\net\java\dev\jna\platform\3.4.0\platform-3.4.0.jar;{0}\libraries\com\ibm\icu\icu4j-core-mojang\51.2\icu4j-core-mojang-51.2.jar;{0}\libraries\net\sf\jopt-simple\jopt-simple\4.6\jopt-simple-4.6.jar;{0}\libraries\com\paulscode\codecjorbis\20101023\codecjorbis-20101023.jar;
     
    Ensuite, remplacez la fin de la commande (juste après le chemin de la classe) par :
    Code (cpp):
    --username {1} --version {2} --gameDir {3} --assetsDir {4} --assetIndex {5} --uuid {6} --accessToken {7} --userType mojang
    À noter › J'ai enlevé le --userProperties {}, qui gênait le formatage du texte et qui s'est avéré inutile.

    Si votre java est bien configuré, vous pouvez également remplacer la première ligne par "java" :
    "C:\Users\<votre nom>\Documents\Minecraft\Lanceur\runtime\jre-x64\1.8.0_25\bin\javaw.exe" devient "java" (et nom "javaw").

    Je vous invite maintenant à créer quelques variables :

    Code (csharp):

      String appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
      String librariesDir = "\"" + Path.Combine(appData + "\\.minecraft\\libraries") + "\"";
      String assetsDir = "\"" + Path.Combine(appData + "\\.minecraft\\assets") + "\"";
      String version = "1.8.8";
      String assets = "1.8";
      String quotedGameDirectory = "\"" + Path.Combine(appData + "\\.minecraft").ToString() + "\"";
      String gameDirectory = Path.Combine(appData + "\\.minecraft").ToString();
     
    Et créer la commande :
    Code (csharp):

    String command = String.Format(@"java -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -Xmx1G -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:-UseAdaptiveSizePolicy -Xmn128M -Dos.name=""Windows 10 -Dos.version=10.0"" -Djava.library.path=""{0}\versions\1.8.8\1.8.8-natives"" -cp ""{0}\libraries\oshi-project\oshi-core\1.1\oshi-core-1.1.jar"";""{0}\libraries\net\java\dev\jna\jna\3.4.0\jna-3.4.0.jar"";""{0}\libraries\net\java\dev\jna\platform\3.4.0\platform-3.4.0.jar"";""{0}\libraries\com\ibm\icu\icu4j-core-mojang\51.2\icu4j-core-mojang-51.2.jar"";""{0}\libraries\net\sf\jopt-simple\jopt-simple\4.6\jopt-simple-4.6.jar"";""{0}\libraries\com\paulscode\codecjorbis\20101023\codecjorbis-20101023.jar"";""{0}\libraries\com\paulscode\codecwav\20101023\codecwav-20101023.jar"";""{0}\libraries\com\paulscode\libraryjavasound\20101123\libraryjavasound-20101123.jar"";""{0}\libraries\com\paulscode\librarylwjglopenal\20100824\librarylwjglopenal-20100824.jar"";""{0}\libraries\com\paulscode\soundsystem\20120107\soundsystem-20120107.jar"";""{0}\libraries\io\netty\netty-all\4.0.23.Final\netty-all-4.0.23.Final.jar"";""{0}\libraries\com\google\guava\guava\17.0\guava-17.0.jar"";""{0}\libraries\org\apache\commons\commons-lang3\3.3.2\commons-lang3-3.3.2.jar"";""{0}\libraries\commons-io\commons-io\2.4\commons-io-2.4.jar"";""{0}\libraries\commons-codec\commons-codec\1.9\commons-codec-1.9.jar"";""{0}\libraries\net\java\jinput\jinput\2.0.5\jinput-2.0.5.jar"";""{0}\libraries\net\java\jutils\jutils\1.0.0\jutils-1.0.0.jar"";""{0}\libraries\com\google\code\gson\gson\2.2.4\gson-2.2.4.jar"";""{0}\libraries\com\mojang\authlib\1.5.21\authlib-1.5.21.jar"";""{0}\libraries\com\mojang\realms\1.7.39\realms-1.7.39.jar"";""{0}\libraries\org\apache\commons\commons-compress\1.8.1\commons-compress-1.8.1.jar"";""{0}\libraries\org\apache\httpcomponents\httpclient\4.3.3\httpclient-4.3.3.jar"";""{0}\libraries\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar"";""{0}\libraries\org\apache\httpcomponents\httpcore\4.3.2\httpcore-4.3.2.jar"";""{0}\libraries\org\apache\logging\log4j\log4j-api\2.0-beta9\log4j-api-2.0-beta9.jar"";""{0}\libraries\org\apache\logging\log4j\log4j-core\2.0-beta9\log4j-core-2.0-beta9.jar"";""{0}\libraries\org\lwjgl\lwjgl\lwjgl\2.9.4-nightly-20150209\lwjgl-2.9.4-nightly-20150209.jar"";""{0}\libraries\org\lwjgl\lwjgl\lwjgl_util\2.9.4-nightly-20150209\lwjgl_util-2.9.4-nightly-20150209.jar"";""{0}\libraries\tv\twitch\twitch\6.5\twitch-6.5.jar"";""{0}\versions\1.8.8\1.8.8.jar"" net.minecraft.client.main.Main --username {1} --version {2} --gameDir {3} --assetsDir {4} --assetIndex {5} --uuid {6} --accessToken {7} --userType mojang", gameDirectory, "<votre pseudo>", version, quotedGameDirectory, assetsDir, assets, "uuid", "token");
     
    Remplacez, bien évidemment, "uuid" et "token" par votre UUID et Token, ainsi que "votre pseudo" par votre pseudonyme (et non pas mail ! Il sera affiché en jeu).
    Il faut également doubler les guillemets... et remplacer tous les ; par "";"" si vous n'avez pas choisi la méthode du chemin court. Après cela, vérifiez tous vos guillemets, car si vous l'avez mal fait ; vous aurez une erreur qui ressemble à "unable to find class [un chemin bizarre coupé en deux]".

    À cette étape, vous avez presque finit. Il vous suffit de lancer la commande.
    Pour cela, rien de plus simple :
    Code (csharp):

    Process Minecraft = new Process
      {
        StartInfo = new ProcessStartInfo
        {
          FileName = "java",
          Arguments = command,
          UseShellExecute = false,
          RedirectStandardOutput = true,
          CreateNoWindow = true
        }
      };
      Minecraft.Start();
      while (!Minecraft.StandardOutput.EndOfStream)
      {
        string line = Minecraft.StandardOutput.ReadLine();
        Console.WriteLine(line);
      }
     
    Avec ce code, vous pouvez aussi rediriger la sortie du lanceur où vous voulez. Ici, je l'ai simplement affichée dans la console.


    IV. Bonus - se connecter automatiquement

    Il vous suffira d'ajouter l'argument --server <ip> à la fin de votre commande pour vous connecter directement à un serveur.
    Utile pour les lanceurs moddés, utiles à un seul serveur. ^^


    [​IMG]


    Vous savez maintenant lancer Minecraft depuis votre code.
    L'avantage de ce tutoriel est qu'il marchera pour n'importe quelle version future de Minecraft ; pour peu que les lignes de commande ne changent pas (ce qui ne devrait pas arriver).

    Pour rendre le tout propre, il faudrait créer une classe dédiée à Minecraft, créer un thread sur lequel créer la boucle pour récupérer la sortie, il faudrait aussi récupérer la commande directement dans le code, c'est-à-dire parcourir les fichiers de Minecraft afin de récupérer les données voulues et créer dynamiquement la commande (sans la copier-coller à partir du lanceur officiel)...
    Pour les lanceurs moddés, il faut télécharger la version, les natives, et donc créer un gestionnaire de téléchargement, dans un autre thread, avoir peut-être un dossier spécial pour le lanceur (".<lanceur>"), et donc modifier la variable gameDir.

    Vous l'aurez compris ; il reste du boulot. Mais le principal est là. :)
    J'espère que ce tutoriel vous sera utile !
     
    • J'aime J'aime x 1
    #1 Hawezo, 5 Mar 2016
    Dernière édition: 17 Mar 2016
  2. Polymeth

    Polymeth Mineur de Diamants

    Inscrit:
    16 Août 2014
    Messages:
    2 135
    Points:
    170
    Sexe:
    Homme
    Encore une fois, très sympa ! C'était quand même plus simple à l'époque, haha.
     
  3. Hawezo

    Hawezo Mineur de Fer

    Inscrit:
    6 Juin 2013
    Messages:
    545
    Points:
    136
    Sexe:
    Homme
    Merci ^^
    C'est clair que "Process.Start("Minecraft.exe", "Hawezo", "motdepasse")", c'était beaucoup plus simple. :')
     
    • J'aime J'aime x 1
  4. Hawezo

    Hawezo Mineur de Fer

    Inscrit:
    6 Juin 2013
    Messages:
    545
    Points:
    136
    Sexe:
    Homme
    Je viens de remarquer que le nouveau launcher de Minecraft n'affiche plus la ligne de commande de lancement.
    Celle du 1.8 est toujours compatible, en changeant évidemment les numéros de version.
     
  5. Etoile

    Etoile Nouveau

    Inscrit:
    6 Juil 2017
    Messages:
    1
    Points:
    0
    Sexe:
    Homme
    La méthode ne fonctionne plus avec le nouveau launcher ?
     
  6. Calambiel

    Calambiel Résident de l'End

    Inscrit:
    5 Août 2014
    Messages:
    6 598
    Points:
    229
    @Etoile Merci de ne pas remonter les vieux topics, la dernière réponse date de plus d'un an.
     

Partager cette page