Difference between revisions of "LlGetNotecardLine"

From Second Life Wiki
Jump to navigation Jump to search
m
(Move some Caveats to Template:LSL_Function/notecard and replace {{LSL_Function/inventory}} to it)
Line 1: Line 1:
{{LSL_Function/negative_index|false|line}}{{LSL_Function/inventory|name|uuid=true|type=notecard}}{{LSL_Function
{{LSL_Function/negative_index|false|line}}{{LSL_Function/notecard|name|uuid=true}}{{LSL_Function
|func_id=217|func_sleep=0.1|func_energy=10.0
|func_id=217|func_sleep=0.1|func_energy=10.0
|sort=GetNotecardLine
|sort=GetNotecardLine
Line 12: Line 12:
|caveats=* If notecard contains embedded inventory items (such as textures and landmarks), [[EOF]] will be returned, regardless of the line requested.
|caveats=* If notecard contains embedded inventory items (such as textures and landmarks), [[EOF]] will be returned, regardless of the line requested.
*If the requested line is longer then 255 bytes the [[dataserver]] will return the first 255 bytes of the line.
*If the requested line is longer then 255 bytes the [[dataserver]] will return the first 255 bytes of the line.
*If the notecard is empty, the dataserver will shout on the [[DEBUG_CHANNEL]] that the notecard does not exist. This is because until a notecard is saved for the first time, it does not exist as an asset only as an inventory placeholder ([[llGetInventoryKey]] will return [[NULL_KEY]]).
|constants
|constants
|examples=<lsl>
|examples=<lsl>
Line 33: Line 32:


             } else {
             } else {
 
                  
                 // increment line count
                 llSay(0, "Line " + (string)iLine + ": " + data);  // data has the current line from this notecard
                 llSay(0, "Line " + (string)iLine + ": " + data);  // data has the current line from this notecard
                  
                  
                 //request next line
                 //request next line
                 iLine++;
                 iLine++;   // increment line count
                 kQuery = llGetNotecardLine("My Notecard", iLine);  // read another line when you can
                 kQuery = llGetNotecardLine("My Notecard", iLine);  // read another line when you can


Line 136: Line 134:
             // this is a line of our notecard
             // this is a line of our notecard
             if (_data != EOF) {     
             if (_data != EOF) {     
                // increment line count
                 g_lTempLines += [_data];
                 g_lTempLines += [_data];
                 //request a next line
                 //request a next line
                 g_iLine++;
                 g_iLine++;   // increment line count
                 g_kQuery = llGetNotecardLine(g_sNoteCardName, g_iLine);
                 g_kQuery = llGetNotecardLine(g_sNoteCardName, g_iLine);
             } else {
             } else {

Revision as of 05:47, 7 May 2009

Summary

Function: key llGetNotecardLine( string name, integer line );

Requests the line line of the notecard name from the dataserver.
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 or a UUID of a notecard
• integer line Line number in a notecard (the index starts at zero).

line does not support negative indexes. If line is past the end of the notecard EOF is returned by the dataserver.

Caveats

  • This function causes the script to sleep for 0.1 seconds.
  • If line is out of bounds the script continues to execute without an error message.
  • If name is missing from the prim's inventory and it is not a UUID or it is not a notecard then an error is shouted on DEBUG_CHANNEL.
  • If name is a UUID then there are no new asset permissions consequences for the object.
    • The resulting object develops no new usage restrictions that might have occurred if the asset had been placed in the prims inventory.
  • If name is a new empty notecard (never saved) then an error "Couldn't find notecard ~NAME~" (~NAME~ being the value of name) will be shouted on the DEBUG_CHANNEL. This is because until a notecard is saved for the first time, it does not exist as an asset only as an inventory placeholder.
  • If notecard contains embedded inventory items (such as textures and landmarks), EOF will be returned, regardless of the line requested.
  • If the requested line is longer then 255 bytes the dataserver will return the first 255 bytes of the line.
All Issues ~ Search JIRA for related Bugs

Examples

<lsl> key kQuery; integer iLine = 0; default {

   state_entry() {
       llSay(0, "Reading notecard...");
       kQuery = llGetNotecardLine("My Notecard", iLine);   // read in "My Notecard" when you can
   }
   dataserver(key query_id, string data) {
       if (query_id == kQuery) {    // were we called to work on "My Notecard"?
           // this is a line of our notecard
           if (data == EOF) {    
               llSay(0, "No more lines in notecard, read " + (string)iLine + " lines.");
           } else {
               
               llSay(0, "Line " + (string)iLine + ": " + data);   // data has the current line from this notecard
               
               //request next line
               iLine++;   // increment line count
               kQuery = llGetNotecardLine("My Notecard", iLine);   // read another line when you can
           }
       }
   }

}

</lsl>

Useful Snippets

<lsl> ///// // Generic Multi Notecard reader by Brangus Weir // Given freely and published on wiki.secondlife.com // // This script will read three note cards and store the results into three lists. // It can be modified and extended to as many (or few) cards as you'd like to read. //

list gOneCard; // All the lines from from the first card list gTwoCard; // All the lines from from the second card list gThreeCard; // All the lines from from the third card

string gsCardOneName = "One"; //Set these to the name of the invetory item. string gsCardTwoName = "Two"; string gsCardThreeName = "Three";

//Temporary variables for processing string g_sNoteCardName; // Name of the card to be read. list g_lTempLines; // The resulting data pushed into a list integer g_iLine; // The line count for the card reader key g_kQuery; // The key of the card being read


initialize(string _action) {

   // Due to the execution order when using dataserver, this function sets the first card to 
   // be read, and the excetuion finishes when called again with the _action set to "finish".
   if (_action == "") {
       loadNoteCard(gsCardOneName);
   } else if (_action == "finish") {
       // All cards have been read into the lists... now you can do any kind of string
       // manipulations to get the data you need to set your script.
       // But here we will prove that the cards have been read with a loop
       integer end = llGetListLength(gOneCard);  //Always evaluate this once, don't do it
                                                 //INSIDE the for loop like noob programers will.
                                                 //Reduce lag, THINK ABOUT MACHINE CYCLES!
       integer i = 0;
       for (; i< end; ++i)
           llSay(0, llList2String(gOneCard,i));
       end = llGetListLength(gTwoCard);
       for (i = 0; i< end; ++i)
           llSay(0, llList2String(gTwoCard,i));
       end = llGetListLength(gThreeCard);
       for (i = 0; i< end; ++i)
           llSay(0, llList2String(gThreeCard,i));
   }                
                             

}

loadNoteCard( string _notecard ) {

   g_lTempLines = []; //clear the temp lines
   g_sNoteCardName = _notecard;
   g_iLine = 0;
   g_kQuery = llGetNotecardLine(g_sNoteCardName, g_iLine);  
   

}

notecardFinished(string _notecard){

   // Called at the end of each notecard as it is read. The temp results are stored
   // and the next card is commanded to be read.
   if (_notecard == gsCardOneName) {
       gOneCard = g_lTempLines;
       loadNoteCard(gsCardTwoName);
   } else if (_notecard == gsCardTwoName) {
       gTwoCard = g_lTempLines;
       loadNoteCard(gsCardThreeName);
   } else if (_notecard == gsCardThreeName) {
       gThreeCard = g_lTempLines;
       initialize("finish");  // Finally pass exection to finish the initialization.   
   }    

}

default {

   state_entry()
   {
   }
   
   touch_start(integer _num_det){
       initialize("");     
    
   }
    
   dataserver(key _query_id, string _data) 
   {
       if (_query_id == g_kQuery) {
           // this is a line of our notecard
           if (_data != EOF) {    
               g_lTempLines += [_data];
               //request a next line
               g_iLine++;   // increment line count
               g_kQuery = llGetNotecardLine(g_sNoteCardName, g_iLine);
           } else {
            //The notecard has been read 
            //notify end of read
            notecardFinished(g_sNoteCardName);   
               
           }
       }
   }

} </lsl>

Notes

The notecard read can be no modify, or no modify/no copy.

See Also

Events

•  dataserver

Functions

•  llGetNumberOfNotecardLines

Deep Notes

Search JIRA for related Issues

Signature

function key llGetNotecardLine( string name, integer line );