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

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.

Voila le code source :
Code:
package net.minecraft.src;

import java.util.Random;

public class BlockCocoaLeaves extends BlockLeavesBase
{

    protected BlockCocoaLeaves(int i, int j)
    {
        super(i, j, Material.leaves, false);
        baseIndexInPNG = j;
        setTickOnLoad(true);
    }

    public int quantityDropped(Random random)
    {
        return random.nextInt(20) != 0 ? 0 : 1;
    }
    
    public int idDropped(int i, Random random)
    {
        return mod_SeedBeer.CocoaFeve.shiftedIndex;
    }

    public boolean isOpaqueCube()
    {
        return false;
    }
    
    protected int damageDropped(int i)
    {
        return i & 3;
    }
    
    public boolean renderAsNormalBlock()
    {
        return blockType;
    }
    
    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 == mod_SeedBeer.CocoaLeaves.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 == mod_SeedBeer.CocoaWood.blockID)
                            {
                                adjacentTreeBlocks[(l1 + k1) * j1 + (k2 + k1) * byte1 + (i3 + k1)] = 0;
                                continue;
                            }
                            if(k3 == mod_SeedBeer.CocoaLeaves.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.setBlockMetadata(i, j, k, l & -9);
            } else
            {
                removeLeaves(world, i, j, k);
            }
        }
    }

    public void harvestBlock(World world, EntityPlayer entityplayer, int i, int j, int k, int l)
    {
        if(!world.multiplayerWorld && entityplayer.getCurrentEquippedItem() != null && entityplayer.getCurrentEquippedItem().itemID == Item.shears.shiftedIndex)
        {
            entityplayer.addStat(StatList.mineBlockStatArray[blockID], 1);
            dropBlockAsItem_do(world, i, j, k, new ItemStack(mod_SeedBeer.CocoaLeaves.blockID, 1, l & 3));
        } else
        {
            super.harvestBlock(world, entityplayer, i, j, k, l);
        }
    }
   
    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 void setGraphicsLevel(boolean flag)
    {
        graphicsLevel = flag;
        blockIndexInTexture = baseIndexInPNG + (flag ? 0 : 1);
    }

    public void onEntityWalking(World world, int i, int j, int k, Entity entity)
    {
        super.onEntityWalking(world, i, j, k, entity);
    }

    int adjacentTreeBlocks[];
    private int baseIndexInPNG;
    private boolean blockType;
}

Merci d'avance.

Zoctos, je connais presque rien aux mobs, mais essaye ça :

Code:
 protected Entity findPlayerToAttack()
    {
        double d = -1D;
        EntityLiving entityliving = null;
        for(int i = 0; i < worldObj.loadedEntityList.size(); i++)
        {
            Entity entity = (Entity)worldObj.loadedEntityList.get(i);
            if(!(entity instanceof EntityLiving) || (entity instanceof EntityCreature))
            {
                continue;
            }
            double d1 = entity.getDistance(posX, posY, posZ);
            if(d1 < 16D && (d == -1D || d1 < d) && ((EntityLiving)entity).canEntityBeSeen(this))
            {
                d = d1;
                entityliving = (EntityLiving)entity;
            }
        }

        return entityliving;
    }

Pas sur du résultat
 
Bonjour,
Je suis nouveau dans le modding, et j'ai lu le début des tutoriaux présent en début de page, et cela m'a donné envie de m'y intéresser de plus près.

Pour critiquer un peu, je trouve les deux premiers tutoriaux utiles, le reste je pense que c'est au joueur de se débrouiller tout seul en lisant les codes sources.

Anyway, j'ai donc commencé à lire les codes sources et j'aurais donc quelques questions :

-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 ?
-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.
-Dans le fichier block.java , je n'ai pas trouvé l'initialisation de la variable k, elle correspond à quoi précisément ?
-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.

Merci d'avance,
Bonne journée.

P.S.
-Si j'ai d'autres questions, c'est bien sur ce topic qui faut les poster, ou bien je dois créer un autre topic ?
 
Tous les commentaires que tu vois ne sont pas les commentaires de notch, mais de la décompilation ( tout comme l'ordganisation des codes )

La décompilation se gère bizarrement...
Par exemple, essaye de décompiler un mod, tu verra dans le fichier principale des commentaires du genre

Code:
// Block1, Block 2, Block 3
// Block 4, Block 5

Et l'organisation du fichier sera les ModLoader.addName tout en haut, et tout en bas un

Code:
static
{
    // ...
};

Tous les autres commentaires seront supprimés et l'organisation de l'indentation sera aussi refaite, les else if, etc...

Je me demande aussi d'ou les fonctions sont appelés, comment, etc...
Mais je pense que les fichier world, worldoBJ et minecraft en contiennent la plupart !

Si ce sont des question si terribles pour toi va demander à Notch ^^
 
Du coup cette mystérieuse variable k ? Je comprend toujours pas :p ! Sinon, quand Notch prévoit de sortir un API pour moddeur ? c'est justement pour éviter la décompilation ?

Merci pour la réponse ;)