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 ? -
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. -
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 ? -
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 -
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) -
@‘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);
-
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 ?)