Résolu Texture 'pulling' arc
-
Bonjour, je me présente Eryah, et je vais aller vite cette fois, droit au problème
J’ai codé un arc ( Vegetal bow ) qui est 2x plus résistant. Donc voila, explication inutile, mais bon. J’aimerai faire sa proprement, ( pas comme certain mod) et faire l’animation de l’arc quand on tir
Le .java de l’arc ( C’est le même que celui de base, mais modifié légèrement )
package eryah.usefulthings.init; import eryah.usefulthings.CreativeTab; import eryah.usefulthings.Reference; import eryah.usefulthings.UsefulthingsMod; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.creativetab.CreativeTabs; 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.Item; import net.minecraft.item.ItemStack; import net.minecraft.stats.StatList; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.GameRegistry; public class VegeBow extends Item { public static final String[] bowPullIconNameArray = new String[] {"pulling_0", "pulling_1", "pulling_2"}; private static final String __OBFID = "CL_00001777"; public static Item vegetal_bow; public VegeBow() { this.maxStackSize = 1; this.setMaxDamage(768); this.setCreativeTab(UsefulthingsMod.UTTab); } public static void init(){ vegetal_bow = new Item().setUnlocalizedName("vegetal_bow").setCreativeTab(UsefulthingsMod.UTTabMat); } public static void register() { GameRegistry.registerItem(vegetal_bow,vegetal_bow.getUnlocalizedName().substring(5)); } public static void registerRenders() { registerRender(vegetal_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); } } } }
J’ai des hypothèse, mais j’ai pas trop envie d’expérimenter maintenant, je dois régler quelques problèmes prioritaires :
Les textures de l’arc de base se nomment bow_pulling_1, dans le code on voit qu’elles s’apelle juste pulling_1…
Je pense que c’est grâce à ceci : [font=Monaco, Consolas, Courier, monospacebowPullIconNameArray]
Donc, je pense que si je marque ceci : V[font=Monaco, Consolas, Courier, monospacebowPullIconNameArray ][font=ArialMes textures devront s’apeller Vbow_pulling_1, Vbow_standby … etc] -
La texture de l’arc de Minecraft n’est pas du tout géré dans la classe de l’arc. Ça passe par une autre classe, qu’on ne peut bien sûr pas modifier. C’est pour ça que forge ajoute la fonction getModel, à utiliser comme ça :
@Override public ModelResourceLocation getModel(ItemStack stack, EntityPlayer player, int useRemaining) { ModelResourceLocation modelresourcelocation = new ModelResourceLocation(NanotechHungerGames.MODID + ":bomber_bow", "inventory"); if(stack.getItem() == this && player.getItemInUse() != null) { if(useRemaining >= 18) { modelresourcelocation = new ModelResourceLocation(NanotechHungerGames.MODID + ":bomber_bow_pull2", "inventory"); } else if(useRemaining > 13) { modelresourcelocation = new ModelResourceLocation(NanotechHungerGames.MODID + ":bomber_bow_pull1", "inventory"); } else if(useRemaining > 0) { modelresourcelocation = new ModelResourceLocation(NanotechHungerGames.MODID + ":bomber_bow_pull0", "inventory"); } } return modelresourcelocation; }
C’est le code de NHG, ça fait un moment que j’y ai pas touché, ça date du début de la 1.8, il me semble qu’il y a juste eu un petit changement dessus :
https://github.com/MinecraftForge/MinecraftForge/issues/1623
https://github.com/MinecraftForge/MinecraftForge/commit/64bf7bb3bef588d414561b638a945e8653df6dc5
Donc il faudrait faire int useTime = this.getMaxDuration() - useRemaining; puis changer la texture en fonction de useTime et non de useRemaining.Attention à bien enregistrer les textures dans une fonction côté client (proxy ou directement classe principale avec un if(event.getSide().isClient()) :
registerItem(NHGItems.bomberBow, 0, NanotechHungerGames.MODID + ":bomber_bow"); registerItem(NHGItems.bomberBow, 1, NanotechHungerGames.MODID + ":bomber_bow_pull0"); registerItem(NHGItems.bomberBow, 2, NanotechHungerGames.MODID + ":bomber_bow_pull1"); registerItem(NHGItems.bomberBow, 3, NanotechHungerGames.MODID + ":bomber_bow_pull2"); ModelBakery.addVariantName(NHGItems.bomberBow, new String[] {NanotechHungerGames.MODID + ":bomber_bow", NanotechHungerGames.MODID + ":bomber_bow_pull0", NanotechHungerGames.MODID + ":bomber_bow_pull1", NanotechHungerGames.MODID + ":bomber_bow_pull2"});
La fonction registerItem :
public static void registerItem(Item item, int metadata, String identifier) { ItemModelMesher mesher = Minecraft.getMinecraft().getRenderItem().getItemModelMesher(); mesher.register(item, metadata, new ModelResourceLocation(identifier, "inventory")); }
-
Pfiou, tous cela m’a l’air bien plus compliqué de ce que je pensait…
Je pense que je vais abbandoner pour l’instant, je reprendrais plus tard, quand je serais assez expérimenté pour faire cela -
Bon, je me suis remis a ce topic
J’ai tenté, et j’ai foiréClasse du Clientproxy
registerItem(BladedBowDiamond.diamond_bladed_bow, 0, Reference.MOD_ID + ":diamond_bladed_bow_standby"); registerItem(BladedBowDiamond.diamond_bladed_bow, 1, Reference.MOD_ID + ":diamond_bladed_bow_pulling_0"); registerItem(BladedBowDiamond.diamond_bladed_bow, 2, Reference.MOD_ID + ":diamond_bladed_bow_pulling_1"); registerItem(BladedBowDiamond.diamond_bladed_bow, 3, Reference.MOD_ID + ":diamond_bladed_bow_pulling_2"); ModelBakery.addVariantName(BladedBowDiamond.diamond_bladed_bow, new String[] {Reference.MOD_ID + ":diamond_bladed_bow_standby", Reference.MOD_ID + ":diamond_bladed_bow_pulling_0", Reference.MOD_ID + ":diamond_bladed_bow_pulling_1", Reference.MOD_ID + ":diamond_bladed_bow_pulling_2"}); } private void registerItem(Item diamond_bladed_bow, int i, String identifier) { ItemModelMesher mesher = Minecraft.getMinecraft().getRenderItem().getItemModelMesher(); mesher.register(diamond_bladed_bow, i, new ModelResourceLocation(identifier, "inventory")); }
J’ai du utilisé la méthode registerItem auto généré, car celle de robin ne fonctionnait pas.
Classe de l’itme
@Override public ModelResourceLocation getModel(ItemStack stack, EntityPlayer player, int useRemaining) { ModelResourceLocation modelresourcelocation = new ModelResourceLocation(Reference.MOD_ID + ":diamond_bladed_bow_standby", "inventory"); if(stack.getItem() == this && player.getItemInUse() != null) { if(useRemaining >= 18) { modelresourcelocation = new ModelResourceLocation(Reference.MOD_ID + ":diamond_bladed_bow_pulling_0", "inventory"); } else if(useRemaining > 13) { modelresourcelocation = new ModelResourceLocation(Reference.MOD_ID + ":diamond_bladed_bow_pulling_1", "inventory"); } else if(useRemaining > 0) { modelresourcelocation = new ModelResourceLocation(Reference.MOD_ID + ":diamond_bladed_bow_pulling_2", "inventory"); } } return modelresourcelocation; }
Pour une fois, j’ai relu 3x mon code avant de demander de l’aide !
Je me demande : Faudrait-il un .json pour chaque phase de l’arc ?
Car l’arc de base à plusieurs .json- bow_standby.json
- bow_pulling_0.json
- bow_pulling_1.json
- bow_pulling_2.json
Il est assez tard à l’heure ou j’ecrit ce message ( 01:45 ), je vais dormir et je vais tester cela
Cela focntionne, mais je n’ai qu’une animation ( La pulling_0 je croit )
-
Ajoute des logs en mettant dedans la variable useRemaining pour voir jusqu’où cette valeur va.
-
Euh… je n’ai pas trop compris ce que tu veut dire
Je n’ai aps encore une troop grande expérience sur Java ( Mais je me lance sur OpenClassroom quand je serais en vacances ( Lieu )) donc je ne sais pas faire un logger
j’ai tenter de mettre un PrintIn dans une méthode else if(useRemaining), mais cela fait crasher mon jeu -
Si tu n’as pas de logger, fait un System.ou.println(useRemaining) dans la fonction getModel.
-
Déso, j’avais un crash, et je devais le regler
Quand je right click avec l’arc, ce la donne ça dans les logs0 0 71993 71986 71981 71975 71969 71963 0 0
Donc c’est bon, j’ai compris l’erreur, je vais faire des tests pour voir quels sont les meilleurs valeurs a mettre
(PS : j’ai un bug sur mon client Debug, sa me le lance en normal, idée de ce que cela pourrait être ? ) -
C’est à dire ? Si tu cliques sur debug, çà lance en debug.
-
eh bien non, moi ca ne me lance pas les consoles suplémentaires du débug, et quand je modfie une valeur, elle n’est pas modfié en temps réel
-
Il n’y a pas de console supplémentaire en debug, si tu as une autre page sur eclipse qui veut s’ouvrir c’est qu’il y a eu une erreur donc il faut que tu lances en version normale. çà arrive notamment quand un thread autre que celui principal crash.
-
Ah non c’est bon, mon Debug fonctionne.
Je le clos le sujet, en espérent ne jamais avoir a le re-ouvrir