Posted December 15, 20186 yr 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.
December 16, 20186 yr 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.
December 16, 20186 yr 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?
December 16, 20186 yr 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.
December 16, 20186 yr 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.