MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Effet de healt-boost réitéré a chaque tick

    Planifier Épinglé Verrouillé Déplacé Résolu 1.12.x
    1.12.2
    22 Messages 2 Publieurs 1.4k Vues 2 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • I Hors-ligne
      ImperoMaximo
      dernière édition par

      Salut, oui encore moi avec mes histoires de soleil et de lune 😉
      Je suis en train de coder une des armures de mon mod et j’ai réussi a faire la texture, le matériau et les effets sans soucis, enfin presque car j’ai UN soucis, lors du port complet de mon armure grâce a cette méthode:

      	@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;
      	}
      

      cela donne au joueur un effet, celui-ci (extrait de ma classe):

      	@Override
      	public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) {
      
      		boolean isDay = world instanceof World ? (((World)world).getWorldTime() % 24000 < 13000) : true;
      
      		if(isDay && isWearingFullSet(player, TutorialItems.SOLARIUM_HELMET, TutorialItems.SOLARIUM_CHESTPLATE, TutorialItems.SOLARIUM_LEGGINGS, TutorialItems.SOLARIUM_BOOTS)) {
      			player.addPotionEffect(new PotionEffect(Potion.getPotionById(21), 220, 4));
      		}
      

      mais vu que cet effet est réitéré a chaque tick, les cœurs supplémentaires ne se chargent pas vu que l’effet est réinitialisé a chaque tick, ma question est donc la suivante: comment garder l’effet sur mon armure sans qu’il se réinitialise a chaque tick et l’enlever lorsque mon armure n’est plus complète, j’ai déjà fais des recherches mais je n’ai rien trouvé de concluant, merci d’avance toute piste est la bienvenue.

      1 réponse Dernière réponse Répondre Citer 0
      • I Hors-ligne
        ImperoMaximo
        dernière édition par

        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 😉

        1 réponse Dernière réponse Répondre Citer 1
        • U Hors-ligne
          UtopiePhysique
          dernière édition par UtopiePhysique

          Salut,

          Pourquoi ne pas vérifier le port complet si un objet est équipé, si c’est le cas healthboost à l’infini et si un item est retiré ou cassé alors retirer l’effet, tout simplement?

          Pour le retirer il suffit de passer le temps à 0 ou 1 il me semble.

          Ce serait bien plus pratique et beaucoup moins gourmand, spam une fonction à chaque tick est loin d’être une bonne idée.

          Je pars du principe où, moins une fonction tournera, mieux ce sera pour le serveur.

          1 réponse Dernière réponse Répondre Citer 0
          • I Hors-ligne
            ImperoMaximo
            dernière édition par

            Bonjour, tout d’abord merci pour cette réponse, et j’essaierais ta proposition des que possible, tout d’abord si je met le temps a chaque tick c’est que dans les tutos pour armures ils procèdent comme suivant, et est ce que tu sais comment mettre l’effet infini? (Je comprendrais que tu me dise de chercher sinon 😉 )

            1 réponse Dernière réponse Répondre Citer 0
            • U Hors-ligne
              UtopiePhysique
              dernière édition par

              Je vais te dire honnêtement je suis développeur web & web mobile à la base, pas dans le modding, je suis en train d’apprendre et je n’ai pas essayer de voir ce style de tuto.

              Je trouve ça étrange de faire un truc aussi barbare, du moins je ne connais pas tant que ça le Java c’est peut être “normal” mais je penses que ça doit être sacrément lourd.

              Je te réponds avec une logique de programmation simpliste.

              Par principe on à un event quand on équipe ou retire/perd une pièce d’armure (normalement).
              À partir de la pour moi je préfère opter pour agir sur ces events que spam un effet.
              Cependant je n’y connais pas des masses en mod minecraft, il y à peut être une réel logique derrière.

              D’après ce que j’ai pu lire en cherchant give infinite effect minecraft 1.12.2 forge sur google sur le sujet Infinite potion effect? la personne dit: It might be because the duration is stored as an integer, and 27:20ish is right around the signed integer max value (32767). A negative duration is likely interpreted as being infinite.

              Elle explique que la personne qui essaye de mettre une potion infini avec une grosse valeur n’y arrive pas car la valeur maximal est 32767 ce qui correspond approximativement à 27 minutes et 20 secondes.
              Et que probablement un nombre négatif permettrait de faire un effet infini.

              Dans l’attente d’une réponse d’un expert, je te donnes mon point de vu, qui est peut être stupide et que je n’ai pas la vision qu’il faut avec ce langage et la façon dont marche Minecraft.

              Je vais essayer l’effet de potion en 1.15.2 et je te dirais 🙂

              1 réponse Dernière réponse Répondre Citer 0
              • I Hors-ligne
                ImperoMaximo
                dernière édition par

                Ok merci beaucoup a toi de te renseigner pour m’aider, et pour que ton idée fonctionne (mettre un temps infini) il faudrait que la méthode soit update régulièrement au cas ou l’armure est enlevée, je te souhaite aussi bonne chance pour le modding 😉

                U 1 réponse Dernière réponse Répondre Citer 0
                • U Hors-ligne
                  UtopiePhysique @ImperoMaximo
                  dernière édition par UtopiePhysique

                  @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 armor
                  

                  C’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.

                  1 réponse Dernière réponse Répondre Citer 0
                  • I Hors-ligne
                    ImperoMaximo
                    dernière édition par

                    Je vais essayer de m’y retrouver (je serai bien obligé si je veut que ca fonctionne) merci bcp

                    U 1 réponse Dernière réponse Répondre Citer 0
                    • U Hors-ligne
                      UtopiePhysique @ImperoMaximo
                      dernière édition par UtopiePhysique

                      @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 😄

                      1 réponse Dernière réponse Répondre Citer 0
                      • I Hors-ligne
                        ImperoMaximo
                        dernière édition par ImperoMaximo

                        merci je verrais tout cela demain merci encore

                        1 réponse Dernière réponse Répondre Citer 0
                        • U Hors-ligne
                          UtopiePhysique
                          dernière édition par

                          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:

                          https://forums.minecraftforge.net/topic/84594-1152-solved-armor-that-gives-potion-effect/?tab=comments#comment-398792

                          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_VALUE permet 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 😉

                          1 réponse Dernière réponse Répondre Citer 0
                          • I Hors-ligne
                            ImperoMaximo
                            dernière édition par

                            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é…

                            1 réponse Dernière réponse Répondre Citer 0
                            • I Hors-ligne
                              ImperoMaximo
                              dernière édition par

                              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

                              U 1 réponse Dernière réponse Répondre Citer 0
                              • U Hors-ligne
                                UtopiePhysique @ImperoMaximo
                                dernière édition par UtopiePhysique

                                @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, stack devient stack, world, entity
                                Nom de class des armures: ItemArmor devient ArmorItem

                                Si 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.

                                1 réponse Dernière réponse Répondre Citer 0
                                • I Hors-ligne
                                  ImperoMaximo
                                  dernière édition par

                                  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 :'

                                  U 1 réponse Dernière réponse Répondre Citer 0
                                  • U Hors-ligne
                                    UtopiePhysique @ImperoMaximo
                                    dernière édition par UtopiePhysique

                                    @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 retourne nullen 1.15.2 si l’entité n’a pas l’effet), on lui retire l’effet.

                                    J’ai peut être mal compris quelque chose.

                                    1 réponse Dernière réponse Répondre Citer 0
                                    • I Hors-ligne
                                      ImperoMaximo
                                      dernière édition par ImperoMaximo

                                      @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

                                      U 1 réponse Dernière réponse Répondre Citer 0
                                      • U Hors-ligne
                                        UtopiePhysique @ImperoMaximo
                                        dernière édition par

                                        @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.

                                        I 1 réponse Dernière réponse Répondre Citer 0
                                        • I Hors-ligne
                                          ImperoMaximo @UtopiePhysique
                                          dernière édition par

                                          @UtopiePhysique mais après une perte comment le remettre s’il rééquipe l’armure ?

                                          U 1 réponse Dernière réponse Répondre Citer 0
                                          • U Hors-ligne
                                            UtopiePhysique @ImperoMaximo
                                            dernière édition par

                                            @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

                                            1 réponse Dernière réponse Répondre Citer 1
                                            • I Hors-ligne
                                              ImperoMaximo
                                              dernière édition par

                                              @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

                                              1 réponse Dernière réponse Répondre Citer 0
                                              • 1
                                              • 2
                                              • 2 / 2
                                              • Premier message
                                                Dernier message
                                              Design by Woryk
                                              ContactMentions Légales

                                              MINECRAFT FORGE FRANCE © 2024

                                              Powered by NodeBB