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

    Résolu Texture URL

    1.7.x
    1.7.10
    2
    6
    2806
    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.
    • DiabolicaTrix
      DiabolicaTrix Correcteurs Moddeurs confirmés dernière édition par

      Hey, c’est encore moi!

      Donc, ma question est: comment faire afficher une texture à partir d’un URL. Comme par example, les skins de Minecraft. En fait ce que je cherche à faire est de pouvoir mettre un skin à mon PNJ sans être obligé de faire une mise à jour du mod, ce qui serait très malcommode. C’est surement simple, j’ai recherché un peu en anglais et ça parlait de DynamicTexture qui télécharge l’image dans le resource pack de Minecraft, mais aucune solution vraiment. Bref, peut-être pourrez-vous m’éclairer!

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

        Regardes du côté du système de skin. Si tu n’arrives pas à voir quel code est nécessaire tu peux aller voir le code des chapeau de FFMT lib.
        https://github.com/FFMT/FFMT-libs/blob/master/common/fr/minecraftforgefrance/ffmtlibs/event/FFMTCustomPlayerProp.java#L46-L125
        https://github.com/FFMT/FFMT-libs/blob/master/common/fr/minecraftforgefrance/ffmtlibs/render/LayerHat.java
        (dans ton cas pas besoin de layer ni de custom player prop comme tu veux ajouter ta texture à ta propre entité et non à une entité existante. Donc tu peux directement mettre le code dans la classe de l’entité au lieu du custom player prop et dans le rendu au lieu du layer. Attention aussi car en plus de télécharger la texture ce code télécharge aussi deux fichiers textes).

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

          Bref, j’ai juste à mettre le code du prop directement dans le render.

          PS: désolé de ma réponse tardive mais je suis au québec donc je viens de finir l’école.

          EDIT: Donc j’ai essayé ça et ça fonctionne pas, ce soir je suis fatigué je vais voir ça demain.

          package diabolicatrix.project;
          
          import java.awt.image.BufferedImage;
          import java.io.File;
          
          import net.minecraft.client.Minecraft;
          import net.minecraft.client.model.ModelBiped;
          import net.minecraft.client.renderer.ImageBufferDownload;
          import net.minecraft.client.renderer.ThreadDownloadImageData;
          import net.minecraft.client.renderer.entity.RenderBiped;
          import net.minecraft.client.renderer.texture.ITextureObject;
          import net.minecraft.client.renderer.texture.TextureManager;
          import net.minecraft.entity.DataWatcher;
          import net.minecraft.entity.EntityLiving;
          import net.minecraft.util.ResourceLocation;
          import net.minecraft.util.StringUtils;
          
          public class RenderMarketPNJ extends RenderBiped {
          
          public ResourceLocation locationSkin;
              public ThreadDownloadImageData downloadImageSkin;
          
          //private EEPMarket props = EEPMarket.get(this);
          
          //public final ResourceLocation texture = new ResourceLocation("t4pro", "textures/entity/dtrix1.png"); 
          
          public RenderMarketPNJ(ModelBiped model, float shadow)
          {
          super(model, shadow);
          }
          
          public ThreadDownloadImageData getDownloadImageHat(ResourceLocation resourceLocation, String uuid)
              {
                  TextureManager texturemanager = Minecraft.getMinecraft().getTextureManager();
                  Object object = texturemanager.getTexture(resourceLocation);
          
                  if(object == null)
                  {
                      object = new ThreadDownloadImageData((File)null, String.format("http://www.altiscraft.fr/skin/%s.png", StringUtils.stripControlCodes(uuid)), null, new ImageBufferDownload()
                      {
                          public BufferedImage parseUserSkin(BufferedImage image)
                          {
                              return image;
                          }
                      });
                      texturemanager.loadTexture(resourceLocation, (ITextureObject)object);
                  }
          
                  return (ThreadDownloadImageData)object;
              }
          
          protected ResourceLocation getEntityTexture(EntityLiving living)
          {
          DataWatcher dw = living.getDataWatcher();
                  String texture = dw.getWatchableObjectString(20);
                  if(this.downloadImageSkin == null)
                  {
                  this.downloadImageSkin = this.getDownloadImageHat(this.getPNJTexture((EntityMarketPNJ)living, texture), texture);
                  }
          return this.getPNJTexture((EntityMarketPNJ)living, texture);
          }
          
          private ResourceLocation getPNJTexture(EntityMarketPNJ marketPNJ, String texture)
          {
          return new ResourceLocation("t4pro", "textures/entity/" + texture + ".png");
          }
          
          }
          
          

          PS: je viens de remarquer que je ne retourne pas le vonne chose je crois.

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

            @‘DiabolicaTrix’:

            Bref, j’ai juste à mettre le code du prop directement dans le render.

            Non. Car les rendus sont des singletons. Tu as besoin d’une ressource location différente en fonction de l’instance du mob non ? Donc pas directement dans le rendu. Sauf si tu veux que tous les entités aient la même texture.

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

              Effectivement mais logiquement je peux quand même le mettre directement dans le rendu car pour télécharger la texture j’utilise le DataWatcher pour récupérer le nom de la texture.

              EDIT: Donc voici mon nouveau code mais la texture n’est pas téléchargé, le mob est mauve et noir.

              
              package diabolicatrix.project;
              
              import java.awt.image.BufferedImage;
              import java.io.File;
              
              import net.minecraft.client.Minecraft;
              import net.minecraft.client.model.ModelBiped;
              import net.minecraft.client.renderer.ImageBufferDownload;
              import net.minecraft.client.renderer.ThreadDownloadImageData;
              import net.minecraft.client.renderer.entity.RenderBiped;
              import net.minecraft.client.renderer.texture.ITextureObject;
              import net.minecraft.client.renderer.texture.TextureManager;
              import net.minecraft.entity.DataWatcher;
              import net.minecraft.entity.EntityLiving;
              import net.minecraft.util.ResourceLocation;
              import net.minecraft.util.StringUtils;
              
              public class RenderMarketPNJ extends RenderBiped {
              
              public ResourceLocation locationSkin;
                  public ThreadDownloadImageData downloadImageSkin = null;
                  public String textureChanged;
              
              //private EEPMarket props = EEPMarket.get(this);
              
              //public final ResourceLocation texture = new ResourceLocation("t4pro", "textures/entity/dtrix1.png"); 
              
              public RenderMarketPNJ(ModelBiped model, float shadow)
              {
              super(model, shadow);
              }
              
              public ThreadDownloadImageData getDownloadImageHat(ResourceLocation resourceLocation, String uuid)
                  {
                      TextureManager texturemanager = Minecraft.getMinecraft().getTextureManager();
                      System.out.println("Tex Manager Setted!");
                      Object object = texturemanager.getTexture(resourceLocation);
                      System.out.println("Object Setted!");
              
                      if(object == null)
                      {
                      System.out.println("Object Null!");
                          object = new ThreadDownloadImageData((File)null, String.format("http://www.altiscraft.fr/skin/%s.png", StringUtils.stripControlCodes(uuid)), null, new ImageBufferDownload()
                          {
                              public BufferedImage parseUserSkin(BufferedImage image)
                              {
                              System.out.println("Downloading…!");
                                  return image;
                              }
                          });
                          texturemanager.loadTexture(resourceLocation, (ITextureObject)object);
                          System.out.println("Texture Loaded...!");
                      }
              
                      System.out.println("Texture Returned...!");
                      return (ThreadDownloadImageData)object;
                  }
              
              public void downloadTextureIfNull(EntityLiving living, ResourceLocation location, String texture)
              {
              if(this.downloadImageSkin == null)
              {
              this.downloadImageSkin = this.getDownloadImageHat(this.getPNJTexture((EntityMarketPNJ)living, texture), texture);
              }
              }
              
              protected ResourceLocation getEntityTexture(EntityLiving living)
              {
              DataWatcher dw = living.getDataWatcher();
                      String texture = dw.getWatchableObjectString(20);
                      //System.out.println("Is texture null?");
                      //System.out.println(this.downloadImageSkin);
                     // this.getDownloadImageHat(this.getPNJTexture((EntityMarketPNJ)living, texture), texture);
                     this.downloadTextureIfNull(living, this.getPNJTexture((EntityMarketPNJ)living, texture), texture);
                      //return null;
                     // return new ResourceLocation("t4pro", "textures/entity/dtrix1.png");*/
                     //System.out.println();
              
                      return this.getPNJTexture((EntityMarketPNJ)living, texture);
              }
              
              private ResourceLocation getPNJTexture(EntityMarketPNJ marketPNJ, String texture)
              {
              return new ResourceLocation("t4pro", "textures/entity/" + texture + ".png");
              }
              
              }
              
              

              PPS: Petite question sur ton code, ton ressource location équivaut à quoi quand tu dowload ca rje crois que dans ton code il n’y a pas d’extension.

              Bref, il y a un message d’erreur que le texture ne peut pas être cast en ThreadDownloadImage, je crois que c’est à cause que la fonction est appllée trop souvent.

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

                Donc, effectivement, on ne peut pas mettre le code dans le render directement donc j’ai créer un EEP comme ton example et ça fonctionne parfaitement. Un seul problème c’est que en multi, quand je change la texture de l’entité (DataWatcher) et bien elle ne s’actualise pas pour les autres joueurs. Je ne crois pas que ce soit un gros problème donc je vais travailler là dessus.

                Je ne passe pas en résolu pour l’instant.

                EDIT: Donc, j’ai fait des tests plus en “profondeur” et j’ai remarqué que quand j’update le datawatcher, il est update pour le client qui l’update.

                EDIT2: Merde j’updatais seulement le client…

                EDIT3: Je passe ne résolu, merci de ton aide!

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

                MINECRAFT FORGE FRANCE © 2018

                Powered by NodeBB