Difference between revisions of "LlGetNotecardLine"

From Second Life Wiki
Jump to: navigation, search
(Multi note card reader example added)
Line 44: Line 44:
 
     }
 
     }
 
}
 
}
 +
</pre>
 +
/////
 +
//  Generic Multi Notecard reader by Brangus Weir
 +
//  Given freely and published on wiki.secondlife.com
 +
//
 +
// This scrip will read three note cards and stor the results into 3 lists.
 +
// It can be modified and extended to as many 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 reslulting data pushed into a list
 +
integer g_iLine;    // The line count for the card reader
 +
key g_kQuery;      //the key of thge 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
 +
        // maniulations 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.
 +
                                                  //Save lag!
 +
        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); 
 +
               
 +
            }
 +
        }
 +
    }
 +
}
 +
<pre>
 +
 
</pre>
 
</pre>
 
|helpers
 
|helpers

Revision as of 12:11, 27 June 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 of a notecard (the index starts at zero).

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 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 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 scrip will read three note cards and stor the results into 3 lists. // It can be modified and extended to as many 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 reslulting data pushed into a list integer g_iLine; // The line count for the card reader key g_kQuery; //the key of thge 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
       // maniulations 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.
                                                 //Save lag!
       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 );