Résolu Propriétés pour couper des arbres
-
Ce qu’il y avait dans onBlockDestroyed en prenant soin de remplacer les variables par celle que propose le paramètre event
-
Dans l’event tu check si le bloc qui vient d’être cassé est du bois.
Si oui, tu check si le joueur à ton item et main et si oui tu check avec cette condition :
worldIn.getBlockState(pos.up(7)).getBlock().isWood(worldIn, pos.up(7)
que l’arbre n’est pas trop grand. Et si l’arbre est trop grand tu cancel l’event.Le problème c’est que BlockBreak reste appelé après la destruction du bloc, donc ça permettra juste que la première buche ne soit pas cassé, le message ne s’affichera pas avant de tenter de casser le bloc
-
J’avais une idée. Est-ce qu’on ne peut pas faire ceci ? :
- le block visé se casse.
- le message s’envoie.
- le drop du block s’annule.
- le block cassé réapparaît à l’endroit où on cassé le premier block.
-
C’est exactement ce qu’on t’as proposé de faire avec BlockBreakEvent
-
D’accord j’avais pas compris. J’ai fait ça le problème c’est que le message ne s’envoie pas et 7 block de buche se détruisent :
@SubscribeEvent public void onBlockDestroyed(BlockEvent.BreakEvent event) { if (event.world.getBlockState(event.pos).getBlock().isWood(event.world, event.pos)) { if (event.getPlayer().getItemInUse() == new ItemStack(ItemMod.itemMachete)) { if (event.world.getBlockState(event.pos.up(7)).getBlock().isWood(event.world, event.pos)) { event.setCanceled(true); event.getPlayer().addChatMessage(new ChatComponentText("Cet arbre est trop grand pour pouvoir être coupé !")); } else { event.setCanceled(false); } } } }
-
if (event.getPlayer().getItemInUse() == new ItemStack(ItemMod.itemMachete))
->
if (event.getPlayer().getItemInUse() != null && event.getPlayer().getItemInUse().getItem() == ItemMod.itemMachete) -
Ca veut toujours pas, c’est le même problème.
-
Tu as bien enregistré la classe d’événement dans ta classe principale ?
-
Oui, j’ai d’autres évènement dans cette classe qui fonctionne très bien
-
Une idée ?
-
Vu que BlockEvent.BreakEvent ne semble pas fonctionner, je penser utiliser la commande /setblock comme on peut le faire avec les commandes blocks ou le tchat. Cependant est-il possible d’exécuter cette commande à l’intérieur du mod ? Je voudrais en effet rajouter cette commande à ma méthode onBlockDestroyed pour replacer le block.
-
Euh… pourquoi passer par une commande alors que tu peux faire world.setBlockState(tonBlock, LaPostion); ?
-
Effectivement, en mettant ceci au niveau de l’envoie du texte :“Cet arbre est trop grand”, ça fonctionne:
%(#6a3e3e)[worldIn].setBlockState(%(#6a3e3e)[[color=#6a3e3e]pos], (IBlockState)%(#6a3e3e)[[color=#6a3e3e]worldIn].getBlockState(%(#6a3e3e)[[color=#6a3e3e]pos].up(1)).getBlock());
Le souci c’est que le bloc qui se repositionne devient invisible, je dois faire un click droit dessus (alors qu’il est invisible) pour le faire apparaître. Comment corriger ceci ?
Merci par avance.
-
worldIn.setBlockState(pos, worldIn.getBlockState(pos.up(1)), 3);
-
Je viens d’essayer, si je met pas .getBlock() , le bloc drop et même en mettant .getBlock() puis ,3 derrière cela ne fonctionne pas. La valeur de 3 correspond à un retard ?
-
Le 3 est un flag, qui demande au client d’update le chunk.
C’est pas normal que ça ne fonctionne pas.
-
Ok merci. A défaut de pouvoir faire apparaître le block par cette méthode. Est-il possible de faire en sorte que dès que le bloc se pose le joueur face un click droit automatiquement ?
-
Après plusieurs test, j’ai réussi à corriger le problème concernant la reposition du block de bois si l’arbre est trop grand :
Dans la classe de l’item j’ai enlevé la partie pour faire apparaître le block ainsi que le message envoyé dans le tchat, et dans ma classe d’event j’ai mis ceci :@SubscribeEvent **[color=#7f0055public]** **[color=#7f0055void]** breakBlock(BlockEvent.BreakEvent [color=#6a3e3eevent]) { **[color=#7f0055 if]** ([color=#6a3e3eevent].[color=#0000c0world].getBlockState([color=#6a3e3eevent].[color=#0000c0pos].up(7)).getBlock().isWood([color=#6a3e3eevent].[color=#0000c0world], [color=#6a3e3eevent].[color=#0000c0pos])) { [color=#6a3e3e event].setCanceled(**[color=#7f0055true]**); [color=#6a3e3e event].getPlayer().addChatMessage(**[color=#7f0055new]** ChatComponentText([color=#2a00ff"Cet arbre est trop grand pour pouvoir être coupé"])); } } ``` Maintenant cette partie là fonctionne très bien : ) Il reste un souci concernant le type de block de bois qui est looté quand l'arbre n'est pas trop grand. En effet, si j'empile 3 buche de bois de jungle et que je casse le tout à la base, j'ai trois block de bois de chêne qui sont looté au lieu de 3 block de bois de jungle. Je suis sûr que ça viens de cette partie : ```java EntityItem [color=#6a3e3eentityItem] = **[color=#7f0055new]** EntityItem([color=#6a3e3eworldIn], (**[color=#7f0055double]**)[color=#6a3e3etestPos].getX() + [color=#6a3e3ed0], (**[color=#7f0055double]**)[color=#6a3e3etestPos].getY() + [color=#6a3e3ed1], (**[color=#7f0055double]**)[color=#6a3e3etestPos].getZ() + [color=#6a3e3ed2], **[color=#7f0055new]** ItemStack(Item.*getItemFromBlock*([color=#6a3e3eblockIn]), 1));
le block qui est looté est celui de blockIn qui, dans mon cas, est un block de bois, appelé log, et ainsi j’obtient le premier block log : le chêne.
Ainsi, comment faire pour sélectionner le type de block looté selon celui qu’on a détruit ?Merci par avance.
-
Il faut ajouter le metadata en argument de ItemStack.
new ItemStack(Item.getItemFromBlock(blockIn), 1, metadata)Maintenant pour récupérer le metadata, ça dépend des arguments que tu as à l’endroit où se trouve ton code.
-
Ma fonction ressemble à ça (elle se trouve dans ma classe item de la machette) :
[size=x-small**public**] **[color=#7f0055boolean]** onBlockDestroyed(ItemStack [color=#6a3e3estack], World [color=#6a3e3eworldIn], Block [color=#6a3e3eblockIn], BlockPos [color=#6a3e3epos], EntityLivingBase [color=#6a3e3eplayerIn]) { **[color=#7f0055 if]**([color=#6a3e3eworldIn].getBlockState([color=#6a3e3epos].up(7)).getBlock().isWood([color=#6a3e3eworldIn], [color=#6a3e3epos].up(7))) { **[color=#7f0055 if]**([color=#6a3e3eplayerIn] **[color=#7f0055instanceof]** EntityPlayer && ![color=#6a3e3eworldIn].[color=#0000c0isRemote]) { } **[color=#7f0055 return]** **[color=#7f0055super]**.onBlockDestroyed([color=#6a3e3estack], [color=#6a3e3eworldIn], [color=#6a3e3eblockIn], [color=#6a3e3epos], [color=#6a3e3eplayerIn]); } **[color=#7f0055 for]** (**[color=#7f0055int]** [color=#6a3e3ei] = 0 ; [color=#6a3e3ei] < 7; [color=#6a3e3ei]++) { BlockPos [color=#6a3e3etestPos] = [color=#6a3e3epos].up([color=#6a3e3ei]); **[color=#7f0055 if]** ([color=#6a3e3eworldIn].getBlockState([color=#6a3e3etestPos]).getBlock().isWood([color=#6a3e3eworldIn], [color=#6a3e3etestPos])) { [color=#6a3e3e stack].damageItem(1, [color=#6a3e3eplayerIn]); **[color=#7f0055 if]** (![color=#6a3e3eworldIn].[color=#0000c0isRemote] && [color=#6a3e3eworldIn].getGameRules().getBoolean([color=#2a00ff"doTileDrops"])) { **[color=#7f0055 float]** [color=#6a3e3ef] = 0.7F; **[color=#7f0055 double]** [color=#6a3e3ed0] = (**[color=#7f0055double]**)([color=#6a3e3eworldIn].[color=#0000c0rand].nextFloat() * [color=#6a3e3ef]) + (**[color=#7f0055double]**)(1.0F - [color=#6a3e3ef]) * 0.5D; **[color=#7f0055 double]** [color=#6a3e3ed1] = (**[color=#7f0055double]**)([color=#6a3e3eworldIn].[color=#0000c0rand].nextFloat() * [color=#6a3e3ef]) + (**[color=#7f0055double]**)(1.0F - [color=#6a3e3ef]) * 0.5D; **[color=#7f0055 double]** [color=#6a3e3ed2] = (**[color=#7f0055double]**)([color=#6a3e3eworldIn].[color=#0000c0rand].nextFloat() * [color=#6a3e3ef]) + (**[color=#7f0055double]**)(1.0F - [color=#6a3e3ef]) * 0.5D; EntityItem [color=#6a3e3eentityItem] = **[color=#7f0055new]** EntityItem([color=#6a3e3eworldIn], (**[color=#7f0055double]**)[color=#6a3e3etestPos].getX() + [color=#6a3e3ed0], (**[color=#7f0055double]**)[color=#6a3e3etestPos].getY() + [color=#6a3e3ed1], (**[color=#7f0055double]**)[color=#6a3e3etestPos].getZ() + [color=#6a3e3ed2], **[color=#7f0055new]** ItemStack(Item.*getItemFromBlock*([color=#6a3e3eblockIn]), 1)); [color=#6a3e3e entityItem].setDefaultPickupDelay(); [color=#6a3e3e worldIn].spawnEntityInWorld([color=#6a3e3eentityItem]); } [color=#6a3e3e worldIn].setBlockToAir([color=#6a3e3etestPos]); } **[color=#7f0055 else]** { **[color=#7f0055 return]** **[color=#7f0055super]**.onBlockDestroyed([color=#6a3e3estack], [color=#6a3e3eworldIn], [color=#6a3e3eblockIn], [color=#6a3e3epos], [color=#6a3e3eplayerIn]); } } **[color=#7f0055 return]** **[color=#7f0055super]**.onBlockDestroyed([color=#6a3e3estack], [color=#6a3e3eworldIn], [color=#6a3e3eblockIn], [color=#6a3e3epos], [color=#6a3e3eplayerIn]); }