Skip to content
lsl.devlsl.devLSL Dev

llGetStaticPath

function
Function syntax
list llGetStaticPath(
  1. vector start_pos,// Starting position vector.
  2. vector end_pos,// Target end position vector.
  3. float radius,// Radius of the character path, between 0.125m and 5.0m.
  4. list params// A list specifying the CHARACTER_TYPE parameter (defaults to CHARACTER_TYPE_NONE).
);
Returns
list
Energy
10

The list also always contains an integer in the last element, which is a status code indicating the outcome of the path query:

  • If llGetStaticPath() finds a path, it will return waypoint vectors and will return a status code of 0, for success
  • If llGetStaticPath() cannot find a path for some reason, it only returns the status code, indicating the sort of error. The error codes correspond to the constants in path_update (e.g. PU_FAILURE_INVALID_START is returned if the start vector is not near the nav mesh)

Returns a list of position vectors indicating pathfinding waypoints between positions at start and end, for a character of a given radius. The waypoints this function returns are for the ‘static’ nav mesh, meaning that objects set to “movable obstacle” or “movable phantom” are ignored.

This function can be used from attachments and other non-character objects. It can also be used in any region, even if dynamic pathfinding is disabled.

How to use
list result = llGetStaticPath(ZERO_VECTOR, ZERO_VECTOR, 0.0, []);
From the LSL definitions: GetStaticPathParam (rule, then its arguments)
CHARACTER_TYPE  // Specifies the preferred surface and terrain terrain-type for the character (default is CHARACTER_TYPE_NONE).
ConstantTypeValueDescription
m=3PU_SLOWDOWN_DISTANCE_REACHEDintegerCharacter is near current goal.
m=3PU_GOAL_REACHEDintegerCharacter has reached the goal and will stop or choose a new goal (if wandering).
m=3PU_FAILURE_INVALID_STARTintegerCharacter cannot navigate from the current location - e.g., the character is off the navmesh or too high above it.
m=3PU_FAILURE_INVALID_GOALintegerGoal is not on the navmesh and cannot be reached.
m=3PU_FAILURE_UNREACHABLEintegerGoal is no longer reachable for some reason - e.g., an obstacle blocks the path.
m=3PU_FAILURE_TARGET_GONEintegerTarget (for llPursue or llEvade) can no longer be tracked - e.g., it left the region or is an avatar that is now more than about 30m outside the region.
m=3PU_FAILURE_NO_VALID_DESTINATIONintegerThere’s no good place for the character to go - e.g., it is patrolling and all the patrol points are now unreachable.
m=3PU_EVADE_HIDDENintegerTriggered when an llEvade character thinks it has hidden from its pursuer.
m=3PU_EVADE_SPOTTEDintegerTriggered when an llEvade character switches from hiding to running
m=3PU_FAILURE_NO_NAVMESHintegerThis is a fatal error reported to a character when there is no navmesh for the region. This usually indicates a server failure and users should file a bug report and include the time and region in which they received this message.
m=3PU_FAILURE_DYNAMIC_PATHFINDING_DISABLEDintegerTriggered when a character enters a region with dynamic pathfinding disabled. Dynamic pathfinding can be toggled by estate managers via the ‘dynamic_pathfinding’ option in the Region Debug Console.
m=3PU_FAILURE_PARCEL_UNREACHABLEintegerTriggered when a character failed to enter a parcel because it is not allowed to enter, e.g. because the parcel is already full or because object entry was disabled after the navmesh was baked.
m=3PU_FAILURE_OTHERintegerOther failure.
ConstantsValueDescription
OptionDefaultRange / ValuesDescription
CHARACTER_DESIRED_SPEED16[0.2, 40.0]Speed of pursuit in meters per second.
CHARACTER_RADIUS2[0.125, 5.0]Set collision capsule radius.
CHARACTER_LENGTH3(0.0, 10.0]Set collision capsule length If the value is less than twice the radius plus 0.1m, it will be set to twice the radius plus 0.1m.
CHARACTER_ORIENTATION4VERTICALVERTICAL, HORIZONTALSet the character orientation.
TRAVERSAL_TYPE7TRAVERSAL_TYPE_SLOWTRAVERSAL_TYPE_FAST, TRAVERSAL_TYPE_SLOW, TRAVERSAL_TYPE_NONEControls the speed at which characters moves on terrain that is less than 100% walkable will move faster (e.g., a cat crossing a street) or slower (e.g., a car driving in a swamp). To use _FAST or _SLOW, you must specify a CHARACTER_TYPE.
CHARACTER_TYPE6CHARACTER_TYPE_NONECHARACTER_TYPE_A, CHARACTER_TYPE_B, CHARACTER_TYPE_C, CHARACTER_TYPE_D, CHARACTER_TYPE_NONESpecifies which walkability coefficient will be used by this character.
CHARACTER_AVOIDANCE_MODE5AVOID_CHARACTERS | AVOID_DYNAMIC_OBSTACLESCombinable Flags: AVOID_CHARACTERS, AVOID_DYNAMIC_OBSTACLES, AVOID_NONEAllows you to specify that a character should not try to avoid other characters, should not try to avoid dynamic obstacles (relatively fast moving objects and avatars), or both. This is framed in the positive sense ([CHARACTER_AVOIDANCE_MODE, AVOID_CHARACTERS] would create a character that avoided other characters but not agents or moving vehicles). Setting this parameter to AVOID_NONE causes the character to not avoid either category.
CHARACTER_MAX_ACCEL820[0.5, 40.0]The character’s maximum acceleration rate.
CHARACTER_MAX_DECEL930[0.5, 60.0]The character’s maximum deceleration rate.
CHARACTER_DESIRED_TURN_SPEED126[0.02, 40.0]The character’s maximum speed while turning—note that this is only loosely enforced (i.e., a character may turn at higher speeds under certain conditions)
CHARACTER_MAX_TURN_RADIUS101.25[0.1, 10.0]The character’s turn radius when traveling at CHARACTER_DESIRED_TURN_SPEED
CHARACTER_MAX_SPEED1320[1, 40.0]The character’s maximum speed. Affects speed when avoiding dynamic obstacles and when traversing low-walkability objects in TRAVERSAL_TYPE_FAST mode.
CHARACTER_ACCOUNT_FOR_SKIPPED_FRAMES14TRUETRUE or FALSETRUE matches pre-existing behavior. If set to FALSE, character will not attempt to catch up on lost time when pathfinding performance is low, potentially providing more reliable movement (albeit while potentially appearing to be more stuttery).
CHARACTER_STAY_WITHIN_PARCEL15Depends*TRUE or FALSEFALSE matches traditional behavior. If set to TRUE, treat the parcel boundaries as one-way obstacles (will re-enter but can’t leave on it’s own).
Example 1
// llGetStaticPath() test script
// Reports the static path from the object's current position to the object owner's position
// Radius of character to test for
float character_radius = 1.0;
// All defined path_update codes; note that llGetStaticPath() can only return a few of these.
list path_update_codes = [
"PU_SLOWDOWN_DISTANCE_REACHED ",
34 collapsed lines
"PU_GOAL_REACHED",
"PU_FAILURE_INVALID_START",
"PU_FAILURE_INVALID_GOAL",
"PU_FAILURE_UNREACHABLE",
"PU_FAILURE_TARGET_GONE",
"PU_FAILURE_NO_VALID_DESTINATION",
"PU_EVADE_HIDDEN",
"PU_EVADE_SPOTTED",
"PU_FAILURE_NO_NAVMESH",
"PU_FAILURE_DYNAMIC_PATHFINDING_DISABLED",
"PU_FAILURE_PARCEL_UNREACHABLE",
"PU_FAILURE_OTHER"
];
default
{
touch_start(integer detected)
{
vector agent_pos = llList2Vector(llGetObjectDetails(llGetOwner(), [OBJECT_POS]), 0);
vector end_pos = llList2Vector(llGetClosestNavPoint(agent_pos, [GCNP_STATIC, TRUE]), 0);
vector start_pos = llList2Vector(llGetClosestNavPoint(llGetPos(), [GCNP_STATIC, TRUE]), 0);
if(end_pos == ZERO_VECTOR)
{
llOwnerSay("Error: end position undefined - the object owner is either offline or far away from the nav mesh."
+ "\nagent pos is " + (string)agent_pos);
}
else if(start_pos == ZERO_VECTOR)
{
llOwnerSay("Error: start position undefined - this object is far away from the nav mesh."
+ "\nobject pos is " + (string)llGetPos());
}
else
{
llOwnerSay("Finding path from " + (string)start_pos
+ " to " + (string)end_pos
+ " for a character of radius " + (string)character_radius);
list result = llGetStaticPath(start_pos, end_pos, character_radius, []);
integer result_code = llList2Integer(result, -1);
//llOwnerSay("Raw llGetStaticPath() result: " + llList2CSV(result));
// the last element in the list is just the return code;
// the preceding elements should be waypoint vectors
if(result_code == 0)
{
llOwnerSay("llGetStaticPath found a path: " + llList2CSV(llList2List(result, 0, -2)));
}
else
{
llOwnerSay("llGetStaticPath failed to find a path, with code " + (string)result_code
+ " (" + llList2String(path_update_codes, result_code) + ")");
}
}
}
}

Date of Release 31/07/2012

Original wiki source

Some wiki templates and tables need their original context. View this article on the Second Life Wiki. Technical wording and examples are retained from the source; historical guidance may differ from current behavior.