Jump to content
  • Home
  • Files
  • Docs
Topics
  • All Content

  • This Topic
  • This Forum

  • Advanced Search
  • Existing user? Sign In  

    Sign In



    • Not recommended on shared computers


    • Forgot your password?

  • Sign Up
  • All Activity
  • Home
  • Mod Developer Central
  • Modder Support
  • [1.12.x] Advanced animation for custom entity
The update for 1.13 is being worked on - please be patient. (Updated 02/19/19)
1.13 Update Notes for Mod Creators
Sign in to follow this  
Followers 0
TheOrangeInd

[1.12.x] Advanced animation for custom entity

Started by TheOrangeInd, December 15, 2018

5 posts in this topic

TheOrangeInd    0

TheOrangeInd

TheOrangeInd    0

  • Tree Puncher
  • TheOrangeInd
  • Members
  • 0
  • 4 posts
  • Report post
Posted December 15, 2018

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.

  

Share this post


Link to post
Share on other sites

V0idWa1k3r    308

V0idWa1k3r

V0idWa1k3r    308

  • World Shaper
  • V0idWa1k3r
  • Members
  • 308
  • 1443 posts
  • Report post
Posted December 16, 2018
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.

Share this post


Link to post
Share on other sites

TheOrangeInd    0

TheOrangeInd

TheOrangeInd    0

  • Tree Puncher
  • TheOrangeInd
  • Members
  • 0
  • 4 posts
  • Report post
Posted December 16, 2018
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?

Share this post


Link to post
Share on other sites

V0idWa1k3r    308

V0idWa1k3r

V0idWa1k3r    308

  • World Shaper
  • V0idWa1k3r
  • Members
  • 308
  • 1443 posts
  • Report post
Posted December 16, 2018
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

Share this post


Link to post
Share on other sites

TheOrangeInd    0

TheOrangeInd

TheOrangeInd    0

  • Tree Puncher
  • TheOrangeInd
  • Members
  • 0
  • 4 posts
  • Report post
Posted December 16, 2018
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! 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  
Followers 0
Go To Topic Listing Modder Support

  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Choonster
      [1.12.2] Block Item Missing from Custom Creative Tab

      By Choonster · Posted 22 minutes ago

      ItemBlock uses the Block's creative tab, so calling Item#setCreativeTab on an ItemBlock won't do anything.
    • zbigg007
      Crashing while logging/respawn/random time

      By zbigg007 · Posted 28 minutes ago

      Hello, I have FML server on my desktop, when I have played lots of hours. From yesterday I got crashed doing random things in game. When I log in again I got crashed too. I was trying two or three times and my problem disappeared. And now I'm getting crashed sometimes, always with the same error code. I got this error code every time. I did't change anything in mods setup or server settings.  What is the problem?

       
    • Cadiboo
      Faliure when trying to setupDecompWorkspace

      By Cadiboo · Posted 30 minutes ago

      Not necessarily
    • Timur132
      Freeze during loading step 6/7 ModIdMapping - Minecraft Forge

      By Timur132 · Posted 30 minutes ago

      Thank you!
    • BatHeart
      Setup workspace for 1.13 forge

      By BatHeart · Posted 41 minutes ago

      ... and now this is broken again ... I've tried with builds 25.0.47 and 25.0.48 and it appears to be the same - you have to run gradlew genEclipseRuns before the Run Configurations appear. However, now the Client launch fails - even if you try to run it with just the examplemod. The problem is a NullPointerException at net.minecraftforge.fml.ModLoader.buildMods(ModLoader.java:161)   We can go back to using gradlew runClient - but that's not ideal especially if you want to debug.
  • Topics

    • Laike_Endaril
      1
      [1.12.2] Block Item Missing from Custom Creative Tab

      By Laike_Endaril
      Started 2 hours ago

    • zbigg007
      0
      Crashing while logging/respawn/random time

      By zbigg007
      Started 27 minutes ago

    • Ghost20000
      8
      Faliure when trying to setupDecompWorkspace

      By Ghost20000
      Started November 2, 2018

    • Timur132
      2
      Freeze during loading step 6/7 ModIdMapping - Minecraft Forge

      By Timur132
      Started Yesterday at 08:32 AM

    • Valoeghese
      18
      Setup workspace for 1.13 forge

      By Valoeghese
      Started December 31, 2018

  • Who's Online (See full list)

    • xxTFxx
    • That_Martin_Guy
    • WilliHay
    • BatHeart
    • Choonster
    • crackedEgg
  • All Activity
  • Home
  • Mod Developer Central
  • Modder Support
  • [1.12.x] Advanced animation for custom entity
  • Theme
  • Contact Us

Copyright © 2017 ForgeDevelopment LLC Powered by Invision Community