Résolu Enchant, multi texture & doublon
-
Résumer des réponses :
“Capter” les enchantements d’un Item
Pour récupéré les enchantements d’un ItemStack :itemStack.isItemEnchanted(); itemStack.getEnchantmentTagList();
Pour récupéré les information sur l’enchantement
EnchantmentHelper.getEnchantmentLevel(ItemStack) EnchantmentHelper.getEnchantments(ItemStack)
Utilisé plusieurs texture sur un objet (avec “getModel”, et non pas superposition)
Ajouter dans le constructeur ceci :ModelBakery.addVariantName(this, new String[] {modid + ":" + json1, modid + ":" + json2, …});
avec chacun des variantes de texture utilisé.
N’effectuer une action qu’une fois :
coté serveur :if(!world.isRemote)
coté client:
if(world.isRemote)
-
itemStack.isItemEnchanted()
itemStack.getEnchantmentTagList()
Tu cherches ces fonctions ?Il y a aussi la classe EnchantmentHelper, avec les fonctions getEnchantmentLevel(stack) et getEnchantments(stack)
-
Merci, j’ai enfin réussis a régler le 2eme problème grâce a toi En faite, j’avais juste pas penser à regarder au niveau de ItemStack ^^’
J’avais vue la fonction sur EnchantmentHelper, mais j’ai aucune idée de ce a quoi correspond le type MapFinalement, je suis partie sur la fonction “attackTargetEntityWithCurrentItem” de EntityPlayer, que j’ai copier puis adapter afin d’avoir une base plus saine et complètes dans ma classe Weapons.
Je laisse encore un peu ouvert le sujet si quelqu’un peu me dépatouiller pour le premier problème, mais ont peu consideré comme résolus le cas échéant. -
Je ne crois pas qu’on puisse gérer ça. Les achievements sont hardcodé, donc ce n’est pas évidant de faire en sorte qu’un item soit restreint en achievement.
-
Il est toujours possible de modifier les enums avec l’EnumHelper
-
@‘SCAREX’:
Il est toujours possible de modifier les enums avec l’EnumHelper
c’est une piste a explorer, mais j’ai peur que ce soit plus compliquer puisqu’il faut aussi modifier la méthode “canEnchantItem” de l’Enum… Je vais m’y pencher demain moi.
-
J’up le sujet, car j’ai changé mon problème (plutôt que de créer des nouveau sujet a chaque petit problème ^^')
-
Il vaut mieux créer un nouveau sujet à chaque fois, comme çà si quelqu’un a le même problème, ce sera plus simple de trouver le sujet.
Pour les models : regarde dans les logs si le fichier est trouvé.
-
Les JSON ajoutés avec la fonction getModel doivent être enregistré, je ne connais plus par coeur la fonction, je ne pourrai que te la donner demain soir. (Je suis pas chez moi, je suis sur mon téléphone).
-
Alors, sur les log en cours d’exécution, je n’ai pas de message d’erreur indiquant que le fichier est manquant (comme c’étais le cas pour certain autre item).
concernant l’enregistrement des fichier .JSON, je l’avais déjà compris. Si j’ai bien compris, il suffit d’enregistrer comme s’il s’agissait d’une autre métadata de l’item
Main.proxy.registerItemTexture(this, 0, getUnlocalizedNameAlone(), modid); Main.proxy.registerItemTexture(this, 1, getUnlocalizedNameAlone() + "Using", modid);
Le problème est que dans cette ordre, cela fonctionne sans problème pour le modèle par défaut (0), mais pas du tout pour le modèle avec “getModel” (1)
En revanche, si j’échange les deux, alors le résultat est inversé. Celui par défaut (0) ne fonctionne pas, en revanche, celui avec “getModel” (1) lui fonctionne ( en utilisant le le modèle enregistrer sur la métadata 1 évidemment ).
Main.proxy.registerItemTexture(this, 0, getUnlocalizedNameAlone() + "Using", modid); Main.proxy.registerItemTexture(this, 1, getUnlocalizedNameAlone(), modid);
Evidemment, je rappel que les fichier .json sont STRICTEMENT identique, a l’exception du nom
-
, getUnlocalizedNameAlone() + “Using” tu disais pas que c’était “_using” ?
-
C’est cette fonction qu’il te manque
:
ModelBakery.addVariantName(NHGItems.backStabberKnife, new String[] {NanotechHungerGames.MODID + “:item_back_stabber_normal”, NanotechHungerGames.MODID + “:item_back_stabber_ready”});
Premier argument : l’item
Deuxième argument : tableau de string avec le nom des JSON.
À mettre côté client seulement. -
Il faut mettre cette fonction ou précisément ? J’ai tenter dans clientProxy, mais elle ne semble pas fonctionner, et j’ai tenter dans la classe de mon item comme cela (que j’appelle dans mon constructeur au passage) :@SideOnly(Side.CLIENT) public JScythe multiTexture(String modid) { ModelBakery.addVariantName(this, new String[] {modid + ":" + getUnlocalizedNameAlone(), modid + ":" + getUnlocalizedNameAlone() + "Using"}); return this; }
Mais cela ne semble pas fonctionné aussi (aucun message d’erreur)EDIT : Autant pour moi, j’avais mal appeler la fonction, j’avais utilisé multiTextue(modid + “:”) mais les “:” étais déjà intégrer ^^"
Merci pour la résolution !
-
N’oublie pas la balise résolu.
-
J’ai hésité a fermer les sujets, puis en ré-ouvrir un, mais au final, j’ai tellement de question en suspense, de chose qui m’échappe sur Forge, qu’au final, j’ai décider d’essayer de faire de se sujet, une sort de FAQ de toute mes questions. Si l’idée ne vous plait pas, n’hésiter pas a le dire, si vraiment, cela s’avères nul, je fermerai le sujet, et en ré-ouvrirai à coté.
Maintenant, voila la question actuel :
:::
Et c’est re partie pour des questions ^^’ Bien dormis au moins ? X)public void onPlayerStoppedUsing(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn, int timeLeft) { AxisAlignedBB hitArea; int x = itemStackIn.getMaxItemUseDuration() - timeLeft; if (x > 50) { x = 50; } Double bonus = 1.0D + (x / 25); // 1 + (limite max - temps restant) / tickParSeconde Float damageMultiplier = 0.75F ; rightCombo++; if(playerIn.isSneaking()) { hitArea = new AxisAlignedBB(playerIn.posX, playerIn.posY, playerIn.posZ, playerIn.posX + 1.0D, playerIn.posY + 1.0D, playerIn.posZ + 1.0D).expand(bonus, 0.0D, bonus); } else { hitArea = new AxisAlignedBB(playerIn.posX, playerIn.posY + 1.0D, playerIn.posZ, playerIn.posX + 1.0D, playerIn.posY + 2.0D, playerIn.posZ + 1.0D).expand(bonus, 0.0D, bonus); damageMultiplier += 0.5F; } damageMultiplier *= (0.25F + (float) (bonus / 4.0D))*(3.0F/2.0F) * (0.5F/rightCombo + 0.5F); List entityList = playerIn.worldObj.getEntitiesWithinAABBExcludingEntity(playerIn, hitArea); for (int i = 0; i < entityList.size(); i++) { if(entityList.get(i) instanceof EntityLivingBase) { JFunction.dealDamage(playerIn, (EntityLivingBase) entityList.get(i), damageMultiplier, false); } } }
Voici ma fonction permettant de gérer mon attaque sur le clic droit.
Le problème étant que pour une raison qui m’échappe, la fonction est appeler deux fois à la suite, à chaque fois que je lâche le clic.
Les dégâts ne sont bien infliger qu’une fois, le problème étant plus sur la variable combo, qui se retrouve implémenter deux fois trop vite, réduisant les dégât du spam clic bien trop rapidement.Ma question du jour étant : Est ce normal que la fonction s’active deux fois, ou est ce que cela est dus à autre chose (sachant que je n’appelle cette fonction nul part ailleurs)
::: -
C’est une question de client / serveur. La plupart des méthodes sont appelés une fois en client et une fois en serveur à chaque fois. Donc deux fois au total.
Il faut utiliser la condition if(!world.isRemote) pour faire les actions que côté serveur.Petite remarque, dans ton code tu devrais utiliser double et float et non Double et Float. C’est juste un majuscule qui change en apparence, mais float et double sont des primitives alors que Float et Double sont des objets. Et il ne s’exécute pas du tout à la même vitesse.
Et oui il est mieux de créer plusieurs discussions de tel sorte que une discussion = un problème.
Pour une simple raison, actuellement ta discussion s’appelle “Les petits problèmes à Jodge”. Si quelqu’un a le même problème, jamais il ne viendra voir cette discussion. Et sur google il a aucune chance que cette discussion soit trouvé en tapant “fonction pour obtenir les enchantements d’un item”.
À l’inverse avec un titre clair et une discussion par problème on peut trouver beaucoup mieux sur google / avec une recherche sur le fofo. -
Ha ouai, je connaissais pas ^^ Merci pour l’astuce ^^
Pour Float ou float, je connais pas la différence de temps d’exécution, donc je te fait confiance ^^
Pour la discussion, okay, je clos, le sujet et j’en réouvrirai d’autre ^^