[Aide] Utilisation de la laine/colorant pour un mod

Sasuke5900

Architecte en herbe
22 Juillet 2011
82
0
103
Bonjour,

je me lance dans l'aventure de la création de mods. J'ai suivi des tutos, j'ai réussi à faire quelques trucs de sympa et aujourd'hui, je veux m'attaquer à un nouveau bloc.

Cependant, et après une recherche bredouille, je me tourne vers ce support :
Je souhaite utiliser la laine blanche et coloré pour mes crafts, mais je bloc ( :D ) au niveau du code source.

Par exemple, je veux un craft du style :
craftlaine.png


Comment ça se traduit dans la création de la recette ?
(A la place de Block.LaineBleu, Block.LaineBlanche, etc ....)
Code:
  private void addRecipes() {
    ModLoader.AddRecipe(new ItemStack(MON_BLOC, 1), new Object[] {" B ", "WYR", " G " ,
        Character.valueOf('B'), Block.LaineBleu, 
        Character.valueOf('W'), Block.LaineBlanche,
        Character.valueOf('Y'), Block.LaineJaune,
        Character.valueOf('R'), Block.LaineRed,
        Character.valueOf('G'), Block.LaineVerte});
  }

Merci d'avance :)
Sasuke5900
 
Utilise les ItemStacks ;)

Code:
private void addRecipes()
{
 ModLoader.AddRecipe(new ItemStack(MON_BLOC, 1), new Object[] {" B ", "WYR", " G " ,
 Character.valueOf('B'), new ItemStack(Block.cloth, 1, 11), 
 Character.valueOf('W'), new ItemStack(Block.cloth, 1, 0),
 Character.valueOf('Y'), new ItemStack(Block.cloth, 1, 4),
 Character.valueOf('R'), new ItemStack(Block.cloth, 1, 14),
 Character.valueOf('G'), new ItemStack(Block.cloth, 1, 13)});
}


La premier argument est le block/l'item, le deuxième le nombre ( ici, on peut mettre n'importe quel nom bre ça ne change rien ), et le troisième la metadata, ou le sous-id.
 
Et pour appliquer une ID identique et un data différent (le même principe que la laine) pour créer des nouveaux blocs ?

C'est possible ça ? :
Code:
public class MON_BLOC extends Block {
 
    private int contour;
    private int autre;
 
    public MON_BLOC(int id, int data) {
        super(id, data, Material.wood);
        contour = ModLoader.addOverride("/terrain.png", "/contour.png");
        autre = ModLoader.addOverride("/terrain.png", "/autre.png");
    }
   
    public int idDropped(int i, Random random) {
        return blockID;
    }
 
    public int getBlockTextureFromSide(int i) {
        if(i == 0 || i == 1) {
            return autre;
        }
        return contour;
    }
}
Modifs :
public MON_BLOC(int id, int data) {
super(id, data, Material.wood);
......




Code:
public class mod_MON_MOD extends BaseMod {
 
  public static Block MON_BLOC;
 
  public mod_MON_MOD() {
    ModLoader.SetInGameHook(this, true, false);
    MON_BLOC = (new  MON_BLOC (200, 1)).setHardness(2.0F).setResistance(2F).setStepSound(Block.soundStoneFootstep).setBlockName("mon_bloc");
    ModLoader.RegisterBlock(MON_BLOC);
    ModLoader.AddName(MON_BLOC, "Mon Bloc");
    addRecipes();
  }
 
 
private void addRecipes(){
    ModLoader.AddRecipe(new ItemStack(MON_BLOC, 1, 1), new Object[] {" B ", "WYR", " G " ,
    Character.valueOf('B'), new ItemStack(Block.cloth, 1, 11),
    Character.valueOf('W'), new ItemStack(Block.cloth, 1, 0),
    Character.valueOf('Y'), new ItemStack(Block.cloth, 1, 4),
    Character.valueOf('R'), new ItemStack(Block.cloth, 1, 14),
    Character.valueOf('G'), new ItemStack(Block.cloth, 1, 13)});
}
 
 
  public String getVersion() {
    return "1.1.0";
  }
 
  public void load(){  }
 
}


Modifs :
MON_BLOC = (new MON_BLOC (200, 1)).setHardness(2.0F).......

ModLoader.AddRecipe(new ItemStack(MON_BLOC, 1, 1), new Object[]......
 
Tu veux dire, créer un block avec des sous-ids ?
Je le fais tout le temps, ça peut avoir plusieurs avantage :
- créer différents états pour un block
- empêcher le joueur d'avoir le block avec TMI ou en Creative
- mais surtout, économiser des ids ;)

Je n'ai pas les sources sous les yeux, mais tu as compris le truc ^^ : on peut bien créer des recettes de metadatas.
Mais la création du sous-block ne marche pas comme ça...
Tout se stocke sur une seul variable, c'est quand le jeu va récupérer les informations ( nom, texture) qu'on va changer le résultat en fonction de la metadata.

Pour retourner une texture en fonction de la metadata du block :

public int getBlockTextureFromSideAndMetadata(int side, int metadata)
{
if(metadata == 0)​
{​
return texture1;​
}​
return texture;​
}

Et pour des noms différents, c'est quelque chose du genre :

public String getBlockName(int metadata)
{
if(metadata == 1)​
{​
return "Block spécial : metadata de 1 !";​
}​
return "Block normal";​
}

On peut faire encore mieux, c'est à dire stocker des informations uniques à chaque block du monde grâce aux TileEntities.
Mais bon, c'est un peu plus compliqué et les metadatas sont plus simples...

Par contre, attention ! chaque block ne peut stocker que 4 bits d'informations contenant la metadata, c'est à dire 16 possibilités différentes ( tiens c'est bizarre pile le nombre de laines différentes ^^ )

C'est du java, pas du Basic, évite de mettre les noms de variables en majuscules, respecte au maximum la convention ;)
- nom d'une variable en minuscule
- nom d'une classe commence par une majuscule
 
Tout se stocke sur une seul variable, c'est quand le jeu va récupérer les informations ( nom, texture) qu'on va changer le résultat en fonction de la metadata.
Ouep, j'ai repris le code de mon premier mod test, j'ai pas penser à changer la fonction du nom et de la texture.

Par contre, attention ! chaque block ne peut stocker que 4 bits d'informations contenant la metadata, c'est à dire 16 possibilités différentes ( tiens c'est bizarre pile le nombre de laines différentes ^^ )
Parfait, j'aurai autant de blocs persos que de blocs de laine.

C'est du java, pas du Basic, évite de mettre les noms de variables en majuscules, respecte au maximum la convention ;)
- nom d'une variable en minuscule
- nom d'une classe commence par une majuscule
Ouep, si j'ai mis des majuscules partout, c'est pour faire un cas "général" (avec juste les variables à remplacer), et pour une meilleure lisibilité quant à mon problème ;)

En tout cas, merci de tes réponses, j'vais aller tester ça dans la soirée.

Sasuke5900
 
Re,

Voilà, je me suis attaquer à ce mod (dans le but de ma formation sur les blocs à métadata) et j'ai 2 erreurs et 1 warning dont je ne comprend pas le sens :
erreurjava.png


Pour la warning, j'ai repris la même synthaxe que le mod précédent, j'ai même testé avec :
setStepSound(Block.soundClothFootstep) -> C'est le son que j'aimerai, j'ai testé après avec Stone et j'ai screen.

Sasuke5900
 
Vraiment galère ce système de métadata.
Code:
  public Mod_Tapis() {
    ModLoader.SetInGameHook(this, true, false);
 
    tblanc = (new  BlockTapis(205, 0)).setHardness(2.0F).setResistance(10F).setStepSound(Block.soundStoneFootstep).setBlockName("tapis_blanc");
    ModLoader.RegisterBlock(tblanc);
    ModLoader.AddName(tblanc, "Tapis blanc");
 
    tnoir = (new  BlockTapis(205, 1)).setHardness(2.0F).setResistance(2F).setStepSound(Block.soundStoneFootstep).setBlockName("tapis_noir");
    ModLoader.RegisterBlock(tnoir);
    ModLoader.AddName(tnoir, "Tapis noir");
 
    addRecipes();
  }
 
  private void addRecipes(){
    ModLoader.AddRecipe(new ItemStack(tblanc, 1), new Object[] {"W", "P" ,
    Character.valueOf('W'), new ItemStack(Block.cloth, 1, 0),
    Character.valueOf('P'), Block.planks});
 
    ModLoader.AddRecipe(new ItemStack(tnoir, 1), new Object[] {"B", "P" ,
    Character.valueOf('B'), new ItemStack(Block.cloth, 1, 15),
    Character.valueOf('P'), Block.planks});
  }

T'es d'accord que normalement, je doit pouvoir crafter mes deux nouvaux blocs avec :
tblanc.png

créé mon bloc tblanc, d'ID 205:0

et
tnoir..png

créé mon bloc tblanc, d'ID 205:1

J'ai plus d'erreur ni de warning de compilation, mais impossible de craft mes blocs en jeu.

Sasuke5900
 
Ce n'est pas comme ça qu'on utilise les metadatas....
C'est sur un seul et même block.

Sinon, le seul problème est que le code doit contenir 3 caractères par ligne, donc ceci :

Code:
 private void addRecipes(){
    ModLoader.AddRecipe(new ItemStack(tblanc, 1), new Object[] {" W ", " P " ,
    Character.valueOf('W'), new ItemStack(Block.cloth, 1, 0),
    Character.valueOf('P'), Block.planks});

    ModLoader.AddRecipe(new ItemStack(tnoir, 1), new Object[] {" B ", " P " ,
    Character.valueOf('B'), new ItemStack(Block.cloth, 1, 15),
    Character.valueOf('P'), Block.planks});
  }