Résolu Problème lors du lancement de Forge (1.12.2-forge-14.23.5.2854)

Blenn412

Créateur de la série MiniMine Tuto
25 Décembre 2012
377
27
140
33
Bonjour tout le monde,

J'utilise un launcher minecraft personnel (un truc fait dans mon coin, pas un générateur de launcher qu'on peut trouver sur internet) que j'utilisais jusqu'à présent pour une version de Forge en 1.7.10, fonctionnant de la façon suivante :

J'avais un fichier json qui me permettait de lancer convenablement mon minecraft forge 1.7.10 grâce au launcher :

Code:
Minecraft 1.7.10": {
      "launchfolder": ".custommc/runclients/fpvserv-alpha-3.0.2",
      "jarfile": "minecraft.jar",
      "mainclass": "net.minecraft.launchwrapper.Launch",
      "cmdargs": "--tweakClass cpw.mods.fml.common.launcher.FMLTweaker --username {USERNAME} --accessToken token --uuid {UUID} --assetIndex 1.7.10 --userProperties {} --userType mojang",
      "downloadlink": "http://site_de_telechargement_du_pack_au_format_zip/fpvserv-alpha-3.0.2.zip",
      "version": 302
      }

Mon launcher téléchargeait au préalable une archive au format zip comprenant :
0e7a70cf3b0b920f7b9cd615ac98f1b5.png


Au sein de cette archive, je lançais mon minecraft.jar, qui est en fait forge-1.7.10-version.jar
f3abba83bd801aa77ec3b0f163f8d7d1.png

Et j'avais simplement à prendre en compte le dossier librairies suivant :
1613990835319.png

725ca33a92109523f7553f73b60ffbf5.png

Tout fonctionnait parfaitement, et ça fonctionne encore en 1.7.10.



Voici maintenant mon problème :

Ayant fait une grosse pause sur minecraft, je reviens en ayant loupé beaucoup de mises à jour de minecraft et de forge.
Je voudrais aujourd'hui continuer mon launcher et pouvoir lancer forge 1.12 à partir de celui-ci.

J'ai donc commencé par télécharger l'installateur forge-1.12.2-14.23.5.2854 depuis le site officiel
Puis j'ai fais "Install client"
1613991535763.png

J'ai récupéré 1.12.2-forge-14.23.5.2854.jar dans AppData\Roaming\.minecraft\versions\1.12.2-forge-14.23.5.2854\
1613991628036.png
Et je l'ai mis en tant que minecraft.jar dans mon archive zip :
310adb0b8055e33764c6435fe36d691e.png


Pour être sûr que toutes les librairies soient téléchargées, j'ai lancé une fois forge avec le launcher minecraft officiel, aucun souci :
7d17b107a5c470e1790e2cc0a7fd0d32.png


J'ai ensuite copié le contenu de : C:\Users\user\AppData\Roaming\.minecraft\libraries dans mon archive :
691289e6b4f39c293a7842e166eb8aed.png


Voici comment je viens de faire pour tenter de mettre forge 1.12.2, c'est de cette façon que je faisais de la version 1.6.4 jusqu'à la 1.7.10 pour utiliser Forge sur mon launcher perso.

En 1.12.2, lorsque je lance mon launcher sans aucun mod, celui-ci ne se lance pas, avec les logs suivants :
Code:
[12:12:07] [main/INFO]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker
[12:12:07] [main/INFO]: Using primary tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker
[12:12:07] [main/INFO]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLTweaker
[12:12:07] [main/INFO]: Forge Mod Loader version 14.23.5.2854 for Minecraft 1.12.2 loading
[12:12:07] [main/INFO]: Java is OpenJDK 64-Bit Server VM, version 1.8.0_282, running on Windows 10:amd64:10.0, installed at C:\Users\user\.jdks\corretto-1.8.0_282\jre
[12:12:07] [main/INFO]: Searching C:\Users\user\AppData\Roaming\.custommc\runclients\forge-1.12.2\mods for mods
[12:12:07] [main/INFO]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
[12:12:07] [main/INFO]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLDeobfTweaker
[12:12:07] [main/INFO]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
[12:12:07] [main/INFO]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
[12:12:07] [main/INFO]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
[12:12:09] [main/INFO]: Found valid fingerprint for Minecraft Forge. Certificate fingerprint e3c3d50c7c986df74c645c0ac54639741c90a557
[12:12:09] [main/INFO]: Found valid fingerprint for Minecraft. Certificate fingerprint cd99959656f753dc28d863b46769f7f8fbaefcfc
[12:12:09] [main/INFO]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
[12:12:09] [main/INFO]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLDeobfTweaker
[12:12:09] [main/INFO]: Loading tweak class name net.minecraftforge.fml.common.launcher.TerminalTweaker
[12:12:09] [main/INFO]: Calling tweak class net.minecraftforge.fml.common.launcher.TerminalTweaker
[12:12:09] [main/INFO]: Launching wrapped minecraft {net.minecraft.client.main.Main}
[12:12:10] [main/ERROR]: Unable to launch
java.lang.reflect.InvocationTargetException: null
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_282]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_282]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_282]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_282]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
Caused by: java.lang.UnsatisfiedLinkError: no lwjgl64 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) ~[?:1.8.0_282]
    at java.lang.Runtime.loadLibrary0(Runtime.java:871) ~[?:1.8.0_282]
    at java.lang.System.loadLibrary(System.java:1124) ~[?:1.8.0_282]
    at org.lwjgl.Sys$1.run(Sys.java:72) ~[lwjgl-2.9.4-nightly-20150209.jar:?]
    at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_282]
    at org.lwjgl.Sys.doLoadLibrary(Sys.java:66) ~[lwjgl-2.9.4-nightly-20150209.jar:?]
    at org.lwjgl.Sys.loadLibrary(Sys.java:87) ~[lwjgl-2.9.4-nightly-20150209.jar:?]
    at org.lwjgl.Sys.<clinit>(Sys.java:117) ~[lwjgl-2.9.4-nightly-20150209.jar:?]
    at net.minecraft.client.Minecraft.func_71386_F(Minecraft.java:2984) ~[bib.class:?]
    at net.minecraft.client.main.Main.main(SourceFile:38) ~[Main.class:?]
    ... 6 more
Exception in thread "main" [12:12:10] [main/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]: net.minecraftforge.fml.relauncher.FMLSecurityManager$ExitTrappedException
[12:12:10] [main/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:     at net.minecraftforge.fml.relauncher.FMLSecurityManager.checkPermission(FMLSecurityManager.java:49)
[12:12:10] [main/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:     at java.lang.SecurityManager.checkExit(SecurityManager.java:761)
[12:12:10] [main/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:     at java.lang.Runtime.exit(Runtime.java:107)
[12:12:10] [main/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:     at java.lang.System.exit(System.java:973)
[12:12:10] [main/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:     at net.minecraft.launchwrapper.Launch.launch(Launch.java:138)
[12:12:10] [main/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:     at net.minecraft.launchwrapper.Launch.main(Launch.java:28)

J'ai cherché sur internet, dans les situations que j'ai pu voir, mes erreurs provenait soit d'Optifine (que je n'ai pas puisque aucun mod n'est mis), soit de la version de Java.
Je fais mon launcher sous IntelliJ et je le compile avec Maven avec ces paramètres :
1613992661399.png


J'ai essayé de modifier mes arguments de lancement du .jar dans mon json à tel point que j'ai mis le minimum, mais sans succès, peut-être ai-je oublié quelque chose ?
Code:
Minecraft 1.12.2": {
      "launchfolder": ".custommc/runclients/forge-1.12.2",
      "jarfile": "minecraft.jar",
      "mainclass": "net.minecraft.launchwrapper.Launch",
      "cmdargs": "--tweakClass net.minecraftforge.fml.common.launcher.FMLTweaker --username {USERNAME}",
      "downloadlink": "http://site_internet/forge-1.12.2.zip",
      "version": 302
      }

Si quelqu'un ayant la patience et la connaissance de forge pouvait me venir en aide ce serait avec un grand plaisir, ça fait 3 jours que je bloque sur ce problème et malgré mes recherches, j'avoue que je sèche un peu...

Blenn.
 
Dernière édition:

Blenn412

Créateur de la série MiniMine Tuto
25 Décembre 2012
377
27
140
33
Salut @ShE3py ,

J'ai extrait les .dll et je les ai placé dans librairies comme ci-dessous :
9013d2caaf4b5e9a5dda2aaa68fd1c62.png


Et tout fonctionne parfaitement désormais, merci à toi pour tes explications et ton implication !
J'aurai eu beaucoup de mal à trouver cette solution seul.



J'en profite pour te demander rapidement, pourrais-tu développer la partie téléchargement des assets et des librairies que tu as mentionné plus haut ?
Et sinon, je précise juste qu'il est interdit de réuploader le dossier assets/, il faudrait que ton launcher retélécharge tous les fichiers depuis les serveurs officiels.
Il faudrait aussi copier uniquement les fichiers nécessaires, car copier bêtement assets/ et librairies/ revient à copier tous les fichiers nécessaires pour toutes les versions que tu as installées ; tu copieras beaucoup de fichiers qui ne sont pas nécessaire pour l'unique version que tu veux.
Je me doute qu'il s'agit simplement de récupérer le dossier assets par un URL mais je ne trouve pas littéralement ce lien, j'ai cherché sur google mais je ne trouve que des liens miroirs (ce qui ne résout donc pas mon problème initial de droit ^^), j'ai également cherché dans les fichiers json mais je ne trouve rien de très clair.

Si tu pouvais m'éclaircir sur ce sujet,
Je passe mon poste en résolu pour le reste, encore merci ! :)

Blenn.
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 129
162
461
247
21
Mìlhüsa
Pour le dossier assets/, les liens sont indirectement écrits dans assets/indexes/1.12.2.json.
C'est une liste de fichiers, si je prends par exemple le premier :
JSON:
{
    "objects": {
        "icons/icon_16x16.png": {
            "hash": "bdf48ef6b5d0d23bbb02e17d04865216179f510a",
            "size": 3665
        }
}

On a le nom du fichier, sa taille en octets, et son hash. Parce que plusieurs versions peuvent avoir plusieurs fichiers avec le même nom, le fichier n'est pas enregistré sous icons/icon_16x16.png mais sous assets/objects/bd/bdf48ef6b5d0d23bbb02e17d04865216179f510a.
Je t'invite à ouvrir ce fichier et le renommer en rajoutant l'extension .png pour l'ouvrir, tu verras qu'il s'agit bien de l'icône du jeu.

Pour récupérer le chemin du fichier, il suffit juste de prendre le nom du fichier, puis d'ajouter les deux premiers caractères du fichier en dossier.
Quant au lieu de téléchargement, il suffit juste de préfixer ce chemin de l'URL http://resources.download.minecraft.net/ :
http://resources.download.minecraft.net/bd/bdf48ef6b5d0d23bbb02e17d04865216179f510a

Si tu veux vérifier que le fichier a été téléchargé correctement, tu peux vérifier son SHA-1 qui devra être égal à son hash. Tu peux aussi utiliser la taille des fichiers pour faire une barre de progression (tu prends comme maximum la somme de la taille de tous les fichiers à télécharger).

On nomme fonction de hachage, de l'anglais hash function (hash : pagaille, désordre, recouper et mélanger) par analogie avec la cuisine, une fonction particulière qui, à partir d'une donnée fournie en entrée, calcule une empreinte numérique servant à identifier rapidement la donnée initiale, au même titre qu'une signature pour identifier une personne. Les fonctions de hachage sont utilisées en informatique et en cryptographie notamment pour reconnaître rapidement des fichiers ou des mots de passe.
(Source: https://fr.wikipedia.org/wiki/Fonction_de_hachage)
C'est une façon de compresser un fichier en une quarantaine de caractères, et on part du principe que si deux fichiers sont égaux, alors leurs hashes sont égaux.
On utilise ici la contraposée ; si le hash de deux fichiers sont différents, alors les fichiers sont différents.

L'idée est qu'à la fin du téléchargement, l'on calcul le hash du fichier téléchargé, puis on le compare avec celui indiqué dans le fichier de Mojang. Si les deux textes sont différents, le fichier ne s'est pas téléchargé correctement, l'on affiche un message d'erreur.


Pour le dossier librairies/, les liens sont écrits dans versions/1.12.2/1.12.2.json.
La première partie décrit le fichier qui permet de télécharger les assets/ :
JSON:
{
	"assetIndex": {
		"id": "1.12",
		"sha1": "1584b57c1a0b5e593fad1f5b8f78536ca640547b",
		"size": 143138,
		"totalSize": 129336389,
		"url": "https://launchermeta.mojang.com/v1/packages/1584b57c1a0b5e593fad1f5b8f78536ca640547b/1.12.json"
}
Donc c'est ici que tu vas télécharger le fichier assets/indexes/1.12.2.json, tu peux aussi vérifier que le fichier bien téléchargé avec son hash.

La deuxième partie te permet de télécharger le client :
JSON:
{
	"downloads": {
		"client": {
			"sha1": "0f275bc1547d01fa5f56ba34bdc87d981ee12daf",
			"size": 10180113,
			"url": "https://launcher.mojang.com/v1/objects/0f275bc1547d01fa5f56ba34bdc87d981ee12daf/client.jar"
		},
		"server": {
			"sha1": "886945bfb2b978778c3a0288fd7fab09d315b25f",
			"size": 30222121,
			"url": "https://launcher.mojang.com/v1/objects/886945bfb2b978778c3a0288fd7fab09d315b25f/server.jar"
		}
	}
}
C'est ce que le launcher enregistre sous versions/1.12.2/1.12.2.jar. Bon t'as compris l'idée, tu télécharges à partir de l'URL puis tu vérifies le SHA-1.

Troisième partie, les librairies :
JSON:
{
	"libraries": [
		{
			"downloads": {
				"artifact": {
					"path": "com/mojang/patchy/1.1/patchy-1.1.jar",
					"sha1": "aef610b34a1be37fa851825f12372b78424d8903",
					"size": 15817,
					"url": "https://libraries.minecraft.net/com/mojang/patchy/1.1/patchy-1.1.jar"
				}
			},
			"name": "com.mojang:patchy:1.1"
		}
	]
}
Bref bref bref c'est la même chose.


C'était la manipulation à faire pour un Minecraft vanilla, maintenant il reste encore à faire ça pour Forge. C'est à peu près la même chose, les librairies à télécharger sont dans versions/1.12.2-forge-14.23.5.2854/1.12.2-forge-14.23.5.2854.json.

Après vu que Forge en lui-même est créé à partir du client vanilla, il n'y a pas vraiment de lien de téléchargement. Le plus simple serait d'uploader chez toi les quelques fichiers manquants (ce que la plupart des launchers doivent faire), mais le mieux serait de modifier un peu le code de l'installateur, pour qu'il installe Forge dans ton dossier :
https://github.com/MinecraftForge/Installer

Je ne me suis jamais amusé à faire un launcher donc voilà, je te laisse chercher un peu.


L'idée générale est de télécharger le manifeste versions/1.12.2/1.12.2.json, de télécharger le client et les librairies, puis de télécharger l'index assets/indexes/1.12.2.json dont l'URL est précisé dans le premier fichier, pour enfin télécharger toutes les ressources (textures/bruitages/etc.).

Sur comment trouver le manifeste pour la version que tu veux, ils sont tous disponibles à l'adresse suivante :
https://launchermeta.mojang.com/mc/game/version_manifest.json

Il suffit juste de rechercher la version que tu veux « 1.12.2 », et tu tombes sur le lien suivant :
https://launchermeta.mojang.com/v1/packages/6e69e85d0f85f4f4b9e12dd99d102092a6e15918/1.12.2.json

Dans ton code, il suffit juste de lui dire de télécharger le fichier à cette adresse, et de vérifier le téléchargement avec le hash dans l'URL.
L'avantage de cette technique est que si tu veux changer la version du jeu, il suffira juste de changer cette adresse et le launcher téléchargera tout ce qu'il faut automatiquement.

Si à un moment tu as un problème, tu peux toujours supprimer complètement les dossiers assets/ et librairies/ de ton .minecraft/, le launcher retéléchargera complètement la 1.12 et il faudra que tu réinstalles Forge, mais au moins tu auras exactement les fichiers dont tu as besoin et donc tu pourras faire la différence entre ce que tu as et ce que tu es censé avoir.

Tu as quelques informations en plus sur ce site :
https://wiki.vg/Game_files


Pour finir, si tu arrives déjà à faire tout ça, ce serait intéressant que ton launcher détecte si jamais l'utilisateur a le Minecraft officiel installé, et auquel cas qu'au lieu de télécharger les fichiers chez toi, tu les télécharges dans le .minecraft/.
Cela évitera à l'utilisateur de télécharger deux fois la même version, car tu peux a priori lancer le jeu dans ton dossier .FPVserv/ et dire à ton Minecraft d'utiliser le dossier .minecraft/assets/ du launcher officiel.

Le tout n'est en soit pas très compliqué à faire programmatiquement, mais il faudra juste bien rédiger et structurer ton code, au risque de finir avec un truc infâme que même le Malin n'oserait toucher.
 

Blenn412

Créateur de la série MiniMine Tuto
25 Décembre 2012
377
27
140
33
Pour le dossier assets/, les liens sont indirectement écrits dans assets/indexes/1.12.2.json.
C'est une liste de fichiers, si je prends par exemple le premier :
JSON:
{
    "objects": {
        "icons/icon_16x16.png": {
            "hash": "bdf48ef6b5d0d23bbb02e17d04865216179f510a",
            "size": 3665
        }
}

On a le nom du fichier, sa taille en octets, et son hash. Parce que plusieurs versions peuvent avoir plusieurs fichiers avec le même nom, le fichier n'est pas enregistré sous icons/icon_16x16.png mais sous assets/objects/bd/bdf48ef6b5d0d23bbb02e17d04865216179f510a.
Je t'invite à ouvrir ce fichier et le renommer en rajoutant l'extension .png pour l'ouvrir, tu verras qu'il s'agit bien de l'icône du jeu.

Pour récupérer le chemin du fichier, il suffit juste de prendre le nom du fichier, puis d'ajouter les deux premiers caractères du fichier en dossier.
Quant au lieu de téléchargement, il suffit juste de préfixer ce chemin de l'URL http://resources.download.minecraft.net/ :
http://resources.download.minecraft.net/bd/bdf48ef6b5d0d23bbb02e17d04865216179f510a

Si tu veux vérifier que le fichier a été téléchargé correctement, tu peux vérifier son SHA-1 qui devra être égal à son hash. Tu peux aussi utiliser la taille des fichiers pour faire une barre de progression (tu prends comme maximum la somme de la taille de tous les fichiers à télécharger).

C'est une façon de compresser un fichier en une quarantaine de caractères, et on part du principe que si deux fichiers sont égaux, alors leurs hashes sont égaux.
On utilise ici la contraposée ; si le hash de deux fichiers sont différents, alors les fichiers sont différents.

L'idée est qu'à la fin du téléchargement, l'on calcul le hash du fichier téléchargé, puis on le compare avec celui indiqué dans le fichier de Mojang. Si les deux textes sont différents, le fichier ne s'est pas téléchargé correctement, l'on affiche un message d'erreur.


Pour le dossier librairies/, les liens sont écrits dans versions/1.12.2/1.12.2.json.
La première partie décrit le fichier qui permet de télécharger les assets/ :
JSON:
{
    "assetIndex": {
        "id": "1.12",
        "sha1": "1584b57c1a0b5e593fad1f5b8f78536ca640547b",
        "size": 143138,
        "totalSize": 129336389,
        "url": "https://launchermeta.mojang.com/v1/packages/1584b57c1a0b5e593fad1f5b8f78536ca640547b/1.12.json"
}
Donc c'est ici que tu vas télécharger le fichier assets/indexes/1.12.2.json, tu peux aussi vérifier que le fichier bien téléchargé avec son hash.

La deuxième partie te permet de télécharger le client :
JSON:
{
    "downloads": {
        "client": {
            "sha1": "0f275bc1547d01fa5f56ba34bdc87d981ee12daf",
            "size": 10180113,
            "url": "https://launcher.mojang.com/v1/objects/0f275bc1547d01fa5f56ba34bdc87d981ee12daf/client.jar"
        },
        "server": {
            "sha1": "886945bfb2b978778c3a0288fd7fab09d315b25f",
            "size": 30222121,
            "url": "https://launcher.mojang.com/v1/objects/886945bfb2b978778c3a0288fd7fab09d315b25f/server.jar"
        }
    }
}
C'est ce que le launcher enregistre sous versions/1.12.2/1.12.2.jar. Bon t'as compris l'idée, tu télécharges à partir de l'URL puis tu vérifies le SHA-1.

Troisième partie, les librairies :
JSON:
{
    "libraries": [
        {
            "downloads": {
                "artifact": {
                    "path": "com/mojang/patchy/1.1/patchy-1.1.jar",
                    "sha1": "aef610b34a1be37fa851825f12372b78424d8903",
                    "size": 15817,
                    "url": "https://libraries.minecraft.net/com/mojang/patchy/1.1/patchy-1.1.jar"
                }
            },
            "name": "com.mojang:patchy:1.1"
        }
    ]
}
Bref bref bref c'est la même chose.


C'était la manipulation à faire pour un Minecraft vanilla, maintenant il reste encore à faire ça pour Forge. C'est à peu près la même chose, les librairies à télécharger sont dans versions/1.12.2-forge-14.23.5.2854/1.12.2-forge-14.23.5.2854.json.

Après vu que Forge en lui-même est créé à partir du client vanilla, il n'y a pas vraiment de lien de téléchargement. Le plus simple serait d'uploader chez toi les quelques fichiers manquants (ce que la plupart des launchers doivent faire), mais le mieux serait de modifier un peu le code de l'installateur, pour qu'il installe Forge dans ton dossier :
https://github.com/MinecraftForge/Installer

Je ne me suis jamais amusé à faire un launcher donc voilà, je te laisse chercher un peu.


L'idée générale est de télécharger le manifeste versions/1.12.2/1.12.2.json, de télécharger le client et les librairies, puis de télécharger l'index assets/indexes/1.12.2.json dont l'URL est précisé dans le premier fichier, pour enfin télécharger toutes les ressources (textures/bruitages/etc.).

Sur comment trouver le manifeste pour la version que tu veux, ils sont tous disponibles à l'adresse suivante :
https://launchermeta.mojang.com/mc/game/version_manifest.json

Il suffit juste de rechercher la version que tu veux « 1.12.2 », et tu tombes sur le lien suivant :
https://launchermeta.mojang.com/v1/packages/6e69e85d0f85f4f4b9e12dd99d102092a6e15918/1.12.2.json

Dans ton code, il suffit juste de lui dire de télécharger le fichier à cette adresse, et de vérifier le téléchargement avec le hash dans l'URL.
L'avantage de cette technique est que si tu veux changer la version du jeu, il suffira juste de changer cette adresse et le launcher téléchargera tout ce qu'il faut automatiquement.

Si à un moment tu as un problème, tu peux toujours supprimer complètement les dossiers assets/ et librairies/ de ton .minecraft/, le launcher retéléchargera complètement la 1.12 et il faudra que tu réinstalles Forge, mais au moins tu auras exactement les fichiers dont tu as besoin et donc tu pourras faire la différence entre ce que tu as et ce que tu es censé avoir.

Tu as quelques informations en plus sur ce site :
https://wiki.vg/Game_files


Pour finir, si tu arrives déjà à faire tout ça, ce serait intéressant que ton launcher détecte si jamais l'utilisateur a le Minecraft officiel installé, et auquel cas qu'au lieu de télécharger les fichiers chez toi, tu les télécharges dans le .minecraft/.
Cela évitera à l'utilisateur de télécharger deux fois la même version, car tu peux a priori lancer le jeu dans ton dossier .FPVserv/ et dire à ton Minecraft d'utiliser le dossier .minecraft/assets/ du launcher officiel.

Le tout n'est en soit pas très compliqué à faire programmatiquement, mais il faudra juste bien rédiger et structurer ton code, au risque de finir avec un truc infâme que même le Malin n'oserait toucher.
Super, je te remercie fortement pour ce niveau de détails qui m'aide beaucoup.

Je vais tâcher de mettre tout cela en place :)
Je pense que beaucoup de launchers "non-officiels" ne prennent pas la peine de retélécharger toutes les libraires mais je vais tâcher de faire ça.
Y a-t-il des risques particulier avec mojang si ce n'est pas fait ? Des personnes ont déjà eu des problèmes liés à cela à ta connaissance ?

Je suppose qu'héberger les librairies même en tant que miroir est tout aussi interdit ? Je ne pense pas que mojang ferme ou change radicalement ses liens de téléchargement mais c'est par pure curiosité que je pose ces questions.

Blenn.