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