Иконка ресурса

Фикс быстро бегающих нпс в Custom NPC (1.7.10)

Версия(и) Minecraft
1.7.10
Была проблема с кастом нпс на версии майна 1.7.10. Пробовался обычный Custom NPC, и CNPC+
Везде наблюдалась проблема (что на сервере, что в дев среде), при агре нпс, который может стрелять - начинает быстро бегать вокруг. Это очень плохо
Решение возможно костыльное, возможно нет - но оно помогло.
Класс EntityNPCInterface. В него можно залезть либо миксином, либо если есть сорсы кастома - править прям так. В этом классе отсутствует Override метод moveFlying(...), в котором неограниченно для Entity прибавляется переменные motionX and motionZ
Я исправил это так:

EntityNPCInterface#moveFlying():
@Override // метод если что копирка из ванильного класса, поэтому такие нейминги переменных
    public void moveFlying(float p_70060_1_, float p_70060_2_, float p_70060_3_)
    {
        float f3 = p_70060_1_ * p_70060_1_ + p_70060_2_ * p_70060_2_;

        if (f3 >= 1.0E-4F)
        {
            f3 = MathHelper.sqrt_float(f3);

            if (f3 < 1.0F)
            {
                f3 = 1.0F;
            }

            f3 = p_70060_3_ / f3;
            p_70060_1_ *= f3;
            p_70060_2_ *= f3;
            double npcSpeed = this.getSpeed(); // беру скорость нпс
            float f4 = MathHelper.sin(this.rotationYaw * (float)Math.PI / 180.0F);
            float f5 = MathHelper.cos(this.rotationYaw * (float)Math.PI / 180.0F);
            // - тут старый код
            //this.motionX += (double)(p_70060_1_ * f5 - p_70060_2_ * f4);
            //this.motionZ += (double)(p_70060_2_ * f5 + p_70060_1_ * f4);
            // - мой новый код, который убирает плюс к моушену, и просто его хардкодит
            this.motionX = (double)(p_70060_1_ * f5 - p_70060_2_ * f4) * npcSpeed;
            this.motionZ = (double)(p_70060_2_ * f5 + p_70060_1_ * f4) * npcSpeed;
            // при желании, можно еще заклэмпить значение через MathHelper.clamp_double(...) чуть ниже

        }
    }
Плюс, мне еще помог к этому делу хук в EntityMoveHelper#onUpdateMoveHelper:

Java:
@Hook(returnCondition = ReturnCondition.ALWAYS)
    public static void onUpdateMoveHelper(EntityMoveHelper ent)
    {
        ent.entity.setMoveForward(0.0F);

        if (ent.update)
        {
            ent.update = false;
            int i = MathHelper.floor_double(ent.entity.boundingBox.minY + 0.5D);
            double d0 = ent.posX - ent.entity.posX;
            double d1 = ent.posZ - ent.entity.posZ;
            double d2 = ent.posY - (double)i;
            double d3 = d0 * d0 + d2 * d2 + d1 * d1;

            if (d3 >= 2.500000277905201E-7D)
            {
                float f = (float)(Math.atan2(d1, d0) * 180.0D / Math.PI) - 90.0F;
                ent.entity.rotationYaw = ent.limitAngle(ent.entity.rotationYaw, f, 30.0F);
                // закомментил старый кусок кода и добавил свой. По хорошему надо добавить проверку на необходимое существо
                // типа instanceof EntityNPCInterface, но у меня на проекте нет сущностей помимо нпс, поэтому пох
                //ent.entity.setAIMoveSpeed((float) (ent.speed * ent.entity.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue()));
                ent.entity.setAIMoveSpeed(1F);
                
                if (d2 > 0.0D && d0 * d0 + d1 * d1 < 1.0D)
                {
                    ent.entity.getJumpHelper().setJumping();
                }
            }
        }
    }

Публикую тут, авось кому нибудь понадобится
Автор
fukkivdan
Просмотры
101
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя fukkivdan

Назад
Сверху