Difference between revisions of "LlRequestInventoryData"

From Second Life Wiki
Jump to navigation Jump to search
(minor improvements to the script,)
Line 54: Line 54:
//Note: this teleporter is subject to the 300m distance limit for llSitTarget
//Note: this teleporter is subject to the 300m distance limit for llSitTarget
//by Ilse Mannonen
//by Ilse Mannonen


//on state entry, request inventory data and set text for first landmark found in inventory.   
//on state entry, request inventory data and set text for first landmark found in inventory.   
    //If none, complain
//If none, complain
//on getting data, set sit target
//on getting data, set sit target
//on change in inventory, reset script
//on change in inventory, reset script
Line 65: Line 64:


key requestid;
key requestid;
vector dest;
vector offset;


default
default
Line 80: Line 77:
         {
         {
             //set floating text according to the LM name
             //set floating text according to the LM name
             llSetText("Teleport to " + llGetInventoryName(INVENTORY_LANDMARK, 0), <1,1,1>, 1);
             llSetText("Teleport to " + llGetInventoryName(INVENTORY_LANDMARK, 0), <1.0, 1.0, 1.0>, 1.0);
             //request the LM data
             //request the LM data
             requestid = llRequestInventoryData(llGetInventoryName(INVENTORY_LANDMARK, 0));
             requestid = llRequestInventoryData(llGetInventoryName(INVENTORY_LANDMARK, 0));
Line 90: Line 87:
         if (id == requestid)
         if (id == requestid)
         {
         {
             //data will be in vector format            
             //data will be in vector format
             dest = (vector)data;
             vector dest = (vector)data;
             offset = (dest - llGetPos()) * (ZERO_ROTATION / llGetRot());
             vector offset = (dest - llGetPos()) / llGetRot();
             llSitTarget(offset, llEuler2Rot(<0,-90,0> * DEG_TO_RAD));          
             llSitTarget(offset, llEuler2Rot(<0.0, -90.0, 0.0> * DEG_TO_RAD));
         }      
         }
     }
     }
      
      
     changed(integer change)
     changed(integer change)
     {
     {
        if (change & CHANGED_LINK)
        { // and it was a link change
            llSleep(0.5); // llUnSit works better with this delay
            key user = llAvatarOnSitTarget();
            if (user) { // somebody is sitting on me
                llUnSit(user); // unsit him
            }
        }
        //when doing "ifs" on bitwise things, it's best to do them separate instead of using else..if,
        //in case you hit the one in a billion chance when the inventory and link changes are reported in the same event.
         if (change & CHANGED_INVENTORY)
         if (change & CHANGED_INVENTORY)
         {
         {
Line 104: Line 111:
             llResetScript();
             llResetScript();
         }
         }
        //when doing "ifs" on bitwise things, it's best to do them separate instead of useing else..if, in case you hit the one in a billion chance when the inventory and link changes are reported in the same event.
        if (change & CHANGED_LINK)
        { // and it was a link change
            llSleep(0.5); // llUnSit works better with this delay
            if (llAvatarOnSitTarget() != NULL_KEY) { // somebody is sitting on me
                llUnSit(llAvatarOnSitTarget()); // unsit him
            }
        }       
     }
     }
      
      

Revision as of 23:45, 29 February 2008

Summary

Function: key llRequestInventoryData( string name );
1.0 Forced Delay
10.0 Energy

Requests data from objects inventory object. When data is available the dataserver event will be raised.
Returns a key that is used to identify the dataserver event when it is raised.

• string name an item in the inventory of the prim this script is in

name Type dataserver Description
Landmark (vector) The vector data received by dataserver is a global position as an offset from the current region's origin (<0,0,0>). To obtain the absolute global position of a landmark, add llGetRegionCorner() to the vector.

Caveats

  • This function causes the script to sleep for 1.0 seconds.
  • If name is missing from the prim's inventory then an error is shouted on DEBUG_CHANNEL.

Examples

<lsl>//-- Open map for owner to 1st landmark in object inventory on touch //-- *MUST* be in an attached object (llMapDestination Requirement for non-touch use) key vgKeyOwner;

default {

 touch_start( integer vIntNull )
 {
   if (llDetectedKey( 0 ) == vgKeyOwner)
   {
     integer vIntLMcount = llGetInventoryNumber( INVENTORY_LANDMARK );
      //-- make sure we have a landmark in invetory
     if (vIntLMcount)
     {
       llRequestInventoryData( llGetInventoryName( INVENTORY_LANDMARK, 0 ) );
     }
   }
 }
 dataserver( key vKeyNull, string vStrData )
 {
    //-- because we don't know who touched us in this event, this
    //-- only works for the owner when called from the dataserver
   llMapDestination( llGetRegionName(), (vector)vStrData, ZERO_VECTOR );
 }
 on_rez( integer vIntNull )
 {
   vgKeyOwner = llGetOwner();
 }

}</lsl> <lsl>//An easily-configurable teleporter that sets its destination by getting it from a landmark in the prim's inventory //Note: this teleporter is subject to the 300m distance limit for llSitTarget //by Ilse Mannonen

//on state entry, request inventory data and set text for first landmark found in inventory. //If none, complain //on getting data, set sit target //on change in inventory, reset script //on sit, TP the person and unsit

//Thanks to Pol Tabla, who wrote the simple sit-teleport script I have adapted here

key requestid;

default {

   state_entry()
   {
       //complain if there are no landmarks
       if (llGetInventoryNumber(INVENTORY_LANDMARK) == 0)
       {
           llSay(0, "There are no landmarks in me.  You need to put a landmark in me for me to work.");
       }
       else
       {
           //set floating text according to the LM name
           llSetText("Teleport to " + llGetInventoryName(INVENTORY_LANDMARK, 0), <1.0, 1.0, 1.0>, 1.0);
           //request the LM data
           requestid = llRequestInventoryData(llGetInventoryName(INVENTORY_LANDMARK, 0));
       }
   }
   
   dataserver(key id, string data)
   {
       if (id == requestid)
       {
           //data will be in vector format
           vector dest = (vector)data;
           vector offset = (dest - llGetPos()) / llGetRot();
           llSitTarget(offset, llEuler2Rot(<0.0, -90.0, 0.0> * DEG_TO_RAD));
       }
   }
   
   changed(integer change)
   {
       if (change & CHANGED_LINK) 
       { // and it was a link change
           llSleep(0.5); // llUnSit works better with this delay
           key user = llAvatarOnSitTarget();
           if (user) { // somebody is sitting on me
               llUnSit(user); // unsit him
           }
       }
       //when doing "ifs" on bitwise things, it's best to do them separate instead of using else..if,
       //in case you hit the one in a billion chance when the inventory and link changes are reported in the same event.
       if (change & CHANGED_INVENTORY)
       {
           //reset on inventory change, so people don't have to manually reset when they add a new LM
           llResetScript();
       }
   }
   
   on_rez(integer param)
   {
       llResetScript();
   }
}</lsl>

See Also

Functions

•  llMapDestination

Deep Notes

Signature

function key llRequestInventoryData( string name );