Propriétés pour couper des arbres
-
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]); } -
world.getBlockState(testPos).getBlock().getMetaFromState(world.getBlockState(testPos))
-
Super, ça fonctionne, mon item est donc complètement terminé : Voilà à quoi ça ressemble :
Dans la classe de mon item, il y a ceci :
[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 worldIn].getBlockState([color=#6a3e3etestPos]).getBlock().getMetaFromState([color=#6a3e3eworldIn].getBlockState([color=#6a3e3etestPos])))); [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]); }Dans ma classe event, il y a 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é"])); } }Je met la balise en résolu : )