Résolu onBlockDestroy ?
-
Hello, encore moi , toujours moi et cependant je fais des efforts juré !
Je reviens avec un problème assez ennuyant , je pense avoir trouvé le gros de la fonction grâce aux tutos de robin sur l’effet sur la hache cet à dire que lorsqu’on casse un block sa effectue une action j’ai donc essayer de modifier le code à ma façon pour faire ce que je veut !
Cependant j’aimerais vérifier le block que le joueur détruit par exemple vérifier que le block détruit est bien du bois de mon mod j’ai donc chercher partout et j’ai rien trouver pour faire ca et je ne suis pas un pro du modding je le répète , je suis en apprentissage
voici le code que j’ai fait pour le moment !
public void onBlockDestroy(World world, int x, int i , int z, EntityPlayer player) { ***ICI UNE CONDITION POUR VERIFIER*** { world.setBlockToAir(x, i, z); player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false); } }
Je ne sais pas quoi faire pour vérifier que si le block détruit est ce block alors il drop de facon random ( par après ) soit itemSevewithmosquito ou itemSeve ?
De plus il faut qu’il soit détruit avec un outil spécial que j’ai créer ,le code est donc dans ma classe itemSuperAxe!
Merci de votre aide
-
if(world.getBlock(x, i, z) == TaClassePrincipale.tonBlock) // vérifie le bloc { world.setBlockToAir(x, i, z); if(world.rand.nextInt(2) == 0) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1) { //si il est égale à 0 player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false); } else { //sinon il est forcement égale à 1 player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSeve ), false); } }
-
Oké j’ai compris le code avec le systeme de choix soit 0 ou 1 , mais quand je casse le block avec mon itemSuperAxe rien ne drop
Voici donc le code complet :
public void onBlockDestroy(World world, int x, int i , int z, EntityPlayer player) { if(world.getBlock(x, i, z) == Blocks.wooden_slab) // vérifie le bloc { world.setBlockToAir(x, i, z); if(world.rand.nextInt(2) == 0) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1) { //si il est égale à 0 player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false); } else { //sinon il est forcement égale à 1 player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSeve ), false); } } }
-
public void onBlockDestroy(World world, int x, int i , int z, EntityPlayer player) { if(world.getBlock(x, i, z) == Blocks.wooden_slab) // vérifie le bloc { System.out.println("je vais drop"); world.setBlockToAir(x, i, z); if(world.rand.nextInt(2) == 0) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1) { //si il est égale à 0 player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false); } else { //sinon il est forcement égale à 1 player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSeve ), false); } } else { System.out.println("le bloc correspond pas, je drop rien " + world.getBlock(x, i, z).getUnlocalizedName()); } }
Il affiche quoi ?
-
Wait, t’es bien dans la classe de ton bloc la non ?
-
Ca ne drop rien et sa n’affiche rien également
-
Tu l’as placés où ce code ?
-
Dans mon itemSuperAxe j’ai préciser “De plus il faut qu’il soit détruit avec un outil spécial que j’ai créer ,le code est donc dans ma classe itemSuperAxe!” Donc je suppose qu’il doit être dans la classe du block ?
-
Normalement non, mets un @Override au dessus ?
-
Si je met un override au dessus sa souligne rouge et ca met qu’il faut remove le override Voici mon code complet
package mod.common; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; 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.Item; import net.minecraft.item.ItemAxe; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class itemSuperAxe extends ItemAxe { public itemSuperAxe(ToolMaterial material) { super(material); } @Override public void onBlockDestroy(World world, int x, int i , int z, EntityPlayer player) { if(world.getBlock(x, i, z) == Blocks.planks) // vérifie le bloc { System.out.println("je vais drop"); world.setBlockToAir(x, i, z); if(world.rand.nextInt(2) == 0) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1) { //si il est égale à 0 player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false); } else { //sinon il est forcement égale à 1 player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSeve ), false); } } else { System.out.println("le bloc correspond pas, je drop rien " + world.getBlock(x, i, z).getUnlocalizedName()); } } @Override public void registerIcons(IIconRegister iconregister) { this.itemIcon = iconregister.registerIcon(ModMinecraft.MODID + ":itemSuperAxe"); } }
J’ai testé avec un block plein pour savoir si il y avais une différence…
-
Ok, le problème c’est que c’est :
public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase living)
Et non
public void onBlockDestroy(World world, int x, int i , int z, EntityPlayer player) -
Si je met public boolean , il me le souligne en rouge donc j’ai supposé qu’il fallait return quelques choses j’ai donc return tout ce que j’avais dans ma parenthèses du public boolean cependant , le return se souligne en rouge car il dit qu’il faut add arguments to match…
public boolean onBlockDestroyed(World world, int x, int i , int z, EntityPlayer player) { if(world.getBlock(x, i, z) == Blocks.planks) // vérifie le bloc { System.out.println("je vais drop"); world.setBlockToAir(x, i, z); if(world.rand.nextInt(2) == 0) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1) { //si il est égale à 0 player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false); } else { //sinon il est forcement égale à 1 player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSeve ), false); } } else { System.out.println("le bloc correspond pas, je drop rien " + world.getBlock(x, i, z).getUnlocalizedName()); } return super.onBlockDestroyed(world, x, i, z); }
EDIT EDIT EDIT
J’ai modifier comme ceci et ca ne me met plus aucune erreur est-ce que c’est bon comme cela ?
public boolean onBlockDestroyed(World world, int x, int i , int z, EntityPlayer player) { if(world.getBlock(x, i, z) == Blocks.planks) // vérifie le bloc { System.out.println("je vais drop"); world.setBlockToAir(x, i, z); if(world.rand.nextInt(2) == 0) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1) { //si il est égale à 0 player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false); } else { //sinon il est forcement égale à 1 player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSeve ), false); } } else { System.out.println("le bloc correspond pas, je drop rien " + world.getBlock(x, i, z).getUnlocalizedName()); } return onBlockDestroyed(world, x, i, z, player); }
-
Non, absolument pas.
On peut pas inventer des méthodes comme ça, sauf si tu l’appelle quelque part.
Or public boolean onBlockDestroyed(World world, int x, int i , int z, EntityPlayer player) n’existe pas dans ItemTool.java, c’est :
public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase living)Attention, les arguments change tout :
public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase living) { if(world.getBlock(x, y, z) == Blocks.planks) // vérifie le bloc { System.out.println("je vais drop"); world.setBlockToAir(x, y, z); if(living instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)living; if(world.rand.nextInt(2) == 0) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1) { //si il est égale à 0 player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false); } else { //sinon il est forcement égale à 1 player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSeve ), false); } } } else { System.out.println("le bloc correspond pas, je drop rien " + world.getBlock(x, i, z).getUnlocalizedName()); } return super.onBlockDestroyed(stack, world, block, x, y, z, living); }
-
Ok sa drop l’item de facon random maintenant !! J’ai juste rajouter un autre if(world.rand.netInt(3) == 2) pour que parfois ils ne drop rien , il y a moyen de faire en sorte que l’item sevewithmosquito soit plus rare a drop ? De plus la c’est le player qui drop l’item et j’aimerais que se soit le “block” qui le drop , c’est possible ?
C’est bon du coup comme ca ?
if(living instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)living; if(world.rand.nextInt(3) == 0) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1) { //si il est égale à 0 player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false); } if(world.rand.nextInt(3) == 2) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1) { //si il est égale à 0 } else { //sinon il est forcement égale à 1 player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSeve ), false); } } }
-
int randInt = world.rand.nextInt(3) if(randInt == 0) { première action } else if(randInt == 1) { deuxième action } else { rien ou troisième action }
Pour le drop, vire ta fonction actuel avec le joueur et remplace par :
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)y + d1, (double)z + d2, new ItemStack(world.getBlock(x, y, z), 1)); // instancie une nouvelle entité item avec les coordonnées + l'id et le metadata du bois entityitem.delayBeforeCanPickup = 10; world.spawnEntityInWorld(entityitem); // spawn l'entité item
En plus j’ai donné cette fonction dans le tutoriel sur les outils …
-
Je comprend la fonction ce que je comprend pas c’est comme je choisis l’item à droppé je viens de lire l’effet sur la hache dans Créer un kit d’outils et je vois toujours pas Je suis un peu perdu en fait la je dois t’avouer xD
-
EntityItem entityitem = new EntityItem(world, (double)x + d0, (double)y + d1, (double)z + d2, new ItemStack(world.getBlock(x, i, z), 1));
new ItemStack(bloc ou item, quantité, metadata)
-
Et pour la fonction d’un qui est plus rare a drop que l’autre c’est possible ?
-
Change le random …
-
C’est à dire un code a rajouter ou dans le code que tu ma donner il y a une fonction précise , désoler je suis un gros boulet xD