Modding FR

nostre

Aventurier
13 Novembre 2010
424
5
0
31
subject_mods_32.png

Minecraft est un jeu en plein développement,aussi bien du coté de chez Mojang que de celui de la communauté, qui ne cesse de développer toujours plus de mods et de extures packs.

Cependant, pour toute personne voulant tenter le modding de Minecraft,il faudra passer par les tutoriaux du forum officiel,où le français n'est pas vraiment courant.
De plus,si la personne en question ne connait pas un minimum certaines bases de code,sa devient vite un enfer de se lancer dans le domaines...

C'est pourquoi,devant l'absence total de tutoriel français sur le sujet,et afin d'encourager de nouveaux modder français,j'ai décidé de créer le 1er Tutoriel de Modding Minecraft FR.

Le but n'est pas seulement de créer un tutoriel en français,j'esseye de faire en sorte qu'il sois le plus accessible possible pour toutes personnes, compréhensible même pour des non initiés a toutes formes de codes (ou presque).

tutorial.gif


changelog.png
ChangeLog:
changelog.png

*27-02-11: Mise a jour des tutos I et III pour MCP 29a et ModLoader Beta 1.3_01v4.
*27-02-11: Correction d'une erreur dans le tuto II,merci a Woreck de me l'avoir fait remarquer !
*11-04-11: Mise a jour complète pour Minecraft Beta 1.4_01,MCP211 et ModLoader B1.4_01 v1.
*27-04-2011: Mise a jour pour Minecraft B1.5_01,MCP v2.12 et ModLoader v3 B1.5_01.
*30-04-2011: Correction d'une erreur avec les recettes,et mise a disposition des fichiers mod_MyMod.java et BlockMyBloc.java.
exclamation.gif
*29-05-11: Mise a jour pour Minecraft B1.6.5,MCP v3.3 et ModLoader v1 B1.6.5.


! Les liens suivants sont morts !

tuto.png

green-download-arrow-grey-line.png
Tutorial Modding FR - Téléchargement:
green-download-arrow-grey-line.png

asus_download_arrow004.gif
Tuto I - Téléchargement et installation
asus_download_arrow004.gif
Tuto II - Création d'un mod simple,ajout de nouveaux blocs
asus_download_arrow004.gif
Tuto III - Compilation et tests
asus_download_arrow004.gif
Tuto IV - Quelques petits trucs a savoir avant de continuer
asus_download_arrow004.gif
Tuto - Création de nouveaux objets
asus_download_arrow004.gif
Tuto - Ajouter des blocs et objets pour le four
asus_download_arrow004.gif
Tuto - Blocs – Autres possibilités
asus_download_arrow004.gif
Tuto - Autres possibilités - objets
asus_download_arrow004.gif
Sources du mod du Tuto II

Nouveaux fichiers ajoutés suite aux liens morts à la fin du message.
Il manque juste les "Sources du mod du Tuto II".
Je précise que ce sont les fichiers d'origine, le code est parfois obsolète !
 

Fichiers joints

KiwiAtomique a dit:
Plop, j'ai besoin d'aide.

Dans mon mod, j'ai rajouter une sort de bois, et une sorte de feuille. Jusque là tout va bien.
J'ai aussi rajouté une génération d'arbre (cacaotier pour être exact. Tout fonctionne bien.

Mais lorsque je regarde en jeu, les feuilles bug, elles comme les vitres collés, on voit que le premier block (screen : http://mineshack.olympe-network.com/upload/1012011-07-20_17.58.00.png) alors que je voudrais qu'on voit les autres feuilles.

Je ne vois pas l'image mais je pense que tu as le même problème que j'ai eu, pour le résoudre j'ai repris le code de BlockLeavesBase et l'ai ajouté à mon fichier Feuille.java, modifié un peu pour enlever les erreurs possibles et changer le "extends BlockLeaveBase" par "extends Block"








Frank1010 a dit:
-Les développeurs ont réellement créer des fonctions du style fun_XXXX_X() ? Ou bien c'est un effet de la décompilation ?
Où est-ce que tu vois un fichier comme ça?


Frank1010 a dit:
-Je suppose aussi que de voir aucun commentaire, c'est un autre effet de la décompilation, qui naturellement ne sont pas sauvegardés à la compilation.
Exact :D




Frank1010 a dit:
-Dans le fichier block.java , je n'ai pas trouvé l'initialisation de la variable k, elle correspond à quoi précisément ?
Les variables peuvent être créée dans la définition de la fonction, par exemple
Code:
getBlockID(int i, int j, int k)
ici on créé 3 variables de type int, au passage je te montre une méthode qu'il y a dans le fichier World.java, qui sert à obtenir l'ID d'un block avec ses coordonnées, i, j et k sont les coordonnées du bloc

Mais à quoi sert k dépend de la méthode dans laquelle il est utilisé

Frank1010 a dit:
-Toujours dans ce même fichier, je retrouve des fonctions vides, notamment onBlockClicked(), onBlockDestroyedByExplosion(), c'est un effet de la décompilation ou bien ces fonctions sont réellements vides ? Car du coup, je me demande où se situe les lignes de codes générant l'explosion de la TNT ? Car dans BlockTNT.java , on retrouve des références à des fonctions qui sont vides ? Ou bien j'ai mal compris.
Je ne suis pas sûr mais je pense que ces fonctions sont crées dans le fichier Block.java pour ensuite être "écrites" dans les fichiers enfants (les fichiers Block*.java), je ne sais pas quelle utilité ça a par contre



J'espère t'avoir aidé :D
 
Entre autre, mais dans BlockTNT.java , je crois, il y a une fonction qui par exemple contient une seule instruction :
"return (i&7);" , si ma mémoire est bonne, mon pc fixe étant éteint je ne peux y accéder. Cette instruction se situe dans une fonction au nom dont je parle dans mon premier post. Mais je suis quand même intéressé par les fonctions field que tu mentionnes.

Parcontre je m'en veux pour mon histoire de variable k, ça fait 3 mois que je n'ai pas touché à du code, et je me suis posé la question en plus, mais bon, va falloir que je m'y replonge demain si j'ai le temps.

Parcontre, pour mon histoire de TNT , quelqu'un a répondu sur le sujet suivant : http://minecraft.fr/forums/showthread.php?tid=15998

Mais Ce que je ne comprend pas, c'est comment l'explosion est généré, car apparemment le code se situe dans EntityTNTPrimed et RenderTNTPrimed , mais quand est-ce que ces deux fichiers sont appelés ?

Au final, que dois contenir le fichier BlockMyBlock.class ? Comment se passe donc l'interaction avec le joueur ?
Car pour le moment, si j'ai bien compris ce fichier contient donc les images à afficher, sa résistance, son type, le bruit qu'il peut générer, mais si un joueur clique dessus, c'est dans ce fichier que dois être gérer l'événement ?

Merci d'avance,
Bonne soirée ;)
 
Frank1010 a dit:
je suis quand même intéressé par les fonctions field que tu mentionnes.
Ce sont juste des variables avec un nom bizarre, je ne sais pas si elle sont nommées ainsi car ceux qui font MCP n'ont pas jugés utile de modifier leur nom ou s'ils n'ont pas trouvé de nom qui lui conviendrait


Frank1010 a dit:
Mais Ce que je ne comprend pas, c'est comment l'explosion est généré, car apparemment le code se situe dans EntityTNTPrimed et RenderTNTPrimed , mais quand est-ce que ces deux fichiers sont appelés ?
Ces fichiers sont utilisés dans BlockTNT.java, lorsque le bloc est détruit je pense



Frank1010 a dit:
Au final, que dois contenir le fichier BlockMyBlock.class ? Comment se passe donc l'interaction avec le joueur ?
Car pour le moment, si j'ai bien compris ce fichier contient donc les images à afficher, sa résistance, son type, le bruit qu'il peut générer, mais si un joueur clique dessus, c'est dans ce fichier que dois être gérer l'événement ?
Le fichier BlockMyBlock.java contient ce que tu veux :D

Interaction c'est à dire? que le joueur clique dessus ou qu'il se prenne des dégâts en le touchant ? alors oui il faut mettre les méthodes dans ce fichier, pour le cactus la méthode qui "blesse le joueur" est dans le fichier BlockCactus.java, lorsque tu cliques droit sur un coffre la méthode qui ouvre le GUI est dans BlockChest.java

En clair toute action que provoque ton blocMyBloc doit être dans ce fichier
 
Code:
package net.minecraft.src;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) braces deadcode 

import java.util.Random;

public class BlockFeuille extends Block
{

    protected BlockFeuille(int i, int j)
    {
        super(i, j, Material.leaves);
        baseIndexInPNG = j;
        setTickOnLoad(true);
    }
	
    public boolean isOpaqueCube()
    {
        return false;
    }
	
    public void onBlockRemoval(World world, int i, int j, int k)
    {
        int l = 1;
        int i1 = l + 1;
        if(world.checkChunksExist(i - i1, j - i1, k - i1, i + i1, j + i1, k + i1))
        {
            for(int j1 = -l; j1 <= l; j1++)
            {
                for(int k1 = -l; k1 <= l; k1++)
                {
                    for(int l1 = -l; l1 <= l; l1++)
                    {
                        int i2 = world.getBlockId(i + j1, j + k1, k + l1);
                        if(i2 == feuille.blockID)
                        {
                            int j2 = world.getBlockMetadata(i + j1, j + k1, k + l1);
                            world.setBlockMetadata(i + j1, j + k1, k + l1, j2 | 8);
                        }
                    }

                }

            }

        }
    }

    public void updateTick(World world, int i, int j, int k, Random random)
    {
        if(world.multiplayerWorld)
        {
            return;
        }
        int l = world.getBlockMetadata(i, j, k);
        if((l & 8) != 0)
        {
            byte byte0 = 4;
            int i1 = byte0 + 1;
            byte byte1 = 32;
            int j1 = byte1 * byte1;
            int k1 = byte1 / 2;
            if(adjacentTreeBlocks == null)
            {
                adjacentTreeBlocks = new int[byte1 * byte1 * byte1];
            }
            if(world.checkChunksExist(i - i1, j - i1, k - i1, i + i1, j + i1, k + i1))
            {
                for(int l1 = -byte0; l1 <= byte0; l1++)
                {
                    for(int k2 = -byte0; k2 <= byte0; k2++)
                    {
                        for(int i3 = -byte0; i3 <= byte0; i3++)
                        {
                            int k3 = world.getBlockId(i + l1, j + k2, k + i3);
                            if(k3 == bois.blockID)
                            {
                                adjacentTreeBlocks[(l1 + k1) * j1 + (k2 + k1) * byte1 + (i3 + k1)] = 0;
                                continue;
                            }
                            if(k3 == feuille.blockID)
                            {
                                adjacentTreeBlocks[(l1 + k1) * j1 + (k2 + k1) * byte1 + (i3 + k1)] = -2;
                            } else
                            {
                                adjacentTreeBlocks[(l1 + k1) * j1 + (k2 + k1) * byte1 + (i3 + k1)] = -1;
                            }
                        }

                    }

                }

                for(int i2 = 1; i2 <= 4; i2++)
                {
                    for(int l2 = -byte0; l2 <= byte0; l2++)
                    {
                        for(int j3 = -byte0; j3 <= byte0; j3++)
                        {
                            for(int l3 = -byte0; l3 <= byte0; l3++)
                            {
                                if(adjacentTreeBlocks[(l2 + k1) * j1 + (j3 + k1) * byte1 + (l3 + k1)] != i2 - 1)
                                {
                                    continue;
                                }
                                if(adjacentTreeBlocks[((l2 + k1) - 1) * j1 + (j3 + k1) * byte1 + (l3 + k1)] == -2)
                                {
                                    adjacentTreeBlocks[((l2 + k1) - 1) * j1 + (j3 + k1) * byte1 + (l3 + k1)] = i2;
                                }
                                if(adjacentTreeBlocks[(l2 + k1 + 1) * j1 + (j3 + k1) * byte1 + (l3 + k1)] == -2)
                                {
                                    adjacentTreeBlocks[(l2 + k1 + 1) * j1 + (j3 + k1) * byte1 + (l3 + k1)] = i2;
                                }
                                if(adjacentTreeBlocks[(l2 + k1) * j1 + ((j3 + k1) - 1) * byte1 + (l3 + k1)] == -2)
                                {
                                    adjacentTreeBlocks[(l2 + k1) * j1 + ((j3 + k1) - 1) * byte1 + (l3 + k1)] = i2;
                                }
                                if(adjacentTreeBlocks[(l2 + k1) * j1 + (j3 + k1 + 1) * byte1 + (l3 + k1)] == -2)
                                {
                                    adjacentTreeBlocks[(l2 + k1) * j1 + (j3 + k1 + 1) * byte1 + (l3 + k1)] = i2;
                                }
                                if(adjacentTreeBlocks[(l2 + k1) * j1 + (j3 + k1) * byte1 + ((l3 + k1) - 1)] == -2)
                                {
                                    adjacentTreeBlocks[(l2 + k1) * j1 + (j3 + k1) * byte1 + ((l3 + k1) - 1)] = i2;
                                }
                                if(adjacentTreeBlocks[(l2 + k1) * j1 + (j3 + k1) * byte1 + (l3 + k1 + 1)] == -2)
                                {
                                    adjacentTreeBlocks[(l2 + k1) * j1 + (j3 + k1) * byte1 + (l3 + k1 + 1)] = i2;
                                }
                            }

                        }

                    }

                }

            }
            int j2 = adjacentTreeBlocks[k1 * j1 + k1 * byte1 + k1];
            if(j2 >= 0)
            {
                world.setBlockMetadataWithNotify(i, j, k, l & -9);
            } else
            {
                removeLeaves(world, i, j, k);
            }
        }
    }

    private void removeLeaves(World world, int i, int j, int k)
    {
        dropBlockAsItem(world, i, j, k, world.getBlockMetadata(i, j, k));
        world.setBlockWithNotify(i, j, k, 0);
    }

    public int idDropped(int i, Random random)
    {
	    int drop = random.nextInt(6);
		if(drop > 3)
		{
            return ;
		} else
		{
		    return 0;
		}
    }

    private int baseIndexInPNG;
    int adjacentTreeBlocks[];
}