Jump to content

[1.12.x] Advanced animation for custom entity


TheOrangeInd

Recommended Posts

I have a custom entity with model and custom AI task. I want make an attack animation for my model class, that will run when entity performs my custom AI task. I already tried some ways, but ALL my entities always animating, when fighting only one of them. Tell me, please, what is the most correct way to bind an animation to entity tasks.

  

Link to comment
Share on other sites

6 hours ago, TheOrangeInd said:

but ALL my entities always animating, when fighting only one of them.

This souns like you are either using static fields to store animation state or are accessing the model/renderer from your AI task directly neither of which is correct.

6 hours ago, TheOrangeInd said:

Tell me, please, what is the most correct way to bind an animation to entity tasks.

Store and update a value of a field within your entity, sync it with the DataManager and use the value of that field to determine the animation.

Link to comment
Share on other sites

3 hours ago, V0idWa1k3r said:

Store and update a value of a field within your entity, sync it with the DataManager

In the last try I did it this way:

That is parts of

my entity class

	protected NBTTagCompound compound = new NBTTagCompound();

	@Override
    public void compoundInit()
    {
        compound.setByte("attackTime", (byte)0);
        compound.setBoolean("isAttacking", false);
    }

	public void setAttacking(Boolean attacking)
    {
        compound.setBoolean("isAttacking", attacking);
        if(attacking) setAttackTimer((byte)ATTACK_TIME);
        syncEntityOnClient();
    }

    public boolean isAttacking()
    {
        return compound.getBoolean("isAttacking");
    }

    public void setAttackTimer(byte value)
    {
        compound.setByte("attackTime", value);
        syncEntityOnClient();
    }

    public void decreaseAttackTimer()
    {
        compound.setByte("attackTime", (byte)(getAttackTimer() - 1));
        syncEntityOnClient();
    }

    public byte getAttackTimer()
    {
        return compound.getByte("attackTime");
    }

    @Override
    public void setCompound(NBTTagCompound setTo)
    {
        compound = setTo;
    }

    @Override
    public NBTTagCompound getCompound()
    {
        return compound;
    }

    @Override
    public void syncEntityOnClient()
    {
        Sync.sendEntitySyncToClient(this);
    }

 

my AI class

public boolean shouldExecute()
{
    EntityLivingBase target = this.entityHost.getAttackTarget();

    if (target == null)
    {
        return false;
    }
    else
    {
        if(this.entityHost.getDistanceSq(target) < this.maxAttackDistance && this.entityHost.getDistance(target) > 4 && target.getHealth() > 5)
        {
            this.attackTarget = target;
            this.entityHost.setAttacking(true);
            return true;
        }
        else
        {
            this.entityHost.setAttacking(false);
            return false;
        }
    }
}

public boolean shouldContinueExecuting()
{
    if (entityHost.getAttackTimer() > 0)
    {
        entityHost.decreaseAttackTimer();
    }
    return this.shouldExecute() || !this.entityHost.getNavigator().noPath();
}

 

my model class

	@Override
    public void setLivingAnimations(EntityLivingBase entitylivingbaseIn, float limbSwing, float limbSwingAmount, float partialTickTime)
    {
        float phase[] = {0.1F, 0.2F, 0.1F, -0.1F, -0.3F, -0.4F, -0.3F, -0.2F, -0.1F, 0.0F};

        boolean attacking = ((EntityThrower)entitylivingbaseIn).isAttacking();
        int time = ((EntityThrower)entitylivingbaseIn).getAttackTimer();

        if(attacking)
        {
            if(time > 0)
            {
                this.jawL.rotateAngleX = -0.81F + phase[time - 1];
                this.jawR.rotateAngleX = -0.81F + phase[time - 1];
            }
        }
    }

 

So, I tried using NBTTagCompound to save and load information about my entities, but it still doesn't work.

What am I doing wrong?

Link to comment
Share on other sites

15 minutes ago, TheOrangeInd said:

What am I doing wrong?

Well first and foremost you are using NBTTagCompound for whatever god unknown reason. Don't use it, NBT is for (de)serializatio only.

 

15 minutes ago, TheOrangeInd said:

public void setAttacking(Boolean attacking)

Any particular reason you are using boxed values? You should not be doing that.

 

16 minutes ago, TheOrangeInd said:

Sync.sendEntitySyncToClient(this);

What does this do? You have a DataManager class for syncing entity related data. Use it. Don't reinvent the wheel.

 

16 minutes ago, TheOrangeInd said:

if(attacking) { if(time > 0) { this.jawL.rotateAngleX = -0.81F + phase[time - 1]; this.jawR.rotateAngleX = -0.81F + phase[time - 1]; } }

Since models are singletons you must either include an else with default rotations or reset the rotations. Otherwise the moment attacking is true for one entity the model changes for all of them. Which is your issue.

  • Thanks 1
Link to comment
Share on other sites

1 hour ago, V0idWa1k3r said:

Well first and foremost you are using NBTTagCompound for whatever god unknown reason. Don't use it, NBT is for (de)serializatio only.

 

Any particular reason you are using boxed values? You should not be doing that.

 

What does this do? You have a DataManager class for syncing entity related data. Use it. Don't reinvent the wheel.

 

Since models are singletons you must either include an else with default rotations or reset the rotations. Otherwise the moment attacking is true for one entity the model changes for all of them. Which is your issue.

I had no model animation experience before. Now, after following your recommendatios, I got a correctly working animation. Thank you very much! 

Link to comment
Share on other sites

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.



×
×
  • Create New...

Important Information

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