Résolu [1.7.x]Modifier la vie du joueur
-
Bonsoir à tous ! Je sollicite votre aide car malgré quelques recherches, je n’ai rien trouvé de très concret sur mon problème.
Je cherche à faire varié la vie du joueur en fonction d’une variable de mon Extended Entity Properties et je ne vois absolument pas comment m’y prendre sans modifier les classes vanilla. J’ai pourtant vu quelques mods comme ça, mais je suppose qu’ils utilisent une sorte de coremod pour modifier les classes des joueurs ?
Si oui, vous connaissez des api qui permettent de faire ça ?
Et aux passages, il va falloir modifier également la bar de vie, et je voulais savoir : Peut-on juste annulé l’évènement de son render comme la barre d’xp ou c’est plus compliqué ?Merci d’avance en tous cas !
-
Pour le render de la barre de vie
@ForgeSubscribe @SideOnly(Side.CLIENT) public void renderGameOverlay(RenderGameOverlayEvent.Pre event) { if(event.type == ElementType.HEALTH) { event.setCanceled(true); } }
c.f Robin
-
Ok, pas de soucis pour la barre de vie, ça confirme ce que je pensais.
Quelqu’un aurait une idée pour le reste ?
EDIT: Au passage, je crois que c’est plutot @SubscribeEvent plutot que @ForgeSubscribe ^^. -
Tu as la fonction setHealth(float) qui te permet de modifier la vie d’une EntityLivingBase.
Je ne sais pas si ça répond a ton problème, tu peux nous en dire plus sur ton Extended Entity Property ? -
Oui, j’ai continué mes recherches et je suis tombé sur la même fonction, j’étais justement en train de me demandé comment l’employer et si je pourrais l’utilisé sur le joueur.
Pour mon extended entity, bah c’est un truc sans aucune prétention, presque le même que le tuto de Gugu ^^(C’est pour dire, y a encore ces petits commentaires dedans ; D) .
J’ai juste créer une variable et je voudrais que quand on la monte, la vie maximal du joueur monte également.
Je peux vous filé le code mais c’est encore très … embryonnaire on va dire, je fais surtout sur papier pour le moment. -
Tu peux peut-être faire
@SubscribeEvent public void onPlayerTick(PlayerTickEvent e) { if(e.phase == TickEvent.Phase.START) { if(!e.player.getFoodStats().needFood() && e.player.getHealth() < laVieMaxDuJoueur) { e.player.setHealth(e.player.getHealth()+0.1F); } } }
-
Merci beaucoup, mais j’ai fait quelques tests a partir de la fonction que tu ma passé, la vie du joueur est effectivement régénéré mais, dans tout les cas on ne peut pas dépasser 20 points : Il doit y avoir un plafond défini pour Player.
Mais peut être que toutes les EntityLiving en on un. Ça va être compliquer du coup pour faire ce que je veux si c’est le cas…
EDIT : je viens de tombé sur ça : http://minecraft.gamepedia.com/Attribute
Je vais essayer de faire quelques choses avec, ça a l’air intéressant. -
Effectivement, tu risques de devoir utiliser l’instrospection pour surcharger la fonction public final float getMaxHealth() de EntityLivingBase.
-
Rebonjour !
Je me suis renseigné sur l’introspection et franchement je me voit mal utilisé ce truc avec mon niveau actuel en java.
Mais j’ai trouvé une solution : j’ai contacté le type qui a fait le mod dont je parlais plus haut et il m’a confirmé avoir utilisé un custom modifier pour affecter la vie du joueurs. J’ai cherché partout des tuto la dessus, je n’en ai trouvé nul parts.
Du coup, j’ai jeté un coup d’œil a son code source, j’ai trouvé la méthode qui m’intéresse mais tous est offuscated c’est pas pratique, et malgré le fait que se soit en 1.6.4, je n’arrive pas l’avoir avec BON. La voici :protected void c(ye par1ItemStack, abw par2World, uf par3EntityPlayer) { double valueToSet = 2.0D; try { valueToSet = par3EntityPlayer.a(tp.a).a(par3EntityPlayer.getPersistentID()).d() + 2.0D; } catch (Exception e) { } ot moreHealth = new ot(par3EntityPlayer.getPersistentID(), "Heart Crystal Health Boost", valueToSet, 0); os attributeinstance = par3EntityPlayer.a(tp.a); attributeinstance.b(moreHealth); attributeinstance.a(moreHealth); }
En gros, cette classe était la méthode “OnItemRightClic” d’un item. Lorsqu’on l’active, elle compte la valeur du modifier du joueur, le supprime , puis en ajoute un nouveau de valeur égal au précédent + 2.0D et enfin l’enregistre.
J’ai reussie a comprendre que tp correspond à SharedMonsterAttributes, os à IAttributeInstance, et ot a AttributeModifier, mais je n’arrive pas a voir quel méthode sont appelés. Quelqu’un aurait-il une idée du nom des fonctions qui sont masqués ? -
MD: uf/a ()V net/minecraft/entity/player/EntityPlayer/func_70088_a ()V
func_70088_a,entityInit,2,
Donc par3EntityPlayer.a = player.entityInit(FD: tp/a net/minecraft/entity/SharedMonsterAttributes/field_111267_a
field_111267_a,maxHealth,2,
Donc tp.a = SharedMonsterAttributes.maxHealth
etc …Je te laisse chercher, il te faut juste un setup de forge en 1.6.4 avec forge gradle, puis va dans le dossier forge-1.6.4\build\unpacked\conf
Ici, tu as le fichier packaged.srg, dedans il y a toutes les correspondances des noms a , b, c, d, etc … vers field_xxx, fonc_xxx et le nom des classes.
Ensuite dans forge-1.6.4\build\unpacked\mappings tu as les fichiers fields.csv et methods.csv, dans le premier tu as les correspondances de field_xxx vers le nom correcte et dans le second la même chose pour les méthodes.(En passant, c’est pas bien de décompiler un mod sans l’accord de l’auteur …).
-
Oaui, je sais, mais j’ai vraiment pas eu d’autres solutions, ça fait 3 jours que je cherche partout ces 50 caractères de code …
En plus j’ai même pas tout decompilé, juste une pitite méthode. Je pence qu’il m’en voudra pas :x
Sinon merci beaucoup, je savais qu’il y avait surment une sorte de “tableau de correspondance” dans les files de graddle, mais pour la 1.6.4 j’étais encore sous MCP et j’ai pas trouvé .:PJe vous dirais si ça marche !
Encore un petit problème, mais on commence a en voir le boue !
Dans le code source, nous avions :os attributeinstance = par3EntityPlayer.a(tp.a);
Ce qui, après relecture donne :
IAttributeInstance attributeinstance = par3EntityPlayer.entityInit(SharedMonsterAttributes.maxHealth);
Problème : J’ai une erreur sur entityInit, qui est protected et ne prend pas de paramètre :
protected void entityInit() { super.entityInit(); this.dataWatcher.addObject(16, Byte.valueOf((byte)0)); this.dataWatcher.addObject(17, Float.valueOf(0.0F)); this.dataWatcher.addObject(18, Integer.valueOf(0)); }
Donc ou j’ai du faire une erreurs en relisant le tableau et c’est une autre fonction qui va a la place, ou bien j’ai … autre chose ?
-
En effet ça peut pas être ça, il chercher la fonction qui accepte un attribue en argument. Elle est surement dans une classe mère.
-
Je repost pour vous dire que j’ai fini par trouvé, voilà le code que j’utilise finalement:
AttributeModifier moreHealth = new AttributeModifier(par3EntityPlayer.getPersistentID(), "Minefus Caracteristique Health Boost", valueToSet, 0);// On déclare un AttributeModifier pour par3EntityPlayer, on lui donne un ID, un nom, une valeur et le type d'opération qui va être effectuer. IAttributeInstance attributeinstance = par3EntityPlayer.getEntityAttribute(SharedMonsterAttributes.maxHealth); // Nouvelle instance de AttributeInstance, qui pointe sur l'Attribute "MaxHealth" joueur. attributeinstance.removeModifier(moreHealth); // On supprime les éventuelles AttributeModifier du même nom de l'AttributeInstance . attributeinstance.applyModifier(moreHealth);// On applique finalement l'AttributeModifier sur l'AttributeInstance
Voilà ! Avec ce code, plusieurs mod qui affecte la vie du joueur peuvent fonctionné sans conflis, j’ai testé, c’est génial.
Merci beaucoup a tout ceux qui m’ont aider pour y arrivé, c’était vraiment une prise de tête, vous devriez faire un tutoriel sur les Attribute & Modifier, c’est super utile !
Vous pouvez mettre en “Résolu”. -
Désolé du UP, mais ces bouts de code tu les mets où exactement ?