Difference between revisions of "Path update"
Jump to navigation
Jump to search
Rand Linden (talk | contribs) |
Chaser Zaks (talk | contribs) (Use llRegionSayTo instead of llInstantMessage as to avoid unexpectedly yielding the script.) |
||
(21 intermediate revisions by 12 users not shown) | |||
Line 1: | Line 1: | ||
{{ | [[Category:LSL Pathfinding]]{{LSL_Event | ||
|event=path_update | |||
|event_desc=Event description goes here. | |||
|p1_type=integer|p1_name=type | |||
|p1_desc=A <code>PU_*</code>, it's the path event type | |||
|p1_hover=A PU_* flag, it's the path event type | |||
|p2_type=list|p2_name=reserved | |||
|p2_desc=Reserved; not currently used. | |||
|constants={{LSL_Constants/path_update}} | |||
|caveats= | |||
* Note that if wandering, the "stop" (<code>{{LSL Const|PU_GOAL_REACHED|hex=0x01|ihex=1}}</code>) type may never occur as a new goal may be chosen when near (<code>{{LSL Const|PU_SLOWDOWN_DISTANCE_REACHED|hex=0x00|ihex=0}}</code>) the previous goal. | |||
* When the character cannot navigate from the current position (<code>{{LSL Const|PU_FAILURE_INVALID_START|hex=0x02|ihex=2}}</code>) [[llNavigateTo]] with the <code>{{LSL Const|FORCE_DIRECT_PATH|value=1}}</code> option may be helpful. | |||
|examples= | |||
<syntaxhighlight lang="lsl2"> | |||
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 | default | ||
{ | { | ||
on_rez(integer start_param) | |||
{ | |||
llResetScript(); | |||
} | |||
state_entry() | state_entry() | ||
{ | { | ||
create_wandering_character(); | |||
} | } | ||
path_update(integer type, list reserved) | 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]); | |||
} | } | ||
} | } | ||
} | } | ||
</ | </syntaxhighlight> | ||
|also_functions= | |||
* [[llCreateCharacter]] | |||
* [[llDeleteCharacter]] | |||
* [[llEvade]] | |||
* [[llExecCharacterCmd]] | |||
* [[llGetClosestNavPoint]] | |||
* [[llFleeFrom]] | |||
* [[llNavigateTo]] | |||
* [[llPatrolPoints]] | |||
* [[llPursue]] | |||
* [[llUpdateCharacter]] | |||
* [[llWanderWithin]] | |||
|also_events | |||
|history = Date of Release [[ Release_Notes/Second_Life_Server/12#12.07.31.262785 | 31/07/2012 ]] | |||
}} | }} | ||
Latest revision as of 07:58, 6 October 2024
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Description
Event: path_update( integer type, list reserved ){ ; }Event description goes here.
• integer | type | – | A PU_* , it's the path event type
|
|
• list | reserved | – | Reserved; not currently used. |
Constants | Value | Description |
---|---|---|
PU_SLOWDOWN_DISTANCE_REACHED | 0x00 | Character is near current goal. |
PU_GOAL_REACHED | 0x01 | Character has reached the goal and will stop or choose a new goal (if wandering). |
PU_FAILURE_INVALID_START | 0x02 | Character cannot navigate from the current location - e.g., the character is off the navmesh or too high above it. |
PU_FAILURE_INVALID_GOAL | 0x03 | Goal is not on the navmesh and cannot be reached. |
PU_FAILURE_UNREACHABLE | 0x04 | Goal is no longer reachable for some reason - e.g., an obstacle blocks the path. |
PU_FAILURE_TARGET_GONE | 0x05 | 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. |
PU_FAILURE_NO_VALID_DESTINATION | 0x06 | There's no good place for the character to go - e.g., it is patrolling and all the patrol points are now unreachable. |
PU_EVADE_HIDDEN | 0x07 | Triggered when an llEvade character thinks it has hidden from its pursuer. |
PU_EVADE_SPOTTED | 0x08 | Triggered when an llEvade character switches from hiding to running |
PU_FAILURE_NO_NAVMESH | 0x09 | 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. |
PU_FAILURE_DYNAMIC_PATHFINDING_DISABLED | 0x0A | 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. |
PU_FAILURE_PARCEL_UNREACHABLE | 0x0B | 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. |
PU_FAILURE_OTHER | 0xF4240 | Other failure. |
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_PATH
option 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]);
}
}
}