Garry's Mod Wiki

PathFollower:Compute

  boolean PathFollower:Compute( NextBot bot, Vector goal, function generator = nil )

Description

Compute shortest path from bot to 'goal' via A* algorithm.

Arguments

1 NextBot bot
The nextbot we're generating for. This can also be a nextbot player (player.CreateNextbot).
2 Vector goal
The target location, the goal.
3 function generator = nil
A funtion that allows you to alter the path generation. See example below for the default function.

Function callback arguments are:

  • CNavArea area - The area to move to.
  • CNavArea fromArea - The area to move from.
  • CNavLadder ladder - The ladder to move to or from (Validation required), if any.
  • Entity elevator - Will probably be always NULL
  • number length - Precomputed length between area and fromArea.

Function callback return values are:

  • number cost - The cost of movement between area and fromArea.

Returns

1 boolean
  • If returns true, path was found to the goal position.
  • If returns false, path may either be invalid (use IsValid() to check), or valid but doesn't reach all the way to the goal.

Example

The default path generator. You do not have to provide the PathFollower.Compute any generator functions if you want to use the default generator.

path:Compute( self, pos, function( area, fromArea, ladder, elevator, length ) if ( !IsValid( fromArea ) ) then // first area in path, no cost return 0 else if ( !self.loco:IsAreaTraversable( area ) ) then // our locomotor says we can't move here return -1 end // compute distance traveled along path so far local dist = 0 if ( IsValid( ladder ) ) then dist = ladder:GetLength() elseif ( length > 0 ) then // optimization to avoid recomputing length dist = length else dist = ( area:GetCenter() - fromArea:GetCenter() ):GetLength() end local cost = dist + fromArea:GetCostSoFar() // check height change local deltaZ = fromArea:ComputeAdjacentConnectionHeightChange( area ) if ( deltaZ >= self.loco:GetStepHeight() ) then if ( deltaZ >= self.loco:GetMaxJumpHeight() ) then // too high to reach return -1 end // jumping is slower than flat ground local jumpPenalty = 5 cost = cost + jumpPenalty * dist elseif ( deltaZ < -self.loco:GetDeathDropHeight() ) then // too far to drop return -1 end return cost end end )