Difference between revisions of "LlGetNotecardLine"

From Second Life Wiki
Jump to navigation Jump to search
Line 1: Line 1:
{{LSL_Function/inventory|name|uuid=true|type=notecard}}{{LSL_Function
{{LSL_Function/negative_index|false|line}}{{LSL_Function/inventory|name|uuid=true|type=notecard}}{{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 5: Line 5:
|return_type=key
|return_type=key
|p1_type=string|p1_name=name
|p1_type=string|p1_name=name
|p2_type=integer|p2_name=line|p2_desc=Line number of a notecard (the index starts at zero).
|p2_type=integer|p2_name=line|p2_desc=Line number in a notecard (the index starts at zero).
|func_desc=Requests the line '''line''' of the notecard '''name''' from the dataserver.
|func_desc=Requests the line '''line''' of the notecard '''name''' from the dataserver.
|return_text=that is the handle for a {{LSLG|dataserver}} event response.
|return_text=that is the handle for a [[dataserver]] event response.
|func_footnote=If '''line''' is past the end of the notecard {{LSLG|EOF}} is returned by the {{LSLG|dataserver}}.
|func_footnote=If '''line''' is past the end of the notecard [[EOF]] is returned by the [[dataserver]].
|spec
|spec
|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 notecardline is longer then 255 characters/1024 Bytes it will be silently be cut down. Same like in llWhisper, llSay, llShout, and llRegionSay.
*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]]).
*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

Revision as of 15:44, 12 August 2007

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 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 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).
All Issues ~ Search JIRA for related Bugs

Examples

key kQuery;
integer iLine = 0;
default {
    
    state_entry() {
        llSay(0, "Reading notecard...");
        kQuery = llGetNotecardLine("My Notecard", iLine);
    }

    dataserver(key query_id, string data) {

        if (query_id == kQuery) {
            // this is a line of our notecard
            if (data == EOF) {    

                llSay(0, "No more lines in notecard, read " + (string)iLine + " lines.");

            } else {

                // increment line count
                llSay(0, "Line " + (string)iLine + ": " + data);
                
                //request next line
                iLine++;
                kQuery = llGetNotecardLine("My Notecard", iLine);

            }
        }
    }
}
/////
//  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 thse to the name of the invetory iten.
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;
        for (i = 0; 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) {    
                // increment line count
                g_lTempLines += [_data];
                //request a next line
                g_iLine++;
                g_kQuery = llGetNotecardLine(g_sNoteCardName, g_iLine);
            } else {
             //The notecard has been read 
             //notify end of read
             notecardFinished(g_sNoteCardName);   
                
            }
        }
    }
}

See Also

Events

•  dataserver

Functions

•  llGetNumberOfNotecardLines

Deep Notes

Search JIRA for related Issues

Signature

function key llGetNotecardLine( string name, integer line );