MFF

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

    Item complexe : gui, bouton, packet et model custom

    Planifier Épinglé Verrouillé Déplacé Résolu 1.8.x
    1.8.9
    50 Messages 4 Publieurs 9.0k Vues 1 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.
    • robin4002R Hors-ligne
      robin4002 Moddeurs confirmés Rédacteurs Administrateurs
      dernière édition par

      Après avoir effectué les modifications, côté serveur.
      Cette fonction met la booléan inventoryChanged sur truc, étrange que cela ne fonctionne pas.

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

        Sinon tu fais aussi les mêmes modifs sur le client avant/après avoir envoyé le packet.

        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
        • LeBossMax2L Hors-ligne
          LeBossMax2
          dernière édition par

          @‘AymericRed’:

          Sinon tu fais aussi les mêmes modifs sur le client avant/après avoir envoyé le packet.

          Oui mais j’aimerais bien ne pas avoir à mettre toutes les conditions ( ça ma fait environ 50 lignes) du coté client, ce serais plus simple si je pouvait utiliser player.inventory.markDirty().

          J’ai mis System.out.println(playerInv.inventoryChanged); pour savoir si la fonction markDirty() fonctionnais bien et c’est bon, ça m’affiche true ( quand je met la fonction après les modifications coté serveur. ) mais j’ai l’impression que markDirty() seul ne sert  rien car tout ce que ça fait c’est mettre le boolean inventoryChanged sur true et quand on regarde le description de cette variable, il y a marqué :
          Set true whenever the inventory changes. Nothing sets it false so you will have to write your own code to check it and reset the value.

          Donc j’ai l’impression que je doit faire une fonction qui détecte si inventoryChanged est true et qui dans ce cas synchronise le client et le serveur et on reviens à la question initiale : comment synchroniser le client avec le serveur.
          Donc je fais essayer de faire la deuxième solution coté client.

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

            J’ai une nouvelle question qui se compose de deux parties !

            - Pour modifier le model d’un item selon une certaine propriété, je voudrais savoir se qui est le plus simple entre enregistre cette propriété dans les NBTTag ou dans les Metadata ?
             - Pour le model, comme il y à des tonnes do possibilités, je voudrais savoir si c’est mieux de passer par un model custom (plutôt que faire un model par possibilité) donc je voudrais savoir comment faire un model custom qui, en fonction du NBTTag ou du MetaData, vas être différant.

            PS : Pour la question précédente, je vais tr,ter de passer par une réponse du serveur en envoyant un message au client pour qu’il fasse les modifications.

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

              C’est plus simple avec metadata, il y a une fonction pour return un model en fonction de ça regarde dans l’arc

              Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk

              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
              • LeBossMax2L Hors-ligne
                LeBossMax2
                dernière édition par

                J’ai trouvé la fonction ```java
                ModelResourceLocation getModel(ItemStack stack, EntityPlayer player, int useRemaining)

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

                  Et oui, les joies de la 1.8 …

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

                    Mojang…

                    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
                    • LeBossMax2L Hors-ligne
                      LeBossMax2
                      dernière édition par

                      Je reviens à la question précédant car j’ai réussi mettre à jour l’inventaire du joueur coté client via un packet réponse mais le problème c’est que ça n’update les NBTTag de l’item qui ouvre le gui que quand on ferme puis rouvre le gui, pourtant, j’ai bien fait les modifications de NBTTag.

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

                        Comme je vois que personne ne répond, je vais donc faire un petit résumé :

                        J’ai créé un item, lorsque l’on fait clic droit avec lui  dans la main, ça ouvre un gui.

                        Sur ce gui, il y a plusieurs boutons. Lorsque l’on clique sur un bouton, ça envoie un packet au serveur qui vas (si quelques conditions son respectés) modifier deux item de l’inventaire du joueur : il change les NBTTag de l’item en main (celui avec qui le joueur a ouvert le gui) et modifie le nombre d’item dans un autre itemStack de l’inventaire du joueur.

                        Ensuite, le serveur envoi un packet réponse au client pour qu’il fasse les mêmes modifications mais le NBTTag de l’item ne ce met à jour que lorsque l’on ferme puis rouvre le gui. (Il y a une modification de l’interface selon le NBTTag de l’item : des bouton qui deviennent visibles. Le NBTTag est vérifié dans le drawGuiContainerBackgroundLayer du gui, je pence pas que ce soit ça le problème)

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

                          Est-ce que l’item garde les tags après avoir sauvegardé puis relancer la map ?
                          Montre le code où tu set les tags de l’item.

                          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
                          • LeBossMax2L Hors-ligne
                            LeBossMax2
                            dernière édition par

                            @‘AymericRed’:

                            Est-ce que l’item garde les tags après avoir sauvegardé puis relancer la map ?
                            Montre le code où tu set les tags de l’item.

                            L’item garde bien les tags quand on relance la map.
                            Pour le code je met un “//ici” pour les endroits où il y a un changement de NBTTag.
                             - coté serveur : (dans le classe de RuneStoneMessage qui implémente IMessage )
                            :::

                            public static class ServerMessageHandler implements IMessageHandler <runestonemessage, runestonemessage="">{
                            
                                    @Override
                                    public RuneStoneMessage onMessage(RuneStoneMessage message, MessageContext ctx)
                                    {
                                        EntityPlayer player = ctx.getServerHandler().playerEntity;
                                        if (player == null)
                                        {
                                            return null;
                                        }
                            
                                        int slotIndex = message.slotIndex;
                                        int[] linkIndex = message.linkIndex;
                                        InventoryPlayer playerInv = player.inventory;
                            
                                        ItemStack runeStoneStack = playerInv.getStackInSlot(slotIndex);
                                        ItemStack applyStack = playerInv.getItemStack();
                                        if (runeStoneStack == null || !(runeStoneStack.getItem() instanceof RuneStoneItem) || applyStack == null)
                                        {
                                            return null;
                                        }
                            
                                        if (!runeStoneStack.hasTagCompound())
                                        {
                                            runeStoneStack.setTagCompound(new NBTTagCompound());
                                        }
                            
                                        NBTTagCompound tag = runeStoneStack.getTagCompound();
                                        int[] links = null;
                                        if (!tag.hasKey("Links"))
                                        {
                                            links = Link.linksInit();
                                            tag.setIntArray("Links", links); // ici (on réinitiallise le NBTTag)
                                        }
                                        else
                                        {
                                            links = tag.getIntArray("Links");
                            
                                            if (links == null || links.length != 187)
                                            {
                                                links = Link.linksInit();
                                                tag.setIntArray("Links", links); // ici (on réinitiallise le NBTTag)
                                            }
                                        }
                            
                                        if (linkIndex != null && linkIndex.length != 0 && applyStack.stackSize >= linkIndex.length)
                                        {
                                            Item applyItem = applyStack.getItem();
                            
                                            if (applyItem == Items.flint)
                                            {
                                                for (int i : linkIndex)
                                                {
                                                    if(i < 0 || i > 186 || (links* != 1 && i != 0) )
                                                    {
                                                        return null;
                                                    }
                                                }
                            
                                                for (int i : linkIndex)
                                                {
                                                    if (i != 0)
                                                    {
                                                        links* = 2;
                                                        applyStack.stackSize -=1;
                                                    }
                                                }
                                                tag.setIntArray("Links", links); //ici
                                                //playerInv.markDirty();
                                                return message;
                                            }
                                        }
                                        return null;
                                    }
                            
                                }
                            

                            :::

                            • coté client (dans la même class, c’est trés proche de ce qu’il y a coté serveur) :
                              :::
                            public static class ClientMessageHandler implements IMessageHandler <runestonemessage, imessage="">{
                            
                                    @Override
                                    public IMessage onMessage(RuneStoneMessage message, MessageContext ctx)
                                    {
                                        EntityPlayer player = Minecraft.getMinecraft().thePlayer;
                            
                                        int slotIndex = message.slotIndex;
                                        int[] linkIndex = message.linkIndex;
                                        InventoryPlayer playerInv = player.inventory;
                            
                                        ItemStack runeStoneStack = playerInv.getStackInSlot(slotIndex);
                                        ItemStack applyStack = playerInv.getItemStack();
                                        if (runeStoneStack == null || !(runeStoneStack.getItem() instanceof RuneStoneItem) || applyStack == null)
                                        {
                                            return null;
                                        }
                            
                                        if (!runeStoneStack.hasTagCompound())
                                        {
                                            runeStoneStack.setTagCompound(new NBTTagCompound());
                                        }
                            
                                        NBTTagCompound tag = runeStoneStack.getTagCompound();
                                        int[] links = null;
                                        if (!tag.hasKey("Links"))
                                        {
                                            links = Link.linksInit();
                                            tag.setIntArray("Links", links); // ici (on initiallise le NBTTag)
                                        }
                                        else
                                        {
                                            links = tag.getIntArray("Links");
                            
                                            if (links == null || links.length != 187)
                                            {
                                                links = Link.linksInit();
                                                tag.setIntArray("Links", links); // ici (on réinitiallise le NBTTag)
                                            }
                                        }
                            
                                        if (linkIndex != null && linkIndex.length != 0 && applyStack.stackSize >= linkIndex.length)
                                        {
                                            Item applyItem = applyStack.getItem();
                            
                                            if (applyItem == Items.flint)
                                            {
                                                for (int i : linkIndex)
                                                {
                                                    if(i < 0 || i > 186 || (links* != 1 && i != 0) )
                                                    {
                                                        return null;
                                                    }
                                                }
                            
                                                for (int i : linkIndex)
                                                {
                                                    if (i != 0)
                                                    {
                                                        links* = 2;
                                                        applyStack.stackSize -=1;
                                                    }
                                                }
                                                tag.setIntArray("Links", links); //ici
                                                //playerInv.markDirty();
                                                System.out.println(playerInv.inventoryChanged);
                                            }
                                        }
                                        return null;
                                    }
                            
                                }
                            

                            :::</runestonemessage,></runestonemessage,>

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

                              C’est bizarre, ça devrait bien être changé, mets un System.out.println au début de ta fonction côté client pour voir si le packet est bien renvoyé par le serveur. Si oui, tu peux toujours faire Minecraft.getMinecraft().displayGuiSreen(TonGui); pour réafficher le gui mais bon c’est pas très propre…

                              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
                              • LeBossMax2L Hors-ligne
                                LeBossMax2
                                dernière édition par

                                @‘AymericRed’:

                                C’est bizarre, ça devrait bien être changé, mets un System.out.println au début de ta fonction côté client pour voir si le packet est bien renvoyé par le serveur. Si oui, tu peux toujours faire Minecraft.getMinecraft().displayGuiSreen(TonGui); pour réafficher le gui mais bon c’est pas très propre…

                                Le packet est bien renvoyé par le serveur et reçut par le client.
                                Avec Minecraft.getMinecraft().displayGuiSreen(MonGui); ça fonctionne mais comme le joueur a un itemStack sur le curseur, c’est un peut buggé : l’itemStack disparais et est dropé par le joueur quand il referme le gui.

                                EDIT :
                                J’ai trouvé une solution : après Minecraft.getMinecraft().displayGuiSreen(MonGui); j’ai mis playerInv.setItemStack(applyStack); (applyStack est définit plus haut par playerInv.getItemStack(); )

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

                                  Alors j’ai toujours un problème : l’itemStack ne disparais plus mais dés que je quitte le gui, il se faite drop alors qu’il est pas sur le curseur, comme si ce que j’ai fait après le Minecraft.getMinecraft().displayGuiSreen(MonGui); n’avais pas été fait (si je bouge une item de mon inventaire avant de le refermé, il reviens à sa position initiale).
                                  La fonction pour rouvrir le gui alors qu’il est déjà ouvert fait forcément dropé l’item sur le curseur ?
                                  J’ai tenté de aire ça mais ça ne fonctionne pas :

                                  playerInv.setItemStack(null);
                                  Minecraft.getMinecraft().displayGuiScreen(new RuneStoneGui(playerInv, slotIndex));
                                  if (applyStack.stackSize <= 0)
                                  {
                                      playerInv.setItemStack(null);
                                  }
                                  else
                                  {
                                      playerInv.setItemStack(applyStack);
                                  }
                                  
                                  1 réponse Dernière réponse Répondre Citer 0
                                  • LeBossMax2L Hors-ligne
                                    LeBossMax2
                                    dernière édition par

                                    J’ai trouvé une solution : au lieux de rajouter Minecraft.getMinecraft().displayGuiScreen(new RuneStoneGui(playerInv, slotIndex)) et de corrigé les problèmes que ça créé, j’ai modifié mon gui pour qu’au lieu d’enregistrer l’itemstack dans une variable (ce qui fait qu’il n’est update que lorsque l’on ferme puis rouvre l’inventaire), j’enregistre l’index du slot dans lequel il est et je get le contenu du slot (ce qui donne l’itemstack ) pour modifier le rendu du gui.

                                    Maintenant que ce problème est réglé, je m’occupe du rendu de l’item !

                                    Dans le NBTTag de mon item, il y a 28 int. je voudrais que chaque int, s’il est égale à 1 affiche une ligne noir sur l’item. Je suppose que je ne peut pas passer par un rendu classique (un model en .json) car en recherchant dans le rendu des item j’ai trouvé ce qui correspond au model builtin/generated et il y a une liste du layer0 au layer4 donc je ne peut pas en mettre 29. (Ou alors il faudrait que j’arrive à mette les 28 lignes sur un layer)

                                    Donc je voudrais savoir de quel manière je pourrais faire le rendu pour pouvoir mettre ces 28 lignes sans (si possible) avoir à faire un model pour chaque combinaison possible (plus tard, il y aura encore plus de possibilités car je voudrais faire en sorte que selon le int, la ligne soit d’une certaine couleur).

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

                                      Je pense que tu pourrais utiliser un IItemRender (après, jamais utilisé donc je ne sais pas trop ce que ça offre).

                                      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
                                      • robin4002R Hors-ligne
                                        robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                                        dernière édition par

                                        N’existe plus en 1.8. Donc non.

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

                                          Ah okay autant pour moi (ça a disparu comme le ISBHR (un nom de genre avec ces lettres dans un autre ordre) quoi)

                                          Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk

                                          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
                                          • LeBossMax2L Hors-ligne
                                            LeBossMax2
                                            dernière édition par

                                            Dommage… Il n’y a pas une autre solution qui pourrais remplacer IItemRender ?

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

                                            MINECRAFT FORGE FRANCE © 2024

                                            Powered by NodeBB