Résolu Une Pioche avec 2 modes de vitesse
-
bonjour je voudrais creer une pioche avec 2 modes de vitesse mais je suis bloquer
package fr.yahoo.mehdiboussalem.mehdmod.common; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemPickaxe; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.world.World; public class ItemMehdriumPickaxe extends ItemPickaxe { protected ItemMehdriumPickaxe(ToolMaterial material) { super(material); } public boolean getIsRepairable(ItemStack imput, ItemStack repair) { if(repair.getItem() == MehdMod.itemMehdrium) { return true; } return false; } public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { if (player.isSneaking()){ if(!stack.hasTagCompound()) { stack.setTagCompound(new NBTTagCompound()); } byte mode = stack.getTagCompound().getByte("mode"); mode++; if(mode ==2) { mode=0; } stack.getTagCompound().setByte("mode", mode); if(!world.isRemote) { player.addChatMessage(new ChatComponentTranslation(mode == 0 ?"pickaxe.mode.message.0" : "pickaxe.mode.message.1" )); } } else { super.onItemRightClick(stack, world, player); } return stack; } }
-
Pour ce que tu veux faire je crois que tu va être obligé de passer par l’event BreakSpeed pour modifier la vitesse selon le mode que ta pioche
-
Plus simple : la même chose que l’épée.
La fonction getStrVsBlock() adapte la vitesse de minage. Un truc du genre :
public float getStrVsBlock(ItemStack stack, IBlockState state) { float speed = super.getStrVsBlock(stack, state); byte mode = stack.getTagCompound().getByte("mode"); if(mode == 1) return speed*2; else return speed*3; }
devrai fonctionner
-
@‘Jodge’:
Plus simple : la même chose que l’épée.
La fonction getStrVsBlock() adapte la vitesse de minage. Un truc du genre :
public float getStrVsBlock(ItemStack stack, IBlockState state) { float speed = super.getStrVsBlock(stack, state); byte mode = stack.getTagCompound().getByte("mode"); if(mode == 1) return speed*2; else return speed*3; }
devrai fonctionner
j’ai essayer mais j’ai une erreur sur IblockState
-
Normale tu as en 1.7, fait ALT + SHIFT + S > Override/Implement method > et cherche getStrVsBlock > tu le coches > tu valide
-
@‘BrokenSwing’:
Normale tu as en 1.7, fait ALT + SHIFT + S > Override/Implement method > et cherche getStrVsBlock > tu le coches > tu valide
Euh il n’existe pas on peut pas m’envoyer directement la method ?
-
En 1.7 cette méthode est obfusquée, donc tu vas dans la classe ItemTool (ou ItemPickaxe j’en sais rien) et tu cherche, c’pas bien compliqué.
Pour ma part c’est ça (en 1.7.10) :public float func_150893_a(ItemStack stack, Block block) { return taVitesse; }
-
heuu… Vous devez pas être à jour sur la version de Forge alors, je l’ai toujours vue deobfusquée cette fonction… (et ceux depuis 1.6.4)
-
Je le place ou exactement parce que j’ai essayer de le placer un peu n’importe ou toujours la meme erreur
-
Dans ta class de l’objet, au même niveau que “onItemRightClick” et tout le reste.
C’est une des fonctions de base d’un item (disponible dans la class Item que tu hérite). -
package fr.yahoo.mehdiboussalem.mehdmod.common; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemPickaxe; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.world.World; public class ItemMehdriumPickaxe extends ItemPickaxe { protected ItemMehdriumPickaxe(ToolMaterial material) { super(material); } public boolean getIsRepairable(ItemStack imput, ItemStack repair) { if(repair.getItem() == MehdMod.itemMehdrium) { return true; } return false; } public float func_150893_a(ItemStack stack, Block block) { return 5; } public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { if (player.isSneaking()){ if(!stack.hasTagCompound()) { stack.setTagCompound(new NBTTagCompound()); } byte mode = stack.getTagCompound().getByte("mode"); mode++; if(mode ==2) { mode=0; } stack.getTagCompound().setByte("mode", mode); if(!world.isRemote) { player.addChatMessage(new ChatComponentTranslation(mode == 0 ?"pickaxe.mode.message.0" : "pickaxe.mode.message.1" )); } } else { super.onItemRightClick(stack, world, player); } return stack; } public float getStrVsBlock(ItemStack stack, IBlockState state)// erreur a IBlockState { float speed = super.getStrVsBlock(stack, state); byte mode = stack.getTagCompound().getByte("mode"); if(mode == 1) return speed*2; else return speed*3; } }
Comme ça j’ai encorre la meme erreur
-
Sur Eclipse :
Ctrl + clic gauche sur ‘ItemPickaxe’. Ça vas t’ouvrir la class. Tu fait la même chose sur le mot qui apparaît à la place (ItemTool je crois), et tu continue jusqu’à arrivé sur la class Item
OU
tu cherche la classe Item manuellement dans net.minecraft.item qui s’appelle item.classUne fois dessus, Ctrl+f et tu cherche ‘return 1.0F;’ Tu a normalement UNE occurrence. Tu copie la fonction, et tu la colle dans ta classe. C’est cette fonction qui gère la résistance du block.
-
@‘Jodge’:
Sur Eclipse :
Ctrl + clic gauche sur ‘ItemPickaxe’. Ça vas t’ouvrir la class. Tu fait la même chose sur le mot qui apparaît à la place (ItemTool je crois), et tu continue jusqu’à arrivé sur la class Item
OU
tu cherche la classe Item manuellement dans net.minecraft.item qui s’appelle item.classUne fois dessus, Ctrl+f et tu cherche ‘return 1.0F;’ Tu a normalement UNE occurrence. Tu copie la fonction, et tu la colle dans ta classe. C’est cette fonction qui gère la résistance du block.
package fr.yahoo.mehdiboussalem.mehdmod.common; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemPickaxe; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.world.World; public class ItemMehdriumPickaxe extends ItemPickaxe { protected ItemMehdriumPickaxe(ToolMaterial material) { super(material); } public boolean getIsRepairable(ItemStack imput, ItemStack repair) { if(repair.getItem() == MehdMod.itemMehdrium) { return true; } return false; } public float func_150893_a(ItemStack stack, Block block) { return 1.0F; } public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { if (player.isSneaking()){ if(!stack.hasTagCompound()) { stack.setTagCompound(new NBTTagCompound()); } byte mode = stack.getTagCompound().getByte("mode"); mode++; if(mode ==2) { mode=0; } stack.getTagCompound().setByte("mode", mode); if(!world.isRemote) { player.addChatMessage(new ChatComponentTranslation(mode == 0 ?"pickaxe.mode.message.0" : "pickaxe.mode.message.1" )); } } else { super.onItemRightClick(stack, world, player); } return stack; } public float getStrVsBlock(ItemStack stack, IBlockState state) { float speed = super.getStrVsBlock(stack, state); byte mode = stack.getTagCompound().getByte("mode"); if(mode == 1) return speed*2; else return speed*3; } }
comme ça ? mais j’ai toujours l’erreur
-
Qu’elle erreur précisément ? (log)
Et a tu bien changer la fonction par celle de la 1.7.10 ? (Donc celle qui n’utilise pas IBlockStats)EDIT : Bon, j’ai re-re-re-re-setup un projet en 1.7.10 (vive les maj eclipse qui bousille tous ^^" En même temps passer de Indigo à Luna, voila voila x) )
public float func_150893_a(ItemStack p_150893_1_, Block p_150893_2_) { return 1.0F; }
voila la fonction sur la dernier version de Forge en 1.7.10, dans la classe Item (elle est re-écrite ensuite sur la class ItemPickaxe)
Il faut que tu l’Override comme ceci :
public float func_150893_a(ItemStack stack, Block block) { float speed = super.func_150893_a(stack, block); // vitesse originel tirer de la classe ItemPickaxe // adapte ton switch en fonction des résultats possibles de ta variable (si tu n'as que deux mode, mais un if else, se sera peu être plus simple) switch(stack.getTagCompound().getByte("mode")) { case 1: return speed*2; case 2: return speed*3; default: return speed; } }
-
@‘Jodge’:
Qu’elle erreur précisément ? (log)
Et a tu bien changer la fonction par celle de la 1.7.10 ? (Donc celle qui n’utilise pas IBlockStats)EDIT : Bon, j’ai re-re-re-re-setup un projet en 1.7.10 (vive les maj eclipse qui bousille tous ^^" En même temps passer de Indigo à Luna, voila voila x) )
public float func_150893_a(ItemStack p_150893_1_, Block p_150893_2_) { return 1.0F; }
voila la fonction sur la dernier version de Forge en 1.7.10, dans la classe Item (elle est re-écrite ensuite sur la class ItemPickaxe)
Il faut que tu l’Override comme ceci :
public float func_150893_a(ItemStack stack, Block block) { float speed = super.func_150893_a(stack, block); // vitesse originel tirer de la classe ItemPickaxe // adapte ton switch en fonction des résultats possibles de ta variable (si tu n'as que deux mode, mais un if else, se sera peu être plus simple) switch(stack.getTagCompound().getByte("mode")) { case 1: return speed*2; case 2: return speed*3; default: return speed; } }
Merci beaucoup sa marche parfaitement mais derniere question comment je met le topic en resolus
-
C’est écrit dans le post important : https://www.minecraftforgefrance.fr/showthread.php?tid=7
-
@‘robin4002’:
C’est écrit dans le post important : https://www.minecraftforgefrance.fr/showthread.php?tid=7
je trouve pas le bouton editer de mon topic
-
il y a sur la première page, en dessous de ton premier message.