Jump to content

How do I animate textures?


ocomobock

Recommended Posts

 

Qo6xXxI.png

 

 

I'm trying to create a new compass that points at a random player on the server when you right click with it.

 

My current problem is that it doesn't recognize my file because it's 16x512. This is the error I get when it tries to load the texture:

 

[WARNING] [Minecraft-Client] TextureManager.createTexture: Skipping mods/combatbars/textures/items/playercompass.png because of broken aspect ratio and not animation

 

I can't figure out how the original compass can use a 16x512 png without getting any errors. Does anyone know how to do this?

 

Here's all my code:

 

Outside of the load method

public static Item playercompass;

 

In the load method

playercompass = (new ItemPlayerCompass(3841)).setUnlocalizedName("combatbars:playercompass").setCreativeTab(CreativeTabs.tabTools);

LanguageRegistry.addName(playercompass, "Player Compass");

 

TexturePlayerCompass

 

package ocomobock.healingbar;

import java.util.Iterator;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.Texture;
import net.minecraft.client.renderer.texture.TextureStitched;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.INetworkManager;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.world.World;
import java.util.Random;

@SideOnly(Side.CLIENT)
public class TexturePlayerCompass extends TextureStitchedPlayer
{
    public static TexturePlayerCompass compassTexture;
    public static Random r;
    public static String playerPointingAt;
    public static EntityPlayer entityplayer;
    public static boolean isOnePlayer = false;

    /** Current compass heading in radians */
    public double currentAngle;

    /** Speed and direction of compass rotation */
    public double angleDelta;

    public TexturePlayerCompass()
    {
        super("compass");
        compassTexture = this;
    }

    public void updateAnimation()
    {
    	INetworkManager par1INetworkManager = null;
        Minecraft minecraft = Minecraft.getMinecraft();

        if (minecraft.theWorld != null && minecraft.thePlayer != null)
        {
            this.updateCompass(minecraft.theWorld, minecraft.thePlayer.posX, minecraft.thePlayer.posZ, (double)minecraft.thePlayer.rotationYaw, false, false);
        }
        else
        {
            this.updateCompass((World)null, 0.0D, 0.0D, 0.0D, true, false);
        }
    }

    /**
     * Updates the compass based on the given x,z coords and camera direction
     */
    public void updateCompass(World par1World, double par2, double par4, double par6, boolean par8, boolean par9)
    {
        double d3 = 0.0D;
        Minecraft minecraft = Minecraft.getMinecraft();
        World w = Minecraft.getMinecraft().theWorld;

        if (par1World != null && !par8)
        {
            entityplayer = (EntityPlayer)w.playerEntities.get(w.rand.nextInt(w.playerEntities.size()));
            playerPointingAt = entityplayer.username;
            int playerAmount = (Integer)w.playerEntities.get(w.rand.nextInt(w.playerEntities.size()));
        	if (playerAmount == 1)
        	{
        		isOnePlayer = true;
        	}else
        	{
        		isOnePlayer = false;
        	}
        	double d4;
        	double d5;
            d4 = (double)entityplayer.posX - par2;
            d5 = (double)entityplayer.posZ - par4;
            par6 %= 360.0D;
            d3 = -((par6 - 90.0D) * Math.PI / 180.0D - Math.atan2(d5, d4));
        }

        if (par9)
        {
            this.currentAngle = d3;
        }
        else
        {
            double d6;

            for (d6 = d3 - this.currentAngle; d6 < -Math.PI; d6 += (Math.PI * 2D))
            {
                ;
            }

            while (d6 >= Math.PI)
            {
                d6 -= (Math.PI * 2D);
            }

            if (d6 < -1.0D)
            {
                d6 = -1.0D;
            }

            if (d6 > 1.0D)
            {
                d6 = 1.0D;
            }

            this.angleDelta += d6 * 0.1D;
            this.angleDelta *= 0.8D;
            this.currentAngle += this.angleDelta;
        }

        int i;

        for (i = (int)((this.currentAngle / (Math.PI * 2D) + 1.0D) * (double)this.textureList.size()) % this.textureList.size(); i < 0; i = (i + this.textureList.size()) % this.textureList.size())
        {
            ;
        }

        if (i != this.frameCounter)
        {
            this.frameCounter = i;
            this.textureSheet.copyFrom(this.originX, this.originY, (Texture)this.textureList.get(this.frameCounter), this.rotated);
        }
    }
}

 

 

Original TextureCompass

 

package net.minecraft.client.renderer.texture;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.world.World;

@SideOnly(Side.CLIENT)
public class TextureCompass extends TextureStitched
{
    public static TextureCompass compassTexture;

    /** Current compass heading in radians */
    public double currentAngle;

    /** Speed and direction of compass rotation */
    public double angleDelta;

    public TextureCompass()
    {
        super("compass");
        compassTexture = this;
    }

    public void updateAnimation()
    {
        Minecraft minecraft = Minecraft.getMinecraft();

        if (minecraft.theWorld != null && minecraft.thePlayer != null)
        {
            this.updateCompass(minecraft.theWorld, minecraft.thePlayer.posX, minecraft.thePlayer.posZ, (double)minecraft.thePlayer.rotationYaw, false, false);
        }
        else
        {
            this.updateCompass((World)null, 0.0D, 0.0D, 0.0D, true, false);
        }
    }

    /**
     * Updates the compass based on the given x,z coords and camera direction
     */
    public void updateCompass(World par1World, double par2, double par4, double par6, boolean par8, boolean par9)
    {
        double d3 = 0.0D;

        if (par1World != null && !par8)
        {
            ChunkCoordinates chunkcoordinates = par1World.getSpawnPoint();
            double d4 = (double)chunkcoordinates.posX - par2;
            double d5 = (double)chunkcoordinates.posZ - par4;
            par6 %= 360.0D;
            d3 = -((par6 - 90.0D) * Math.PI / 180.0D - Math.atan2(d5, d4));

            if (!par1World.provider.isSurfaceWorld())
            {
                d3 = Math.random() * Math.PI * 2.0D;
            }
        }

        if (par9)
        {
            this.currentAngle = d3;
        }
        else
        {
            double d6;

            for (d6 = d3 - this.currentAngle; d6 < -Math.PI; d6 += (Math.PI * 2D))
            {
                ;
            }

            while (d6 >= Math.PI)
            {
                d6 -= (Math.PI * 2D);
            }

            if (d6 < -1.0D)
            {
                d6 = -1.0D;
            }

            if (d6 > 1.0D)
            {
                d6 = 1.0D;
            }

            this.angleDelta += d6 * 0.1D;
            this.angleDelta *= 0.8D;
            this.currentAngle += this.angleDelta;
        }

        int i;

        for (i = (int)((this.currentAngle / (Math.PI * 2D) + 1.0D) * (double)this.textureList.size()) % this.textureList.size(); i < 0; i = (i + this.textureList.size()) % this.textureList.size())
        {
            ;
        }

        if (i != this.frameCounter)
        {
            this.frameCounter = i;
            this.textureSheet.copyFrom(this.originX, this.originY, (Texture)this.textureList.get(this.frameCounter), this.rotated);
        }
    }
}

 

 

ItemPlayerCompass

 

 

package ocomobock.healingbar;

import java.util.Random;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.util.MathHelper;
import net.minecraft.world.ChunkCoordIntPair;
import net.minecraft.world.World;

public class ItemPlayerCompass extends Item{

public ItemPlayerCompass(int par1) {super(par1);}

public ItemStack onItemRightClick(ItemStack stack, World par2World, EntityPlayer p)
{
    	ChunkCoordinates chunkcoordinates = par2World.getSpawnPoint();
    	p.addChatMessage(Integer.toString(par2World.playerEntities.size()) + TexturePlayerCompass.playerPointingAt);
    	EntityPlayer pp = TexturePlayerCompass.entityplayer;
	TexturePlayerCompass.r = new Random();
	p.addChatMessage(chunkcoordinates.posX + "," + chunkcoordinates.posZ + " --- " + TexturePlayerCompass.isOnePlayer);
	return stack;
}
}

 

 

The original compass is just a normal item with no special class. Mine obviously has one just because of the onItemRightClick method.

 

Anyway, if anyone could help that would be awesome.

 

EDIT: I was testing stuff in ItemPlayerCompass, but that class isn't really important right now.

Link to comment
Share on other sites

I had this problem, too. Just make a txt file next to your animated texture, name it the same as the texture and you should be fine. Leave the txt file blank.

For example:

texture.png  <==>  texture.txt

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Link to comment
Share on other sites

Thank you, that seemed to have worked.

 

EDIT: The compass is spinning randomly now. But, nobody else probably has any experience with this so I'll just try to figure it out on my own.

 

My guess is that it somehow isn't finding the proper way to animate the texture and reverts to the default animation, which just goes through each panel every few ticks. But I have no idea why <_<

Link to comment
Share on other sites

Does anyone wanna help with this? I wasn't able to figure it out and I have no idea what I could be doing wrong.

 

If someone wants to really try and help (unlikely) you could get TeamViewer and remotely edit my code. That would be a lot more efficient than through replies and stuff.

 

You don't have to get TeamViewer, but it would probably be a lot easier that way

Link to comment
Share on other sites

Does anyone wanna help with this? I wasn't able to figure it out and I have no idea what I could be doing wrong.

 

If someone wants to really try and help (unlikely) you could get TeamViewer and remotely edit my code. That would be a lot more efficient than through replies and stuff.

 

You don't have to get TeamViewer, but it would probably be a lot easier that way

 

In your Item class, where do you register your texture?

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Link to comment
Share on other sites

I didn't think I needed to do that because I added this in the main class:

 

playercompass = (new Item(3841)).setUnlocalizedName("playercompass:playercompass").setCreativeTab(CreativeTabs.tabTools);

 

I guess I forgot to add that. Also, sorry I took 3 days to reply, I forgot about this thread somehow.

Link to comment
Share on other sites

I didn't think I needed to do that because I added this in the main class:

 

playercompass = (new Item(3841)).setUnlocalizedName("playercompass:playercompass").setCreativeTab(CreativeTabs.tabTools);

 

I guess I forgot to add that. Also, sorry I took 3 days to reply, I forgot about this thread somehow.

 

What you should have is following:

- Have an own Item class (here ItemMyCompass)

- Have an own TextureStitched class (here TextureMyCompass, you can copy the code from the TextureCompass class and change the stuff in that code, it's what I did)

Seems like you have both. In order to "bind" the TextureStitched to your item, do these lines of code in your updateIcons method (if you don't have one, create and override one):

Minecraft.getMinecraft().renderEngine.textureMapItems.setTextureEntry("playercompass:playercompass", new TextureMyCompass());
this.iconIndex = TextureMyCompass.compassTexture;

The first line registers the TextureStitched to Minecraft and binds the right texture for it. "playercompass:playercompass" is the string you would also normally use when you register an "ordinary" texture

The second line grabs the newly created instance from the custom TextureStitched class and assigns it to the texture field of the Item.

 

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Link to comment
Share on other sites

Minecraft.getMinecraft().renderEngine.textureMapItems.setTextureEntry("playercompass:playercompass", new TextureStitchedPlayer());

 

This line gives me two errors. setTextureEntry basically says the arguments don't match (String, TextureStitched) and (String, TextureStitchedPlayer). 'new TextureStitchedPlayer()' wants me to add a String as an argument.

 

Maybe I could add "playercompass:playercompass" to the second error, and for the first one I'm not really sure. I can't just use TextureStitched. Maybe I could make a new TextureMap class (where setTextureEntry is from).

 

I'll try to do both of those and see if they work.

 

EDIT: Okay, making a new TextureMap class didn't work at all. But I made TextureStitchedPlayer extend TextureStitched and that fixed the first error. And I fixed (maybe) the second error by putting "playercompass:playercompass".

 

EDIT 2: Nothing I'm trying is working at all and now I have "missing texture" as the texture.

Link to comment
Share on other sites

Minecraft.getMinecraft().renderEngine.textureMapItems.setTextureEntry("playercompass:playercompass", new TextureStitchedPlayer());

 

This line gives me two errors. setTextureEntry basically says the arguments don't match (String, TextureStitched) and (String, TextureStitchedPlayer). 'new TextureStitchedPlayer()' wants me to add a String as an argument.

 

Maybe I could add "playercompass:playercompass" to the second error, and for the first one I'm not really sure. I can't just use TextureStitched. Maybe I could make a new TextureMap class (where setTextureEntry is from).

 

I'll try to do both of those and see if they work.

 

EDIT: Okay, making a new TextureMap class didn't work at all. But I made TextureStitchedPlayer extend TextureStitched and that fixed the first error. And I fixed (maybe) the second error by putting "playercompass:playercompass".

 

EDIT 2: Nothing I'm trying is working at all and now I have "missing texture" as the texture.

 

Maybe it has changed in a newer Version of Forge. I have to look into this...

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Link to comment
Share on other sites

  • 2 weeks later...

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.