diff --git a/core/src/mindustry/ai/HierarchyPathFinder.java b/core/src/mindustry/ai/HierarchyPathFinder.java index 3479f94c57..7d43a2bdcd 100644 --- a/core/src/mindustry/ai/HierarchyPathFinder.java +++ b/core/src/mindustry/ai/HierarchyPathFinder.java @@ -1021,13 +1021,17 @@ public class HierarchyPathFinder implements Runnable{ PathRequest request = unitRequests.get(unit); + unit.hitboxTile(Tmp.r3); + //tile rect size has tile size factored in, since the ray cannot have thickness + float tileRectSize = tilesize + Tmp.r3.height; + int lastRaycastTile = request == null || world.tileChanges != request.lastWorldUpdate ? -1 : request.lastRaycastTile; boolean raycastResult = request != null && request.lastRaycastResult; //cache raycast results to run every time the world updates, and every tile the unit crosses if(lastRaycastTile != packedPos){ //near the destination, standard raycasting tends to break down, so use the more permissive 'near' variant that doesn't take into account edges of walls - raycastResult = unit.within(destination, tilesize * 2.5f) ? !raycastNear(team, cost, tileX, tileY, actualDestX, actualDestY) : !raycast(team, cost, tileX, tileY, actualDestX, actualDestY); + raycastResult = unit.within(destination, tilesize * 2.5f) ? !raycastRect(unit.x, unit.y, destination.x, destination.y, team, cost, tileX, tileY, actualDestX, actualDestY, tileRectSize) : !raycast(team, cost, tileX, tileY, actualDestX, actualDestY); if(request != null){ request.lastRaycastTile = packedPos; @@ -1065,9 +1069,6 @@ public class HierarchyPathFinder implements Runnable{ int maxIterations = 30; //TODO higher/lower number? is this still too slow? int i = 0; boolean recalc = false; - unit.hitboxTile(Tmp.r3); - //tile rect size has tile size factored in, since the ray cannot have thickness - float tileRectSize = tilesize + Tmp.r3.height; //TODO last pos can change if the flowfield changes. if(initialTileOn.pos() != request.lastTile || request.lastTargetTile == null){ @@ -1079,8 +1080,8 @@ public class HierarchyPathFinder implements Runnable{ Tile current = null; int minCost = 0; - for(int dir = 0; dir < 8; dir ++){ - Point2 point = Geometry.d8[dir]; + for(int dir = 0; dir < 4; dir ++){ + Point2 point = Geometry.d4[dir]; int dx = tileOn.x + point.x, dy = tileOn.y + point.y; Tile other = world.tile(dx, dy); @@ -1094,13 +1095,7 @@ public class HierarchyPathFinder 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) && - //diagonal corner trap - !( - (!passable(team, cost, world.packArray(tileOn.x + point.x, tileOn.y)) || - (!passable(team, cost, world.packArray(tileOn.x, tileOn.y + point.y)))) - ) - ){ + if((value == 0 || otherCost < value) && otherCost != impassable && (otherCost != 0 || packed == destPos) && (current == null || otherCost < minCost) && passable(unit.team.id, cost, packed)){ current = other; minCost = otherCost; } diff --git a/core/src/mindustry/ai/types/CommandAI.java b/core/src/mindustry/ai/types/CommandAI.java index 042852e05f..07a30878b1 100644 --- a/core/src/mindustry/ai/types/CommandAI.java +++ b/core/src/mindustry/ai/types/CommandAI.java @@ -223,8 +223,8 @@ public class CommandAI extends AIController{ } if(unit.isGrounded() && stance != UnitStance.ram){ - //TODO: blocking is disabled, doesn't work well - if(timer.get(timerTarget3, avoidInterval) && false){ + //TODO: blocking enable or disable? + if(timer.get(timerTarget3, avoidInterval)){ Vec2 dstPos = Tmp.v1.trns(unit.rotation, unit.hitSize/2f); float max = unit.hitSize/2f; float radius = Math.max(7f, max); @@ -251,7 +251,6 @@ public class CommandAI extends AIController{ timeSpentBlocked = 0f; } - //if you've spent 3 seconds stuck, something is wrong, move regardless move = hpath.getPathPosition(unit, vecMovePos, targetPos, vecOut, noFound) && (!blockingUnit || timeSpentBlocked > maxBlockTime); //rare case where unit must be perfectly aligned (happens with 1-tile gaps) alwaysArrive = vecOut.epsilonEquals(unit.tileX() * tilesize, unit.tileY() * tilesize);