Résolu Besoin d'aide pour 'Anti-BoneMeal'
-
Bonjour, je me présente, Eryah. Je m’attaque à un truc que j’ai toujours espérer arriver dans les changelogs de minecraft : Le désherbant. Eh bah oui, c’est vraiment énervant d’avoir trouvé une superbe place pour construire, mais de devoir détruire à la main/Avec des seau d’eau toute l’herbe ! Pour luter contre ceci, je vais tenter de créer l’inverse de la bonemeal :
- Fera disparaître l’herbe et les fleurs
Wuah sa fait beaucoup de condition à remplir ^^’ Mais je sens que cela va m’être extrêmement complexe
J’ai tenté également d’etudier le code de la bonemeal, mais la… Je comprend rien. Quelqu’un pourrait m’expliquer ? ^^’
else { EnumDyeColor enumdyecolor = EnumDyeColor.byDyeDamage(stack.getMetadata()); if (enumdyecolor == EnumDyeColor.WHITE) { if (applyBonemeal(stack, worldIn, pos, playerIn)) { if (!worldIn.isRemote) { worldIn.playAuxSFX(2005, pos, 0); } return true; } }
public static boolean applyBonemeal(ItemStack stack, World worldIn, BlockPos target) { if (worldIn instanceof net.minecraft.world.WorldServer) return applyBonemeal(stack, worldIn, target, net.minecraftforge.common.util.FakePlayerFactory.getMinecraft((net.minecraft.world.WorldServer)worldIn)); return false; }
public static boolean applyBonemeal(ItemStack stack, World worldIn, BlockPos target, EntityPlayer player) { IBlockState iblockstate = worldIn.getBlockState(target); int hook = net.minecraftforge.event.ForgeEventFactory.onApplyBonemeal(player, worldIn, target, iblockstate, stack); if (hook != 0) return hook > 0; if (iblockstate.getBlock() instanceof IGrowable) { IGrowable igrowable = (IGrowable)iblockstate.getBlock(); if (igrowable.canGrow(worldIn, target, iblockstate, worldIn.isRemote)) { if (!worldIn.isRemote) { if (igrowable.canUseBonemeal(worldIn, worldIn.rand, target, iblockstate)) { igrowable.grow(worldIn, worldIn.rand, target, iblockstate); } --stack.stackSize; } return true; } } return false; }
@SideOnly(Side.CLIENT) public static void spawnBonemealParticles(World worldIn, BlockPos pos, int amount) { if (amount == 0) { amount = 15; } Block block = worldIn.getBlockState(pos).getBlock(); if (block.isAir(worldIn, pos)) { block.setBlockBoundsBasedOnState(worldIn, pos); for (int j = 0; j < amount; ++j) { double d0 = itemRand.nextGaussian() * 0.02D; double d1 = itemRand.nextGaussian() * 0.02D; double d2 = itemRand.nextGaussian() * 0.02D; worldIn.spawnParticle(EnumParticleTypes.VILLAGER_HAPPY, (double)((float)pos.getX() + itemRand.nextFloat()), (double)pos.getY() + (double)itemRand.nextFloat() * block.getBlockBoundsMaxY(), (double)((float)pos.getZ() + itemRand.nextFloat()), d0, d1, d2, new int[0]); } } else { for (int i1 = 0; i1 < amount; ++i1) { double d0 = itemRand.nextGaussian() * 0.02D; double d1 = itemRand.nextGaussian() * 0.02D; double d2 = itemRand.nextGaussian() * 0.02D; worldIn.spawnParticle(EnumParticleTypes.VILLAGER_HAPPY, (double)((float)pos.getX() + itemRand.nextFloat()), (double)pos.getY() + (double)itemRand.nextFloat() * 1.0f, (double)((float)pos.getZ() + itemRand.nextFloat()), d0, d1, d2, new int[0]); } } }
J’ai mis toute les méthodes en rapport avec la bonemeal
-
Un moyen simple : la méthode onItemUseFirst dans laquelle tu regardes si le block clické est de l’hebre ou même extends BlockCrops et tu fait world.setBlockToAir.
-
Oui, mais je voudrais que cela ait un rayon égale ou réduit à la bone meal. J’ai prévu que pour le craft, sa soit 2 Chair Putréfié. Sa fait cher le désherbant, mais en plus, on peut faire la même chose à la main…
-
Si tu veux aller plus loin que le block cliqué, il va falloir faire un algorithme et c’est à toi de le faire tout seul. La bonemeal de minecraft utilise une instance d’un Random pour faire çà, ce que tu ne peux pas faire dans ton cas.
-
Ah…
Et si je ne sais pas faire d’algorithme ? Je suis dans le caca ? -
Je t’e conseille le floodfill.
-
Ehh… Je vais surement me faire engeuler, mais…
Qu’est-ce qu’un floodfill ?? -
-
Tu n’as pas du tout besoin de faire là même chose que la bone meal.
Tu as juste à mettre 2 ou 3 boucles for (x, z ou x, y et z) dans la fonction onItemUse et si les blocs aux coordonnées x, y, z sont des plantes tu mets de l’air.
-
J’ai déjà cherché cela, mais sous une autre recherche, car je n’aime aps quand je cherche du code, sans que cela ait un rapport avec MC
Je cherche donc directement des tutos sur MinecraftForge.com, ou en rapport avec MC
J’ai cherché : Forge 1.8 FloodFill est j’ai rien trouvé. Je vais essayer de comprend tous cela
J’ai balayer le topic… J’ai RIEN compris !
Je vais essayer le méthode de robin, même si je n’ai jamais fais de boucle, j’ai une légère connaisanse sur ComputerCraft, espèrons que les boucles, se soit le même système -
floodfill est un algorithme qui n’a aucun rapport avec forge, le lien que je t’ai donné devrait LARGEMENT t’aider, je ne donne pas tout sur demande, cherche pas toi même.
-
Petite question
Peut-on dessiner une forme sans algorithme etc…
J’aimerai simplement un cercle de 2 de rayon genreOOOOOOO O=Gazon
OOO OOO M = Origine
OO OO
O M O
OO OO
OOO OOO
OOOOOOOExcusez moi ce schéma dégoulasse
-
Soit tu fait block par block ce qui est très stupide et fastidieux ou tu peux faire une boucle / algorithme.
-
Ah
j’aurais imaginer une ligne du genre
GetShape(ShapeCircle circle, r=2)J’ai regarder un peu les boucles http://openclassrooms.com/courses/apprenez-a-programmer-en-java/les-boucles-2
Et la, beaucoup de question :- J’utilise une boucle while ?
- Do While ?
- For ?
Je vois donc rapidement que j’ai besoin d’une boucle while
Mais la…- Quel est la condition ?
- Comment localiser des blocs ?
-
Moi j’aurais utilisé 3 boucles for (une pour chaque axe), un comme çà :
for (int i = -1; i < 3; i++) { for (int j = -3; j <= 3; j++) { for (int k = -3; k <= 3; k++) { if (world.getBlock(x + j, y + i, z + k) instanceof BlockBush) world.setBlockToAir(x + j, y + i, z + k); } } }
Ce code marche théoriquement en 1.7, à toi de trouver le reste.
-
Erreurs
for (int i = -1; i < 3; i++) { for (int j = -3; j <= 3; j++) { for (int k = -3; k <= 3; k++) { if (worldIn.*getBlock*(x + j, y + i, z + k) instanceof BlockBush) worldIn.*setBlockToAir*(x + j, y + i, z + k); } } }
J’ai essayer de remplacer getBlock par getBlockStates, en vain
The method getBlock(float, float, float) is undefined for the type World
The method setBlockToAir(BlockPos) in the type World is not applicable for the arguments (float, float, -
@‘SCAREX’:
Ce code marche théoriquement en 1.7, à toi de trouver le reste.
-
Tout comme le briquet activateur de redstone, je le désenregistre. Je le reprendrais plus tard.
Cet item me semble beaucoup plus compliqué, car nécessitant des boucles for, ou des algorithmes