Sommaire
Introduction
Vous voulez créer un mod en utilisant l’énergie de Thermal Expansion ou/et d’IndustrialCraft 2, ou même l’API de ComputerCraft, voici comment gérer ça facilement.
Pré-requis
Code
La première chose que nous allons faire c’est faire quelque chose de plus propre pour gérer les versions, voici 2 moyens :
- Utiliser le fichier gradle.properties
- Créer un nouveau fichier appelé gradle.properties
- Nous allons ajouter nos valeurs sous la forme “clé=valeur”
- Nous récupérerons ces valeurs avec ${clé} (en le mettant entre des guillemets doubles ("), les guillemets simples (') ne marchent pas)
- Utiliser un ConfigSlurper
- Créer un fichier du nom que vous voulez
- Dans le build.gradle, ajoutez ceci :
ext.configFile = file “<chemin vers votre fichier>” // configFile peut être ce que vous voulez tant que vous mettez le même plus basconfigFile.withReader { def properties = new Properties() properties.load(it) project.ext.config = new ConfigSlurper().parse properties // ici config (project.ext.config) peut être ce que vous voulez mais vous devrez récupérer vos valeurs avec ${<le nom>.clé}} - Les valeurs auront la même forme qu’au-dessus : clé=valeur
- Nous récupérerons ces valeurs avec ${config.clé} (en le mettant entre des guillemets doubles ("), les guillemets simples (') ne marchent pas)
Si vous le voulez vous pouvez aussi utiliser le format json en utilisant JsonSlurper.
Ce fichier va nous servir à stocker toutes les versions des dépendances dedans.
(Dans ce tutoriel j’utiliserai la première technique)
Maintenant que l’on a un moyen de rassembler nos valeurs dans un fichier à part, je vous conseille très fortement de rajouter dans votre fichier de configuration (celui défini au-dessus) la version de minecraft ainsi que celle de forge, voici ce à quoi devrait ressembler vos fichiers :
gradle.properties (fichier de configuration) :
mc_version=1.7.10
forge_version=10.13.4.1448-1.7.10
build.gradle :
buildscript {
// Retiré pour plus de compréhension
}
apply plugin: 'forge'
version = "1.0"
group= "com.yourname.modid"
archivesBaseName = "modid"
minecraft {
version = "${mc_version}-${forge_version}"
runDir = "eclipse"
}
dependencies {
// Retiré pour plus de compréhension
}
processResources
{
// Retiré pour plus de compréhension
}
Pour pouvoir télécharger automatiquement les versions des mods voulus, il va falloir dire à gradle où les télécharger, on peut lui donner 2 types de liens :
Ces informations sont à rajouter dans le block “repositories”, qui est à créer :
buildscript {
// Retiré pour plus de compréhension
}
apply plugin: 'forge'
repositories {
// C'est ici que l'on va rajouter nos repositories
}
version = "1.0"
group= "com.yourname.modid" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = "modid"
minecraft {
// Retiré pour plus de compréhension
}
dependencies {
// Retiré pour plus de compréhension
}
processResources
{
// Retiré pour plus de compréhension
}
- Un repo maven (c’est ce qu’il y a de plus simple) :
maven { name “<le nom du repo>” // ce nom est optionnel et importe très peu url “<lien vers le repo maven>” // ici le lien vers le repo maven voulu, exemple : http://files.minecraftforgefrance.fr/maven/} - Un repo ivy, c’est un lien auquel vous allez définir un pattern (https://docs.gradle.org/current/userguide/dependency_management.html#sec:ivy_repositories) :
ivy { name “<le nom du repo>” // facultatif artifactPattern “<lien avec= le pattern>” // exemple de pattern : http://addons-origin.cursecdn.com/files/2246/919/[module]-[revision].[ext] (repo du CoFHCore)}
Voici les repositories que je vais rajouter pour ce tutoriel :
repositories {
mavenCentral()
maven { // le repo de chicken bones, celui-ci est obligatoire pour faire fonctionner les mods non-déobfusqués
name 'CB Repo'
url "http://chickenbones.net/maven/"
}
maven { // le repo de profMobius pour waila
name 'ProfMobius Repo'
url "http://mobiusstrip.eu/maven/"
}
maven { // celui d'IC2
name 'Player'
url "http://maven.ic2.player.to/"
}
maven { // celui de RX14 pour inventorytweaks, et pleins d'autres
name 'RX14'
url "http://mvn.rx14.co.uk/repo/"
}
maven {
name = "Tterrag"
url = "http://maven.tterrag.com/"
}
ivy { // nous sommes obligés de passer par un repo ivy car la CoFHTeam n'a pas de maven
name "CoFHCore"
artifactPattern 'http://addons-origin.cursecdn.com/files/2246/919/[module]-[revision].[ext]'
}
ivy {
name "ThermalFoundation"
artifactPattern 'http://addons-origin.cursecdn.com/files/2246/921/[module]-[revision].[ext]'
}
ivy {
name "ThermalFoundation"
artifactPattern 'http://addons-origin.cursecdn.com/files/2246/924/[module]-[revision].[ext]'
}
ivy {
name "ThermalDynamics"
artifactPattern 'http://addons-origin.cursecdn.com/files/2246/949/[module]-[revision].[ext]'
}
ivy {
name "MineFactoryReloaded"
artifactPattern 'http://addons-origin.cursecdn.com/files/2233/906/[module]-[revision].[ext]'
}
ivy { // BuildCraft est téléchargé depuis son site web
name "BuildCraft"
artifactPattern "http://www.mod-buildcraft.com/releases/BuildCraft/[revision]/[module]-[revision]-[classifier].[ext]"
}
}
Si vous avez des fichiers à télécharger avec curse, il faut juste trouver les 2 nombres après “files/” en téléchargeant un fichier (le 1er dépend de l’auteur).
Maintenant il ne reste plus qu’à dire à gradle quels mods il faut télécharger dans le block “dependencies” (celui en bas de votre fichier build.gradle) :
dependencies {
compile "codechicken:CodeChickenCore:${mc_version}-${ccc_version}:dev" // obligatoire pour faire fonctionner les autres mods
compile "codechicken:CodeChickenLib:${mc_version}-${ccl_version}:dev" // pas obligatoire : si vous ne le mettez pas, le CCC va le télécharger dans le dossier mods
compile "codechicken:ForgeMultipart:${mc_version}-${fmp_version}:dev"
compile "codechicken:NotEnoughItems:${mc_version}-${nei_version}:dev"
compile "mcp.mobius.waila:Waila:${waila_version}_${mc_version}"
compile "cofh:CoFHCore:[${mc_version}]${cofhcore_version}"
compile "cofh:ThermalFoundation:[${mc_version}]${tf_version}"
compile "cofh:ThermalExpansion:[${mc_version}]${te_version}"
compile "cofh:ThermalDynamics:[${mc_version}]${td_version}"
compile "cofh:MineFactoryReloaded:[${mc_version}]${mfr_version}"
compile "net.industrial-craft:industrialcraft-2:${ic2_version}-experimental:dev"
compile "buildcraft:buildcraft:${bc_version}:dev"
compile "com.enderio:EnderIO:${mc_version}-${enderio_version}:dev"
compile "inventorytweaks:InventoryTweaks:${invtweaks_version}"
}
Voici comment se compose la fonction “compile” :
compile “organisation:mod:version:classifier” (les guillemets doubles sont importants pour la raison spécifiée en haut)
organisation : le plus souvent l’auteur, à voir en fonction du repo spécifié au-dessus
mod : dépend aussi du repo
version : à choisir parmi les versions disponibles sur le repo
classifier : non obligatoire car, si le repo est fait correctement, le plugin eclipse (ou idea) téléchargera les sources avec et le CCC (CodeChickenCore) permet de jouer avec des mods non-déobfusqués.
Et voilà ! Il ne vous reste plus qu’à mettre vos versions dans votre fichier de configuration et faire “gradlew eclipse” pour télécharger et jouer avec vos mods préférés.
Voici ce que vous devriez avoir au final :
build.gradle
buildscript {
repositories {
mavenCentral()
maven {
name = "forge"
url = "http://files.minecraftforge.net/maven"
}
maven {
name = "sonatype"
url = "https://oss.sonatype.org/content/repositories/snapshots/"
}
}
dependencies {
classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT'
}
}
apply plugin: 'forge'
repositories {
mavenCentral()
maven {
name 'CB Repo'
url "http://chickenbones.net/maven/"
}
maven {
name 'ProfMobius Repo'
url "http://mobiusstrip.eu/maven/"
}
maven {
name 'Player'
url "http://maven.ic2.player.to/"
}
maven {
name 'RX14'
url "http://mvn.rx14.co.uk/repo/"
}
maven {
name = "Tterrag"
url = "http://maven.tterrag.com/"
}
ivy {
name "CoFHCore"
artifactPattern 'http://addons-origin.cursecdn.com/files/2246/919/[module]-[revision].[ext]'
}
ivy {
name "ThermalFoundation"
artifactPattern 'http://addons-origin.cursecdn.com/files/2246/921/[module]-[revision].[ext]'
}
ivy {
name "ThermalFoundation"
artifactPattern 'http://addons-origin.cursecdn.com/files/2246/924/[module]-[revision].[ext]'
}
ivy {
name "ThermalDynamics"
artifactPattern 'http://addons-origin.cursecdn.com/files/2246/949/[module]-[revision].[ext]'
}
ivy {
name "MineFactoryReloaded"
artifactPattern 'http://addons-origin.cursecdn.com/files/2233/906/[module]-[revision].[ext]'
}
ivy {
name "BuildCraft"
artifactPattern "http://www.mod-buildcraft.com/releases/BuildCraft/[revision]/[module]-[revision]-[classifier].[ext]"
}
}
version = "1.0"
group= "com.yourname.modid" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = "modid"
minecraft {
version = "${mc_version}-${forge_version}"
runDir = "eclipse"
}
dependencies {
compile "codechicken:CodeChickenCore:${mc_version}-${ccc_version}:dev"
compile "codechicken:CodeChickenLib:${mc_version}-${ccl_version}:dev"
compile "codechicken:ForgeMultipart:${mc_version}-${fmp_version}:dev"
compile "codechicken:NotEnoughItems:${mc_version}-${nei_version}:dev"
compile "mcp.mobius.waila:Waila:${waila_version}_${mc_version}"
compile "cofh:CoFHCore:[${mc_version}]${cofhcore_version}"
compile "cofh:ThermalFoundation:[${mc_version}]${tf_version}"
compile "cofh:ThermalExpansion:[${mc_version}]${te_version}"
compile "cofh:ThermalDynamics:[${mc_version}]${td_version}"
compile "cofh:MineFactoryReloaded:[${mc_version}]${mfr_version}"
compile "net.industrial-craft:industrialcraft-2:${ic2_version}-experimental:dev"
compile "buildcraft:buildcraft:${bc_version}:dev"
compile "com.enderio:EnderIO:${mc_version}-${enderio_version}:dev"
compile "inventorytweaks:InventoryTweaks:${invtweaks_version}"
}
processResources
{
// this will ensure that this task is redone when the versions change.
inputs.property "version", project.version
inputs.property "mcversion", project.minecraft.version
// replace stuff in mcmod.info, nothing else
from(sourceSets.main.resources.srcDirs) {
include 'mcmod.info'
// replace version and mcversion
expand 'version':project.version, 'mcversion':project.minecraft.version
}
// copy everything else, thats not the mcmod.info
from(sourceSets.main.resources.srcDirs) {
exclude 'mcmod.info'
}
}
gradle.properties (fichier de configuration) :
mc_version=1.7.10
forge_version=10.13.4.1448-1.7.10
ccc_version=1.0.7.46
ccl_version=1.1.3.138
fmp_version=1.1.2.331
nei_version=1.0.5.118
waila_version=1.5.10
cofhcore_version=3.0.3-303
tf_version=1.2.0-102
te_version=4.0.3B1-218
td_version=1.1.0-161
mfr_version=2.8.0-104
ic2_version=2.2.717
bc_version=7.1.9
enderio_version=2.3.0.375_beta
invtweaks_version=1.58
Lors de votre premier lancement, le code chicken lib va vous demander de trouver le dossier conf, il se trouve dans GRADLE_HOME\caches\minecraft\net\minecraftforge\forge<votre version de forge>\unpacked\conf , GRADLE_HOME est par défaut C:\Users<utilisateur>.gradle .
Bonus
Pour modifier automatiquement la version de votre mod ainsi que d’autres paramètres, voici comment faire :
minecraft {
version = "${mc_version}-${forge_version}"
runDir = "eclipse"
replace "@VERSION@", project.version // ici on cherche le pattern @VERSION@ et on le remplace par la version du mod
replaceIn "<votre classe principale>.java" // on le remplace uniquement dans la classe principale, en enlevant cette ligne le remplacement se fera dans tous les fichiers
}
Dans votre classe principale :
@Mod(modid = <classe principale>.MODID, version = <classe principale>.VERSION)
public class <classe principale>
{
public static final String MODID = "modid";
public static final String VERSION = "@VERSION@";
}
Comment créer une version déobfusquée et un jar contenant les sources de votre mod (à placer à la fin de votre build.gradle) :
task deobfJar(type: Jar) {
from sourceSets.main.output
classifier = 'dev'
}
task sourceJar(type: Jar) {
from sourceSets.main.allSource
classifier = 'sources' // il est conseillé de mettre "sources" au lieu de "src", sinon gradle ne le considérera pas comme les sources du mod
}
artifacts {
archives deobfJar
archives sourceJar
archives jar
}
Si vous voulez que ces archives soient créées à chaque fois que vous faîtes un “gradlew build” :
tasks.assemble.dependsOn('deobfJar', 'sourceJar')
Résultat
Crédits
Rédaction :
Correction :
Ce tutoriel de SCAREX publié sur Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International