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

Bonsoir, j'aimerais ajouter à mon code un moyen de le faire sauté si ont pause de la redstone et que l'on active le tous (sauté comme la tnt ^^') s'il vous plait quelqu'un connais le moyen ?

mod_Mod1.java
Code:
package net.minecraft.src;

public class mod_Mod1 extends BaseMod
{
	public mod_Mod1()
	{
	ModLoader.RegisterBlock(myBloc);
    ModLoader.AddName(myBloc, "Test");
	ModLoader.AddRecipe(new ItemStack(myBloc, 3), new Object[] {"###","XXX","#X#",Character.valueOf('#'), Block.cobblestone, Character.valueOf('X'), Block.sand});

	}

	public static final Block myBloc = (new BlockMyBloc(99,224)).setHardness(1.0F)
	.setResistance(99F)
	.setBlockName("Test")
	.setLightValue(2.0F)
	.setStepSound(Block.soundMetalFootstep);
	
	



	public String Version()
	{
	return "V1";
	}
}


BlockMyBloc.java
Code:
package net.minecraft.src;

import java.util.Random;

public class BlockMyBloc extends Block
{
	public BlockMyBloc(int i, int j)
	{
		super(i, j, Material.rock);
	}

	public int idDropped(int i, Random random)
	{
		return mod_Mod1.myBloc.blockID;
	}
}

Merci d'avance :)

Bonne soirée
 
Salut, j'ai un petit bug avec mon mod :
J'essaie de créer une Torche qui marche comme un levier.
J'ai donc commencer à copier coller les quelques morceau que je pensé utile, puis je décide de tester.
Lorsque je teste : Rien.
Impossible de créer ce fameux block ... La recette ne donne rien ... ( J'ai essayer avec une recette avec juste un CobbkeStone ... Et ça fait pareil )

Voila les deux fichiers :
ModLeverTorch.java :
Code:
package net.minecraft.src;
public class ModLeverTorch extends BaseMod
{
public ModLeverTorch()
{
ModLoader.RegisterBlock(myBloc);

ModLoader.AddRecipe(new ItemStack(myBloc), new Object[] {
            "###", "# ", "##", Character.valueOf('#'), Block.planks
        });
ModLoader.AddRecipe(new ItemStack(myBloc, 1), new Object[] {"C", Character.valueOf('C'), Block.cobblestone});
}
public static final Block myBloc = (new
BlockLever(104,224)).setHardness(2.0F).setResistance(10F)
.setStepSound(Block.soundStoneFootstep);
public String Version()
{
return "1.5_01";
}
}

BlockLeverTorch.java :

Code:
// 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 

package net.minecraft.src;

import java.util.Random;

// Referenced classes of package net.minecraft.src:
//            Block, Material, World, IBlockAccess, 
//            AxisAlignedBB, EntityPlayer

public class BlockLeverTorch extends Block
{

    protected BlockLeverTorch(int i, int j)
    {
        super(i, j, Material.circuits);
    }

    public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int i, int j, int k)
    {
        return null;
    }

    public boolean isOpaqueCube()
    {
        return false;
    }

    public boolean renderAsNormalBlock()
    {
        return false;
    }

    public int getRenderType()
    {
        return 2;
    }
 public void randomDisplayTick(World world, int i, int j, int k, Random random)
    {
        int l = world.getBlockMetadata(i, j, k);
        double d = (float)i + 0.5F;
        double d1 = (float)j + 0.7F;
        double d2 = (float)k + 0.5F;
        double d3 = 0.2199999988079071D;
        double d4 = 0.27000001072883606D;
        if(l == 1)
        {
            world.spawnParticle("smoke", d - d4, d1 + d3, d2, 0.0D, 0.0D, 0.0D);
            world.spawnParticle("flame", d - d4, d1 + d3, d2, 0.0D, 0.0D, 0.0D);
        } else
        if(l == 2)
        {
            world.spawnParticle("smoke", d + d4, d1 + d3, d2, 0.0D, 0.0D, 0.0D);
            world.spawnParticle("flame", d + d4, d1 + d3, d2, 0.0D, 0.0D, 0.0D);
        } else
        if(l == 3)
        {
            world.spawnParticle("smoke", d, d1 + d3, d2 - d4, 0.0D, 0.0D, 0.0D);
            world.spawnParticle("flame", d, d1 + d3, d2 - d4, 0.0D, 0.0D, 0.0D);
        } else
        if(l == 4)
        {
            world.spawnParticle("smoke", d, d1 + d3, d2 + d4, 0.0D, 0.0D, 0.0D);
            world.spawnParticle("flame", d, d1 + d3, d2 + d4, 0.0D, 0.0D, 0.0D);
        } else
        {
            world.spawnParticle("smoke", d, d1, d2, 0.0D, 0.0D, 0.0D);
            world.spawnParticle("flame", d, d1, d2, 0.0D, 0.0D, 0.0D);
        }
    }
    public boolean canPlaceBlockOnSide(World world, int i, int j, int k, int l)
    {
        if(l == 1 && world.isBlockNormalCube(i, j - 1, k))
        {
            return true;
        }
        if(l == 2 && world.isBlockNormalCube(i, j, k + 1))
        {
            return true;
        }
        if(l == 3 && world.isBlockNormalCube(i, j, k - 1))
        {
            return true;
        }
        if(l == 4 && world.isBlockNormalCube(i + 1, j, k))
        {
            return true;
        }
        return l == 5 && world.isBlockNormalCube(i - 1, j, k);
    }
 private boolean func_31032_h(World world, int i, int j, int k)
    {
        return world.isBlockNormalCube(i, j, k) || world.getBlockId(i, j, k) == Block.fence.blockID;
    }

    public boolean canPlaceBlockAt(World world, int i, int j, int k)
    {
        if(world.isBlockNormalCube(i - 1, j, k))
        {
            return true;
        }
        if(world.isBlockNormalCube(i + 1, j, k))
        {
            return true;
        }
        if(world.isBlockNormalCube(i, j, k - 1))
        {
            return true;
        }
        if(world.isBlockNormalCube(i, j, k + 1))
        {
            return true;
        }
        return func_31032_h(world, i, j - 1, k);
    }

    public void onBlockPlaced(World world, int i, int j, int k, int l)
    {
        int i1 = world.getBlockMetadata(i, j, k);
        int j1 = i1 & 8;
        i1 &= 7;
        i1 = -1;
        if(l == 1 && world.isBlockNormalCube(i, j - 1, k))
        {
            i1 = 5 + world.rand.nextInt(2);
        }
        if(l == 2 && world.isBlockNormalCube(i, j, k + 1))
        {
            i1 = 4;
        }
        if(l == 3 && world.isBlockNormalCube(i, j, k - 1))
        {
            i1 = 3;
        }
        if(l == 4 && world.isBlockNormalCube(i + 1, j, k))
        {
            i1 = 2;
        }
        if(l == 5 && world.isBlockNormalCube(i - 1, j, k))
        {
            i1 = 1;
        }
        if(i1 == -1)
        {
            dropBlockAsItem(world, i, j, k, world.getBlockMetadata(i, j, k));
            world.setBlockWithNotify(i, j, k, 0);
            return;
        } else
        {
            world.setBlockMetadataWithNotify(i, j, k, i1 + j1);
            return;
        }
    }

    public void onNeighborBlockChange(World world, int i, int j, int k, int l)
    {
        if(checkIfAttachedToBlock(world, i, j, k))
        {
            int i1 = world.getBlockMetadata(i, j, k) & 7;
            boolean flag = false;
            if(!world.isBlockNormalCube(i - 1, j, k) && i1 == 1)
            {
                flag = true;
            }
            if(!world.isBlockNormalCube(i + 1, j, k) && i1 == 2)
            {
                flag = true;
            }
            if(!world.isBlockNormalCube(i, j, k - 1) && i1 == 3)
            {
                flag = true;
            }
            if(!world.isBlockNormalCube(i, j, k + 1) && i1 == 4)
            {
                flag = true;
            }
            if(!world.isBlockNormalCube(i, j - 1, k) && i1 == 5)
            {
                flag = true;
            }
            if(!world.isBlockNormalCube(i, j - 1, k) && i1 == 6)
            {
                flag = true;
            }
            if(flag)
            {
                dropBlockAsItem(world, i, j, k, world.getBlockMetadata(i, j, k));
                world.setBlockWithNotify(i, j, k, 0);
            }
        }
    }

    private boolean checkIfAttachedToBlock(World world, int i, int j, int k)
    {
        if(!canPlaceBlockAt(world, i, j, k))
        {
            dropBlockAsItem(world, i, j, k, world.getBlockMetadata(i, j, k));
            world.setBlockWithNotify(i, j, k, 0);
            return false;
        } else
        {
            return true;
        }
    }

    public void setBlockBoundsBasedOnState(IBlockAccess iblockaccess, int i, int j, int k)
    {
        int l = iblockaccess.getBlockMetadata(i, j, k) & 7;
        float f = 0.1875F;
        if(l == 1)
        {
            setBlockBounds(0.0F, 0.2F, 0.5F - f, f * 2.0F, 0.8F, 0.5F + f);
        } else
        if(l == 2)
        {
            setBlockBounds(1.0F - f * 2.0F, 0.2F, 0.5F - f, 1.0F, 0.8F, 0.5F + f);
        } else
        if(l == 3)
        {
            setBlockBounds(0.5F - f, 0.2F, 0.0F, 0.5F + f, 0.8F, f * 2.0F);
        } else
        if(l == 4)
        {
            setBlockBounds(0.5F - f, 0.2F, 1.0F - f * 2.0F, 0.5F + f, 0.8F, 1.0F);
        } else
        {
            float f1 = 0.25F;
            setBlockBounds(0.5F - f1, 0.0F, 0.5F - f1, 0.5F + f1, 0.6F, 0.5F + f1);
        }
    }

    public void onBlockClicked(World world, int i, int j, int k, EntityPlayer entityplayer)
    {
        blockActivated(world, i, j, k, entityplayer);
    }

    public boolean blockActivated(World world, int i, int j, int k, EntityPlayer entityplayer)
    {
        if(world.multiplayerWorld)
        {
            return true;
        }
        int l = world.getBlockMetadata(i, j, k);
        int i1 = l & 7;
        int j1 = 8 - (l & 8);
        world.setBlockMetadataWithNotify(i, j, k, i1 + j1);
        world.markBlocksDirty(i, j, k, i, j, k);
        world.playSoundEffect((double)i + 0.5D, (double)j + 0.5D, (double)k + 0.5D, "random.click", 0.3F, j1 <= 0 ? 0.5F : 0.6F);
        world.notifyBlocksOfNeighborChange(i, j, k, blockID);
        if(i1 == 1)
        {
            world.notifyBlocksOfNeighborChange(i - 1, j, k, blockID);
        } else
        if(i1 == 2)
        {
            world.notifyBlocksOfNeighborChange(i + 1, j, k, blockID);
        } else
        if(i1 == 3)
        {
            world.notifyBlocksOfNeighborChange(i, j, k - 1, blockID);
        } else
        if(i1 == 4)
        {
            world.notifyBlocksOfNeighborChange(i, j, k + 1, blockID);
        } else
        {
            world.notifyBlocksOfNeighborChange(i, j - 1, k, blockID);
        }
        return true;
    }

    public void onBlockRemoval(World world, int i, int j, int k)
    {
        int l = world.getBlockMetadata(i, j, k);
        if((l & 8) > 0)
        {
            world.notifyBlocksOfNeighborChange(i, j, k, blockID);
            int i1 = l & 7;
            if(i1 == 1)
            {
                world.notifyBlocksOfNeighborChange(i - 1, j, k, blockID);
            } else
            if(i1 == 2)
            {
                world.notifyBlocksOfNeighborChange(i + 1, j, k, blockID);
            } else
            if(i1 == 3)
            {
                world.notifyBlocksOfNeighborChange(i, j, k - 1, blockID);
            } else
            if(i1 == 4)
            {
                world.notifyBlocksOfNeighborChange(i, j, k + 1, blockID);
            } else
            {
                world.notifyBlocksOfNeighborChange(i, j - 1, k, blockID);
            }
        }
        super.onBlockRemoval(world, i, j, k);
    }

    public boolean isPoweringTo(IBlockAccess iblockaccess, int i, int j, int k, int l)
    {
        return (iblockaccess.getBlockMetadata(i, j, k) & 8) > 0;
    }

    public boolean isIndirectlyPoweringTo(World world, int i, int j, int k, int l)
    {
        int i1 = world.getBlockMetadata(i, j, k);
        if((i1 & 8) == 0)
        {
            return false;
        }
        int j1 = i1 & 7;
        if(j1 == 6 && l == 1)
        {
            return true;
        }
        if(j1 == 5 && l == 1)
        {
            return true;
        }
        if(j1 == 4 && l == 2)
        {
            return true;
        }
        if(j1 == 3 && l == 3)
        {
            return true;
        }
        if(j1 == 2 && l == 4)
        {
            return true;
        }
        return j1 == 1 && l == 5;
    }

    public boolean canProvidePower()
    {
        return true;
    }
}


J'ai raté quoi ?
 
Ah okay merci bien :).

Par contre, j'ai deux autres petites questions :
- Comment faire pour prendre l'icone de l'objet à autre part que dans le fichier terrain.png ?
- Comment faire pour changer le bâton violet qui sert de levier, et mettre la torche ? Parce que là, j'me retrouve avec la base du levier qui est correcte, et un gros baton violet comme torche =').

( Et éventuellement comment mettre la lumière mais j'devrais pas avoir trop de mal à trouver comment faire. )
 
Excusez moi je voulais savoir un ami aimerais faire un craft avec de la dyepowder (en colorant je crois avec la puissance 4) mais comment insérer des puissance dans la recette ?

Edit :
Je voulais vous demander j'ai créé un bloc de sable mouvant mais quand je détruit n'importe quel bloc de la map aucun block ou item ne tombe au sol oO comment résoudre ce problème assez ennuyeux :s

Edit 2 :Quel est le nom du block lapis lazuli ?

BlockLapisLazuli ?
 
Pour créer une recette avec des "puissances" utilise ceci :
ModLoader.AddRecipe(new ItemStack(fertilisantXP, 2), new Object[]
{"A",Character.valueOf('A'), new ItemStack(Item.dyePowder, 1, 4)});
soit(ItemStack(item, nombre, puissance))

Ensuite le bloc de lapis-lazuli est une "puissance" de BlockOre.