Résolu Texture URL
-
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!
-
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). -
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.
-
@‘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.
-
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.
-
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!