Résolu Le gamemode d'un joueur + 2 problèmes
-
Salut à tous,
mon problème est tout bête, j’aimerais détecter le gamemode du joueur pour que s’il n’est pas en créatif et que s’il n’a pas la bonne pioche lorsqu’il casse mon minerai, un message est envoyé dans le chat et la destruction du bloc est annulée. Mais j’ai 3 problèmes.1 - Lorsque je détruit le bloc, je me prends un NPE si je n’ai rien dans la main. J’ai pourtant mis des vérifications que l’item n’est pas null partout…
2 - Le message s’affiche dans tous les cas, alors qu’il ne devrait s’afficher que si le joueur ne tient pas dans sa main 1 des 6 pioches requises.
3 - Je ne trouve pas comment vérifier que le joueur n’est pas en créatif.
Voila ou j’en suis :
@SubscribeEvent public void onBlockDestroyed(BlockEvent.BreakEvent event) { if(event.block instanceof MysticShadowOre) { // Vérification du mode créatif manquante if(event.getPlayer().getHeldItem().getItem() != null && event.getPlayer().getHeldItem().getItem() != net.minecraft.init.Items.diamond_pickaxe && event.getPlayer().getHeldItem().getItem() != null && event.getPlayer().getHeldItem().getItem() != MorePowerCraft.mysticPickaxe && event.getPlayer().getHeldItem().getItem() != null && event.getPlayer().getHeldItem().getItem() != MorePowerCraft.shadowPickaxe && event.getPlayer().getHeldItem().getItem() != null && event.getPlayer().getHeldItem().getItem() != MorePowerCraft.divinePickaxe &&event.getPlayer().getHeldItem().getItem() != null && event.getPlayer().getHeldItem().getItem() != MorePowerCraft.fallenPickaxe && event.getPlayer().getHeldItem().getItem() != null && event.getPlayer().getHeldItem().getItem() != MorePowerCraft.futurUltimate) { } event.getPlayer().addChatMessage(new ChatComponentText("§o" + "Votre pioche n'est pas assez puissante pour récupérer le minerai.")); event.setCanceled(true); } }
Tout le mod est dispo ici : https://github.com/Vayper/MorePowerCraft
Merci d’avance pour vos solutions !
PS : - Existe-t-il un event qui s’active quand on commence a détruire un bloc ?
- Comment faire pour qu’un bloc émette de la lumière ? J’ai inspecté le code de la lampe redstone et de la torche,
mais c’est truffé de field et de func…
- Comment faire pour qu’un bloc émette de la lumière ? J’ai inspecté le code de la lampe redstone et de la torche,
-
Comme ça :
@SubscribeEvent public void onBlockDestroyed(BlockEvent.BreakEvent event) { if(event.block instanceof MysticShadowOre) { // Vérification du mode créatif manquante if(!event.getPlayer().capabilities.isCreativeMode && event.getPlayer().getHeldItem() != null && (event.getPlayer().getHeldItem().getItem() == net.minecraft.init.Items.diamond_pickaxe || event.getPlayer().getHeldItem().getItem() == MorePowerCraft.mysticPickaxe || event.getPlayer().getHeldItem().getItem() == MorePowerCraft.shadowPickaxe || event.getPlayer().getHeldItem().getItem() == MorePowerCraft.divinePickaxe || event.getPlayer().getHeldItem().getItem() == MorePowerCraft.fallenPickaxe || event.getPlayer().getHeldItem().getItem()== MorePowerCraft.futurUltimate)) { event.getPlayer().addChatMessage(new ChatComponentText("§o" + "Votre pioche n'est pas assez puissante pour récupérer le minerai.")); event.setCanceled(true); } } }
Le null check, il doit être event.getPlayer().getHeldItem() et pas sur event.getPlayer().getHeldItem().getItem()
player.capabilities.isCreativeMode pour le créative.Pour les deux autres questions, PlayerEvent.HarvestCheck et PlayerEvent.BreakSpeed
et la lumière, setLightValue(1F) dans le constructeur. -
@‘robin4002’:
Comme ça :
@SubscribeEvent public void onBlockDestroyed(BlockEvent.BreakEvent event) { if(event.block instanceof MysticShadowOre) { // Vérification du mode créatif manquante if(!event.getPlayer().capabilities.isCreativeMode && event.getPlayer().getHeldItem() != null && (event.getPlayer().getHeldItem().getItem() == net.minecraft.init.Items.diamond_pickaxe || event.getPlayer().getHeldItem().getItem() == MorePowerCraft.mysticPickaxe || event.getPlayer().getHeldItem().getItem() == MorePowerCraft.shadowPickaxe || event.getPlayer().getHeldItem().getItem() == MorePowerCraft.divinePickaxe || event.getPlayer().getHeldItem().getItem() == MorePowerCraft.fallenPickaxe || event.getPlayer().getHeldItem().getItem()== MorePowerCraft.futurUltimate)) { event.getPlayer().addChatMessage(new ChatComponentText("§o" + "Votre pioche n'est pas assez puissante pour récupérer le minerai.")); event.setCanceled(true); } } }
Le null check, il doit être event.getPlayer().getHeldItem() et pas sur event.getPlayer().getHeldItem().getItem()
player.capabilities.isCreativeMode pour le créative.Pour les deux autres questions, PlayerEvent.HarvestCheck et PlayerEvent.BreakSpeed
et la lumière, setLightValue(1F) dans le constructeur.Merci d’avoir répondu rapidement
J’ai fais plusieurs tests :
- En mode créatif, je peux casser le bloc a la main, le message ne s’affiche pas et ne crash pas – Problème 1 résolu
- En mode créatif, quand je détruis le bloc, le message ne s’affiche jamais – Problème 2 a moitié résolu
- En mode survie, c’est l’inverse de ce que je veux qui se produit. Quand je détruis le bloc avec une des 6 pioches “exceptées”, le message s’affiche et je ne peux pas détruire le bloc, alors que si je prends une pioche en fer, le bloc se casse correctement.
*EDIT : Tous les problèmes résolus, j’ai remplacé les || par des && et les == par des != . *
Merci beaucoup !!!
Dernière petit question, comment je pourrais faire pour afficher proprement la pioche utilisée dans le message au lieu de mettre “Votre pioche” ?
J’ai essayé de mettre event.getPlayer().getHeldItem().getItem() mais ca me met “net.minecraft.item.ItemPickaxe@2de6f1bc” ^^ -
Je pense qu’il faut juste que tu inverses les conditions. à la place des == des items, mets !=
-
@‘gagoi’:
Je pense qu’il faut juste que tu inverses les conditions. à la place des == des items, mets !=
Tu devrais écrire ton message quand j’éditais le mien ^^
Merci quand même
-
event.getPlayer().getHeldItem().getItem().getItemStackDisplayName(event.getPlayer().getHeldItem())
-
@‘robin4002’:
event.getPlayer().getHeldItem().getItem().getItemStackDisplayName(event.getPlayer().getHeldItem())
MERCI BEAUCOUP !