llGetNumberOfNotecardLines
Revision as of 06:33, 27 September 2007 by Core Taurog (talk | contribs)
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(); } } }