Modding FR

nostre

Aventurier
13 Novembre 2010
424
5
0
30
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

Euh coment changer la couche de spawn des bloc exemble

J'aimerai que le titane se trouve a la meme couche que l'or
que le titane50 a celle de la redstone et le cristal a celle du diamonds ! J'imagine quil faut changer sa public

BlockTitane(int i, int j)
{
super(i, j, Material.rock);
}

Mais j'ai taper gold,diamonds sa me fait error a chaque fois :'(
 
Salut Zer0w117, il ne faut pas changer sa :

BlockTitane(int i, int j)
{
super(i, j, Material.rock);
}

regarde bien dans les source java de minecraft ( il faut fouiller pour trouver ;) )
 
J'aimerais savoir comment créer une option dans le menu de création de monde

J'explique, suite a mon idée: http://minecraft.fr/forums/showthread.php?tid=22906

J'aimerais faire ce mod, pour cela, il faut ajouter un bouton pour sélectionner sa classe exemple

[Chevalier]

si on clique sur le bouton (chevalier :hap:) on passe à:

[Archer]

Voilà :(
 
J'aimerais savoir comment créer une option dans le menu de création de monde

Regarde dans le fichier GuiCreateWorld.java :)


Zer0w117 a écrit :
oulaa lit le tuto

je l'ai lu mais ce n'est pas indiqué et j'aurais une autre question: comment faire un bloc avec de la gravité inversé merci

Si il a une gravité inversé comment pourra tu le stopper ?
Quoi qu'il en soit, essaye avec ce fichier ( EntitySandInverse.java )

Code:
package net.minecraft.src;

public class EntitySandInverse extends Entity
{

    public EntitySandInverse(World world)
    {
        super(world);
        fallTime = 0;
    }

    public EntitySandInverse(World world, double d, double d1, double d2, 
            int i)
    {
        super(world);
        fallTime = 0;
        blockID = i;
        preventEntitySpawning = true;
        setSize(0.98F, 0.98F);
        yOffset = height / 2.0F;
        setPosition(d, d1, d2);
        motionX = 0.0D;
        motionY = 0.0D;
        motionZ = 0.0D;
        prevPosX = d;
        prevPosY = d1;
        prevPosZ = d2;
    }

    protected boolean canTriggerWalking()
    {
        return false;
    }

    protected void entityInit()
    {
    }

    public boolean canBeCollidedWith()
    {
        return !isDead;
    }

    public void onUpdate()
    {
        if(blockID == 0)
        {
            setEntityDead();
            return;
        }
        prevPosX = posX;
        prevPosY = posY;
        prevPosZ = posZ;
        fallTime++;
        motionY += 0.039999999105930328D;
        moveEntity(motionX, motionY, motionZ);
        motionX *= 0.98000001907348633D;
        motionY *= 0.98000001907348633D;
        motionZ *= 0.98000001907348633D;
        int i = MathHelper.floor_double(posX);
        int j = MathHelper.floor_double(posY);
        int k = MathHelper.floor_double(posZ);
        if(worldObj.getBlockId(i, j, k) == blockID)
        {
            worldObj.setBlockWithNotify(i, j, k, 0);
        }
        if(onGround)
        {
            motionX *= 0.69999998807907104D;
            motionZ *= 0.69999998807907104D;
            motionY *= 0.5D;
            setEntityDead();
            if((!worldObj.canBlockBePlacedAt(blockID, i, j, k, true, 1) || BlockSand.canFallBelow(worldObj, i, j - 1, k) || !worldObj.setBlockWithNotify(i, j, k, blockID)) && !worldObj.multiplayerWorld)
            {
                dropItem(blockID, 1);
            }
        } else
        if(fallTime > 100 && !worldObj.multiplayerWorld)
        {
            dropItem(blockID, 1);
            setEntityDead();
        }
    }

    protected void writeEntityToNBT(NBTTagCompound nbttagcompound)
    {
        nbttagcompound.setByte("Tile", (byte)blockID);
    }

    protected void readEntityFromNBT(NBTTagCompound nbttagcompound)
    {
        blockID = nbttagcompound.getByte("Tile") & 0xff;
    }

    public float getShadowSize()
    {
        return 0.0F;
    }

    public World getWorld()
    {
        return worldObj;
    }

    public int blockID;
    public int fallTime;
}


C'est quasiment de recopiage...
C'est juste le fichier EntityFallingSand avec quelques modifications...

Pareil pour le fichier BlockSandInverse.java

Code:
package net.minecraft.src;

import java.util.Random;

public class BlockSandInverse extends Block
{

    public BlockSandInverse(int i, int j)
    {
        super(i, j, Material.sand);
    }

    public void onBlockAdded(World world, int i, int j, int k)
    {
        world.scheduleBlockUpdate(i, j, k, blockID, tickRate());
    }

    public void onNeighborBlockChange(World world, int i, int j, int k, int l)
    {
        world.scheduleBlockUpdate(i, j, k, blockID, tickRate());
    }

    public void updateTick(World world, int i, int j, int k, Random random)
    {
        tryToFall(world, i, j, k);
    }

    private void tryToFall(World world, int i, int j, int k)
    {
        int l = i;
        int i1 = j;
        int j1 = k;
        if(canFallBelow(world, l, i1 - 1, j1) && i1 >= 0)
        {
            byte byte0 = 32;
            if(fallInstantly || !world.checkChunksExist(i - byte0, j - byte0, k - byte0, i + byte0, j + byte0, k + byte0))
            {
                world.setBlockWithNotify(i, j, k, 0);
                for(; canFallBelow(world, i, j - 1, k) && j > 0; j--) { }
                if(j > 0)
                {
                    world.setBlockWithNotify(i, j, k, blockID);
                }
            } else
            {
                EntitySandInverse entityfallingsand = new EntitySandInverse(world, (float)i + 0.5F, (float)j + 0.5F, (float)k + 0.5F, blockID);
                world.entityJoinedWorld(entityfallingsand);
            }
        }
    }

    public int tickRate()
    {
        return 3;
    }

    public static boolean canFallBelow(World world, int i, int j, int k)
    {
        int l = world.getBlockId(i, j, k);
        if(l == 0)
        {
            return true;
        }
        if(l == Block.fire.blockID)
        {
            return true;
        }
        Material material = Block.blocksList[l].blockMaterial;
        if(material == Material.water)
        {
            return true;
        }
        return material == Material.lava;
    }

    public static boolean fallInstantly = false;

}

Et bien sur rajouter cela dans le code de ton mod :

Code:
public void AddRenderer(Map paramMap)
{
     paramMap.put(net.minecraft.src.EntitySandInverse.class, new RenderFallingSand());
}

Euh en tout cas ce n'est pas aussi simple que claquer des doigts...
Mais bien utilisé il est vrai que ça peut-être marrant :gni:
 
rafoudiablol a dit:
J'aimerais savoir comment créer une option dans le menu de création de monde

Regarde dans le fichier GuiCreateWorld.java :)


Zer0w117 a écrit :
oulaa lit le tuto

je l'ai lu mais ce n'est pas indiqué et j'aurais une autre question: comment faire un bloc avec de la gravité inversé merci

Si il a une gravité inversé comment pourra tu le stopper ?
Quoi qu'il en soit, essaye avec ce fichier ( EntitySandInverse.java )

Code:
package net.minecraft.src;

public class EntitySandInverse extends Entity
{

    public EntitySandInverse(World world)
    {
        super(world);
        fallTime = 0;
    }

    public EntitySandInverse(World world, double d, double d1, double d2, 
            int i)
    {
        super(world);
        fallTime = 0;
        blockID = i;
        preventEntitySpawning = true;
        setSize(0.98F, 0.98F);
        yOffset = height / 2.0F;
        setPosition(d, d1, d2);
        motionX = 0.0D;
        motionY = 0.0D;
        motionZ = 0.0D;
        prevPosX = d;
        prevPosY = d1;
        prevPosZ = d2;
    }

    protected boolean canTriggerWalking()
    {
        return false;
    }

    protected void entityInit()
    {
    }

    public boolean canBeCollidedWith()
    {
        return !isDead;
    }

    public void onUpdate()
    {
        if(blockID == 0)
        {
            setEntityDead();
            return;
        }
        prevPosX = posX;
        prevPosY = posY;
        prevPosZ = posZ;
        fallTime++;
        motionY += 0.039999999105930328D;
        moveEntity(motionX, motionY, motionZ);
        motionX *= 0.98000001907348633D;
        motionY *= 0.98000001907348633D;
        motionZ *= 0.98000001907348633D;
        int i = MathHelper.floor_double(posX);
        int j = MathHelper.floor_double(posY);
        int k = MathHelper.floor_double(posZ);
        if(worldObj.getBlockId(i, j, k) == blockID)
        {
            worldObj.setBlockWithNotify(i, j, k, 0);
        }
        if(onGround)
        {
            motionX *= 0.69999998807907104D;
            motionZ *= 0.69999998807907104D;
            motionY *= 0.5D;
            setEntityDead();
            if((!worldObj.canBlockBePlacedAt(blockID, i, j, k, true, 1) || BlockSand.canFallBelow(worldObj, i, j - 1, k) || !worldObj.setBlockWithNotify(i, j, k, blockID)) && !worldObj.multiplayerWorld)
            {
                dropItem(blockID, 1);
            }
        } else
        if(fallTime > 100 && !worldObj.multiplayerWorld)
        {
            dropItem(blockID, 1);
            setEntityDead();
        }
    }

    protected void writeEntityToNBT(NBTTagCompound nbttagcompound)
    {
        nbttagcompound.setByte("Tile", (byte)blockID);
    }

    protected void readEntityFromNBT(NBTTagCompound nbttagcompound)
    {
        blockID = nbttagcompound.getByte("Tile") & 0xff;
    }

    public float getShadowSize()
    {
        return 0.0F;
    }

    public World getWorld()
    {
        return worldObj;
    }

    public int blockID;
    public int fallTime;
}


C'est quasiment de recopiage...
C'est juste le fichier EntityFallingSand avec quelques modifications...

Pareil pour le fichier BlockSandInverse.java

Code:
package net.minecraft.src;

import java.util.Random;

public class BlockSandInverse extends Block
{

    public BlockSandInverse(int i, int j)
    {
        super(i, j, Material.sand);
    }

    public void onBlockAdded(World world, int i, int j, int k)
    {
        world.scheduleBlockUpdate(i, j, k, blockID, tickRate());
    }

    public void onNeighborBlockChange(World world, int i, int j, int k, int l)
    {
        world.scheduleBlockUpdate(i, j, k, blockID, tickRate());
    }

    public void updateTick(World world, int i, int j, int k, Random random)
    {
        tryToFall(world, i, j, k);
    }

    private void tryToFall(World world, int i, int j, int k)
    {
        int l = i;
        int i1 = j;
        int j1 = k;
        if(canFallBelow(world, l, i1 - 1, j1) && i1 >= 0)
        {
            byte byte0 = 32;
            if(fallInstantly || !world.checkChunksExist(i - byte0, j - byte0, k - byte0, i + byte0, j + byte0, k + byte0))
            {
                world.setBlockWithNotify(i, j, k, 0);
                for(; canFallBelow(world, i, j - 1, k) && j > 0; j--) { }
                if(j > 0)
                {
                    world.setBlockWithNotify(i, j, k, blockID);
                }
            } else
            {
                EntitySandInverse entityfallingsand = new EntitySandInverse(world, (float)i + 0.5F, (float)j + 0.5F, (float)k + 0.5F, blockID);
                world.entityJoinedWorld(entityfallingsand);
            }
        }
    }

    public int tickRate()
    {
        return 3;
    }

    public static boolean canFallBelow(World world, int i, int j, int k)
    {
        int l = world.getBlockId(i, j, k);
        if(l == 0)
        {
            return true;
        }
        if(l == Block.fire.blockID)
        {
            return true;
        }
        Material material = Block.blocksList[l].blockMaterial;
        if(material == Material.water)
        {
            return true;
        }
        return material == Material.lava;
    }

    public static boolean fallInstantly = false;

}

Et bien sur rajouter cela dans le code de ton mod :

Code:
public void AddRenderer(Map paramMap)
{
     paramMap.put(net.minecraft.src.EntitySandInverse.class, new RenderFallingSand());
}

Euh en tout cas ce n'est pas aussi simple que claquer des doigts...
Mais bien utilisé il est vrai que ça peut-être marrant :gni:

Merci beaucoup mais il me dit lors de la recompilation qu'il ne trouve pas class map enfin je croit :


== MCP v4.3 ==
> Recompiling client...
"C:\Program Files (x86)\Java\jdk1.6.0_25\bin\javac.exe" -g -verbose -classpath "
lib/;lib/*;jars/bin/minecraft.jar;jars/bin/jinput.jar;jars/bin/lwjgl.jar;jars/bi
n/lwjgl_util.jar" -sourcepath src/minecraft -d bin/minecraft src/minecraft\net\m
inecraft\client\*.java src/minecraft\net\minecraft\isom\*.java src/minecraft\net
\minecraft\src\*.java conf/patches/*.java failed.
Return code : 1

== ERRORS FOUND ==

src\minecraft\net\minecraft\src\mod_MyMod.java:17: cannot find symbol
symbol : class Map
location: class net.minecraft.src.mod_MyMod
public void AddRenderer(Map paramMap)
^

1 error
==================

> Done in 2.07 seconds
> Recompiling server...
!! Can not find server sources !!
Appuyez sur une touche pour continuer...