Les metadata de bloc
-
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 UlBlock(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* = iconregister.registerIcon(dossierResource.toLowerCase()+":" + type*); } } @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]; } }Voici les classe ItemBlock
Remplacerpublic String getUnlocalizedName(ItemStack stack) { int metadata = stack.getItemDamage(); if(metadata > UlMetal.type.length || metadata < 0) { metadata = 0; } return super.getUnlocalizedName() + "." + UlMetal.type[metadata]; }public class ModTutoriel { […] public static String[] typePierre = 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 TutorialMetadata("TutorialMetadata", 2001,Material.rock,2.0F,10.0F,Block.soundStoneFootstep,"ModTutoriel","alMetadata",typePierre); //Enregistrement des blocs - Blocks registry GameRegistry.registerBlock(TutorialMetadata, UlItemMetadata.class, "UlItemMetadata", "ModTutoriel");; //Items //Enregistrement des Items - Items registry //Achievements } @EventHandler public void Init(FMLInitializationEvent event) //enregistrement des tileEntity, des Entity, des rendu, etc { /////////////////////////////////////////////////////////////////////////////// //Registry //Mobs //Render proxy.registerRender(); //NetWork //Recipe //GameRegistry.addRecipe(new ItemStack(BlockTutorial), new Object[]{"XXX", "ZYZ", "XXX", 'X', Block.blockLapis, 'Y', new ItemStack(Item.dyePowder, 1, 15), 'Z', new ItemStack(Item.dyePowder, 1, 6)}); //GameRegistry.addRecipe(new ItemStack(UlPierre, 4, 2), new Object[]{"XXX", "XXX", " ", 'X', Block.stone}); //GameRegistry.addRecipe(new ItemStack(UlSable, 4, 1), new Object[]{"XXX", "XXX", 'X', Block.dirt}); for(int i = 0; i < 16; i++) { GameRegistry.addShapelessRecipe(new ItemStack(UlPierre, 1, i), new Object[]{ Block.stone, new ItemStack(UlColorant, 1, i)}); GameRegistry.addShapelessRecipe(new ItemStack(UlMetal, 1, i), new Object[]{ Block.blockIron , new ItemStack(UlColorant, 1, i)}); GameRegistry.addShapelessRecipe(new ItemStack(UlSable, 1, i), new Object[]{ Block.sand , new ItemStack(UlColorant, 1, i)}); GameRegistry.addShapelessRecipe(new ItemStack(UlVerre, 1, i), new Object[]{ Block.glass , new ItemStack(UlColorant, 1, i)}); } } @EventHandler public void PostInit(FMLPostInitializationEvent event) //enregistrements de langages ou de recettes { //Intégration avec les autres mods } -
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.
-
J’ai mis des code_java pour une meilleur lisibilité (il faudrait que je vois avec Woryk pour les améliorer encore aussi, barre défilante sur le codé et éviter les déformations avec les codes trop long)
Par contre tu as dû te fail avec l’ItemBlock, car je ne vois pas de différence (et du fait que type n’est plus static il me semble que ça peut pas marcher avec le code actuelle)
Ton code pourra être utile pour de nombreuse personne, je le laisse donc. En revanche, je préfère avoir une classe par bloc pour les autres fonctions que nous verrons plus tard pour rendre le bloc plus complexe.
-
ulysse je comprend tout à fait ton point de vue mais je pense que si les développeurs de Mojang ont choisi de faire une classe/bloc c’est pas pour rien. Ce ne sont pourtant pas des débutants en programmation.
Je ne comprend pas pourquoi moi non plus mais il doit bien y avoir une raison
-
Je ne comprend pas pourquoi moi non plus mais il doit bien y avoir une raison
Sans doute s’ils veulent faire une modification sur un bloc qui nécessite un changement de l’extension
-
Peut être… Ou alors pour mieux s’y retrouver, je sais pas.
-
@‘robin4002’:
J’ai mis des code_java pour une meilleur lisibilité (il faudrait que je vois avec Woryk pour les améliorer encore aussi, barre défilante sur le codé et éviter les déformations avec les codes trop long)
Tu parle de balises pour écrire le code dans les post ?
@‘robin4002’:
Par contre tu as dû te fail avec l’ItemBlock, car je ne vois pas de différence (et du fait que type n’est plus static il me semble que ça peut pas marcher avec le code actuelle)
effectivement c’est pas TutorialMetedata (la classe du block) mais ModTutoriel ( classe du mod ) . J’ai rectifier dans le post . Et apparemment ca marche chez moi aussi non je ne me serait pas permis d’avoir publié ce code.
Pas évident de faire un post comme ca , je suis encore loin de pouvoir rédiger des tutu comme toi , mais ca viendra .
-
Oui les balises dans le postes.
Et pour le code, comme ça oui ça fonctionne, mais sans la avant que tu rectifie la modification de l’ItemBlock ça pouvait pas fonctionner -
@‘EclipseOnFire’:
ulysse je comprend tout à fait ton point de vue mais je pense que si les développeurs de Mojang ont choisi de faire une classe/bloc c’est pas pour rien. Ce ne sont pourtant pas des débutants en programmation.
Je ne comprend pas pourquoi moi non plus mais il doit bien y avoir une raison
Non mais la se sont des classes qui sont écrites par nous même il n’est pas question de changer la classe Block de Majong.
-
Petity fail:
Majong
c’est un jeu, c’est pas la même chose que Mojang
-
oups fourchage de doigts

-
Non je ne parle pas de modifier. Je parle de suivre l’exemple initial. Je voulais dire que si les développeurs de Mojang ont décidé de faire un bloc/classe c’est pour une bonne raison, et je pense que l’on devrait suivre cette démarche
(Attention, je ne dis pas que ton code est nul/mauvais/inutile !) -
Quelque questions … Comment on ajoute des propriété a nos blocs dans les metadata ?
du genre :
public int quantityDropped(Random par1Random) { return 0; } public int getRenderBlockPass() { return 0; } public boolean isOpaqueCube() { return false; } public boolean renderAsNormalBlock() { return false; }Ou tout les propriété lister ici : Customiser votre bloc ?
Merci de vos réponse !
-
Les fontions qui n’ont pas “int metadata”, “World world, int x, int y, int z” ou “BlockAccess blockaccess, int x, int y, int z” ne peuvent pas être utilisées en metadata.
Pour le drop:public ArrayList <itemstack>getBlockDropped(World world, int x, int y, int z, int metadata, int fortune) { ArrayList <itemstack>ret = new ArrayList<itemstack>(); int count = quantityDropped(metadata, fortune, world.rand); for(int i = 0; i < count; i++) { int id = idDropped(metadata, world.rand, fortune); if (id > 0) { ret.add(new ItemStack(id, 1, damageDropped(metadata))); } } return ret; }Pour le rendu, c’est dans la classe du render qu’il faut check le metadata et faire la différence.</itemstack></itemstack></itemstack>
-
Donc du coups si ma texture de bloc est transparente je fais comment ?
et si on veut faire la forme d’un bloc déjà existant on fait comment parce que la je comprend pas trop…
public int getRenderType()
{
return 32;
}tout ça dans les metadata bien sur ! Merci encore !
-
Les fonctions qui n’ont pas metadata en paramètre (ou world, x, y, z ou iblockaccess, x, y, z) sont appliquer à tout les metadata.
Si tu veux un rendu différent, il faut utiliser un autre id, ou alors faire un rendu custom et dans le rendu tu appliques le rendu en fonction du metadata (cf rendu complexe de bloc via ISBRH). -
Les fonctions qui n’ont pas metadata en paramètre (ou world, x, y, z ou iblockaccess, x, y, z) sont appliquer à tout les metadata.
Sa veux dire que ça s’est déjà dans les metadatas ?
public int quantityDropped(Random par1Random) { return 0; } public int getRenderBlockPass() { return 0; } public boolean isOpaqueCube() { return false; }Alors pour quoi mes vitres son pas transparentes… ??
package mods.block; import java.util.ArrayList; import java.util.List; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.ItemStack; import net.minecraft.util.Icon; import net.minecraft.world.World; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class BlockVitreColorer extends Block{ public BlockVitreColorer(int id, Material Materials) { super(id, Materials); this.setCreativeTab(CreativeTabs.tabDecorations); } public static String[] type = new String[]{"Glass-White", "Glass-Orange", "Glass-Magenta", "Glass-LightBlue", "Glass-Yellow", "Glass-Lime", "Glass-Pink", "Glass-Gray","Glass-LightGrey","Glass-Cyan","Glass-Purple","Glass-Blue","Glass-Brown","Glass-Green","Glass-Red","Glass-Black"}; private Icon[] IconArray; public void registerIcons(IconRegister iconregister) { IconArray = new Icon[type.length]; for(int i = 0; i < type.length; i++) { IconArray* = iconregister.registerIcon("mods:" + type*); } } @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) { return metadata < type.length && metadata >= 0 ? IconArray[metadata] : IconArray[0]; } public ArrayList <itemstack>getBlockDropped(World world, int x, int y, int z, int metadata, int fortune) { ArrayList <itemstack>ret = new ArrayList<itemstack>(); int count = quantityDropped(metadata, fortune, world.rand); for(int i = 0; i < count; i++) { int id = idDropped(metadata, world.rand, fortune); if (id > 0) { ret.add(new ItemStack(id, 0, damageDropped(metadata))); } } return ret; } }J’ai repris les textures de la 1.7 donc il son belle et bien transparente !
dsl mais j’arrive vraiment pas a comprendre…Merci</itemstack></itemstack></itemstack> -
Remplace l’extends Block par extends BlockGlass
Le constructeur sera comme ça :public BlockVitreColorer(int id, Material Materials, boolean b) { super(id, Materials, b); this.setCreativeTab(CreativeTabs.tabDecorations); }Dans ta classe principale, remplace le new BlockVitreColorer(id, Material.glass) par new BlockVitreColorer(id, Material.glass, false)
Normalement ça devrait être bon. -
Je suis dsl… mais ça fonctionne pas
mes vitre son toujours opaqued’âpres moi le soucie vien d’ici quand on déclare les texture non ?
avec le iconregister?
public static String[] type = new String[]{"Glass-White", "Glass-Orange", "Glass-Magenta", "Glass-LightBlue", "Glass-Yellow", "Glass-Lime", "Glass-Pink", "Glass-Gray","Glass-LightGrey","Glass-Cyan","Glass-Purple","Glass-Blue","Glass-Brown","Glass-Green","Glass-Red","Glass-Black"}; private Icon[] IconArray; public void registerIcons(IconRegister iconregister) { IconArray = new Icon[type.length]; for(int i = 0; i < type.length; i++) { IconArray* = iconregister.registerIcon("mods:" + type*); } } -
Du coup, soit tes textures ne sont pas transparentes, soit y’a un gros problème…
