Posted September 18, 201411 yr Hey, I have been trying to figure out how to do this for hours, but no luck. I could really do with some help, so I am hoping that putting my problem here might yield some solutions My Mod: An item that when you right click a mob/player, you can choose a new texture for them. I am using: public boolean itemInteractionForEntity(ItemStack par1ItemStack, EntityPlayer Player, EntityLivingBase Target){} in my item class to target the entity. (I also have a JFileChooser set up, and working correctly, to select a file path which I can then pass into RecourseLocation.) So: [*]I have a targeted EntityLivingBase [*]I have a texture file path how can I apply the new texture to the target ? Also: If it is too difficult to make this work for all entities, then it can just be for players. It only needs to update on the players screen, not the target. So, if it is used in SMP and I try to change the skin of a different player, it should only change it in my view and NOT theirs. Thanks for taking the time to read this and I hope somebody can help me out a little Thanks in advance, Sam EDIT: I am not sure how much help my code will be, but if you need it for whatever reason, here it is: public boolean itemInteractionForEntity(ItemStack par1ItemStack, EntityPlayer Player, EntityLivingBase Target){ Minecraft mc= Minecraft.getMinecraft(); //File Chooser JFrame frame = new JFrame("Skin Tool"); File skinFile = new File ("C:\\Users\\Sam Humby\\Desktop\\SamalotPlays\\Graphics\\Skins"); JFileChooser chooser = new JFileChooser(skinFile); int result = chooser.showOpenDialog(frame); if (result == JFileChooser.APPROVE_OPTION) { File selectedFile = chooser.getSelectedFile(); System.out.println("Selected file: " + selectedFile.getAbsolutePath()); ResourceLocation location = new ResourceLocation(selectedFile.getAbsolutePath()); System.out.println(location.toString()); } return false; } note: this is a private/personal mod that wont be published, which is why the directories are static.
September 18, 201411 yr Well, the association of the texture with the entity happens in the renderer class. For example RenderCow class sets the cowTextures ResourceLocation to be ResourceLocation("textures/entity/cow/cow.png"). The problems are that: a) each render class is different and they don't all have consistent fields or methods for the textures. b) the texture resource location field and methods are private and protected respectively. So I think your best bet is to change the renderer mapping by editing the RenderManager.inistance.entityRenderMap directly to replace the renderers with custom renderers. The safe way to do this is with the rendering registry. I just tried it out and it works pretty well, but it does mean you need to make a custom renderer class for each texture you want to associate: You need to put something like this in your client proxy class. RenderingRegistry.registerEntityRenderingHandler(EntityCow.class, new RenderCowMagicBeans(new ModelCow(), 0.7F)); In this case, I made a RenderCowMagicBeans class that looks like this: public class RenderCowMagicBeans extends RenderLiving { private ResourceLocation cowMagicBeansTexture; /** * @param parModelBase * @param parShadowSize */ public RenderCowMagicBeans(ModelBase parModelBase, float parShadowSize) { super(parModelBase, parShadowSize); setEntityTexture(); } protected void setEntityTexture() { cowMagicBeansTexture = new ResourceLocation(MagicBeans.MODID+":textures/entities/cow_magic_beans.png"); } @Override protected ResourceLocation getEntityTexture(Entity par1Entity) { return cowMagicBeansTexture; } } The new texture I pointed to was used for all entity cows. Check out my tutorials here: http://jabelarminecraft.blogspot.com/
September 18, 201411 yr Author EDIT: Fixed it I now have a custom render class for the Pig. Now my biggest issue is working out how to use this static render class from a non-static item class
September 18, 201411 yr EDIT: Fixed it I now have a custom render class for the Pig. Now my biggest issue is working out how to use this static render class from a non-static item class I think what you would do is create a public field (or maybe multiple fields or an array depending on how many entities and textures can be affected) in your mod's main class. for example you can have a ResourceLocation field for your texturePigCurrent and textureCowCurrent, etc. Then in your item class you just update this field. And in the render class you would just reference that field. so the item doesn't directly do the rendering, but basically updates a public mod field to point to new resource location which is then used by the render class. Get the idea? Check out my tutorials here: http://jabelarminecraft.blogspot.com/
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.