Résolu Problème onBlockDestroyed
-
Bonjour, je suis actuellement en train de faire une hache pouvant détruire le bois d’un arbre entier et j’ai réussi à faire disparaître le bois à la verticale, le remplacer par de l’air et faire apparaître l’ItemStack correspondant mais je n’arrive pas à faire la même chose à l’horizontale.
Classe de l’item :
package net.mobject.common.item.tool; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemAxe; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.mobject.common.entity.EntityVoleur; public class ItemGemmeAxe extends ItemAxe { public ItemGemmeAxe(ToolMaterial p_i45327_1_) { super(p_i45327_1_); } public boolean getIsRepairable(ItemStack input, ItemStack repair) { if(repair.getItem() == Items.diamond) { return true; } return false; } public boolean hasEffect(ItemStack stack){ return true; } public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase living){ for(int i = y; i < 256; i++) { int m = world.getBlockMetadata(x, y, y); System.out.println(m); if(world.getBlock(x, i, z).isWood(world, x, y, z)){ float f = 0.7F; double d0 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; double d1 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; double d2 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; EntityItem entityitem = new EntityItem(world, (double)x + d0, (double)i + d1, (double)z + d2, new ItemStack(world.getBlock(x, i, z), 1,m)); world.spawnEntityInWorld(entityitem); world.setBlockToAir(x, i, z); } else { System.out.println("blabla"); return super.onBlockDestroyed(stack, world, block, x, i, z, living); } } for(int j = x; j < 25000 || j == 250000 || j > 250000 ; j++) { if(world.getBlock(j, y, z).isWood(world, x, y, z)){ float f = 0.7F; double d0 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; double d1 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; double d2 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; EntityItem entityitem = new EntityItem(world, (double)j + d0, (double)y + d1, (double)z + d2, new ItemStack(world.getBlock(x, y, z), 1, world.getBlockMetadata(j, y, y))); world. world.spawnEntityInWorld(entityitem); System.out.println("blabla"); world.setBlockToAir(j, y, z); } else { return super.onBlockDestroyed(stack, world, block, j, y, z, living); } } return super.onBlockDestroyed(stack, world, block, x, y, z, living); } }
Merci d’avance
-
@‘20cents34’:
Bonjour, je suis actuellement en train de faire une hache pouvant détruire le bois d’un arbre entier et j’ai réussi à faire disparaître le bois à la verticale, le remplacer par de l’air et faire apparaître l’ItemStack correspondant mais je n’arrive pas à faire la même chose à l’horizontale.
Classe de l’item :
package net.mobject.common.item.tool; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemAxe; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.mobject.common.entity.EntityVoleur; public class ItemGemmeAxe extends ItemAxe { public ItemGemmeAxe(ToolMaterial p_i45327_1_) { super(p_i45327_1_); } public boolean getIsRepairable(ItemStack input, ItemStack repair) { if(repair.getItem() == Items.diamond) { return true; } return false; } public boolean hasEffect(ItemStack stack){ return true; } public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase living){ for(int i = y; i < 256; i++) { int m = world.getBlockMetadata(x, y, y); System.out.println(m); if(world.getBlock(x, i, z).isWood(world, x, y, z)){ float f = 0.7F; double d0 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; double d1 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; double d2 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; EntityItem entityitem = new EntityItem(world, (double)x + d0, (double)i + d1, (double)z + d2, new ItemStack(world.getBlock(x, i, z), 1,m)); world.spawnEntityInWorld(entityitem); world.setBlockToAir(x, i, z); } else { System.out.println("blabla"); return super.onBlockDestroyed(stack, world, block, x, i, z, living); } } for(int j = x; j < 25000 || j == 250000 || j > 250000 ; j++) { if(world.getBlock(j, y, z).isWood(world, x, y, z)){ float f = 0.7F; double d0 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; double d1 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; double d2 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; EntityItem entityitem = new EntityItem(world, (double)j + d0, (double)y + d1, (double)z + d2, new ItemStack(world.getBlock(x, y, z), 1, world.getBlockMetadata(j, y, y))); world. world.spawnEntityInWorld(entityitem); System.out.println("blabla"); world.setBlockToAir(j, y, z); } else { return super.onBlockDestroyed(stack, world, block, j, y, z, living); } } return super.onBlockDestroyed(stack, world, block, x, y, z, living); } }
Merci d’avance
Ton code est très étrange, premièrement : ta première boucle va continuer jusqu’à 256 ce qui veut dire que si tu as un bloc de bois à la hauteur 255, il sera aussi cassé alors qu’il n’y a que de l’air entre le block cassé et ce morceau de bois en y = 255. Tu devrais utiliser une boucle do {} while ();, il me semble que robin avait fait un tutoriel pour faire ça dans sa vidéo sur créer des outils, jettes y un coup d’œil.
Ensuite, ta deuxième boucle est une boucle infinie ce qui n’est vraiment pas à faire. Et pour finir, change cette condition :
if(world.getBlock(j, y, z).isWood(world, x, y, z)){}
en :
if(world.getBlock(j, y, z).isWood(world, j, y, z)){}
-
J’ai regardé le code de robin et il est similaire au miens. Pour la boucles allant jusqu’à 256 j’ai changer la valeur en 25 c’est plus précis mais mon problème est que je n’arrive pas à faire la même chose à l’horizontal. Je sais qu’il faut modifier la boucles for mais en quoi ?
-
bha au lieu d’incrémenter les y tu incrémente les x
-
Ouai mais les y ont une valeur max de 256 et ne peuvent pas aller dans les négatifs alors que les x eux ont des valeurs plus grandes donc je ne sais pas quoi mettre pour que le jeu “test” les blocs autours sans faire une boucles infini
-
@‘SCAREX’:
Ton code est très étrange, premièrement : ta première boucle va continuer jusqu’à 256 ce qui veut dire que si tu as un bloc de bois à la hauteur 255, il sera aussi cassé alors qu’il n’y a que de l’air entre le block cassé et ce morceau de bois en y = 255. Tu devrais utiliser une boucle do {} while ();, il me semble que robin avait fait un tutoriel pour faire ça dans sa vidéo sur créer des outils, jettes y un coup d’œil.
Non. Regarde le else, une fois qu’il n’y a plus de bois au dessus il sort de la fonction. Donc non, il ne cassera pas le bloc de bois qui se trouve en y=255 si il n’y en a pas en dessous.
Si tu veux casser les blocs de bois sur toutes les directions il faut partir sur quelques choses de complètement différent, celui-ci n’est pas adapté pour.
public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase living) { if(block.isWood(world, x, y, z)) { this.cutWood(world, x, y, z, living.getEquipmentInSlot(0), living); } return true; } public boolean cutWood(World world, int x, int y, int z, ItemStack stack, EntityLivingBase living) { boolean flagxPos = false, flagxNeg = false, flagzPos = false, flagzNeg = false, flagyPos = false, flagyNeg = false; if(world.getBlock(x + 1, y, z).isWood(world, x + 1, y, z)) { Block b = world.getBlock(x + 1, y, z); int meta = b.damageDropped(world.getBlockMetadata(x + 1, y, z)); world.setBlockToAir(x + 1, y, z); this.dropBlockAsItem(world, x + 1, y, z, new ItemStack(Item.getItemFromBlock(b), 1, meta)); stack.damageItem(1, living); flagxPos = cutWood(world, x + 1, y, z, stack, living); } else { flagxPos = true; } if(world.getBlock(x - 1, y, z).isWood(world, x - 1, y, z)) { Block b = world.getBlock(x - 1, y, z); int meta = b.damageDropped(world.getBlockMetadata(x - 1, y, z)); world.setBlockToAir(x - 1, y, z); this.dropBlockAsItem(world, x - 1, y, z, new ItemStack(Item.getItemFromBlock(b), 1, meta)); stack.damageItem(1, living); flagxNeg = cutWood(world, x - 1, y, z, stack, living); } else { flagxNeg = true; } if(world.getBlock(x, y, z + 1).isWood(world, x, y, z + 1)) { Block b = world.getBlock(x, y, z + 1); int meta = b.damageDropped(world.getBlockMetadata(x, y, z + 1)); world.setBlockToAir(x, y, z + 1); this.dropBlockAsItem(world, x, y, z + 1, new ItemStack(Item.getItemFromBlock(b), 1, meta)); stack.damageItem(1, living); flagzPos = cutWood(world, x, y, z + 1, stack, living); } else { flagzPos = true; } if(world.getBlock(x, y, z - 1).isWood(world, x, y, z - 1)) { Block b = world.getBlock(x, y, z - 1); int meta = b.damageDropped(world.getBlockMetadata(x, y, z - 1)); world.setBlockToAir(x, y, z - 1); this.dropBlockAsItem(world, x, y, z - 1, new ItemStack(Item.getItemFromBlock(b), 1, meta)); stack.damageItem(1, living); flagzNeg = cutWood(world, x, y, z - 1, stack, living); } else { flagzNeg = true; } if(world.getBlock(x, y + 1, z).isWood(world, x, y + 1, z)) { Block b = world.getBlock(x, y + 1, z); int meta = b.damageDropped(world.getBlockMetadata(x, y + 1, z)); world.setBlockToAir(x, y + 1, z); this.dropBlockAsItem(world, x, y + 1, z, new ItemStack(Item.getItemFromBlock(b), 1, meta)); stack.damageItem(1, living); flagyPos = cutWood(world, x, y + 1, z, stack, living); } else { flagyPos = true; } if(world.getBlock(x, y - 1, z).isWood(world, x, y - 1, z)) { Block b = world.getBlock(x, y - 1, z); int meta = b.damageDropped(world.getBlockMetadata(x, y - 1, z)); world.setBlockToAir(x, y - 1, z); this.dropBlockAsItem(world, x, y - 1, z, new ItemStack(Item.getItemFromBlock(b), 1, meta)); stack.damageItem(1, living); flagyNeg = cutWood(world, x, y - 1, z, stack, living); } else { flagyNeg = true; } return flagxPos && flagxNeg && flagzPos && flagzNeg && flagyPos && flagyNeg; }
(code de @kevin_68)
-
J’ai supposé que ce que tu voulais faire c’était créer une hache qui détruit tous les blocs autour du bloc détruit, voici ce à quoi je suis arrivé :
public class SuperAxe extends ItemAxe { private static final String name = "superAxe"; protected SuperAxe() { super(ToolMaterial.EMERALD); GameRegistry.registerItem(this, name); setUnlocalizedName(ST18.MODID + "_" + name); setCreativeTab(CreativeTabs.tabTools); } public static String getName() { return name; } @Override public boolean onBlockDestroyed(ItemStack stack, World worldIn, Block blockIn, BlockPos pos, EntityLivingBase playerIn) { if (!worldIn.isRemote && playerIn instanceof EntityPlayer) { worldIn.destroyBlock(pos, true); destroyNearWood(worldIn, pos, stack, playerIn, stack.getMaxDamage() - stack.getItemDamage()); stack.damageItem(1, playerIn); if (stack.stackSize <= 0 || stack.getItemDamage() >= stack.getMaxDamage()) ((EntityPlayer) playerIn).destroyCurrentEquippedItem(); } return true; } public int destroyNearWood(World world, BlockPos pos, ItemStack stack, EntityLivingBase player, int maxBlocks) { if (world.getBlockState(pos.up()).getBlock().isWood(world, pos.up())) { if (–maxBlocks > 0) { world.destroyBlock(pos.up(), true); stack.damageItem(1, player); maxBlocks = destroyNearWood(world, pos.up(), stack, player, maxBlocks); } } if (world.getBlockState(pos.down()).getBlock().isWood(world, pos.down())) { if (--maxBlocks > 0) { world.destroyBlock(pos.down(), true); stack.damageItem(1, player); maxBlocks = destroyNearWood(world, pos.down(), stack, player, maxBlocks); } } if (world.getBlockState(pos.east()).getBlock().isWood(world, pos.east())) { if (--maxBlocks > 0) { world.destroyBlock(pos.east(), true); stack.damageItem(1, player); maxBlocks = destroyNearWood(world, pos.east(), stack, player, maxBlocks); } } if (world.getBlockState(pos.west()).getBlock().isWood(world, pos.west())) { if (--maxBlocks > 0) { world.destroyBlock(pos.west(), true); stack.damageItem(1, player); maxBlocks = destroyNearWood(world, pos.west(), stack, player, maxBlocks); } } if (world.getBlockState(pos.north()).getBlock().isWood(world, pos.north())) { if (--maxBlocks > 0) { world.destroyBlock(pos.north(), true); stack.damageItem(1, player); maxBlocks = destroyNearWood(world, pos.north(), stack, player, maxBlocks); } } if (world.getBlockState(pos.south()).getBlock().isWood(world, pos.south())) { if (--maxBlocks > 0) { world.destroyBlock(pos.south(), true); stack.damageItem(1, player); maxBlocks = destroyNearWood(world, pos.south(), stack, player, maxBlocks); } } return maxBlocks; } }
NOTE : ce code est pour la 1.8 mais si tu es en 1.7 tu pourras tout de même l’utiliser en changeant quelques valeus.
-
Merci, tu supposais bien c’était mon intention Sinon l’équivalent de BlockPos en 1.7.10 est x,y,z mais je vois pas trop comment faire pour adapter ton code . Surtout les fonctions pos.south() etc… A moins que pos.up() ) soit égale à y+1 , pos.down() à y -1 mais alors je vois pas se que peut représenter pos.north() et pos.south(). Bref si tu as une idée donne la moi sinon je mettrais mon mod à jour. Et encore merci pour le code.
-
up -> y + 1
down -> y - 1
south -> x + 1
north -> x - 1
est -> z + 1
west -> z - 1
(de tête, pas sûr). -
J’ai essayé le code de Robin4002 mais j’ai une erreur sur
this.dropBlockAsItem(world, x, y - 1, z, new ItemStack(Item.getItemFromBlock(b), 1, meta));
Eclipse me dis que dropBlockAsItem est indéfinie pour ma classe.
Et Eclipse ne trouve pas non plus player icithis.cutWood(world, x, y, z, player.inventory.getCurrentItem(), player);
-
private void dropBlockAsItem(World world, int x, int y, int z, ItemStack stack) { if(!world.isRemote && world.getGameRules().getGameRuleBooleanValue("doTileDrops")) { float f = 0.7F; double d0 = world.rand.nextFloat() * f + (1.0F - f) * 0.5D; double d1 = world.rand.nextFloat() * f + (1.0F - f) * 0.5D; double d2 = world.rand.nextFloat() * f + (1.0F - f) * 0.5D; EntityItem entityitem = new EntityItem(world, x + d0, y + d1, z + d2, stack); entityitem.delayBeforeCanPickup = 10; world.spawnEntityInWorld(entityitem); } }
Il manquant cette fonction.
-
Merci mais j’ai toujours le problème du player. En gros il me le trouve pas et me propose de créer une variable.
-
Ajoutes cette variable dans ta méthode
EntityPlayer entityplayer = (EntityPlayer)player; -
J’ai une erreur sur le cast : (EntityPlayer)player et onBlockDestroyed me demande un return non présent dans le code de robin4002.
-
@‘20cents34’:
Merci, tu supposais bien c’était mon intention Sinon l’équivalent de BlockPos en 1.7.10 est x,y,z mais je vois pas trop comment faire pour adapter ton code . Surtout les fonctions pos.south() etc… A moins que pos.up() ) soit égale à y+1 , pos.down() à y -1 mais alors je vois pas se que peut représenter pos.north() et pos.south(). Bref si tu as une idée donne la moi sinon je mettrais mon mod à jour. Et encore merci pour le code.
BlockPos est une classe qui existait déjà avant la 1.8, il te suffit donc de faire BlockPos pos = new BlockPos(x,y,z); et le reste sera adapté, dont le pos.south() etc.
-
Euh non eclipse le trouve nul part et je suis en 1.7.10
-
@‘20cents34’:
J’ai une erreur sur le cast : (EntityPlayer)player et onBlockDestroyed me demande un return non présent dans le code de robin4002.
C’est de ma faute, j’ai édité mon message, maintenant ça devrait être bon.
@‘SCAREX’:
BlockPos est une classe qui existait déjà avant la 1.8, il te suffit donc de faire BlockPos pos = new BlockPos(x,y,z); et le reste sera adapté, dont le pos.south() etc.
Non, elle n’existe pas en 1.7.10
-
@‘robin4002’:
@‘20cents34’:
J’ai une erreur sur le cast : (EntityPlayer)player et onBlockDestroyed me demande un return non présent dans le code de robin4002.
C’est de ma faute, j’ai édité mon message, maintenant ça devrait être bon.
@‘SCAREX’:
BlockPos est une classe qui existait déjà avant la 1.8, il te suffit donc de faire BlockPos pos = new BlockPos(x,y,z); et le reste sera adapté, dont le pos.south() etc.
Non, elle n’existe pas en 1.7.10
Effectivement mais le principe est le même que ce que robin disait, tu fait x + 1 (east) puis x - 1 (west) puis z + 1 (south) puis z - 1 (north) puis y + 1 (up) (puis y - 1 (down) si tu veux aller vers le bas)
Je peux vite fait adapter le code si tu veux pour la 1.7 ?
-
Merci a tous et surtout à robin4002 ça marche parfaitement maintenant
Ça ira merci SCAREX j’utiliserai ton code quand je passerai en 1.8.