Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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.

  

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.

  • Author
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?

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.

  • Author
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! 

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.