Revision Difference
PathFollower:Compute#518706
<function name="Compute" parent="PathFollower" type="classfunc">
<description>Compute shortest path from bot to 'goal' via A* algorithm.</description>
<realm>Server</realm>
<args>
<arg name="from" type="NextBot">The nextbot we're generating for</arg>
<arg name="to" type="Vector">To point</arg>
<arg name="generator" type="function" default="nil">A funtion that allows you to alter the path generation. See example below for the default function.</arg>
</args>
<rets>
<ret name="" type="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.</ret>
</rets>
</function>
<example>
<description>The default path generator. You **do not have** to provide the PathFollower.Compute any generator functions if you want to use the default generator.</description>
<code>
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
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
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
elseif ( deltaZ < -self.loco:GetDeathDropHeight() ) then
// too far to drop
return -1
end
return cost
end
end )
</code>
</example>