This commit is contained in:
2023-11-14 20:54:29 -06:00
parent 25e9f28746
commit b4720a2db5
7 changed files with 120 additions and 140 deletions
+35 -36
View File
@@ -2,6 +2,7 @@ package engine.gameManager;
import engine.Enum;
import engine.math.Vector3fImmutable;
import engine.mobileAI.MobAI;
import engine.net.client.msg.MoveToPointMsg;
import engine.objects.*;
import java.awt.geom.Path2D;
@@ -14,31 +15,16 @@ public class NavigationManager {
private static final int stepHeight = 2;
public static void pathfind(AbstractCharacter character, Vector3fImmutable goal) {
if(!pathBlocked(character.loc,goal)){
character.destination = goal;
MobAI.directMove((Mob)character,character.combatTarget != null);
}
try {
ArrayList<Vector3fImmutable> path = getPath(character.loc, goal);//getOptimizedPath(getPath(character.loc, goal), getPath(goal, character.loc));
if (path.isEmpty()) {
MoveToPointMsg msg = new MoveToPointMsg();
msg.setSourceType(Enum.GameObjectType.Mob.ordinal());
msg.setSourceID(character.getObjectUUID());
msg.setStartCoord(character.loc);
msg.setEndCoord(goal);
Regions region = Regions.getRegionAtLocation(goal);
if (region != null) {
msg.setInBuildingFloor(region.room);
msg.setInBuilding(region.level);
msg.setStartLocType(0);
msg.setInBuildingUUID(region.parentBuildingID);
} else {
msg.setInBuildingFloor(-1);
msg.setInBuilding(-1);
msg.setStartLocType(0);
msg.setInBuildingUUID(0);
}
MobAI.directMove((Mob)character,character.combatTarget != null);
return; //no points to walk to
}
//character.destination = path.get(1);
character.navPath = path;
} catch (Exception e) {
@@ -109,30 +95,43 @@ public class NavigationManager {
}
}
public static float getCost(Vector3fImmutable point, Vector3fImmutable start, Vector3fImmutable goal) {
float gCost = start.distanceSquared(point);
float hCost = goal.distanceSquared(point);
return gCost + hCost;
}
public static boolean pointIsBlocked(Vector3fImmutable point) {
Building building = BuildingManager.getBuildingAtLocation(point);
if(building != null) {
for (Path2D.Float mesh : building.meshes) {
if (mesh.contains(point.x,point.z)) {
public static boolean pathBlocked(Vector3fImmutable start, Vector3fImmutable end){
Zone zone = ZoneManager.findSmallestZone(start);
if(zone != null) {
for (Path2D.Float obstacle : zone.navObstacles)
if(obstacle.intersects(start.x,start.z,end.x,end.z))
return true;
}
}
for (Regions region : building.getBounds().getRegions()) {
if (region.isPointInPolygon(point))
if (Math.abs(region.lerpY(point) - point.y) > stepHeight) // get the height distance between current height and target location height
return true;
}
}
return false;
}
public static boolean pointIsBlocked(Vector3fImmutable point) {
Zone zone = ZoneManager.findSmallestZone(point);
if(zone != null){
for(Path2D.Float obstacle : zone.navObstacles)
if (obstacle.contains(point.x,point.z)) {
return true;
}
}
//Building building = BuildingManager.getBuildingAtLocation(point);
//if(building != null) {
//for (Path2D.Float mesh : building.meshes) {
//if (mesh.contains(point.x,point.z)) {
//return true;
//}
//}
//for (Regions region : building.getBounds().getRegions()) {
//if (region.isPointInPolygon(point))
//if (Math.abs(region.lerpY(point) - point.y) > stepHeight) // get the height distance between current height and target location height
//return true;
//}
//}
return false;
}
}