Wayfarer
Пользователь
- Сообщения
- 45
- Решения
- 1
К сути, есть алгоритм поиска путей, который задаёт маршрут мобу. Вложенный метод moveTo() не подходит, так как он всё равно сам путь перерасчитывает + не пытается идти сквозь препятствия, не прыгает в ямы, в общем, не подходит по всем пунктам. Я написал свой метод движения сущности:
Метод setBodyYaw() либо не работает, либо работает не так, как задумано, в общем сущность всё равно не поворачивается в нужную сторону и идёт как повезёт, стрейфом, спиной, но не лицом. Телепортация к локации не подходит. lookAt() тоже криво работает, сущность всё время дёргается
Java:
private final Mob mob;
public Navigation(Mob mob) {
this.mob = mob;
}
double checkDistance = 0.85 * 0.85;
Calculator calculator = new Calculator();
public boolean moveTo(Location next, double speed) {
//if(mob.isOnGround()) {
Location mobLocation = mob.getLocation();
Location target = next.clone().add(0.5,0,0.5);
if (mobLocation.getX() == target.getX()
&& mobLocation.getY() == target.getY()
&& mobLocation.getZ() == target.getZ()) { //check finite
return true;
}
boolean needJump = false;
if(mobLocation.getY() < target.getY() && mob.isOnGround()) {
needJump = true;
}
double motX = target.getX() - mob.getX();
double motY = 0;
double motZ = target.getZ() - mob.getZ();
Vector velocity = new Vector(motX, motY, motZ).normalize();
velocity.multiply(speed);
motX = velocity.getX();
motY = velocity.getY();
motZ = velocity.getZ();
if(needJump && getXZDistanceSquared(mobLocation, target) < checkDistance
&& mob.getY() + 1 <= target.getY()) {
motY += 0.5;
motX /= 32.0;
motZ /= 32.0;
}
setDeltaMovement(new Vector(motX, motY, motZ));
mob.setBodyYaw(calculator.calculateYaw(mob.getLocation(), target));
if (mob.getLocation().distanceSquared(next) < 0.95) {
return true;
}
//}
return false;
}
public static double getXZDistanceSquared(Location first, Location second) {
double x1 = first.getX();
double x2 = second.getX();
double z1 = first.getZ();
double z2 = second.getZ();
return Math.pow(x1-x2, 2) + Math.pow(z1-z2, 2);
}
private void setDeltaMovement(Vector v) {
Vector initVel = mob.getVelocity();
double motX = v.getX();
double motY = v.getY();
double motZ = v.getZ();
motX += initVel.getX();
motY += initVel.getY();
motZ += initVel.getZ();
Vector computedVelocity = new Vector(motX, motY, motZ);
mob.setVelocity(computedVelocity);
}
public static float calculateYaw(Location objectPosition, Location targetPosition) {
double dx = targetPosition.getX() - objectPosition.getX();
double dz = targetPosition.getZ() - objectPosition.getZ();
return (float) (-Math.atan2(dx, dz) * 180 / Math.PI);
}
Java:
private final List<Location> locationList = new ArrayList<>();
private Location pathTo;
@Override
public void start() {
navigation = new Navigation(mob);
}
@Override
public void tick() {
if(mob.getPathfinder().hasPath()) {
mob.getPathfinder().stopPathfinding();
}
if(!locationList.isEmpty()) {
if (navigation.moveTo(locationList.getFirst(), 0.08)) {
locationList.removeFirst();
if (locationList.isEmpty()) {
pathTo = null;
}
}
} else {
stop();
}
}