• Récent
  • Mots-clés
  • Populaire
  • Utilisateurs
  • Groupes
  • S'inscrire
  • Se connecter
  • S'inscrire
  • Se connecter
  • Recherche
  • Récent
  • Mots-clés
  • Populaire
  • Utilisateurs
  • Groupes

Résolu Encore problème onUpdate

1.7.x
1.7.10
8
104
16.1k
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.
  • Eikins
    Eikins dernière édition par 31 juil. 2016, 12:56

    Coucou !
    Bon, alors j’avais étudier le système de minecraft car je voulais faire un truc similaire.
    En fait c’est simple : tu peux pas.

    Quand tu mets à jour un NBT, ça met à jour ton ItemStack et ça fait planter le “Player Using Item”.
    On peut très bien récupérer des données via le getter des NBTTagCompound, mais faut surtout pas utiliser les setters.
    Pour les sceptiques, faites le test vous verrez. 😛

    Du coup t’as plusieurs options : soit tu refait un système de  “Use Item”, un peu relou, soit tu utilises les ExtendedProperties et tu stock les cooldowns “sur le joueur”, par contre c’est un peu sale. (Ou une autre méthode à toi de voir, là c’est les deux qui me viennent à l’esprit tout de suite)

    Fracture

    1 réponse Dernière réponse Répondre Citer 0
    • SCAREX
      SCAREX dernière édition par 31 juil. 2016, 14:19

      Pourtant moi quand je teste j’ai aucun problème

      Site web contenant mes scripts : http://SCAREXgaming.github.io

      Pas de demandes de support par MP ni par skype SVP.
      Je n'accepte sur skype que l…

      1 réponse Dernière réponse Répondre Citer 0
      • Eikins
        Eikins dernière édition par 31 juil. 2016, 18:09

        C’est bizarre, car en 1.7.10, c’est justement un problème.
        Utiliser les NBT dans le onUpdate ou dans le onUsingTick va empêcher la méthode onPlayerStoppedUsing d’être appelée. (Et en plus ça fait le problème visuel)
        Si tu veux jeter un oeil : http://www.minecraftforge.net/forum/index.php?topic=35035.0

        Fracture

        1 réponse Dernière réponse Répondre Citer 0
        • SCAREX
          SCAREX dernière édition par 31 juil. 2016, 18:45

          Peut être que le problème a été réglé dans ma version

          Site web contenant mes scripts : http://SCAREXgaming.github.io

          Pas de demandes de support par MP ni par skype SVP.
          Je n'accepte sur skype que l…

          1 réponse Dernière réponse Répondre Citer 0
          • Gabs
            Gabs dernière édition par 31 juil. 2016, 18:59

            @‘SCAREX’:

            Peut être que le problème a été réglé dans ma version

            Euhh tu as enlever la ligne if(world.isRemote) dans la fonction onUpdate

            Salut Eikins,
            Merci des infos, du coup c’est chiant ouais…
            Y’a vraiment aucun moyen autre fonction ou une autre version de forge ?

            En tout cas merci de votre aides!

            1 réponse Dernière réponse Répondre Citer 0
            • SCAREX
              SCAREX dernière édition par 31 juil. 2016, 19:10

              Je n’ai absolument rien modifié, j’ai pris le zip donné par robin, s’il est différent du tiens, envoi le tiens

              Site web contenant mes scripts : http://SCAREXgaming.github.io

              Pas de demandes de support par MP ni par skype SVP.
              Je n'accepte sur skype que l…

              1 réponse Dernière réponse Répondre Citer 0
              • Gabs
                Gabs dernière édition par 31 juil. 2016, 19:19

                @‘SCAREX’:

                Je n’ai absolument rien modifié, j’ai pris le zip donné par robin, s’il est différent du tiens, envoi le tiens

                Tien:

                Si tu veux “réglé” le problème tu rajoute un if(world.isremote) dans la fonction onUdpate de l’arc (FlameBow) mais ça fausse les timers…

                1 réponse Dernière réponse Répondre Citer 0
                • SCAREX
                  SCAREX dernière édition par 31 juil. 2016, 19:46

                  Effectivement je comprends d’où vient le problème maintenant : à chaque fois que tu modifies les nbt de l’itemStack, son utilisation est reset, le seul moyen est donc de stocker autre pars ton timer, par exemple dans un ExtendedEntityProperties, ce qui résoudrai le problème.

                  EDIT : petite question, pourquoi utiliser un timer sachant que tu en as déjà un dans les paramètres ?

                  Site web contenant mes scripts : http://SCAREXgaming.github.io

                  Pas de demandes de support par MP ni par skype SVP.
                  Je n'accepte sur skype que l…

                  1 réponse Dernière réponse Répondre Citer 0
                  • Gabs
                    Gabs dernière édition par 31 juil. 2016, 20:41

                    @‘SCAREX’:

                    Effectivement je comprends d’où vient le problème maintenant : à chaque fois que tu modifies les nbt de l’itemStack, son utilisation est reset, le seul moyen est donc de stocker autre pars ton timer, par exemple dans un ExtendedEntityProperties, ce qui résoudrai le problème.

                    EDIT : petite question, pourquoi utiliser un timer sachant que tu en as déjà un dans les paramètres ?

                    Pour l’extended je suis chaud par contre va falloir que je re regarde les extended ^^ .

                    dans ton edit:

                    C’est à dire je peux directement faire un timer sans la fonction onupdate ? j’ai pas bien compris x)

                    1 réponse Dernière réponse Répondre Citer 0
                    • AymericRed
                      AymericRed dernière édition par 31 juil. 2016, 21:04

                      Il veut dire que l’entity player possède déjà un timer qui compte depuis combien de temps il utilise l’objet.

                      Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                      AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                      Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                      Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

                      1 réponse Dernière réponse Répondre Citer 0
                      • SCAREX
                        SCAREX dernière édition par 31 juil. 2016, 21:06

                        Pour l’EEP, voici qui t’aidera : https://www.minecraftforgefrance.fr/showthread.php?tid=905

                        Bah tu incrémentes un timer lorsque l’item est utilisé mais minecraft incrémente déjà un timer (ton paramètre useRemaining), donc je vois pas l’utilité de créer plusieurs timers

                        Site web contenant mes scripts : http://SCAREXgaming.github.io

                        Pas de demandes de support par MP ni par skype SVP.
                        Je n'accepte sur skype que l…

                        1 réponse Dernière réponse Répondre Citer 0
                        • Gabs
                          Gabs dernière édition par 1 août 2016, 12:11

                          Re,
                          Alors du coup j’ai fais l’extended
                          voilà ma classe:

                          public class ExtendedEntityPropTimer implements IExtendedEntityProperties {
                          public final static String EXT_PROP_NAME = "ExtPropTimer";
                          private final EntityPlayer player;
                          public int timer;
                          public ExtendedEntityPropTimer(EntityPlayer player) {
                          this.player = player;
                          this.timer = 0;
                          }
                          public static final void register(EntityPlayer player) {
                          player.registerExtendedProperties(ExtendedEntityPropTimer.EXT_PROP_NAME,
                          new ExtendedEntityPropTimer(player));
                          }
                          public static final ExtendedEntityPropTimer get(EntityPlayer player) {
                          return (ExtendedEntityPropTimer) player.getExtendedProperties(EXT_PROP_NAME);
                          }
                          @Override
                          public void saveNBTData(NBTTagCompound compound) {
                          NBTTagCompound properties = new NBTTagCompound();
                          properties.setInteger("Timer", this.timer);
                          compound.setTag(EXT_PROP_NAME, properties);
                          }
                          @Override
                          public void loadNBTData(NBTTagCompound compound) {
                          NBTTagCompound properties = (NBTTagCompound) compound
                          .getTag(EXT_PROP_NAME);
                          properties.setInteger("Timer", this.timer);
                          }
                          public final void sync() {
                          PacketTimer packetTimer = new PacketTimer(this.timer);
                                    LegacyMod.network.sendToServer(packetTimer);
                          if (!player.worldObj.isRemote) {
                          EntityPlayerMP player1 = (EntityPlayerMP) player;
                                                  //Ici, même chose que précédemment, sauf que le packet est envoyé au player.
                          LegacyMod.network.sendTo(packetTimer, player1);
                          }
                          }
                          private static String getSaveKey(EntityPlayer player) {
                          return player.getDisplayName() + ":" + EXT_PROP_NAME;
                          }
                          public static void saveProxyData(EntityPlayer player) {
                          ExtendedEntityPropTimer playerData = ExtendedEntityPropTimer.get(player);
                          NBTTagCompound savedData = new NBTTagCompound();
                          playerData.saveNBTData(savedData);
                          CommonProxy.storeEntityData(getSaveKey(player), savedData);
                          }
                          public static void loadProxyData(EntityPlayer player) {
                          ExtendedEntityPropTimer playerData = ExtendedEntityPropTimer.get(player);
                          NBTTagCompound savedData = CommonProxy
                          .getEntityData(getSaveKey(player));
                          if (savedData != null) {
                          playerData.loadNBTData(savedData);
                          }
                          playerData.sync();
                          }
                          @Override
                          public void init(Entity entity, World world) {
                          // TODO Auto-generated method stub
                          }
                          }

                          Mon packet:

                          public class PacketTimer implements IMessage{
                          private int Timer;
                          public PacketTimer()
                          {
                          }
                          public PacketTimer(int timer)
                          {
                          this.Timer = timer;
                          }
                          @Override
                          public void fromBytes(ByteBuf buf) 
                          {
                          this.Timer = buf.readInt();
                          }
                          @Override
                          public void toBytes(ByteBuf buf) 
                          {
                          buf.writeInt(this.Timer);
                          }
                          public static class Handler implements IMessageHandler <packettimer, imessage="">{
                             public IMessage onMessage(PacketTimer message, MessageContext ctx) {
                              ExtendedEntityPropTimer props = ExtendedEntityPropTimer
                          .get(ctx.getServerHandler().playerEntity);
                          props.timer = message.Timer;
                                  return null;
                                 }
                             }
                          }

                          register packet:

                                  network.registerMessage(PacketTimer.Handler.class, PacketTimer.class, 4, Side.SERVER);
                          

                          Mais je suis bloqué car je vois pas trop comment faire pour le timer.
                          Je dois rajouter des fonctions dans l’extended pour le timer ou pas ? je dois surement faire this.timer++ / – mais je vois pas du tout ou ^^ et esque je dois faire aussi des fonction settimer / gettimer etc…

                          Merci :)</packettimer,>

                          1 réponse Dernière réponse Répondre Citer 0
                          • Eikins
                            Eikins dernière édition par 1 août 2016, 12:57

                            Maintenant que tu as ton EEP, il fait falloir utiliser les event forge, notamment le TickEvent.PlayerTickEvent.
                            Attention toutefois, cet event est appelé deux fois : une fois au début du tick, et une fois à la fin du tick.
                            Donc tu vérifies si la Phase de l’event est END, et tu appelles une méthode d’update que tu auras préalablement créer dans ton EEP.

                            Comme ceci :

                               public void onTickEnd()
                                {
                                   //Ton code
                                }
                               @SubscribeEvent
                                public void onPlayerTick(TickEvent.PlayerTickEvent event)
                                {
                                    if(event.phase.equals(Phase.END))
                                    {
                                        ExtendedEntityPropTimer.get(event.player).onTickEnd();
                                    }
                                }

                            Fracture

                            1 réponse Dernière réponse Répondre Citer 1
                            • SCAREX
                              SCAREX dernière édition par 1 août 2016, 13:28

                              Dans tous les cas je pense que créer un nouveau timer n’est pas forcément une bonne idée puisque tu as déjà un timer

                              Site web contenant mes scripts : http://SCAREXgaming.github.io

                              Pas de demandes de support par MP ni par skype SVP.
                              Je n'accepte sur skype que l…

                              1 réponse Dernière réponse Répondre Citer 0
                              • Gabs
                                Gabs dernière édition par 1 août 2016, 14:06

                                @‘Eikins’:

                                Maintenant que tu as ton EEP, il fait falloir utiliser les event forge, notamment le TickEvent.PlayerTickEvent.
                                Attention toutefois, cet event est appelé deux fois : une fois au début du tick, et une fois à la fin du tick.
                                Donc tu vérifies si la Phase de l’event est END, et tu appelles une méthode d’update que tu auras préalablement créer dans ton EEP.

                                Comme ceci :

                                   public void onTickEnd()
                                    {
                                       //Ton code
                                    }
                                   @SubscribeEvent
                                    public void onPlayerTick(TickEvent.PlayerTickEvent event)
                                    {
                                        if(event.phase.equals(Phase.END))
                                        {
                                            ExtendedEntityPropTimer.get(event.player).onTickEnd();
                                        }
                                    }

                                D’acc merci, mais dans ontickend je fais spawn donc ma flèche c’est bien ça?

                                et dans l’event tick je dois pas mettre un temps ? je sais plus c’est quoi le code mais tu as du me comprendre x)

                                @SCAREX, 
                                En gros le EEP sert a rien c’est ça ? j’utilise [font=Ubuntu, sans-serifle paramètre useRemaining et c’est tout ?]

                                [font=Ubuntu, sans-serifSi oui je vais pas créer un eep pour rien alors ^^]

                                1 réponse Dernière réponse Répondre Citer 0
                                • SCAREX
                                  SCAREX dernière édition par 1 août 2016, 14:11

                                  Normalement oui tu peux tuiliser directement useRemaining, si tu veux la vrai valeur tu fais this.getMaxItemUseDuration() - useRemaining et tu as un timer correct.

                                  Après si tu veux utiliser l’EEP, tu gardes le code d’avant sauf qu’au lieu d’incrémenter le timer dans les tags de ton item, tu l’incrémente dans l’EEP et quand tu tires la flèches tu récupères la valeur

                                  Site web contenant mes scripts : http://SCAREXgaming.github.io

                                  Pas de demandes de support par MP ni par skype SVP.
                                  Je n'accepte sur skype que l…

                                  1 réponse Dernière réponse Répondre Citer 0
                                  • LeBossMax2
                                    LeBossMax2 dernière édition par 1 août 2016, 14:16

                                    @‘floriangabet’:

                                    D’acc merci, mais dans ontickend je fais spawn donc ma flèche c’est bien ça?

                                    et dans l’event tick je dois pas mettre un temps ? je sais plus c’est quoi le code mais tu as du me comprendre x)

                                    @SCAREX, 
                                    En gros le EEP sert a rien c’est ça ? j’utilise [font=Ubuntu, sans-serifle paramètre useRemaining et c’est tout ?]

                                    [font=Ubuntu, sans-serifSi oui je vais pas créer un eep pour rien alors ^^]

                                    ça dépend du comment ut veux utiliser ton timer :
                                    si ton timer permet (comme le pence SCAREX) de charger l’arc quand tu fait click droit, il ne sert à rien et tu peux faire comme SCAREX l’a dit.
                                    si ton timer permet d’avoir un temps avant de pouvoir re-tirer un flèche de feux par exemple dans ce cas, je pence qu’il faut faire comme Eikins dit. (Ps : dans le onTickEnd, il faut que tu ajoute 1 à ton timer si il n’a pas attend sa valeur max. Et tu tire la flèche dans le packet, comme c’était avant, en vérifiant si le timer du joueur et bien à ça valeur max (ou min, ça dépend comment tu le voix))

                                    1 réponse Dernière réponse Répondre Citer 1
                                    • Gabs
                                      Gabs dernière édition par 1 août 2016, 14:41

                                      @‘LeBossMax2’:

                                      si ton timer permet d’avoir un temps avant de pouvoir re-tirer un flèche de feux par exemple dans ce cas, je pence qu’il faut faire comme Eikins dit. (Ps : dans le onTickEnd, il faut que tu ajoute 1 à ton timer si il n’a pas attend sa valeur max. Et tu tire la flèche dans le packet, comme c’était avant, en vérifiant si le timer du joueur et bien à ça valeur max (ou min, ça dépend comment tu le voix))

                                      C’est exactement se que je veux faire donc il faut que j’utilise l’eep .

                                      Ok donc faut que je re créer le packetarrow x)

                                      1 réponse Dernière réponse Répondre Citer 0
                                      • Eikins
                                        Eikins dernière édition par 1 août 2016, 14:52

                                        Non pas besoin vu que le onTickEnd est appelé des deux côtés. (Client et Serveur).
                                        Je te conseille de décrémenter le cooldown, c’est plus simple pour la suite.

                                        Créer une fonction pour set le timer.

                                           public void setTimer(int cooldown)
                                            {
                                                timer = cooldown;
                                            }

                                        Et dans ton onTickEnd :

                                           public void onTickEnd()
                                            {
                                               if(timer > 0)
                                                {
                                                    timer–;
                                                }
                                            }

                                        Et après, tout simplement, tu demande si le joueur a fini le cooldown :

                                           public boolean canUseFireArrow()
                                            {
                                                return timer == 0;
                                            }

                                        Ensuite tu retournes dans la classe de ton item, et tu fais simplement une condition qui vérifie si le joueur peut utiliser la flèche, et quand tu tire une flèche de feu, tu met ton timer à la valeur que tu veux (20 = 1s)
                                        Laisse toutes ces méthodes des deux côtés, quand tu set le timer, ne vérifie pas le world.isRemote, comme ça les calculs sont aussi effectués par le client ce qui évite d’utiliser du réseaux.

                                        Fracture

                                        1 réponse Dernière réponse Répondre Citer 0
                                        • Gabs
                                          Gabs dernière édition par 1 août 2016, 15:02

                                          @‘Eikins’:

                                          Non pas besoin vu que le onTickEnd est appelé des deux côtés. (Client et Serveur).
                                          Je te conseille de décrémenter le cooldown, c’est plus simple pour la suite.

                                          Créer une fonction pour set le timer.

                                             public void setTimer(int cooldown)
                                             {
                                                 timer = cooldown;
                                             }

                                          Et dans ton onTickEnd :

                                             public void onTickEnd()
                                             {
                                                 if(timer > 0)
                                                 {
                                                     timer–;
                                                 }
                                             }

                                          Et après, tout simplement, tu demande si le joueur a fini le cooldown :

                                             public boolean canUseFireArrow()
                                             {
                                                 return timer == 0;
                                             }

                                          Ensuite tu retournes dans la classe de ton item, et tu fais simplement une condition qui vérifie si le joueur peut utiliser la flèche, et quand tu tire une flèche de feu, tu met ton timer à la valeur que tu veux (20 = 1s)
                                          Laisse toutes ces méthodes des deux côtés, quand tu set le timer, ne vérifie pas le world.isRemote, comme ça les calculs sont aussi effectués par le client ce qui évite d’utiliser du réseaux.

                                          Ah mais ouais en plus c’est tout con omg x) merci vraiment j’essaye je te dis!!

                                          edit pour le canusefirearrow j’ai mis <= car si le timer passe a -1 ou quoi je pourrais pas tiré la flèche 🙂

                                          1 réponse Dernière réponse Répondre Citer 0
                                          • 1
                                          • 2
                                          • 3
                                          • 4
                                          • 5
                                          • 6
                                          • 5 / 6
                                          82 sur 104
                                          • Premier message
                                            82/104
                                            Dernier message
                                          Design by Woryk
                                          Contact / Mentions Légales

                                          MINECRAFT FORGE FRANCE © 2018

                                          Powered by NodeBB