Problème onBlockDestroyed
-
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.