25 juil. 2013, 10:51

Salut,

Voila je me sent plus a l’aise avec le “modding” et java en general.

Aussi en tant que développeur il y a une chose qui me chiffonne dans ton code. c’est la répétition des lignes de code . Aussi je propose un code alternatif qui apporte deux chose:

  • une classe unique pour tout les block
  • toute les variables sont initialisé dans la classe principal du mod

Voici la classe MyBlock pour tout les block

public class MyBlock extends Block
{
    private String dossierResource = null;
    public String[] type; // Important "type" n'est plus static.
    private Icon[] IconArray;

    public MyBlock(String pNom, int pId, Material pMaterial, float pDureté, float pRésistance, StepSound Son, String pDossierResource, String[] pType)
    {
        super(pId, pMaterial);
        this.dossierResource = pDossierResource;
        this.setCreativeTab(CreativeTabs.tabBlock);
        this.setHardness(pDureté).setResistance(pRésistance).setStepSound(Son).setUnlocalizedName(pNom);
        this.type = pType;
    }

    public void registerIcons(IconRegister iconregister)
    {
        IconArray = new Icon[type.length];
        for(int i = 0; i < type.length; i++)
        {
            IconArray[i] = iconregister.registerIcon(dossierResource.toLowerCase() + ":" + type[i]);
        }
    }

    @SideOnly(Side.CLIENT)
    public void getSubBlocks(int id, CreativeTabs creativeTabs, List list)
    {
        for(int metadata = 0; metadata < type.length; metadata++)
        {
            list.add(new ItemStack(id, 1, metadata));
        }
    }

    @SideOnly(Side.CLIENT)
    public Icon getIcon(int side, int metadata)
    {
        if(metadata < type.length && metadata >= 0)
            return IconArray[metadata];
        else
            return IconArray[0];
    }

}

Pour les classe ItemBlock, remplacer:

    public String getUnlocalizedName(ItemStack stack)
    {
        int metadata = stack.getItemDamage();
        if(metadata > BlockTutorialMetadata.type.length || metadata < 0)
        {
            metadata = 0;
        }
        return super.getUnlocalizedName() + "." + BlockTutorialMetadata.type[metadata];
    }

par :

    public String getUnlocalizedName(ItemStack stack)
    {
        int metadata = stack.getItemDamage();
        if(metadata > BlockTutorialMetadata.type.length || metadata < 0)
        {
            metadata = 0;
        }
        return super.getUnlocalizedName() + "." + ModTutoriel.type[metadata];
    }

En faite je deplace le tableau “Type” dans la classe du mod

voici la classe du mod

public class ModTutoriel
{
[…]

public static String[] typeBlock = new String[]{"block1", "block2", "block3", "block4", "block5", "block6", "block7", "block8"};

//Blocks
public static Block UlPierre;

[…]

@EventHandler
public void PreInit(FMLPreInitializationEvent event)
// place des configurations et achievements, compléter et enregistrer nos blocs et items.
{
//Configuration

//Son

//Onglet créative

//Blocks
TutorialMetadata= new MyBlock("TutorialMetadata", 2001,Material.rock,2.0F,10.0F,Block.soundStoneFootstep,"ModTutoriel","alMetadata",typeBlock );

//Enregistrement des blocs - Blocks registry
GameRegistry.registerBlock(TutorialMetadata, ItemBlockTutorialMetadata.class, "TutorialMetadata", "ModTutoriel");;

[…]

On pourrait pousser le vis en faisant une seul classe pour les block simples et les block metadata en détectant si le tableau “Type” est null ou vide par exemple

J’avais penser faire la même chose avec les classe “ItemBlock” mais c’est un tit peut plus difficile puisque apparemment elles sont instancier a la volé .

voila voila voila , je sais pas si ca va être utile mais je suis plutôt contant de moi 😛

ps: j’espere pas avoir fait d’erreur en transposant mon code avec les nom des variables et classes du tuto d’origine.