Difference between revisions of "LlGetNumberOfNotecardLines"
Jump to navigation
Jump to search
All Issues ~ Search JIRA for related Bugs
Don Misfit (talk | contribs) m (added "embedded inventory" caveat) |
Core Taurog (talk | contribs) |
||
Line 10: | Line 10: | ||
|caveats=* If notecard contains embedded inventory items (such as textures and landmarks), invalid data will be returned. | |caveats=* If notecard contains embedded inventory items (such as textures and landmarks), invalid data will be returned. | ||
|constants | |constants | ||
|examples | |examples= | ||
<Pre> | |||
string NOTECARD_NAME = "config"; // name of the card we are going to read | |||
integer notecard_line = 0; | |||
integer num_notecard_lines = 0; | |||
key notecard_request = NULL_KEY; | |||
list card_data; // the data in the card | |||
integer | |||
check_card(string name) // check that that the named inventory item is a notecard | |||
{ | |||
integer i = llGetInventoryType(name); | |||
return i == INVENTORY_NOTECARD; | |||
} | |||
default | |||
{ | |||
state_entry() | |||
{ | |||
state init; | |||
} | |||
} | |||
state ready | |||
{ | |||
touch_start(integer detected) | |||
{ | |||
llOwnerSay("the notecard contained the following data:"); | |||
llOwnerSay(llDumpList2String(card_data, "\n")); | |||
} | |||
changed(integer change) | |||
{ | |||
if (change & (CHANGED_INVENTORY)) // if someone edits the card, reset the script | |||
{ | |||
llResetScript(); | |||
} | |||
} | |||
} | |||
state init | |||
{ | |||
state_entry() | |||
{ | |||
if (!check_card(NOTECARD_NAME)) // check the card exists | |||
{ | |||
state error; | |||
} | |||
llSetText("initialising...", <1, 1, 1>, 0); | |||
notecard_request = NULL_KEY; | |||
notecard_line = 0; | |||
num_notecard_lines = 0; | |||
notecard_request = llGetNumberOfNotecardLines(NOTECARD_NAME); // ask for the number of lines in the card | |||
llSetTimerEvent(5.0); // if we don't hear back in 5 secs, then the card might have been empty | |||
} | |||
timer() // if we time out, it meant something went wrong - the notecard was probably empty | |||
{ | |||
llSetTimerEvent(0.0); | |||
state error; | |||
} | |||
dataserver(key query_id, string data) | |||
{ | |||
if (query_id == notecard_request) // make sure it's an answer to a question we asked - this should be an unnecessary check | |||
{ | |||
llSetTimerEvent(0.0); // at least one line, so don't worry any more | |||
if (data == EOF) // end of the notecard, change to ready state | |||
{ | |||
state ready; | |||
} | |||
else if (num_notecard_lines == 0) // first request is for the number of lines | |||
{ | |||
num_notecard_lines = (integer)data; | |||
notecard_request = llGetNotecardLine(NOTECARD_NAME, notecard_line); // now get the first line | |||
} | |||
else | |||
{ | |||
if (data != "" && llGetSubString(data, 0, 0) != "#") // ignore empty lines, or lines beginning with "#" | |||
{ | |||
card_data = (card_data = []) + card_data + data; | |||
} | |||
++notecard_line; | |||
notecard_request = llGetNotecardLine(NOTECARD_NAME, notecard_line); // ask for the next line | |||
} | |||
} | |||
// update the hover-text with the progress | |||
llSetText("read " + (string)(notecard_line) + " of " + (string)num_notecard_lines + " lines", <1, 1, 1>, 1); | |||
} | |||
state_exit() | |||
{ | |||
llSetText("", <0, 0, 0>, 0); | |||
} | |||
} | |||
state error | |||
{ | |||
state_entry() | |||
{ | |||
llOwnerSay("something went wrong; try checking that the notecard [ " + NOTECARD_NAME + " ] exists and contains data"); | |||
} | |||
changed(integer change) | |||
{ | |||
if (change & CHANGED_INVENTORY) | |||
{ | |||
llResetScript(); | |||
} | |||
} | |||
}</Pre> | |||
|helpers | |helpers | ||
|also_functions={{LSL DefineRow||[[llGetNotecardLine]]|}} | |also_functions={{LSL DefineRow||[[llGetNotecardLine]]|}} |
Revision as of 06:33, 27 September 2007
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Summary
Function: key llGetNumberOfNotecardLines( string name );276 | Function ID |
0.1 | Forced Delay |
10.0 | Energy |
Requests number of lines in notecard name via the dataserver event (cast dataserver value to integer)
Returns a key that is the handle for a dataserver event response.
• string | name | – | a notecard in the inventory of the prim this script is in |
Caveats
- This function causes the script to sleep for 0.1 seconds.
- If name is missing from the prim's inventory or it is not a notecard then an error is shouted on DEBUG_CHANNEL.
- If notecard contains embedded inventory items (such as textures and landmarks), invalid data will be returned.
Examples
string NOTECARD_NAME = "config"; // name of the card we are going to read integer notecard_line = 0; integer num_notecard_lines = 0; key notecard_request = NULL_KEY; list card_data; // the data in the card integer check_card(string name) // check that that the named inventory item is a notecard { integer i = llGetInventoryType(name); return i == INVENTORY_NOTECARD; } default { state_entry() { state init; } } state ready { touch_start(integer detected) { llOwnerSay("the notecard contained the following data:"); llOwnerSay(llDumpList2String(card_data, "\n")); } changed(integer change) { if (change & (CHANGED_INVENTORY)) // if someone edits the card, reset the script { llResetScript(); } } } state init { state_entry() { if (!check_card(NOTECARD_NAME)) // check the card exists { state error; } llSetText("initialising...", <1, 1, 1>, 0); notecard_request = NULL_KEY; notecard_line = 0; num_notecard_lines = 0; notecard_request = llGetNumberOfNotecardLines(NOTECARD_NAME); // ask for the number of lines in the card llSetTimerEvent(5.0); // if we don't hear back in 5 secs, then the card might have been empty } timer() // if we time out, it meant something went wrong - the notecard was probably empty { llSetTimerEvent(0.0); state error; } dataserver(key query_id, string data) { if (query_id == notecard_request) // make sure it's an answer to a question we asked - this should be an unnecessary check { llSetTimerEvent(0.0); // at least one line, so don't worry any more if (data == EOF) // end of the notecard, change to ready state { state ready; } else if (num_notecard_lines == 0) // first request is for the number of lines { num_notecard_lines = (integer)data; notecard_request = llGetNotecardLine(NOTECARD_NAME, notecard_line); // now get the first line } else { if (data != "" && llGetSubString(data, 0, 0) != "#") // ignore empty lines, or lines beginning with "#" { card_data = (card_data = []) + card_data + data; } ++notecard_line; notecard_request = llGetNotecardLine(NOTECARD_NAME, notecard_line); // ask for the next line } } // update the hover-text with the progress llSetText("read " + (string)(notecard_line) + " of " + (string)num_notecard_lines + " lines", <1, 1, 1>, 1); } state_exit() { llSetText("", <0, 0, 0>, 0); } } state error { state_entry() { llOwnerSay("something went wrong; try checking that the notecard [ " + NOTECARD_NAME + " ] exists and contains data"); } changed(integer change) { if (change & CHANGED_INVENTORY) { llResetScript(); } } }