Pathfinder bugfixes

This commit is contained in:
Anuken 2024-06-08 12:55:04 -04:00
parent 8944b08fbf
commit f0bee7f19f
3 changed files with 41 additions and 8 deletions

View File

@ -1099,6 +1099,7 @@ public class ControlPathfinder implements Runnable{
destY = World.toTile(mainDestination.y),
actualDestX = World.toTile(destination.x),
actualDestY = World.toTile(destination.y),
actualDestPos = actualDestX + actualDestY * wwidth,
destPos = destX + destY * wwidth;
PathRequest request = unitRequests.get(unit);
@ -1156,8 +1157,10 @@ public class ControlPathfinder implements Runnable{
int i = 0;
boolean recalc = false;
if(packedPos == actualDestPos){
request.lastTargetTile = tileOn;
//TODO last pos can change if the flowfield changes.
if(initialTileOn.pos() != request.lastTile || request.lastTargetTile == null){
}else if(initialTileOn.pos() != request.lastTile || request.lastTargetTile == null){
boolean anyNearSolid = false;
//find the next tile until one near a solid block is discovered
@ -1181,9 +1184,13 @@ public class ControlPathfinder implements Runnable{
anyNearSolid = true;
}
if((value == 0 || otherCost < value) && otherCost != impassable && (otherCost != 0 || packed == destPos) && (current == null || otherCost < minCost) && passable(unit.team.id, cost, packed)){
if((value == 0 || otherCost < value) && otherCost != impassable && ((otherCost != 0 && (current == null || otherCost < minCost)) || packed == actualDestPos || packed == destPos) && passable(unit.team.id, cost, packed)){
current = other;
minCost = otherCost;
//no need to keep searching.
if(packed == destPos || packed == actualDestPos){
break;
}
}
}
@ -1205,7 +1212,9 @@ public class ControlPathfinder implements Runnable{
tileOn = current;
any = true;
if(current.array() == destPos){
int a = current.array();
if(a == destPos || a == actualDestPos){
break;
}
}
@ -1216,13 +1225,13 @@ public class ControlPathfinder implements Runnable{
}
request.lastTargetTile = any ? tileOn : null;
if(showDebug && tileOn != null){
if(showDebug && tileOn != null && Core.graphics.getFrameId() % 30 == 0){
Fx.placeBlock.at(tileOn.worldx(), tileOn.worldy(), 1);
}
}
if(request.lastTargetTile != null){
if(showDebug){
if(showDebug && Core.graphics.getFrameId() % 30 == 0){
Fx.breakBlock.at(request.lastTargetTile.worldx(), request.lastTargetTile.worldy(), 1);
}
out.set(request.lastTargetTile);
@ -1325,6 +1334,30 @@ public class ControlPathfinder implements Runnable{
return 0;
}
/** @return 0 if nothing was hit, otherwise the packed coordinates. This is an internal function and will likely be moved - do not use!*/
public static int raycastFastAvoid(int team, PathCost type, int x1, int y1, int x2, int y2){
int ww = world.width(), wh = world.height();
int x = x1, dx = Math.abs(x2 - x), sx = x < x2 ? 1 : -1;
int y = y1, dy = Math.abs(y2 - y), sy = y < y2 ? 1 : -1;
int err = dx - dy;
while(x >= 0 && y >= 0 && x < ww && y < wh){
if(avoid(team, type, x + y * wwidth)) return Point2.pack(x, y);
if(x == x2 && y == y2) return 0;
//no diagonals
if(2 * err + dy > dx - 2 * err){
err -= dy;
x += sx;
}else{
err += dx;
y += sy;
}
}
return 0;
}
private static boolean overlap(int team, PathCost type, int x, int y, float startX, float startY, float endX, float endY, float rectSize){
if(x < 0 || y < 0 || x >= wwidth || y >= wheight) return false;
if(!nearPassable(team, type, x + y * wwidth)){

View File

@ -168,9 +168,9 @@ public class UnitGroup{
Unit unit = units.get(index);
PathCost cost = unit.type.pathCost;
int res = ControlPathfinder.raycastFast(unit.team.id, cost, World.toTile(dest.x), World.toTile(dest.y), World.toTile(x), World.toTile(y));
int res = ControlPathfinder.raycastFastAvoid(unit.team.id, cost, World.toTile(dest.x), World.toTile(dest.y), World.toTile(x), World.toTile(y));
//collision found, make th destination the point right before the collision
//collision found, make the destination the point right before the collision
if(res != 0){
v1.set(Point2.x(res) * Vars.tilesize - dest.x, Point2.y(res) * Vars.tilesize - dest.y);
v1.setLength(Math.max(v1.len() - Vars.tilesize - 4f, 0));

View File

@ -25,4 +25,4 @@ org.gradle.caching=true
#used for slow jitpack builds; TODO see if this actually works
org.gradle.internal.http.socketTimeout=100000
org.gradle.internal.http.connectionTimeout=100000
archash=2126b31154
archash=7138ef8769