Mod Le modding Minecraft pour les nuls.

Cobalt Team

Programmation / Design
25 Mars 2015
395
64
90
34
Québec, Canada
cobaltstudio.net
Vous avez toujours rêver de créer un mod minecraft? Vous avez essayer MCreator mais vous avez vu que c'est tellement de la merde que vous voulez "réellement" devenir moddeur? Bien ce tutoriel est fait pour vous!

Dans ce tutoriel, vous allez apprendre la base du java et comment faire certains éléments dans Minecraft. Bien sûr, si vous n'avez jamais fait de programmation, ça va être dur pour vous. Je vous conseille d'aller voir beaucoup de vidéo de programmation ou même ce tutoriel de Openclassroom avant de commencer.

Cobalt Team n'est pas responsable des problèmes qui peut survenir! Vous faites cela sous votre entière responsabilité!

Table des matières

  1. C'est quoi Java?
  2. Préparation
  3. Parti théorique
  4. Ajouter un bloc?
C'est quoi java?

Java est un langage de programmation fait par Sun Microsystems, puis racheter par oracle depuis 2009. Il ne faut pas confondre java et javascript, qui sont 2 langages complètement différent! Une de ses plus grandes forces est son excellente portabilité, une fois un programme créé, il fonctionnera automatiquement sous Windows, Mac, Linux, etc.

Préparation
Premièrement, on va devoir télécharger quelques trucs pour permettre la programmation en java sur votre ordinateur.

Si vous avez déjà Java d'installer sur votre PC et que c'est le JRE, désinstallez le car on va installer le JDK, qui est le kit de développement pour décompiler et compiler le code et en plus, il contient le JRE!

Télécharger JDK
ARFseNn.png

Cliquez sur download du JDK.
peFlM4g.png

Cochez la case : Accept License Agreement puis cliquez sur le lien correspondant à votre système d'exploitation (x86 pour un système 32 bits et x64 pour un système 64 bits). Une popup de téléchargement doit alors apparaître.
Si vous ne savez pas si votre pc est 32 bit ou 64 bit, Faites un clic droit sur démarrer et système
ianRt2r.png


Maintenant que le JDK est installer sur votre PC, vous allez voir besoin de Eclipse IDE.

Je vous invite donc à télécharger Eclipse IDE. Une fois la page de téléchargement choisissez Eclipse IDE for Java Developers, en choisissant la version d'Eclipse correspondant à votre OS (Operating System = système d'exploitation), comme indiqué à la figure suivante.
vxaqDZS.png


Pour ceux qui l'avaient deviné, Eclipse est le petit logiciel qui va nous permettre de développer nos applications ou nos applets, et aussi celui qui va compiler tout ça. Notre logiciel va donc permettre de traduire nos futurs programmes Java en langage byte code, compréhensible uniquement par votre JRE, fraîchement installé.

Quand votre téléchargement va être terminer, vous devez maintenant avoir une archive contenant Eclipse. Décompressez-la où vous voulez, entrez dans ce dossier et lancez Eclipse. Au démarrage, comme le montre la figure suivante, Eclipse vous demande dans quel dossier vous souhaitez enregistrer vos projets;
ciLAMx5.png

Mais vu qu'on n'a pas encore décompiler Minecraft, cliquez sur cancel.
Pour décompiler Minecraft, allez sur ce site et télécharger le fichier suivant.
29lY7Pi.png

Quand cette archive est télécharger, Décompressez-la dans un dossier et ouvrez ce dossier.
EOaOlUZ.png

Vous allez double-clic sur decompile et une fenêtre de commande va s'ouvrir. Laissez la faire. Elle va télécharger tout les fichiers nécessaires pour le projet. Normalement, le script prend 5 minute a décompiler.
jLKSUYV.png

a2FUSLX.png

Quand tout est décompiler, vous allez voir "Appuyez sur une touche pour continuer..", alors appuyer sur enter.
P6g7QyW.png

Maintenant réouvrez éclipse et cliquez sur browse pour aller chercher votre projet décompiler. Allez chercher votre dossier où vous avez décompiler minecraft, cliquez sur la flèche et sélectionnez le dossier eclipse.
Appuyez sur OK et encore OK. Maintenant, éclipse va se charger.
Si vous voyez comme dossier Client et Server dans package explorer, BRAVO! Vous avez fini la section préparation à la perfection!
0gP5Zf0.png


La première chose qu'on va faire, on va ouvrir le projet et aller corriger un bug car avec cette version de Minecraft coder pack, le temps en jeu est déréglé. Cliquez sur la flèche sur client et sur src et plein de boite vont s'affiché. Ces "boites" sont en effet des paquets. Rendez vous jusqu'a au paquet net.minecraft.world et cliquez sur la flèche. Alors la, vous voyez plein de fichier qui fini en .java. Ces fichier sont les fichier de programmation ou java class si vous préférez, elle contienne le code du jeu. ouvrez WorldProvider.java en faisant un double clic dessus.
lDQDC0k.png

Quand fichier est ouvert, prenez une minute pour vous familiariser avec l'interface d'éclipse. Voici quelques détails.
PHNmPPm.png

Mais ce qui va être le plus important, c'est ça.
EX9LQUl.png

Nouveau : Pour faire un nouveau fichier.
Sauvegarder, sauvegarder tout, imprimer : Sauvegarder le code.
Le debug : Le debug est une fonction super utile en programmation! Juste pour vous dire, je l'utilise 95 % du temps car ça permet de modifier le code du jeu et de voir les changements sans devoir reboot l'application à chaque fois que je fait une modification! (Imaginez juste la perte de temps énorme juste à toujours reboot)
Éxécuter l'application : ça exécute l'application mais tu peut pas modifier le code.
Le paquet et java class: ça permet de créer un paquet ou une class rapidement.
Le reste des boutons n'est pas utiles dans le tutoriel ou rarement utiliser et je vais le préciser si besoin.
Maintenant, votre premier travail est de cliquez sur
n8yIFqr.png

Vous voyez, votre jeu est ouvert.
yX9H0I5.png

En bas de éclipse, vous voyez la console. Elle indique tout ce qui arrive a minecraft. C'est comme si le jeu vous parle, alors écoutez le. Quand un problème arrive, il va le dire dans cette section.
wQrA6bW.png


Parti théorique

Mainteant, allez dans un monde et mettez le temps sur la nuit avec la commande /time set night.
ACGq9Of.png

Vous voyez, on a un bug! Le temps du jeu est décalé et votre premier travail est de corriger ce bug.
Mais non, pas tout seul, je vais vous aider. Vous vous en rappeler de la class que je vous aie dit d'ouvrir? Et bien une fonction dans cette class ne fonctionne pas comme prévu. Mais avant de voir les fonction, voici les variables présentent en java.

Les variables de type numérique
Le type byte (1 octet) peut contenir les entiers entre -128 et +127.
Code:
byte hauteur;
hauteur = 64;
Le type short (2 octets) contient les entiers compris entre -32768 et +32767.
Code:
short playerSpeed;
playerSpeed= 32000;
Le type int (4 octets) va de -2*109 à 2*109 (2 et 9 zéros derrière… ce qui fait déjà un joli nombre).
Code:
int flytime;
flytime= 15600000;
Le type long (8 octets) peut aller de −9×1018 à 9×1018 (encore plus gros…).
Code:
long anneeLumiere;
anneeLumiere = 9460700000000000L;
Afin d'informer la JVM que le type utilisé est long, vous DEVEZ ajouter un "L" à la fin de votre nombre, sinon le compilateur essaiera d'allouer ce dernier dans une taille d'espace mémoire de type entier(int) et votre code ne compilera pas si votre nombre est trop grand...
Le type float (4 octets) est utilisé pour les nombres avec une virgule flottante.
Code:
float pi;
pi = 3.141592653f;
Vous remarquerez que nous ne mettons pas une virgule, mais un point ! Et vous remarquerez aussi que même si le nombre en question est rond, on écrit « .0 » derrière celui-ci, le tout suivi de « f ».
Le type double (8 octets) est identique à float, si ce n'est qu'il contient plus de chiffres derrière la virgule et qu'il n'a pas de suffixe.
Code:
double division;
division = 0.333333333333333333333333333333333333333333334D;
Ici encore, vous devez utiliser une lettre - le « d » - pour parfaire la déclaration de votre variable.
Des variables stockant un caractère
Le type char contient un caractère stocké entre apostrophes (« ' ' »), comme ceci :
Code:
char caractere;
caractere = 'A';
Des variables de type booléen
Le type boolean, lui, ne peut contenir que deux valeurs : true (vrai) ou false (faux), sans guillemets (ces valeurs sont natives dans le langage, il les comprend directement et sait les interpréter).
Code:
boolean question;
question = true;
Et aussi le type String
Le type String permet de gérer les chaînes de caractères, c'est-à-dire le stockage de texte.
Il s'agit d'une variable d'un type plus complexe que l'on appelle objet. Vous verrez que celle-ci s'utilise un peu différemment des variables précédentes :
Code:
//Première méthode de déclaration
String phrase;
phrase = "Titi et Grosminet";

//Deuxième méthode de déclaration
String str = new String();
str = "Une autre chaîne de caractères";

//Troisième méthode de déclaration
String string = "Une autre chaîne";

//Quatrième méthode de déclaration
String chaine = new String("Et une de plus !");
ATTENTION: String commence par une majuscule ! Et lors de l'initialisation, on utilise des guillemets doubles (" ").

Mais avant d'aller plus loins, vous devez respecter une convention quand vous programmez!
En résumé : il s'agit d'une convention de nommage. En fait, c'est une façon d'appeler nos classes, nos variables, etc. Il faut que vous essayiez de la respecter au maximum. Cette convention, la voici :

  • tous vos noms de classes doivent commencer par une majuscule ;

  • tous vos noms de variables doivent commencer par une minuscule ;

  • si le nom d'une variable est composé de plusieurs mots, le premier commence par une minuscule, le ou les autres par une majuscule, et ce, sans séparation ;

  • tout ceci sans accentuation !
Aussi, vous avez les opérateurs arithmétiques(sont ceux que l'on apprend à l'école primaire…)
ou presque :

  • « + » : permet d'additionner deux variables numériques (mais aussi de concaténer des chaînes de caractères ; ne vous inquiétez pas, on aura l'occasion d'y revenir).

  • « - » : permet de soustraire deux variables numériques.

  • « * » : permet de multiplier deux variables numériques.

  • « / » : permet de diviser deux variables numériques (mais je crois que vous aviez deviné).

  • « % » : permet de renvoyer le reste de la division entière de deux variables de type numérique ;
Aussi, vous avez les conditions. Mais avant, vous devez savoir les opérateurs logiques. En voici quelque s'un.
  • « == » : permet de tester l'égalité.

  • « != » : permet de tester l’inégalité.

  • « < » : strictement inférieur.

  • « <= » : inférieur ou égal.

  • « > » : strictement supérieur.

  • « >= » : supérieur ou égal.

  • « && » : l'opérateur ET. Il permet de préciser une condition

  • « || » : le OU. Même combat que le précédent.

  • « ? : » : l'opérateur ternaire. Pour celui-ci, vous comprendrez mieux avec un exemple.
Alors voici la forme d'une condition "if" "else".
Code:
if(//condition)
{
  //Exécution des instructions si la condition est remplie
}
else
{
  //Exécution des instructions si la condition n'est pas remplie
}
Vous avez aussi le else if, qui est un" sinon si…".

Maintenant, vous êtes capable de corriger le bug. Revenons au projet et aller à la fonction "CalculateCelestiaAngle".
Voici une fonction:
u7QLtD3.png

Décortiquons un peu une fonction:

  • Tout d'abord, il y a le mot clé public. C'est ce qui définit la portée de la méthode.

  • Juste après, nous voyons float. Il s'agit du type de retour de la méthode. Pour faire simple, ici, notre méthode va renvoyer un float!

  • Vient ensuite le nom de la méthode.

  • Puis arrivent les arguments de la méthode. Ce sont en fait les paramètres dont la méthode a besoin pour travailler.

  • Finalement, vous pouvez voir une instruction return à l'intérieur de la méthode. C'est elle qui effectue le renvoi de la valeur, ici un float.
Donc pour corriger le problème, sélectionner la fonction et remplacer la par celle ci et sauvegarder.
Code:
    public float calculateCelestialAngle(long p_76563_1_, float p_76563_3_)
    {
        int i = (int)(p_76563_1_ % 24000L);
        float f = ((float)i + p_76563_3_) / 24000.0F - 0.25F;

        if (f < 0.0F)
        {
            ++f;
        }

        if (f > 1.0F)
        {
            --f;
        }

        float f2 = f;
        f = 1.0F - (float)((Math.cos((double)f * Math.PI) + 1.0D) / 2.0D);
        f = f2 + (f - f2) / 3.0F;
        return f;
    }
Maintenant, retournons voir le jeu.
QDe3Msy.png

Voilà. Le temps du jeu est corrigé!

Ajouter un bloc

Ajouter un bloc Minerai
Maintenant, aller au paquet net.minecraft.block ,ouvrez le, et faites un double-clic sur Block.java
Maintenant aller a la ligne 1241. (Les lignes sont sur le coté)
ewIexRT.png

Voici votre fonction. Allez tout en bas.
2gqKeJD.png

Donc, la fonction pour ajouter le block est
registerBlock(198, "ruby_ore", (new BlockOre()) .setHardness(3.0F) .setResistance(5.0F) .setStepSound(soundTypePiston).setUnlocalizedName("oreRuby").setCreativeTab(CreativeTabs.tabBlock));

Alors pour ajouter le bloc, ajoutez la ligne avant "blockRegistry.validateKey();"
Code:
registerBlock(198, "ruby_ore", (new BlockOre()).setHardness(3.0F).setResistance(5.0F).setStepSound(soundTypePiston).setUnlocalizedName("oreRuby").setCreativeTab(CreativeTabs.tabBlock));
xQh2Lzn.png


Maintenant, aller dans le paquet net.minecraft.init et ouvrez blocks.java et items.java

Dans Blocks.java
OelMrZ3.png

Ajoutez à la ligne 237 :
Code:
public static final Block ruby_ore;
m17pLNd.png

descendez à la ligne 453 et ajoutez :
Code:
 ruby_ore = getRegisteredBlock("ruby_ore");
Dans Items.java

sf4A6f7.png

Allez à la ligne 204 et ajoutez :
Code:
public static final Item ruby;
cLbDOeE.png

Après, allez à la ligne 406 et ajoutez ceci.
Code:
ruby = getRegisteredItem("ruby");

Maintenant, on va déclarer l'item que va drop le minerai. Nous allons donc dans le paquet net.minecraft.item et ouvrez item.java et allez a la ligne 941 et fait enter.

OtKMaH1.png

Ajoutez ces deux lignes :
Code:
registerItemBlock(Blocks.ruby_ore);
registerItem(432, "ruby", (new ItemRuby()).setUnlocalizedName("ruby"));
La première sert à faire le rendu de l'item du minerai et l'autres pour déclarer un nouvel items.

Maintenant, allons dans le paquet net.minecraft.client.renderer.entity et ouvrez RenderItem.java

Allez tout en bas a la ligne 1043 et ajoutez ces lignes :
ICtzWqY.png

Code:
this.registerItem(Items.ruby,"ruby");
this.registerBlock(Blocks.ruby_ore, "ruby_ore");
Mais maintenant, nous devons ajouter le blockmodel et le blockstate de la 1.8.8!

ATTENTION
Minecraft doit être fermer quand vous transféré les assets.

Veuiller télécharger ce fichier zip, il contient tout les fichiers nécessaires pour cette partie du tutoriel.

Décompressez-là et vous avez 2 dossiers : Blockstates et models
Vous avez juste à renommer les fichiers pour le nom du bloc ou le nom de l'item.

Vous devrez aussi ouvrir les fichiers et changer les nom en dedans aussi.

Les fichiers sont en format .json. Je vous conseil d'utiliser le logiciel Notepad++ pour ça.

Quand les fichiers sont correctement renommé, ouvrez le dossier ou vous avez décompiler minecraft, et allez dans jars.
POUBL8m.png

Et allez dans versions, 1.8.8 et faite clic droit sur 1.8.8.jar et ouvrez le avec 7zip ou winrar. Allez dans assets et puis dans minecraft. Vous allez avoir blockstate. Ajoutez si le contenu du dossier blockstates de l'archive. Quand c'est fait, faite précédent et allez dans Models et transféré les deux dossiers.
Pour les textures, allez dans le dossier textures, blocks et transféré votre texture. Pour la texture d'un item, allez dans textures, items et transféré la texture de l'item.

Réouvrez minecraft et vous allez voir que vos items ont une texture et un model!
BCxqWaD.png

Maintenant, allez dans la classe BlockOre.java et ajoutez ces lignes pour quand on détruit le block, il drop l'item.
xtUPgBh.png

Code:
this == Blocks.ruby_ore ? Items.ruby : (
Il va falloir que vous ajoutez une '(' à la fin de la ligne.
Si vous voulez que le minerai donne de l'expérience, allez à la fonction dropBlockAsItemWithChance.
aYbzW7e.png

Et ajoutez ceci.
Code:
            else if (this == Blocks.ruby_ore)
            {
                i = MathHelper.getRandomIntegerInRange(worldIn.rand, 2, 5);
            }
Et voilà! Votre minerai est terminer!
Résultat final

Ajouter un Item

Ajouter un Mob

Modifier l'interface

Ajouter de la nourriture

Ajouter un armure

Le tutoriel est en cours d'écriture!
 
M'ouai, dans tous les cas il faut de bonne base en Java pour comprendre tous ça.
Une personne Lambda ne sera pas capable de faire tous ce que tu as dit je pense.
 
Dernière édition: