Sens de blocs dans les structures



  • Bonjour,
    Ces derniers jours, j'ai commencé à bosser dans la génération de structures. Seulement voilà :
    Pour ajouter des blocs simples à la structure, pas de problème. Mais pour ce qui est des blocs comme les escaliers ou les portes etc …., il faut un code spécial. J'ai longuement cherché, et j'ai trouvé ceci (dans le code des villages, ComponentVillageHouse1, ligne 48) :

    
    int i = this.getMetadataWithOffset(Block.stairsWoodOak.blockID, 3);
    
    

    Mais je ne sais pas me servir de cette fonction et encore moins l'appliquer.
    Pouvez-vous m'aider ?


  • Moddeurs confirmés

    Je supose que tu utilise la méthode .setBlock(…) de world pour le reste de ta structure, et bien cette méthode est surchargée, donc tu peux lui ajouté les arguments Int metadata, int flag pour le metadata, et donc l'orientation des escaliers par exemple.
    Exemple:

    
    world.setBlock(x, y, z, blockID, metadata, flag);
    
    

    Pour le flag:
    0 = rien
    2 = mise à jour de bloc
    Après le reste je ne sais plus



  • D'accord, merci j'essaie
    PS : Par contre quelqu'un connaîtrait une liste où sont répertoriés les flags correspondants à l'orientation ?___Et tant qu'on y est, au lieu de créer un nouveau topic, j'ai une autre question :
    Comment intégrer des objets à l'intérieur d'un coffre généré ?
    J'ai déjà fait la génération aléatoire de l'ItemStack et celle du coffre. Il me manque juste l'intégration des objets au coffre.


  • Moddeurs confirmés

    Pour une génération aléatoire des items tu peux utilisé le système de forge:

    
    world.setBlock(x + 3, y + 1, z + 5, Block.chest.blockID, 5, 2);
    
    TileEntityChest tileentitychest = (TileEntityChest)world.getBlockTileEntity(x + 3, y + 1, z + 5);
    
    if(tileentitychest != null)
    {
    ChestGenHooks info = ChestGenHooks.getInfo(ChestGenHooks.VILLAGE_BLACKSMITH);
    WeightedRandomChestContent.generateChestContents(rand, info.getItems(rand), tileentitychest, info.getCount(rand));
    }
    
    

    Après, pour un item donné:

    
    world.setBlock(x + 3, y + 1, z + 5, Block.chest.blockID, 5, 2);
    
    TileEntityChest tileentitychest = (TileEntityChest)world.getBlockTileEntity(x + 3, y + 1, z + 5);
    tileentitychest.setInventorySlotContents(slot, ItemStack)
    
    


  • C'est la méthode

    
    tileentitychest.setInventorySlotContents(slot, ItemStack)
    
    

    qui permet d'insérer les items ?
    Je suppose que si c'est le cas on peut la répéter plusieurs fois pour mettre plusieurs items dans le coffre ?


  • Moddeurs confirmés

    Oui c'est ça.



  • Ok merci :), Sujet résolu

    EDIT : Ah ben non en fait .
    Quand ma structure se génère, le coffre qui est dedans contient toujours le même item.

    Le code (dans MinerHouse1) :

    
    private ItemStack getLoot(Random rand)
    {
    int loot = rand.nextInt(10);
    int speLootA = rand.nextInt(8);
    int speLootO = rand.nextInt(10);
    int speLootDB = rand.nextInt(5);
    int speLootEB = rand.nextInt(10);
    ItemStack stack = null;
    switch(loot)
    {
    case 0:
    stack = new ItemStack(Item.diamond);
    case 1:
    if(speLootDB == 0)
    {
    stack = new ItemStack(Block.blockDiamond);
    }
    else if(speLootEB == 0)
    {
    stack = new ItemStack(Block.blockEmerald);
    }
    case 2:
    stack = new ItemStack(Item.bread);
    case 3:
    if(speLootA == 0)
    {
    stack = new ItemStack(Basic.copperHelmet);
    }
    else if(speLootA == 1)
    {
    stack = new ItemStack(Basic.copperPlate);
    }
    else if(speLootA == 2)
    {
    stack = new ItemStack(Basic.copperBoots);
    }
    else if(speLootA == 3)
    {
    stack = new ItemStack(Basic.tinHelmet);
    }
    else if(speLootA == 4)
    {
    stack = new ItemStack(Basic.tinPlate);
    }
    else if(speLootA == 5)
    {
    stack = new ItemStack(Basic.tinBoots);
    }
    else if(speLootA == 6)
    {
    stack = new ItemStack(Basic.manganeseHelmet);
    }
    else if(speLootA == 7)
    {
    stack = new ItemStack(Basic.manganesePlate);
    }
    else
    {
    stack = new ItemStack(Basic.manganeseBoots);
    }
    case 4:
    if(speLootO == 0)
    {
    stack = new ItemStack(Basic.copperPickaxe);
    }
    else if(speLootO == 1)
    {
    stack = new ItemStack(Basic.copperShovel);
    }
    else if(speLootO == 2)
    {
    stack = new ItemStack(Basic.copperSword);
    }
    else if(speLootO == 3)
    {
    stack = new ItemStack(Basic.tinPickaxe);
    }
    else if(speLootO == 4)
    {
    stack = new ItemStack(Basic.tinShovel);
    }
    else if(speLootO == 5)
    {
    stack = new ItemStack(Basic.tinSword);
    }
    else if(speLootO == 6)
    {
    stack = new ItemStack(Basic.manganesePickaxe);
    }
    else if(speLootO == 7)
    {
    stack = new ItemStack(Basic.manganeseAxe);
    }
    else if(speLootO == 8)
    {
    stack = new ItemStack(Basic.manganeseSword);
    }
    else if(speLootO == 9)
    {
    stack = new ItemStack(Item.pickaxeDiamond);
    }
    else if(speLootO == 10)
    {
    stack = new ItemStack(Item.pickaxeIron);
    }
    case 5:
    stack = new ItemStack(Item.emerald);
    case 6:
    stack = new ItemStack(Basic.manganeseIngot);
    case 7:
    stack = new ItemStack(Basic.copperIngot);
    case 8:
    stack = new ItemStack(Basic.tinIngot);
    case 9:
    stack = new ItemStack(Block.blockGold);
    case 10:
    // Nothing
    }
    return stack;
    }
    
    // Chest Content
    TileEntityChest tileentitychest = (TileEntityChest)world.getBlockTileEntity(x + 2, y + 1, z + 2);
    tileentitychest.setInventorySlotContents(2, this.getLoot(rand));
    tileentitychest.setInventorySlotContents(7, this.getLoot(rand));
    tileentitychest.setInventorySlotContents(13, this.getLoot(rand));
    tileentitychest.setInventorySlotContents(19, this.getLoot(rand));
    tileentitychest.setInventorySlotContents(23, this.getLoot(rand));
    
    


  • Up
    De l'aide svp 😞


  • Moddeurs confirmés Rédacteurs Administrateurs

    Il contient quel item précisément ?



  • C'est choisi aléatoirement avec le switch de getLoot()
    Après c'est inséré dans le coffre (vide au départ)


  • Moddeurs confirmés Rédacteurs Administrateurs

    @'MrBlockTNT':

    le coffre qui est dedans contient toujours le même item.

    J'aimerai savoir quel est l'item qui se génère toujours afin de comprendre pourquoi le random ne fonctionne pas.



  • Le bloc d'or
    J'en profite pour dire que (je viens de m'en rendre compte, car je viens de l'ajouter) la porte est bugguée :
    :::

    :::
    Code :

    
    world.setBlock(x + 4, y + 1, z + 2, Block.doorWood.blockID, 0, 4);
    world.setBlock(x + 4, y + 2, z + 2, Block.doorWood.blockID, 0, 4);
    
    

  • Moddeurs confirmés Rédacteurs Administrateurs

    J'ai compris ton problème. Il faut que tu break, car actuellement il lit toutes les cases sans s'arrêter :

    private ItemStack getLoot(Random rand)
    {
    int loot = rand.nextInt(10);
    int speLootA = rand.nextInt(8);
    int speLootO = rand.nextInt(10);
    int speLootDB = rand.nextInt(5);
    int speLootEB = rand.nextInt(10);
    ItemStack stack = null;
    switch(loot)
    {
    case 0:
    stack = new ItemStack(Item.diamond);
    break;
    case 1:
    if(speLootDB == 0)
    {
    stack = new ItemStack(Block.blockDiamond);
    }
    else if(speLootEB == 0)
    {
    stack = new ItemStack(Block.blockEmerald);
    }
    break;
    case 2:
    stack = new ItemStack(Item.bread);
    break;
    case 3:
    if(speLootA == 0)
    {
    stack = new ItemStack(Basic.copperHelmet);
    }
    else if(speLootA == 1)
    {
    stack = new ItemStack(Basic.copperPlate);
    }
    else if(speLootA == 2)
    {
    stack = new ItemStack(Basic.copperBoots);
    }
    else if(speLootA == 3)
    {
    stack = new ItemStack(Basic.tinHelmet);
    }
    else if(speLootA == 4)
    {
    stack = new ItemStack(Basic.tinPlate);
    }
    else if(speLootA == 5)
    {
    stack = new ItemStack(Basic.tinBoots);
    }
    else if(speLootA == 6)
    {
    stack = new ItemStack(Basic.manganeseHelmet);
    }
    else if(speLootA == 7)
    {
    stack = new ItemStack(Basic.manganesePlate);
    }
    else
    {
    stack = new ItemStack(Basic.manganeseBoots);
    }
    break;
    case 4:
    […]
    

    Et pour la porte, je sais pas, essaye avec un autre métadata pour le bloc du haut.



  • Ah oui, merci j'avais complètement oublié ^^'
    Sinon je peux avoir de l'aide pour la porte ?

    EDIT : D'accord j'essaie merci (pour la porte)

    DOUBLE EDIT : J'ai essayé avec d'autres metadata, rien ne marche 😞



  • De l'aide Svp 😞



  • Regarde dans la génération des villages pour la porte(?)



  • @utybo
    J'ai déjà regardé, c'était dit au début.

    Après avoir longuement cherché, je n'ai rien trouvé, et j'ai même fini par réussir à empêcher la génération de mes structures (comment ?)


Log in to reply