2022-03-01 13:54:08 +01:00
|
|
|
package net.citizensnpcs.nms.v1_18_R2.util;
|
2021-12-01 15:56:22 +01:00
|
|
|
|
|
|
|
import java.util.Random;
|
2023-02-22 17:06:13 +01:00
|
|
|
|
2021-12-01 15:56:22 +01:00
|
|
|
import net.citizensnpcs.util.NMS;
|
|
|
|
import net.minecraft.util.Mth;
|
|
|
|
import net.minecraft.world.entity.EntityType;
|
|
|
|
import net.minecraft.world.entity.LivingEntity;
|
|
|
|
import net.minecraft.world.entity.Mob;
|
|
|
|
import net.minecraft.world.entity.ai.attributes.Attributes;
|
|
|
|
import net.minecraft.world.entity.ai.control.MoveControl;
|
|
|
|
import net.minecraft.world.entity.monster.Slime;
|
|
|
|
|
2023-03-19 15:03:45 +01:00
|
|
|
public class EntityMoveControl extends MoveControl {
|
2021-12-01 15:56:22 +01:00
|
|
|
protected LivingEntity entity;
|
|
|
|
private int jumpTicks;
|
|
|
|
protected boolean moving;
|
2022-03-10 12:27:00 +01:00
|
|
|
protected double speedMod;
|
2021-12-01 15:56:22 +01:00
|
|
|
protected double tx;
|
|
|
|
protected double ty;
|
|
|
|
protected double tz;
|
|
|
|
|
2023-03-19 15:03:45 +01:00
|
|
|
public EntityMoveControl(LivingEntity entityinsentient) {
|
2021-12-01 15:56:22 +01:00
|
|
|
super(entityinsentient instanceof Mob ? (Mob) entityinsentient
|
|
|
|
: new Slime(EntityType.SLIME, entityinsentient.level));
|
|
|
|
this.entity = entityinsentient;
|
|
|
|
this.tx = entityinsentient.getX();
|
|
|
|
this.ty = entityinsentient.getY();
|
|
|
|
this.tz = entityinsentient.getZ();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public double getSpeedModifier() {
|
2022-03-10 12:27:00 +01:00
|
|
|
return this.speedMod;
|
2021-12-01 15:56:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public double getWantedX() {
|
|
|
|
return this.tx;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public double getWantedY() {
|
|
|
|
return this.ty;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public double getWantedZ() {
|
|
|
|
return this.tz;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean hasWanted() {
|
|
|
|
return this.moving;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected int jumpTicks() {
|
|
|
|
return new Random().nextInt(20) + 10;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected float rotlerp(float f, float f1, float f2) {
|
|
|
|
float f3 = Mth.wrapDegrees(f1 - f);
|
|
|
|
if (f3 > f2) {
|
|
|
|
f3 = f2;
|
|
|
|
}
|
|
|
|
if (f3 < -f2) {
|
|
|
|
f3 = -f2;
|
|
|
|
}
|
|
|
|
float f4 = f + f3;
|
2023-11-05 09:35:22 +01:00
|
|
|
if (f4 < 0.0F) {
|
2021-12-01 15:56:22 +01:00
|
|
|
f4 += 360.0F;
|
2023-11-05 09:35:22 +01:00
|
|
|
} else if (f4 > 360.0F) {
|
2021-12-01 15:56:22 +01:00
|
|
|
f4 -= 360.0F;
|
|
|
|
}
|
|
|
|
return f4;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setWantedPosition(double d0, double d1, double d2, double d3) {
|
|
|
|
this.tx = d0;
|
|
|
|
this.ty = d1;
|
|
|
|
this.tz = d2;
|
2022-03-10 12:27:00 +01:00
|
|
|
this.speedMod = d3;
|
2021-12-01 15:56:22 +01:00
|
|
|
this.moving = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void tick() {
|
|
|
|
this.entity.zza = 0;
|
|
|
|
if (this.moving) {
|
|
|
|
this.moving = false;
|
|
|
|
double dX = this.tx - this.entity.getX();
|
|
|
|
double dZ = this.tz - this.entity.getZ();
|
|
|
|
double dY = this.ty - this.entity.getY();
|
2022-01-29 07:56:29 +01:00
|
|
|
double dXZ = Math.sqrt(dX * dX + dZ * dZ);
|
2023-11-05 09:35:22 +01:00
|
|
|
if (Math.abs(dY) < 1.0 && dXZ < 0.01)
|
2022-01-15 14:00:18 +01:00
|
|
|
// this.entity.zza = 0.0F;
|
2021-12-01 15:56:22 +01:00
|
|
|
return;
|
2022-06-21 17:52:25 +02:00
|
|
|
if (dXZ > 0.4) {
|
|
|
|
float f = (float) Math.toDegrees(Mth.atan2(dZ, dX)) - 90.0F;
|
|
|
|
this.entity.setYRot(rotlerp(this.entity.getYRot(), f, 90.0F));
|
|
|
|
NMS.setHeadYaw(entity.getBukkitEntity(), this.entity.getYRot());
|
|
|
|
}
|
2024-04-15 16:12:20 +02:00
|
|
|
this.entity.zza = (float) (this.speedMod * this.entity.getAttribute(Attributes.MOVEMENT_SPEED).getValue());
|
2023-10-23 12:32:34 +02:00
|
|
|
if (entity instanceof Slime && jumpTicks-- <= 0) {
|
|
|
|
this.jumpTicks = new Random().nextInt(20) + 10;
|
|
|
|
if (((Slime) entity).isAggressive()) {
|
|
|
|
this.jumpTicks /= 3;
|
|
|
|
}
|
|
|
|
((Slime) entity).getJumpControl().jump();
|
|
|
|
} else if (dY >= NMS.getStepHeight(entity.getBukkitEntity()) && dXZ < 0.4D) {
|
|
|
|
if (entity instanceof Mob) {
|
|
|
|
((Mob) entity).getJumpControl().jump();
|
|
|
|
}
|
2023-03-19 15:03:45 +01:00
|
|
|
entity.setJumping(true);
|
2021-12-01 15:56:22 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|