Résolu Arc Custom
-
Bonjour, je me présente Eryah. Dans mon mod, j’aimerai inclure quelque chose que j’ai toujours voulu dans minecraft. Un Arc avec des lames.
J’ai donc commencé a travailler sur la classe de base de l’arc.
Mais la…. Je bloque
J’ai recherché un peu partout, très peut de tuto pour un arc, presque tous Outdated
J’aimerai recevoir quelques aide par rapport à ces quelques fonctions, que je voudrais que mon arc remplisse- Inflige 4, 5 , 6 , 7 points de dégâts selon le matériaux
- A une résistance augmenté
- Bien sur, a une texture pulling adapté
Sa fait peut, mais bon, c’est surement complexe pour mon niveau ( surtout la texture pulling )
Classe actuelle de mon arc ( Ici en bois, mais çe sera la même à quelques valeurs pour les autres matériaux )
package eryah.usefulthings.init; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.init.Items; import net.minecraft.item.EnumAction; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.stats.StatList; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.GameRegistry; import eryah.usefulthings.Reference; import eryah.usefulthings.UsefulthingsMod; public class BladedBowWood extends Item { public static final String[] bowPullIconNameArray = new String[] {"pulling_0", "pulling_1", "pulling_2"}; public static Item wooden_bladed_bow; public BladedBowWood() { this.maxStackSize = 1; this.setMaxDamage(384); } public static void init(){ wooden_bladed_bow = new Item().setUnlocalizedName("wooden_bladed_bow").setCreativeTab(UsefulthingsMod.UTTab); } public static void register() { GameRegistry.registerItem(wooden_bladed_bow, wooden_bladed_bow.getUnlocalizedName().substring(5)); } public static void registerRenders() { registerRender(wooden_bladed_bow); } public static void registerRender(Item item) { Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, 0, new ModelResourceLocation(Reference.MOD_ID + ":" + item.getUnlocalizedName().substring(5), "inventory")); } /** * Called when the player stops using an Item (stops holding the right mouse button). * * @param timeLeft The amount of ticks left before the using would have been complete */ public void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityPlayer playerIn, int timeLeft) { int j = this.getMaxItemUseDuration(stack) - timeLeft; net.minecraftforge.event.entity.player.ArrowLooseEvent event = new net.minecraftforge.event.entity.player.ArrowLooseEvent(playerIn, stack, j); if (net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(event)) return; j = event.charge; boolean flag = playerIn.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, stack) > 0; if (flag || playerIn.inventory.hasItem(Items.arrow)) { float f = (float)j / 20.0F; f = (f * f + f * 2.0F) / 3.0F; if ((double)f < 0.1D) { return; } if (f > 1.0F) { f = 1.0F; } EntityArrow entityarrow = new EntityArrow(worldIn, playerIn, f * 2.0F); if (f == 1.0F) { entityarrow.setIsCritical(true); } int k = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, stack); if (k > 0) { entityarrow.setDamage(entityarrow.getDamage() + (double)k * 0.5D + 0.5D); } int l = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, stack); if (l > 0) { entityarrow.setKnockbackStrength(l); } if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, stack) > 0) { entityarrow.setFire(100); } stack.damageItem(1, playerIn); worldIn.playSoundAtEntity(playerIn, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F); if (flag) { entityarrow.canBePickedUp = 2; } else { playerIn.inventory.consumeInventoryItem(Items.arrow); } playerIn.triggerAchievement(StatList.objectUseStats[Item.getIdFromItem(this)]); if (!worldIn.isRemote) { worldIn.spawnEntityInWorld(entityarrow); } } } /** * Called when the player finishes using this Item (E.g. finishes eating.). Not called when the player stops using * the Item before the action is complete. */ public ItemStack onItemUseFinish(ItemStack stack, World worldIn, EntityPlayer playerIn) { return stack; } /** * How long it takes to use or consume an item */ public int getMaxItemUseDuration(ItemStack stack) { return 72000; } /** * returns the action that specifies what animation to play when the items is being used */ public EnumAction getItemUseAction(ItemStack stack) { return EnumAction.BOW; } /** * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer */ public ItemStack onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn) { net.minecraftforge.event.entity.player.ArrowNockEvent event = new net.minecraftforge.event.entity.player.ArrowNockEvent(playerIn, itemStackIn); if (net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(event)) return event.result; if (playerIn.capabilities.isCreativeMode || playerIn.inventory.hasItem(Items.arrow)) { playerIn.setItemInUse(itemStackIn, this.getMaxItemUseDuration(itemStackIn)); } return itemStackIn; } /** * Return the enchantability factor of the item, most of the time is based on material. */ public int getItemEnchantability() { return 1; } }
Pour les dégâts , j’ai ma petite idée
Dans le constructeur, j’ai marqué this. et fait un ctrl+space
j’ai donc vu plusieurs méthodes qui pourrait remplir cette fonction, mais je n’en suis pas sur car Damage, c’est les dégats, mais aussi la MetaData !- getDamage()
- getMaxDamage()
- setDamage()
Je pense qu’aucune de ces méthodes n’est la bonne mais bon ^^'
-
@‘Eryah’:
- Inflige 4, 5 , 6 , 7 points de dégâts selon le matériaux
- A une résistance augmenté
- Bien sur, a une texture pulling adapté
- selon le matériau ? C’est à dire ?
- Le nombre de tire avant que l’arc se casse ? Il suffit d’augmenter la valeur dans la fonction setMaxDamage.
- Là aussi pas assez clair, détail ce que tu veux faire.
-
Il y aura un Wooden Bladed Bow, un Stone Bladed Bow, un Iron, Gold et Diamond
Sinon pour la texture pulling, j’aimerai que ce soit comme l’arc de base. Quand on right click, l’arc se charge, avec la corde qui bouge et tout -
Pour le pulling je l’ai déjà expliqué : http://minecraftforgefrance.fr/showthread.php?tid=2164&pid=24595#pid24595
Et pour les matériaux il faut faire plusieurs arcs et pour les dégâts c’est dans onPlayerStoppedUsing, c’est la valeur de f. -
La méthode OnPlayerStoppedUsed me donne ceci
this.onPlayerStoppedUsing(stack, worldIn, playerIn, timeLeft);
quelle est la valeur des dégats ? -
Dans la fonction onPlayerStoppedUsing :
float f = (float)j / 20.0F; f = (f * f + f * 2.0F) / 3.0F; if ((double)f < 0.1D) { return; } if (f > 1.0F) { f = 1.0F; }
-
Ce n’est pas les dégats des flèches ces valeurs ?
Je voudrais que sa soit comme un épée, un arc épée -
ah d’accord.
Dans ce cas il suffit d’ajouter : public float getDamageVsEntity() { return 2.0F; }
-
Merci
Je lance le client pour test
Err, non le bloc magique violet et noir n’inflige toujours pas les dégats d’un épée
-
Je rapelle que ce topic existe
Et j’aimerai quand même que cela fonctionne
Tous est bon, sauf les dégats, l’arc n’inflige toujours pas de dégats
Petit problème supplémentaire :- Impossible d’enchanter les arcs autrement qu’en Solidité
Classe de l’un des arc (Ici en fer)
package eryah.usefulthings.init; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.init.Items; import net.minecraft.item.EnumAction; import net.minecraft.item.Item; import net.minecraft.item.ItemBow; import net.minecraft.item.ItemStack; import net.minecraft.stats.StatList; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.GameRegistry; import eryah.usefulthings.Reference; import eryah.usefulthings.UsefulthingsMod; public class BladedBowIron extends ItemBow { public static final String[] bowPullIconNameArray = new String[] {"pulling_0", "pulling_1", "pulling_2"}; public static Item iron_bladed_bow; public BladedBowIron() { this.maxStackSize = 1; this.setMaxDamage(384); } public static void init(){ iron_bladed_bow = new BladedBowIron().setUnlocalizedName("iron_bladed_bow").setCreativeTab(UsefulthingsMod.UTTab); } public static void register() { GameRegistry.registerItem(iron_bladed_bow, iron_bladed_bow.getUnlocalizedName().substring(5)); } public static void registerRenders() { registerRender(iron_bladed_bow); } public static void registerRender(Item item) { Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, 0, new ModelResourceLocation(Reference.MOD_ID + ":" + item.getUnlocalizedName().substring(5), "inventory")); } public float getDamageVsEntity() { return 6.0F; } /** * Called when the player stops using an Item (stops holding the right mouse button). * * @param timeLeft The amount of ticks left before the using would have been complete */ public void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityPlayer playerIn, int timeLeft) { int j = this.getMaxItemUseDuration(stack) - timeLeft; net.minecraftforge.event.entity.player.ArrowLooseEvent event = new net.minecraftforge.event.entity.player.ArrowLooseEvent(playerIn, stack, j); if (net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(event)) return; j = event.charge; boolean flag = playerIn.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, stack) > 0; if (flag || playerIn.inventory.hasItem(Items.arrow)) { float f = (float)j / 20.0F; f = (f * f + f * 2.0F) / 3.0F; if ((double)f < 0.1D) { return; } if (f > 1.0F) { f = 1.0F; } EntityArrow entityarrow = new EntityArrow(worldIn, playerIn, f * 2.0F); if (f == 1.0F) { entityarrow.setIsCritical(true); } int k = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, stack); if (k > 0) { entityarrow.setDamage(entityarrow.getDamage() + (double)k * 0.5D + 0.5D); } int l = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, stack); if (l > 0) { entityarrow.setKnockbackStrength(l); } if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, stack) > 0) { entityarrow.setFire(100); } stack.damageItem(1, playerIn); worldIn.playSoundAtEntity(playerIn, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F); if (flag) { entityarrow.canBePickedUp = 2; } else { playerIn.inventory.consumeInventoryItem(Items.arrow); } playerIn.triggerAchievement(StatList.objectUseStats[Item.getIdFromItem(this)]); if (!worldIn.isRemote) { worldIn.spawnEntityInWorld(entityarrow); } } } /** * Called when the player finishes using this Item (E.g. finishes eating.). Not called when the player stops using * the Item before the action is complete. */ public ItemStack onItemUseFinish(ItemStack stack, World worldIn, EntityPlayer playerIn) { return stack; } /** * How long it takes to use or consume an item */ public int getMaxItemUseDuration(ItemStack stack) { return 72000; } /** * returns the action that specifies what animation to play when the items is being used */ public EnumAction getItemUseAction(ItemStack stack) { return EnumAction.BOW; } /** * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer */ public ItemStack onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn) { net.minecraftforge.event.entity.player.ArrowNockEvent event = new net.minecraftforge.event.entity.player.ArrowNockEvent(playerIn, itemStackIn); if (net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(event)) return event.result; if (playerIn.capabilities.isCreativeMode || playerIn.inventory.hasItem(Items.arrow)) { playerIn.setItemInUse(itemStackIn, this.getMaxItemUseDuration(itemStackIn)); } return itemStackIn; } /** * Return the enchantability factor of the item, most of the time is based on material. */ public int getItemEnchantability() { return 1; } @Override public ModelResourceLocation getModel(ItemStack stack, EntityPlayer player, int useRemaining) { ModelResourceLocation modelresourcelocation = new ModelResourceLocation(Reference.MOD_ID + ":iron_bladed_bow_standby", "inventory"); if(stack.getItem() == this && player.getItemInUse() != null) { if(useRemaining >= 71985) { modelresourcelocation = new ModelResourceLocation(Reference.MOD_ID + ":iron_bladed_bow_pulling_0", "inventory"); } else if(useRemaining > 71979) { modelresourcelocation = new ModelResourceLocation(Reference.MOD_ID + ":iron_bladed_bow_pulling_1", "inventory"); } else if(useRemaining > 0) { modelresourcelocation = new ModelResourceLocation(Reference.MOD_ID + ":iron_bladed_bow_pulling_2", "inventory"); } } return modelresourcelocation; } }
-
Dégâts au corps à corps ou à distance ?
Pour l’enchantement, je ne sais pas comment ils fonctionnent en 1.8. Fais quelques recherches de ton côté. -
@‘Eryah’:
Ce n’est pas les dégats des flèches ces valeurs ?
Je voudrais que sa soit comme un épée, un arc épée -
Donc corps à corps ?
-
Je pensais que c’était clair
Dans les précédent messages, j’ai dis pas mal de fois que je voulait faire un arc épée, et le nom de mon item est BLADED bow -
“faire un arc épée” n’est pas français.
Je ne sais pas si je te l’ai déjà dit mais il y a quelques trucs à faire quand on voit que changer le code ne sert à rien (retiens bien cette liste, elle te servira par la suite dès qu’un truc ne fonctionne pas) :
- regarder si la méthode est appelée, par exemple en rajoutant un System.out.prinln.
- s’il en s’affiche pas, n’oublie pas l’annotation @Override : elle te permet de savoir si tu as le bon nom de fonction et les bons paramètres. Pour éviter çà, tu peux toujours utiliser Alt + shift + S puis override/implement methods pour choisir la méthode.
- Si toujours rien ne s’affiche, sélectionne le nom de la fonction et fait “Open call hierarchy” pour voir quand ta méthode est appelée, si tu vois que ta méthode n’est ajamais appelée, il y a 2 possibilités : le nom n’est pas bon, ou les paramèters ne sont aps bons, ou la méthode est appelée via un l’ASM.
- Si toujours rien, regarde comment Minecraft fait.
Fait cette méthode et tu verras normalement d’où vient le problème. Si tu ne trouves pas c’est que tu n’as pas tout lu.
-
Je sais que ce n’est pas français, mais en gros c’est un arc, et une épée, dans le même item
Il semble que la méthode que m’
-
Je sais que ce n’est pas français, mais en gros c’est un arc, et une épée, dans le même item
Il semble que la méthode que m’a donné robin, n’est plus valide
@Override public float getDamageVsEntity() { return 6.0F; }
J’ai tenter de faire un OnLeftClickOnEntity (Ou un truc comme ça ), mais peu concluant
-
Regarde le message précédent. Tu n’as pas fait ce que je t’ai dit : regarde comment c’est fait dans les classes de Minecraft, j’ai trouvé pendant que j’écrivais le message précédent.
-
J’ai tout tenté, et dans minecraft, c’est géré comme çela ( Classe de l’épée )
public float getDamageVsEntity() { return this.material.getDamageVsEntity(); }
J’ai tenté de l’adapter a mon code, et peut concluant
public float getDamageVsEntity(float f) { return getDamageVsEntity(6.0F); }
-
Il y en a un autre, regarde la classe entière.