MFF

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

    Plusieurs textures pour un même modèle custom d'une entité

    Planifier Épinglé Verrouillé Déplacé Résolu 1.7.x
    1.7.10
    37 Messages 4 Publieurs 5.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.
    • FolganskyF Hors-ligne
      Folgansky Correcteurs
      dernière édition par

      Hum donc ça?

      public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
      {
      int metadata = stack.getItemDamage();
      if(metadata == 0)
      {
      EntityMoto e = new EntityMoto(world);
        if(!world.isRemote)
            {
         e.setPosition(x, y + 1.0F, z);
         world.spawnEntityInWorld(e);
         stack.stackSize–;
            }
      //   else
      //   {
      //    DataWatcher dw = e.getDataWatcher();
      //    dw.updateObject(30, "Moto");
      //   }
            return true;
      }
      else if(metadata == 1)
      {
      EntityMoto e = new EntityMoto(world);
        if(!world.isRemote)
            {
         e.setPosition(x, y + 1.0F, z);
         world.spawnEntityInWorld(e);
         stack.stackSize--;
            }
      //   else
      //   {
      //    DataWatcher dw = e.getDataWatcher();
      //    dw.updateObject(30, "Moto1");
      //   }
            return true;
      }
      else if (metadata == 2)
          {
          if(!world.isRemote)
              {
          EntityBMX e = new EntityBMX(world);
          e.setPosition(x, y + 1.0F, z);
          world.spawnEntityInWorld(e);
          stack.stackSize--;
              }
                  return true;
          }
      else if (metadata == 3)
          {
          if(!world.isRemote)
              {
          EntityBuggy e = new EntityBuggy(world);
          e.setPosition(x, y + 1.0F, z);
          world.spawnEntityInWorld(e);
          stack.stackSize--;
              }
                  return true;
          }
          else if (metadata == 4)
          {
          if(!world.isRemote)
              {
          EntityBaignoire e = new EntityBaignoire(world);
          e.setPosition(x, y + 1.0F, z);
          world.spawnEntityInWorld(e);
          stack.stackSize--;
              }
                  return true;
          }
      return false;
      }
      

      Parce qu’au final c’est comme au début, sauf que j’ai rajouté un event que je fais spawn l’entité qui lie toujours le même dataWatcher. Moi pas tout comprendre 😃

      1 réponse Dernière réponse Répondre Citer 0
      • DiabolicaTrixD Hors-ligne
        DiabolicaTrix Correcteurs Moddeurs confirmés
        dernière édition par

        en fait il faut que tu gardes le dw.update, tu fais juste enlever le else.

        1 réponse Dernière réponse Répondre Citer 0
        • FolganskyF Hors-ligne
          Folgansky Correcteurs
          dernière édition par

          Tu me fais une blague en me disant qu’il y a autre chose à faire?

          Tout marche comme je l’espérais, le println me sort les bonnes valeurs, chaque metadata différent me donne bien une texture différente (et la bonne précisons).

          Je te remercie de suite et je met en résolu ou y’a un problème éventuel à prévoir dans tout ça?

          edit: Tu parlais de texture non sauvegardée.

          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

            Pourquoi tu passes par un event pour ajouter un data watcher à une entité qui vient de ton propre mod ?
            Tu peux le faire directement dans le constructeur de l’entité …

            1 réponse Dernière réponse Répondre Citer 0
            • DiabolicaTrixD Hors-ligne
              DiabolicaTrix Correcteurs Moddeurs confirmés
              dernière édition par

              Ah ouais c’est vrai ce que robin a dit, tu peux mettre ton addobject dans le constructeur de l’entité, mais si tu veux pas touché parce que ça marche c’est pas grave ^^
              Par contre je te faisait modifier des trucs car je n’avais pas vu que tu avais dit que ça fonctionnait 😛

              Pour la sauvegarde, c’est simple:

              Dans ton EntityMoto tu ajoutes ces deux méthodes:

              public void writeEntityToNBT(NBTTagCompound nbt) {
              super.writeEntityToNBT(nbt);
              DataWatcher dw = this.getDataWatcher();
              nbt.setString("EntityMotoTexture", dw.getWatchableObjectString(30));
              }
              
              public void readEntityFromNBT(NBTTagCompound nbt) {
              super.readEntityFromNBT(nbt);
              DataWatcher dw = this.getDataWatcher();
              dw.updateObject(30, nbt.getString("EntityMotoTexture"));
              }
              

              Et c’est bon! la première écrit la valeur du datawatcher dans les tags nbt de l’entité et la seconde récupère le même tag et update le datawatcher avec.

              1 réponse Dernière réponse Répondre Citer 1
              • FolganskyF Hors-ligne
                Folgansky Correcteurs
                dernière édition par

                Ouki, vraiment super tout ça.

                Tout a fonctionné au moment où j’ai enlevé le “else”.
                Je vais continuer à passer par l’eventHandler, ça me permet d’y regrouper tous les dataWatcher de mes entités.
                (conventionnellement c’est peut être pas propre mais si je m’arrêtais à ça je n’avancerais plus)

                Dernière petite question en passant qui touche d’un peu plus loin le sujet:

                Mon seul limitant actuellement sera la limite de metadata pour cette classe item. Sachant que j’ai 5 entités pour le moment, que je vais forcément me motiver pour en faire 5 autres à la longue et que j’aimerais proposer 3 textures différentes par entités, ce qui nous fait 30 items différents pour faire spawn mes entités.

                Possible d’en avoir autant? (bloc c’est 15+1 et Slabs 7+1, items je n’en sais rien encore)

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

                  Selon le nombre total de texture que tu as prévu, tu seras aussi limité niveau DataWatcher, fais attention !

                  1 réponse Dernière réponse Répondre Citer 0
                  • FolganskyF Hors-ligne
                    Folgansky Correcteurs
                    dernière édition par

                    Je n’arrive pas à appliquer vos précieux conseils sur d’autres entités.

                    J’ai cru qu’il me suffisait de faire comme pour l’entité moto et de faire ça dans l’eventHandler:

                    :::

                    @SubscribeEvent
                    public void handleConstruction(EntityConstructing event)
                    {
                      if(event.entity instanceof EntityMoto)
                      {
                          DataWatcher dw = event.entity.getDataWatcher();
                          dw.addObject(30, "Moto");
                      }
                      else if(event.entity instanceof EntityKart)
                      {
                          DataWatcher dw = event.entity.getDataWatcher();
                          dw.addObject(31, "Kart");
                      }
                      else if(event.entity instanceof EntityBuggy)
                      {
                          DataWatcher dw = event.entity.getDataWatcher();
                          dw.addObject(32, "Buggy");
                      }
                      else if(event.entity instanceof EntityBMX)
                      {
                          DataWatcher dw = event.entity.getDataWatcher();
                          dw.addObject(33, "BMX");
                      }
                      else if(event.entity instanceof EntityBaignoire)
                      {
                          DataWatcher dw = event.entity.getDataWatcher();
                          dw.addObject(34, "Baignoire");
                      }
                    

                    :::

                    Une idée d’où je me foire?

                    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

                      Aucun problème pour les metadatas. Les metadatas des item stack est stocké dans un short si ma mémoire est bonne, ça fait donc 32767 metadata possible.

                      Et je ne vois pas en quoi le dataWatcher est limitant. C’est un string, il peut mettre tout ce qui veut dedans ce qui laisse beaucoup de possibilité.
                      D’ailleurs pour des questions d’optimisations (réduire la taille des paquets) il aurait été mieux d’utiliser un dataWatcher de type int ou short et dans le code du rendu bind une texture différente en fonction de la valeur de ce nombre.

                      1 réponse Dernière réponse Répondre Citer 0
                      • FolganskyF Hors-ligne
                        Folgansky Correcteurs
                        dernière édition par

                        Je met les autres classes d’ailleurs peut-être que ça ne vient pas de l’eventHandler (bien que certains metadata me fassent crash, j’ai la tête dedans)

                        :::

                        @Override
                        public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
                        {
                        int metadata = stack.getItemDamage();
                        if(metadata == 0)
                        {
                        EntityMoto e = new EntityMoto(world);
                          if(!world.isRemote)
                              {
                           e.setPosition(x, y + 1.0F, z);
                           world.spawnEntityInWorld(e);
                           stack.stackSize–;
                           DataWatcher dw = e.getDataWatcher();
                           dw.updateObject(30, "Moto");
                          }
                              return true;
                        }
                        else if(metadata == 1)
                        {
                        EntityMoto e = new EntityMoto(world);
                          if(!world.isRemote)
                              {
                           e.setPosition(x, y + 1.0F, z);
                           world.spawnEntityInWorld(e);
                           stack.stackSize--;
                           DataWatcher dw = e.getDataWatcher();
                           dw.updateObject(30, "Moto1");
                          }
                              return true;
                        }
                        else if(metadata == 2)
                        {
                        EntityMoto e = new EntityMoto(world);
                          if(!world.isRemote)
                              {
                           e.setPosition(x, y + 1.0F, z);
                           world.spawnEntityInWorld(e);
                           stack.stackSize--;
                           DataWatcher dw = e.getDataWatcher();
                           dw.updateObject(30, "Moto2");
                          }
                              return true;
                        }
                        else if (metadata == 3)
                            {
                            EntityBMX e = new EntityBMX(world);
                            if(!world.isRemote)
                                {
                            e.setPosition(x, y + 1.0F, z);
                            world.spawnEntityInWorld(e);
                            stack.stackSize--;
                            DataWatcher dw = e.getDataWatcher();
                            dw.updateObject(33, "BMX");
                                }
                                    return true;
                            }
                        else if (metadata == 4)
                            {
                            EntityBMX e = new EntityBMX(world);
                            if(!world.isRemote)
                                {
                            e.setPosition(x, y + 1.0F, z);
                            world.spawnEntityInWorld(e);
                            stack.stackSize--;
                            DataWatcher dw = e.getDataWatcher();
                            dw.updateObject(33, "BMX1");
                                }
                                    return true;
                            }
                        else if (metadata == 5)
                            {
                            EntityBMX e = new EntityBMX(world);
                            if(!world.isRemote)
                                {
                            e.setPosition(x, y + 1.0F, z);
                            world.spawnEntityInWorld(e);
                            stack.stackSize--;
                            DataWatcher dw = e.getDataWatcher();
                            dw.updateObject(33, "BMX2");
                                }
                                    return true;
                            }
                        else if (metadata == 6)
                            {
                            EntityBuggy e = new EntityBuggy(world);
                            if(!world.isRemote)
                                {
                            e.setPosition(x, y + 1.0F, z);
                            world.spawnEntityInWorld(e);
                            stack.stackSize--;
                            DataWatcher dw = e.getDataWatcher();
                            dw.updateObject(32, "Buggy");
                                }
                                    return true;
                            }
                        else if (metadata == 7)
                            {
                            EntityBuggy e = new EntityBuggy(world);
                            if(!world.isRemote)
                                {
                            e.setPosition(x, y + 1.0F, z);
                            world.spawnEntityInWorld(e);
                            stack.stackSize--;
                            DataWatcher dw = e.getDataWatcher();
                            dw.updateObject(32, "Buggy1");
                                }
                                    return true;
                            }
                        else if (metadata == 8)
                            {
                            EntityBuggy e = new EntityBuggy(world);
                            if(!world.isRemote)
                                {
                            e.setPosition(x, y + 1.0F, z);
                            world.spawnEntityInWorld(e);
                            stack.stackSize--;
                            DataWatcher dw = e.getDataWatcher();
                            dw.updateObject(32, "Buggy2");
                                }
                                    return true;
                            }
                            else if (metadata == 9)
                            {
                            EntityBaignoire e = new EntityBaignoire(world);
                            if(!world.isRemote)
                                {
                            e.setPosition(x, y + 1.0F, z);
                            world.spawnEntityInWorld(e);
                            stack.stackSize--;
                            DataWatcher dw = e.getDataWatcher();
                            dw.updateObject(34, "Baignoire");
                                }
                                    return true;
                            }
                            else if (metadata == 10)
                            {
                            EntityBaignoire e = new EntityBaignoire(world);
                            if(!world.isRemote)
                                {
                            e.setPosition(x, y + 1.0F, z);
                            world.spawnEntityInWorld(e);
                            stack.stackSize--;
                            DataWatcher dw = e.getDataWatcher();
                            dw.updateObject(34, "Baignoire1");
                                }
                                    return true;
                            } 
                            else if (metadata == 11)
                            {
                            EntityBaignoire e = new EntityBaignoire(world);
                            if(!world.isRemote)
                                {
                            e.setPosition(x, y + 1.0F, z);
                            world.spawnEntityInWorld(e);
                            stack.stackSize--;
                            DataWatcher dw = e.getDataWatcher();
                            dw.updateObject(34, "Baignoire2");
                                }
                                    return true;
                            }
                            else if (metadata == 12)
                            {
                            EntityKart e = new EntityKart(world);
                            if(!world.isRemote)
                                {
                            e.setPosition(x, y + 1.0F, z);
                            world.spawnEntityInWorld(e);
                            stack.stackSize--;
                            DataWatcher dw = e.getDataWatcher();
                            dw.updateObject(31, "Kart");
                                }
                                    return true;
                            }
                            else if (metadata == 13)
                            {
                            EntityKart e = new EntityKart(world);
                            if(!world.isRemote)
                                {
                            e.setPosition(x, y + 1.0F, z);
                            world.spawnEntityInWorld(e);
                            stack.stackSize--;
                            DataWatcher dw = e.getDataWatcher();
                            dw.updateObject(31, "Kart1");
                                }
                                    return true;
                            }
                            else if (metadata == 14)
                            {
                            EntityKart e = new EntityKart(world);
                            if(!world.isRemote)
                                {
                            e.setPosition(x, y + 1.0F, z);
                            world.spawnEntityInWorld(e);
                            stack.stackSize--;
                            DataWatcher dw = e.getDataWatcher();
                            dw.updateObject(31, "Kart2");
                                }
                                    return true;
                            }
                        return false;
                        }
                        

                        :::

                        :::

                        public void writeEntityToNBT(NBTTagCompound nbt) {
                        super.writeEntityToNBT(nbt);
                        DataWatcher dw = this.getDataWatcher();
                        nbt.setString("EntityKartTexture", dw.getWatchableObjectString(31));
                        }
                        
                        public void readEntityFromNBT(NBTTagCompound nbt) {
                        super.readEntityFromNBT(nbt);
                        DataWatcher dw = this.getDataWatcher();
                        dw.updateObject(31, nbt.getString("EntityKartTexture"));
                        }
                        

                        :::

                        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

                          Les dataWatcher ne sont pas limité à 32 ? Je ne comprends pas pourquoi tu utilises un id différent à chaque fois. Comme ce n’est pas la même entité tu peux utiliser le même id.
                          Et pour l’erreur sur “baignoire” c’est parce que tu as une majuscule dans le nom du paramètre de la fonction getBaignoireTexture

                          1 réponse Dernière réponse Répondre Citer 0
                          • FolganskyF Hors-ligne
                            Folgansky Correcteurs
                            dernière édition par

                            @‘robin4002’:

                            Les dataWatcher ne sont pas limité à 32 ? Je ne comprends pas pourquoi tu utilises un id différent à chaque fois. Comme ce n’est pas la même entité tu peux utiliser le même id.
                            Et pour l’erreur sur “baignoire” c’est parce que tu as une majuscule dans le nom du paramètre de la fonction getBaignoireTexture

                            Hihihi tu vois tout même quand j’essaie de faire le plus vite possible pour ne pas afficher cette erreur toute bête.

                            Alors effectivement j’ai modifié beaucoup de valeur avec pas mal d’oublis dans certaines classes, donc là tout est bon.

                            Je crois que j’ai commencé à changer la valeur du dataWatcher car justement ça ne fonctionnait pas. Comme au dessus de 30 ça plantait je me suis demandé justement si je ne devais pas aller en diminuant, du coup je suis parti sur 30, 29, 28 etc bref.

                            J’aurais pu mettre 30 partout tu me dis?

                            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

                              Oui tu peux utiliser 30 partout car ce n’est pas la même entité.

                              1 réponse Dernière réponse Répondre Citer 0
                              • FolganskyF Hors-ligne
                                Folgansky Correcteurs
                                dernière édition par

                                Je n’ai plus de questions sur le sujet et tout fonctionne.

                                Un gigantesque merci à toi **[font=Ubuntu, sans-serif[size=medium]DiabolicaTrix ]**car tu m’as plus qu’aidé, tu m’as guidé.

                                Merci Robin pour ces précisions quant aux dataWatcher que j’aborde à peine j’imagine.
                                Notamment cette histoire d’optimisation qui pourrait être utile afin de soulager un serveur qui sera bien sollicité normalement.

                                Je passe en résolu.

                                1 réponse Dernière réponse Répondre Citer 0
                                • DiabolicaTrixD Hors-ligne
                                  DiabolicaTrix Correcteurs Moddeurs confirmés
                                  dernière édition par

                                  Ça fait plaisir 🙂

                                  @Robin en fait c’est 31 avec le 0 donc si tu essaie 32, ça crash normalement mais bon, c’est vraiment un détail.

                                  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