Path update
Looking for the current API? Open the path_update reference →
Wiki description
Event description goes here.
Specification
m=3 PU_GOAL_REACHED integer hex=0x01 ihex=1 c=Character has reached the goal and will stop or choose a new goal (if wandering). nolink=
m=3 PU_FAILURE_INVALID_START integer hex=0x02 ihex=2 c=Character cannot navigate from the current location - e.g., the character is off the navmesh or too high above it. nolink=
m=3 PU_FAILURE_INVALID_GOAL integer hex=0x03 ihex=3 c=Goal is not on the navmesh and cannot be reached. nolink=
m=3 PU_FAILURE_UNREACHABLE integer hex=0x04 ihex=4 c=Goal is no longer reachable for some reason - e.g., an obstacle blocks the path. nolink=
m=3 PU_FAILURE_TARGET_GONE integer hex=0x05 ihex=5 c=Target (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. nolink=
m=3 PU_FAILURE_NO_VALID_DESTINATION integer hex=0x06 ihex=6 c=There's no good place for the character to go - e.g., it is patrolling and all the patrol points are now unreachable. nolink=
m=3 PU_EVADE_HIDDEN integer hex=0x07 ihex=7 c=Triggered when an llEvade character thinks it has hidden from its pursuer. nolink=
m=3 PU_EVADE_SPOTTED integer hex=0x08 ihex=8 c=Triggered when an llEvade character switches from hiding to running nolink=
m=3 PU_FAILURE_NO_NAVMESH integer hex=0x09 ihex=9 c=This 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. nolink=
m=3 PU_FAILURE_DYNAMIC_PATHFINDING_DISABLED integer hex=0x0A ihex=10 c=Triggered 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. nolink=
m=3 PU_FAILURE_PARCEL_UNREACHABLE integer hex=0x0B ihex=11 c=Triggered 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. nolink=
| Constants | Value | Description |
|---|
Caveats
- Note that if wandering, the "stop" (
PU_GOAL_REACHED) type may never occur as a new goal may be chosen when near (PU_SLOWDOWN_DISTANCE_REACHED) the previous goal. - When the character cannot navigate from the current position (
PU_FAILURE_INVALID_START) llNavigateTo with theFORCE_DIRECT_PATHoption may be helpful.
Examples
create_wandering_character()
{
// Clear any previous character behaviors
llDeleteCharacter();
// MAX_SPEED is @ 20 by default
llCreateCharacter([
CHARACTER_MAX_SPEED, 25.0,
CHARACTER_DESIRED_SPEED, 15.0]);
llWanderWithin(llGetPos(), <10.0, 10.0, 2.0>, []);
}
list get_pathupdate_failure_info(integer type)
{
if (type == PU_SLOWDOWN_DISTANCE_REACHED)
return ["Near", FALSE];
if (type == PU_GOAL_REACHED)
return ["Stopping", FALSE];
if (type == PU_FAILURE_INVALID_START)
return ["Cannot path find from current location! Attempting "
+ "to go to the center of the region.", TRUE];
if (type == PU_FAILURE_INVALID_GOAL)
return ["Goal not on navmesh!", FALSE];
if (type == PU_FAILURE_UNREACHABLE)
return ["Goal unreachable!", FALSE];
if (type == PU_FAILURE_TARGET_GONE)
return ["Target gone!", FALSE];
if (type == PU_FAILURE_NO_VALID_DESTINATION)
return ["No place to go!", FALSE];
if (type == PU_EVADE_HIDDEN)
return ["Hiding from pursuer...", FALSE];
if (type == PU_EVADE_SPOTTED)
return ["Switched from hiding to running...", FALSE];
if (type == PU_FAILURE_NO_NAVMESH)
return ["Region has no nav mesh..", FALSE];
if (type == PU_FAILURE_DYNAMIC_PATHFINDING_DISABLED)
return ["Dynamic pathfinding is disabled in this region.", FALSE];
if (type == PU_FAILURE_PARCEL_UNREACHABLE)
return ["Parcel entry problem (is the parcel full?).", FALSE];
if (type == PU_FAILURE_OTHER)
return ["Hit an unspecified failure", FALSE];
return ["Unknown failure", FALSE];
}
default
{
on_rez(integer start_param)
{
llResetScript();
}
state_entry()
{
create_wandering_character();
}
path_update(integer type, list reserved)
{
list params = get_pathupdate_failure_info(type);
string info = llList2String(params, 0);
integer /* boolean */ hasToMove = llList2Integer(params, 1);
llRegionSayTo(llGetOwner(), 0, info);
if (hasToMove)
{
vector currentPosition = llGetPos();
llNavigateTo(<128.0, 128.0, llGround(<128.0, 128.0, 0.0> - currentPosition)>, [FORCE_DIRECT_PATH, TRUE]);
}
}
}See also: functions
History
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.