MFF

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

    Gui coté serveur

    Planifier Épinglé Verrouillé Déplacé Sans suite
    1.8
    27 Messages 4 Publieurs 6.8k Vues 1 Abonné
    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.
    • robin4002R En ligne
      robin4002 Moddeurs confirmés Rédacteurs Administrateurs
      dernière édition par

      public static int readNbtVarInt(ItemStack stack, nbtVar var)
      {
      if (stack.hasTagCompound())
      {
      NBTTagCompound itemData = stack.getTagCompound();
      
      if(var == nbtVar.RightCombo)
      {
      String varName = nbtVar.RightCombo.toString();
      
      if(itemData.hasKey(varName))
      {
      return stack.getTagCompound().getInteger(varName);
      }
      }
      }
      return 0;
      }
      

      Pourquoi tu as une condition if(var == nbtVar.RightCombo) ici ?

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

        Autant pour moi, ce n’est pas toute à fait la bonne version du code (grâce ou a cause de Github, j’ai du récupérer une ancienne sauvegarde du code, parce que j’avais accidentellement tous effacé)

        La bonne version de la fonction est :

        public static int readNbtVarInt(ItemStack stack, nbtVar var)
        {
        if (stack.hasTagCompound())
        {
        NBTTagCompound itemData = stack.getTagCompound();
        
        String varName = var.toString();
        
        if (itemData.hasKey(varName))
        {
        return stack.getTagCompound().getInteger(varName);
        }
        }
        return 0;
        }
        

        Truc plutôt étrange, mon problème d’écriture c’est réglé lorsque j’ai ré-écrit le code manquant a cause de Github. Je suppose que j’ai enlever l’erreur en ré-écrivant le code ^^’ (note que l’erreur ne pouvais pas venir de read, car la fonction n’étais pas utilisé dans le write, sauf pour l’affichage. L’affichage étais donc peu être buguer, mais la valeur n’étais jamais atteinte, puisque l’objet n’étais jamais ré-initialisé, et que je n’utilisai pas encore les nouvelles fonction dans ma classe JScreen au moment du test)

        Du coup j’ai un problème qui persiste.
        Pour faire un timer, j’écrit tous les tic, dans un tag, et cela entraîne une ré-initialisation constante de l’objet (et donc de l’animation).
        il n’y a pas une manière différente de faire timer (moins gourmand en ressources, qui dure X tick pour chaque instance de l’objet, et qui se réinitialise dès que la condition change uniquement pour cette objet ?

        Voila ma classe a l’heure actuel :

        public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected)
        {
        if(stack.getTagCompound() == null)
               {
                stack.setTagCompound(new NBTTagCompound());
        
                stack.getTagCompound().setInteger("rC", 0); // Right Combo
                stack.getTagCompound().setInteger("rPC",0); // Right Previous Combo
                stack.getTagCompound().setInteger("lC", 0); // Left Combo
                stack.getTagCompound().setInteger("lPC", 0); // Left Previous Combo
                stack.getTagCompound().setInteger("aT",0); // actualTimer
               }
        
        if ((nbtVar.readNbtVarInt(stack, nbtVar.RightCombo) != 0) || (nbtVar.readNbtVarInt(stack, nbtVar.LeftCombo) != 0))
        {
        nbtVar.incNbtVarInt(stack, nbtVar.ActualCombo);
        if (nbtVar.readNbtVarInt(stack, nbtVar.ActualCombo) >= this.comboTimer)
        {
        nbtVar.writeNbtVar(stack, nbtVar.RightCombo, 0);
        nbtVar.writeNbtVar(stack, nbtVar.LeftCombo, 0);
        nbtVar.writeNbtVar(stack, nbtVar.ActualCombo, 0);
        }
        else if ( nbtVar.readNbtVarInt(stack, nbtVar.RightCombo) != nbtVar.readNbtVarInt(stack, nbtVar.RightPreviousCombo) ||
        nbtVar.readNbtVarInt(stack, nbtVar.LeftCombo) != nbtVar.readNbtVarInt(stack, nbtVar.LeftPreviousCombo))
        {
        nbtVar.writeNbtVar(stack, nbtVar.ActualCombo, 0);
        }
        if (nbtVar.readNbtVarInt(stack, nbtVar.RightCombo) != nbtVar.readNbtVarInt(stack, nbtVar.RightPreviousCombo))
        {
        nbtVar.writeNbtVar(stack, nbtVar.RightPreviousCombo, nbtVar.readNbtVarInt(stack, nbtVar.RightCombo));
        }
        if (nbtVar.readNbtVarInt(stack, nbtVar.LeftCombo) != nbtVar.readNbtVarInt(stack, nbtVar.LeftPreviousCombo))
        {
        nbtVar.writeNbtVar(stack, nbtVar.LeftPreviousCombo, nbtVar.readNbtVarInt(stack, nbtVar.LeftCombo));
        }
        }
        }
        
        1 réponse Dernière réponse Répondre Citer 0
        • robin4002R En ligne
          robin4002 Moddeurs confirmés Rédacteurs Administrateurs
          dernière édition par

          Tu l’utilises pour quoi ce timer ?

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

            J’utilise le tag “ActualTimer” qui est incrémenter de 1 chaque tick tan que l’un des deux tags (“RightClic” ou LeftClic") est différent de 0.

            Lorsque mon tag “ActualTimer” est supérieur à ma Variable “comboTimer” (variable ce coup ci attention) alors tous mes tag sont ré-initialisé a 0 (et donc le timer ce désactive).

            Si, au cour de l’un des itérations de mon Timer (d’ou la nécessité de l’effectuer chaque tic), un des deux tags “RightClic” ou LeftClic" est modifier (chose que je vérifie grâce aux tags “RightPreviousClic” et “LeftPreviousClic”), alors je ré-initialise mon tag “ActualTimer” le timer continue alors, mais le tag reprend la valeur 0.

            Je ne sais pas si j’ai été assez clair ^^’

            1 réponse Dernière réponse Répondre Citer 0
            • robin4002R En ligne
              robin4002 Moddeurs confirmés Rédacteurs Administrateurs
              dernière édition par

              Je ne vois pas d’autres façons de faire 😕
              Ce que tu peux par contre faire c’est actualisé ton time toutes les secondes au lieu de tous les ticks.

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

                Comment cas ? onUptade est appeler tout les ticks, comment je peu définir pour que ce ne soit que toute les minutes ?

                1 réponse Dernière réponse Répondre Citer 0
                • robin4002R En ligne
                  robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                  dernière édition par

                  Ajoute dans ta classe deux variables :
                  private static final long start = System.currentTimeMillis() / 1000;
                  private static int seconds = 0
                  Ensuite dans ta fonction update :

                  if(seconds != (int)(System.currentTimeMillis() / 1000 - start))
                  {
                  // ton action ici, elle ne sera que faite toutes les secondes
                  seconds = (int)(System.currentTimeMillis() / 1000 - start);
                  }
                  

                  C’est le moyen le plus propre pour faire ça.

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

                    Je vien de relire mon code, et effectuer l’incrémentation chaque seconde n’es pas possible a cause de l’affichage (trop de latence).
                    Par contre, j’avoue avoir totalement oublier la classe System, et je dois pouvoir me baser sur le temps du syteme et faire le calcul à chaque fois plutôt que de me baser sur un tag qu’il faut re écrire à chaque fois. Je vais m’y pencher dessus ^^

                    EDIT :

                    ​ public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected)
                    {
                    if(stack.getTagCompound() == null)
                            {
                            stack.setTagCompound(new NBTTagCompound());
                    
                            stack.getTagCompound().setInteger("rC", 0); // Right Combo
                            stack.getTagCompound().setInteger("rPC",0); // Right Previous Combo
                            stack.getTagCompound().setInteger("lC", 0); // Left Combo
                            stack.getTagCompound().setInteger("lPC", 0); // Left Previous Combo
                            stack.getTagCompound().setInteger("aT",timer); // actualTimer
                            }
                    
                    if ((nbtVar.readNbtVarInt(stack, nbtVar.RightCombo) != 0) || (nbtVar.readNbtVarInt(stack, nbtVar.LeftCombo) != 0))
                    {
                    
                    timer++;
                    if (timer < 0)
                    {
                    timer = 0;
                    }
                    
                    int seconds = timer  - nbtVar.readNbtVarInt(stack, nbtVar.ActualCombo);
                    
                    if(seconds >= this.comboTimer)
                    {
                    JFunction.write("### ### : " + seconds + " >= " + this.comboTimer + " ?");
                    
                    nbtVar.writeNbtVar(stack, nbtVar.RightCombo, 0);
                    nbtVar.writeNbtVar(stack, nbtVar.LeftCombo, 0);
                    nbtVar.writeNbtVar(stack, nbtVar.ActualCombo, timer);
                    }
                    else if ( nbtVar.readNbtVarInt(stack, nbtVar.RightCombo) != nbtVar.readNbtVarInt(stack, nbtVar.RightPreviousCombo) || 
                    nbtVar.readNbtVarInt(stack, nbtVar.LeftCombo) != nbtVar.readNbtVarInt(stack, nbtVar.LeftPreviousCombo))
                    {
                    nbtVar.writeNbtVar(stack, nbtVar.ActualCombo, timer);
                    }
                    if (nbtVar.readNbtVarInt(stack, nbtVar.RightCombo) != nbtVar.readNbtVarInt(stack, nbtVar.RightPreviousCombo))
                    {
                    nbtVar.writeNbtVar(stack, nbtVar.RightPreviousCombo, nbtVar.readNbtVarInt(stack, nbtVar.RightCombo));
                    }
                    if (nbtVar.readNbtVarInt(stack, nbtVar.LeftCombo) != nbtVar.readNbtVarInt(stack, nbtVar.LeftPreviousCombo))
                    {
                    nbtVar.writeNbtVar(stack, nbtVar.LeftPreviousCombo, nbtVar.readNbtVarInt(stack, nbtVar.LeftCombo));
                    }
                    }
                    }
                    

                    Grace à cette méthode, l’objet n’est pas ré-initialisé à chaque fois. Le seul problème viens de si le joueur joue plus de 2,147,483,647 tick non stop (à raison de 20 tick par seconde, sachant qu’il y a 86400 seconde dans une journée sa fait 17,280,000 de tick par jour, soit à peu près 124 jours non stop.)
                    Reste a voir si sa ne risque pas de poser de problème niveau serveurs (multi-activation).

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

                      Le problème n’est malheureusement pas terminer X)

                      Le problème de serveurs semble avoir totalement disparut de par l’utilisation de nbtTags.

                      En revanche, un nouveau problème apparaît ^^’
                      Comme vous pouvez le voir sur le GIF animé (ou pas), l’affichage à lieu sur tout nouveaux objet, immédiatement et se fige. De plus, il y a un décalage des objets qui s’effectues lors du premier clic. Si j’effectue plusieurs clic, le problème est résolu tan que je reste sur cette objet. Dès que je change, c’est la même.

                      :::
                      Désoler pour vos yeux X)

                      :::

                      Voila les code concerner :
                      Classe JScreen (Classe d’affichage, qui est sans doute celle qui bug)
                      Classe JWeapons (Classe de base d’une armes)
                      JScythe (Classe étendu utilisé dans l’exemple)

                      Étrangement, si on observe le code, l’affichage est censé avoir lieu selon la valeurs du nbtTag, qui, par défaut, est initialisé a 0 (donc pas d’affichage). Chaque valeurs est ensuite correcte, sauf la premier fois…

                      help ! 😢

                      1 réponse Dernière réponse Répondre Citer 0
                      • robin4002R En ligne
                        robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                        dernière édition par

                        Je vais récupérer les sources dans la soiré ou demain et je vais regarder ça.

                        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