Привязка анимации моба к выполнению атаки

Версия Minecraft
1.12.2
Создал кастомного моба с анимацией. Пытаюсь сделать отдельную анимацию атаки. В качестве примера использовал ванильного железного голема с его анимацией рук при ударе. В итоге получилось заставить анимацию работать. Но когда она срабатывает при атаке одного моба, она же проигрывается и для мобов, которые в этот момент не атакуют. Происходит это, как я понял, из-за того, что я сделал переменную attackTimer статичной. В ванильном классе голема эта переменная не является статичной. Но, когда я делаю аналогично, при попытке получить значение переменной в классе модели моба с помощью соответствующего метода она всегда выдает 0 и анимация не проигрывается. Подскажите, пожалуйста, как исправить.
Код:
public class EntityThrower extends AbstractSkeleton implements IRangedAttackMob
{
    private static int attackTimer;

    @Override
    public void attackEntityWithRangedAttack(EntityLivingBase target, float distanceFactor)
    {
        this.attackTimer = 10;
        
        /*какой - либо код
        ...
        */
    }

    @Override
    public void onLivingUpdate()
    {
        if (this.attackTimer > 0)
        {
            --this.attackTimer;
        }
        super.onLivingUpdate();
    }

    @SideOnly(Side.CLIENT)
    public int getAttackTimer()
    {
        return this.attackTimer;
    }
}

Код:
public class ModelThrower extends ModelBase
{ 
    @Override
    public void setRotationAngles(float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor, Entity entityIn)
    {
        this.Head.rotateAngleX = headPitch * 0.017453292F;
        this.Head.rotateAngleY = netHeadYaw * 0.017453292F;
        this.Head.rotateAngleZ = MathHelper.cos(limbSwing * 0.6662F ) * 0.1F * limbSwingAmount;

        this.Body.rotateAngleY = MathHelper.cos(limbSwing * 0.6662F + (float)Math.PI) * 0.4F * limbSwingAmount;

        this.LegL.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount - 0.2F;
        this.LegR.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F + (float)Math.PI) * 1.4F * limbSwingAmount - 0.2F;

        this.feetR.rotateAngleX = Math.abs(MathHelper.cos(limbSwing * 0.6662F + ((float)Math.PI)/2) * 1.4F * limbSwingAmount + 0.4F);
        this.feetL.rotateAngleX = Math.abs(MathHelper.cos(limbSwing * 0.6662F - ((float)Math.PI)/2) * 1.4F * limbSwingAmount + 0.4F);

        this.ArmR.rotateAngleX = MathHelper.cos(ageInTicks * 0.09F) * 0.05F;
        this.ArmL.rotateAngleX = MathHelper.cos(ageInTicks * 0.09F) * 0.05F;
        this.ArmR.rotateAngleZ = MathHelper.cos(ageInTicks * 0.09F) * 0.05F + 0.1F;
        this.ArmL.rotateAngleZ = MathHelper.cos(ageInTicks * 0.09F) * 0.05F * (-1) - 0.1F;

        this.ArmR.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F) * 0.6F * limbSwingAmount + 0.1F;
        this.ArmL.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F + (float)Math.PI) * 0.6F * limbSwingAmount + 0.1F;

        this.jawR.rotateAngleZ = MathHelper.cos(ageInTicks * 0.09F) * 0.01F + 0.42F;
        this.jawL.rotateAngleZ = MathHelper.cos(ageInTicks * 0.09F) * 0.01F * (-1) - 0.27F;
    }

    @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};

        EntityThrower thrower = (EntityThrower)entitylivingbaseIn;
        int attack = thrower.getAttackTimer();
        if(attack > 0)
        {
            this.jawL.rotateAngleX = -0.81F + phase[attack - 1];
            this.jawR.rotateAngleX = -0.81F + phase[attack - 1];
        }
    }
}
 
Решение
Максик, вечно ты несешь какой-то бред и путаешь людей.
-
У тебя переменная принимает значение на сервере, а клиент об этом вообще не знает, по-этому выдает ноль всегда.
Нужно синхронизировать. Можно из коробки сделать так:
Java:
worldObj.setEntityState(this, (byte)4); //В методе attackEntityWithRangedAttack

@SideOnly(Side.CLIENT)
    public void handleHealthUpdate(byte par1)
    {
        if (par1 == 4)
        {
            this.attackTimer = 10;
        }
        else
        {
            super.handleHealthUpdate(par1);
        }
    }
5,018
47
783
Происходит это потому что ты не делаешь проверку на своего конкретного моба, а проигрываешь анимацию для всех их.
 
5,018
47
783

tox1cozZ

aka Agravaine
8,455
598
2,892
Максик, вечно ты несешь какой-то бред и путаешь людей.
-
У тебя переменная принимает значение на сервере, а клиент об этом вообще не знает, по-этому выдает ноль всегда.
Нужно синхронизировать. Можно из коробки сделать так:
Java:
worldObj.setEntityState(this, (byte)4); //В методе attackEntityWithRangedAttack

@SideOnly(Side.CLIENT)
    public void handleHealthUpdate(byte par1)
    {
        if (par1 == 4)
        {
            this.attackTimer = 10;
        }
        else
        {
            super.handleHealthUpdate(par1);
        }
    }
 
Последнее редактирование:
У тебя переменная принимает значение на сервере, а клиент об этом вообще не знает, по-этому выдает ноль всегда.
Нужно синхронизировать. Можно из коробки сделать так:
Java:
worldObj.setEntityState(this, (byte)4); //В методе attackEntityWithRangedAttack

@SideOnly(Side.CLIENT)
    public void handleHealthUpdate(byte par1)
    {
        if (par1 == 4)
        {
            this.attackTimer = 10;
        }
        else
        {
            super.handleHealthUpdate(par1);
        }
    }
Большое спасибо! Как раз нашел в классе голема функцию "handleStatusUpdate(... id)" и сидел думал, где же оно берет этот id ).
 
Сверху