-
@ImperoMaximo J’ai un peu regarder et en effet compliquer de simplement suivre les events d’équipement … Je trouve ça un peu dommage c’est quand même assez important …
Une personne à dit ceci:
A. add an event PlayerEvent.armorChangeEvent with properties Item oldArmor, newArmor B. Post the even in these methods: InventoryPlayer#clearInventory - armor removed InventoryPlayer#copyInventory - armor changed InventoryPlayer#damageArmor - armor removed (if damaged beyond repair) InventoryPlayer#decrStackSize - when stack is armorInventory slot InventoryPlayer#dropAllItems - obviously, armor removed InventoryPlayer#getStackInSlotOnClosing - why this removes armor is a mystery InventoryPlayer#setInventorySlotContents - change, add, or remove InventoryPlayer#readFromNBT - donning armorC’est pas facile facile tout ça … En espérant que tu t’y retrouve

Une fois que tu arrives à chopper un event qui dit qu’un stuff est équipé ou cassé ou retiré c’est facile.
-
Je vais essayer de m’y retrouver (je serai bien obligé si je veut que ca fonctionne) merci bcp
-
@ImperoMaximo D’après d’autres personnes cela ce passe bien pendant l’update tick player. Voici un code que j’ai pu trouver:
private boolean flag = true; @SubscribeEvent public void onPlayerTick(TickEvent.PlayerTickEvent event) { if(event.phase == TickEvent.Phase.START && event.side == Side.SERVER) { if(flag) { if(event.player.inventory.armorInventory[0] == MyItem) { flag = false; // DO STUFF } } else { if(event.player.inventory.armorInventory[0] == null) { flag = true; } } } }Je n’ai pas d’informations sur la version utilisé. Bonne programmation

-
merci je verrais tout cela demain merci encore
-
J’ai pas mal appris depuis les derniers messages (ça va vite hein ^^), voilà ce que j’ai trouvé en 1.15.2, tout ce qui touche aux effets est différent en 1.12.2 il me semble malheureusement:
J’ai voulu tester l’histoire d’infinité (toujours en 1.15.2), assez difficile peu de sujets sur ça …
public class DebugCommand { public static void register(CommandDispatcher<CommandSource> dispatcher) { dispatcher.register( LiteralArgumentBuilder.<CommandSource>literal("test") .executes(ctx -> cmdTest(ctx.getSource())) ); } private static int cmdTest(CommandSource src) { if (src.getEntity() instanceof PlayerEntity) { ((PlayerEntity) src.getEntity()).addPotionEffect(new EffectInstance(Effects.ABSORPTION, Integer.MAX_VALUE, 1, false, false, true)); } src.sendFeedback(new StringTextComponent(ChatFormatting.RED + "OK !"), false); return 1; } }Mettre une valeur négative retire immédiatement l’effet, cependant mettre
Integer.MAX_VALUEpermet d’y mettre 2147483647 secondes. (Le maximum possible), le compteur devient donc**:**.Tu me diras que 2147483647 secondes n’est pas l’infini, cependant je doute qu’une personne s’amusera a garder son jeu ouvert 68 ans, 35 jours, 3 heures, 14 minutes et 7 secondes pour au final te dire “il est nul ton mod, j’ai perdu l’effet de mon armure”

Plus qu’à voir si en 1.12.2 c’est similaire ou non !

Bonne programmation a toi et n’hésite pas a venir en MP si besoin

-
Salut, je pense avoir trouvé une solution, juste augmenter le temps de l’effet en permanence a chaque tick j’augmente le temps de l’effet mais au final, il faut aussi actualiser l’effet pour que le changement de la durée soit prise ne compte je me retrouve ainsi bloqué car l’effet continueras d’être réactualisé…
-
Mais tout les autres effets d’armure ne posent pas de soucis vu que s’ils sont réitérés cela ne change rien a leur fonctionnement
-
@ImperoMaximo https://mcreator.net/forum/62513/armor-health-boost-help
Même problème mais pas de solution donner ^^
Ils parlent bien d’incrémenté le compteur. Cependant je n’ai pas trouver comment en 1.15.2, rajouter l’effet reset en effet les coeurs rien ne change, impossible de modifier la duration de l’effet en cours.D’ailleurs en 1.15.2 :
onArmorStick :world, entity, stackdevientstack, world, entity
Nom de class des armures:ItemArmordevientArmorItemSi jamais tu décides à passer en 1.15.2 ça aide

Cependant n’ayant pas encore vu exactement comment créer une armure (et ne voulant pas simplement C/C du code sans le comprendre) je n’arrive pas à faire en sorte de faire fonctionner le onTickArmor pour essayer ma façon avec l’effet infini.Sois il faut que tu trouves comment modifier la “duration” de l’effet sans faire un new Effect, sois il faut que tu fasses comme j’ai expliqué un effet infini que tu retires dès qu’un item est perdu / retirer.
Je ne penses pas qu’il y à d’autre choix.
-
Oui cela ne me dérange pas de faire comme tu dis, mais il faut donc quand même actualiser régulièrement pour savoir si l’armure a été enlevée et remettre l’effet quand elle est de nouveau entière, cela ne résout pas vraiment le soucis :'
-
@ImperoMaximo En effet, rien ne change il faut toujours utiliser onArmorTick ou possiblement onPlayerTick, la façon reste la même car il n’y à en effet aucun event lors de retrait ou d’équipement de stuff ce qui est très malheureux car on est obliger de spam de vérification les events à chaque ticks

Mais sinon je ne comprends pas bien le soucis qu’il reste, du coup on sait qu’il faut obligatoirement passer par les ticks donc …
On vérifie le stuff, si complet et si pas l’effet en cours on lui met l’effet infini (Integer.MAX_VALUE).
Si le stuff n’est plus complet et qu’il possède l’effet (ça retournenullen 1.15.2 si l’entité n’a pas l’effet), on lui retire l’effet.J’ai peut être mal compris quelque chose.
-
@UtopiePhysique a chaque tick l’effet est enlevé et remplacé par le même ce qui fait qu le nombre de cœur ne peut pas augmenter vu que l’effet est remplacé 20fois par seconde
-
@ImperoMaximo Tu as surement pas vérifier si l’effet était déjà présent, si l’effet est déjà présent tu ne dois rien faire, ce qui fait que l’effet tu le mets infini et tu ne le remets pas tant qu’il est présent.
Et la deuxième vérification c’est le retrait / perte du stuff qui lui retire l’effet.
-
@UtopiePhysique mais après une perte comment le remettre s’il rééquipe l’armure ?
-
@ImperoMaximo On repart dans la boucle, il n’a pas l’effet + il à un stuff complet, on lui remet l’effet.
Les coeurs sont perdu c’est normal puisqu’il n’avait plus l’effet, et ils ne reset pas puisque l’effet est infini jusqu’à qu’il reperdre l’armure.En gros c’est 2 vérifications qui créer une boucle:
Stuff complet + pas d’effet: On lui met l’effet infini
Stuff retiré / cassé + l’effet: On lui retire l’effet -
@UtopiePhysique Bonsoir, je suis heureux de t’annoncer que grâce a toi j’ai (presque) réussi !! l’effet reste et ne recommence pas grâce a ce code que tu m’as suggéré dans onArmorTick()
if(isWearingFullSet(player, TutorialItems.SOLARIUM_HELMET, TutorialItems.SOLARIUM_CHESTPLATE, TutorialItems.SOLARIUM_LEGGINGS, TutorialItems.SOLARIUM_BOOTS) == false || player.isPotionActive(Potion.getPotionById(21)) == true) { player.removeActivePotionEffect(Potion.getPotionById(21)); } else { player.addPotionEffect(new PotionEffect(Potion.getPotionById(21), Integer.MAX_VALUE, 4, false, false)); }par contre l’effet se retire très mal lorsque j’enlève l’armure malgré le remove effect
-
Merci a @UtopiePhysique grâce a lui j’ai trouvé la solution, je la poste donc ici:
@Override public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) { boolean isDay = world instanceof World ? (((World)world).getWorldTime() % 24000 < 13000) : true; boolean iswearingfullset = isWearingFullSet(player, TutorialItems.SOLARIUM_HELMET, TutorialItems.SOLARIUM_CHESTPLATE, TutorialItems.SOLARIUM_LEGGINGS, TutorialItems.SOLARIUM_BOOTS); boolean havePotionEffect = player.isPotionActive(Potion.getPotionById(21)); if (isDay && iswearingfullset && !havePotionEffect) // jour && fullstuff && pas l'effet = on l'ajoute player.addPotionEffect(new PotionEffect(Potion.getPotionById(21), Integer.MAX_VALUE, 4, false, false)); else if(!isDay && iswearingfullset && havePotionEffect || !iswearingfullset && havePotionEffect) // pas jour && fullstuff && l'effet || pas fullstuff && effet = on le retire player.removePotionEffect(Potion.getPotionById(21)); } @SideOnly(Side.CLIENT) private boolean isWearingFullSet(EntityPlayer player, Item helmet, Item chestplate, Item leggings, Item boots) { return player.inventory.armorItemInSlot(3) != null && player.inventory.armorItemInSlot(3).getItem() == helmet && player.inventory.armorItemInSlot(2) != null && player.inventory.armorItemInSlot(2).getItem() == chestplate && player.inventory.armorItemInSlot(1) != null && player.inventory.armorItemInSlot(1).getItem() == leggings && player.inventory.armorItemInSlot(0) != null && player.inventory.armorItemInSlot(0).getItem() == boots; }Et voila cela fonctionne merci beaucoup

-
le dernier soucis est que graphiquement c’est pas beau, quand je retire les pièces d’armure, certains disparaissent graphiquement,d’autre non, parfois obligé de se /kill pour actualiser graphiquement