@@ -8631,9 +8631,9 @@ simulated function bool MoveToPoint(vector vDestination, optional out string Fai
86318631 local TTile kTileDest;
86328632 local array<PathPoint> PathPoints;
86338633 local array<ETraversalType> AllowedTraversals;
8634+ local bool bNeedsHazardEscape;
86348635
86358636 bPathFailed=false;
8636-
86378637 kTileDest = `XWORLD.GetTileCoordinatesFromPosition(vDestination);
86388638
86398639 if (kTileDest.X == UnitState.TileLocation.X && kTileDest.Y == UnitState.TileLocation.Y && abs(UnitState.TileLocation.Z-kTileDest.Z) <= 3)
@@ -8651,8 +8651,9 @@ simulated function bool MoveToPoint(vector vDestination, optional out string Fai
86518651 }
86528652
86538653 // HL-Docs: ref:AIHazardEscape; issue:1559
8654- // IsTileReachable will always return false if surrounded by hazards
8655- if (!bPathFailed && !NeedsHazardEscape())
8654+ // IsTileReachable will always return false if surrounded by hazards, so skip this check
8655+ bNeedsHazardEscape = NeedsHazardEscape();
8656+ if (!bPathFailed && !bNeedsHazardEscape)
86568657 {
86578658 bPathFailed = !m_kUnit.m_kReachableTilesCache.IsTileReachable(kTileDest);
86588659 if (bPathFailed)
@@ -8661,33 +8662,34 @@ simulated function bool MoveToPoint(vector vDestination, optional out string Fai
86618662 }
86628663 }
86638664
8664- if( !bPathFailed || bForcePathIfUnreachable || NeedsHazardEscape() )
8665+ if( !bPathFailed || bForcePathIfUnreachable || bNeedsHazardEscape )
86658666 {
86668667 if (XGAIBehavior_Civilian(self) != none)
86678668 {
86688669 XGAIBehavior_Civilian(self).m_iMoveTimeStart = WorldInfo.TimeSeconds;
86698670 }
86708671
86718672 // HL-Docs: ref:AIHazardEscape; issue:1559
8672- // Use BuildNonUnitPath for hazard escape to ensure the unit can path out of hazards
8673- if (NeedsHazardEscape())
8674- {
8675- // Build allowed traversals from unit's character template
8676- if (UnitState.GetMyTemplate().bCanUse_eTraversal_Normal) AllowedTraversals.AddItem(eTraversal_Normal);
8677- if (UnitState.GetMyTemplate().bCanUse_eTraversal_ClimbOver) AllowedTraversals.AddItem(eTraversal_ClimbOver);
8678- if (UnitState.GetMyTemplate().bCanUse_eTraversal_ClimbOnto) AllowedTraversals.AddItem(eTraversal_ClimbOnto);
8679- if (UnitState.GetMyTemplate().bCanUse_eTraversal_ClimbLadder) AllowedTraversals.AddItem(eTraversal_ClimbLadder);
8680- if (UnitState.GetMyTemplate().bCanUse_eTraversal_DropDown) AllowedTraversals.AddItem(eTraversal_DropDown);
8681- if (UnitState.GetMyTemplate().bCanUse_eTraversal_Grapple) AllowedTraversals.AddItem(eTraversal_Grapple);
8682- if (UnitState.GetMyTemplate().bCanUse_eTraversal_Landing) AllowedTraversals.AddItem(eTraversal_Landing);
8683- if (UnitState.GetMyTemplate().bCanUse_eTraversal_BreakWindow) AllowedTraversals.AddItem(eTraversal_BreakWindow);
8684- if (UnitState.GetMyTemplate().bCanUse_eTraversal_KickDoor) AllowedTraversals.AddItem(eTraversal_KickDoor);
8685- if (UnitState.GetMyTemplate().bCanUse_eTraversal_JumpUp) AllowedTraversals.AddItem(eTraversal_JumpUp);
8686- if (UnitState.GetMyTemplate().bCanUse_eTraversal_WallClimb) AllowedTraversals.AddItem(eTraversal_WallClimb);
8687- if (UnitState.GetMyTemplate().bCanUse_eTraversal_BreakWall) AllowedTraversals.AddItem(eTraversal_BreakWall);
8688- if (UnitState.GetMyTemplate().bCanUse_eTraversal_Launch) AllowedTraversals.AddItem(eTraversal_Launch);
8689- if (UnitState.GetMyTemplate().bCanUse_eTraversal_Flying) AllowedTraversals.AddItem(eTraversal_Flying);
8690- if (UnitState.GetMyTemplate().bCanUse_eTraversal_Land) AllowedTraversals.AddItem(eTraversal_Land);
8673+ // Use BuildNonUnitPath to path through hazards with runtime traversal capabilities
8674+ if (bNeedsHazardEscape)
8675+ {
8676+ // Build allowed traversals from unit's runtime traversal capabilities
8677+ if (UnitState.aTraversals[eTraversal_Normal] > 0) AllowedTraversals.AddItem(eTraversal_Normal);
8678+ if (UnitState.aTraversals[eTraversal_ClimbOver] > 0) AllowedTraversals.AddItem(eTraversal_ClimbOver);
8679+ if (UnitState.aTraversals[eTraversal_ClimbOnto] > 0) AllowedTraversals.AddItem(eTraversal_ClimbOnto);
8680+ if (UnitState.aTraversals[eTraversal_ClimbLadder] > 0) AllowedTraversals.AddItem(eTraversal_ClimbLadder);
8681+ if (UnitState.aTraversals[eTraversal_DropDown] > 0) AllowedTraversals.AddItem(eTraversal_DropDown);
8682+ if (UnitState.aTraversals[eTraversal_Grapple] > 0) AllowedTraversals.AddItem(eTraversal_Grapple);
8683+ if (UnitState.aTraversals[eTraversal_Landing] > 0) AllowedTraversals.AddItem(eTraversal_Landing);
8684+ if (UnitState.aTraversals[eTraversal_BreakWindow] > 0) AllowedTraversals.AddItem(eTraversal_BreakWindow);
8685+ if (UnitState.aTraversals[eTraversal_KickDoor] > 0) AllowedTraversals.AddItem(eTraversal_KickDoor);
8686+ if (UnitState.aTraversals[eTraversal_JumpUp] > 0) AllowedTraversals.AddItem(eTraversal_JumpUp);
8687+ if (UnitState.aTraversals[eTraversal_WallClimb] > 0) AllowedTraversals.AddItem(eTraversal_WallClimb);
8688+ if (UnitState.aTraversals[eTraversal_Phasing] > 0) AllowedTraversals.AddItem(eTraversal_Phasing);
8689+ if (UnitState.aTraversals[eTraversal_BreakWall] > 0) AllowedTraversals.AddItem(eTraversal_BreakWall);
8690+ if (UnitState.aTraversals[eTraversal_Launch] > 0) AllowedTraversals.AddItem(eTraversal_Launch);
8691+ if (UnitState.aTraversals[eTraversal_Flying] > 0) AllowedTraversals.AddItem(eTraversal_Flying);
8692+ if (UnitState.aTraversals[eTraversal_Land] > 0) AllowedTraversals.AddItem(eTraversal_Land);
86918693 class'X2PathSolver'.static.BuildNonUnitPath(UnitState.TileLocation, kTileDest, AllowedTraversals, Path);
86928694 }
86938695 else
0 commit comments