User:Jack Abraham

From Second Life Wiki
Jump to: navigation, search

Lantern by day, filler of blank (personal) pages.

Code Snippets

What am I looking at?

A function I just threw in to replace phantom bullets for quickly acquiring a point of interest -- whatever your camera's focused on (in this sim, within 20m) is returned, allowing quicker, more intuitive targeting of other objects. PERMISSION_TRACK_CAMERA must be previously set. Requires llCastRay.

<lsl>key camPing() {

   // End points at the camera and 20m in front of it
   vector camPos = llGetCameraPos();

   // Clamp the end position to within the sim
   // From an SLUniverse post by Chalice Yao
   // http://www.sluniverse.com/php/vb/scripting/46344-llcastray-available-testing-maybe-only.html#post969497
   float xSteps;
   float ySteps;
   vector camRot = llRot2Fwd(llGetCameraRot());
   fXSteps = llAbs( ( 256.0 * !!camRot.x ) - camPos.x ) / camRot.x;
   fYSteps = llAbs( ( 256.0 * !!camRot.y ) - camPos.y ) / camRot.y;
   if(xSteps > ySteps)
       xSteps = ySteps;
   if ( xSteps > 20.0 )
       xSteps = 20.0
   // Cast the ray; ignore hits on land, otherwise get the root key
   list contacts = llCastRay( camPos, camPos + ( camRot * xSteps ), 
       RC_REJECT_LAND,
       RC_GET_ROOT_KEY );
   // Return values
   if ( llList2Integer( contacts, -1 ) > 0 ) { // Got a return
       return llList2Key( contacts, 0 );
   }
   return NULL_KEY;

} </lsl>

Donation System

System for tracking total donations to an avatar via payment kiosks. It requires Latif Khalifa's Grid URL Persister; you can find instructions for setting up your own copy here.

Client

This goes in the payment kiosks. If you don't set the recipient variable to an avatar's key, your money will go nowhere and clowns will laugh at you.

<lsl> // ========================================================================= // Network giving client \ // By Jack Abraham \__ // =========================================================================

// Change these three for your application --------------------------------- // Key for the avatar who actually gets paid // If you don't change this I'm not giving you your money back key recipient =

   NULL_KEY;

// 40 character password string PASSWORD = "neduW4AME57UD5m6zudAJEkA6HExet6UyerU6wEw"; // UUID for your application key gridURLkey = "6365ef00-a48b-44cb-a852-9495c2c136a9";

// -------------------------------------------------------------------------

string gridURL = // Latif Khalifa Grid URL Persister

   "http://gridURL.appspot.com/";

integer total = 0; // Systemwide total integer myTotal = 0; // Total this terminal

update_total( string body ) {

   total = (integer)body;
   llSetText( "L$ " + body + " collected\nL$ " + (string)myTotal + " here",
       <1, 0.6, 0.6>, 1.0 );

}

string transmitURL = ""; key txRequest; key send( string message ) {

   if ( transmitURL ) {
       return llHTTPRequest( transmitURL, [ HTTP_METHOD, "POST" ], PASSWORD + 
           message );
   }
   return NULL_KEY;

}

key hostRequest;

key get_Grid_URL() {

   return llHTTPRequest( gridURL, [], "" );

}

default {

   state_entry()
   {
       llSetText( "Setting up", <1, 0.8, 0.8>, 1.0 );
       llSetClickAction( CLICK_ACTION_TOUCH );
       llSetPayPrice( 2000, [ 250, 500, 1000, 2000 ] );
       llRequestPermissions( llGetOwner(), PERMISSION_DEBIT );
   }
   
   run_time_permissions( integer perm )
   {
       if ( perm & PERMISSION_DEBIT ) {
           llOwnerSay( "Connecting to server..." );
           hostRequest = get_Grid_URL();
       }
   }
   on_rez( integer p )
   {
       llResetScript();
   }
   
   http_response(key request_id, integer status, list metadata, string body)
   {
       if ( request_id == hostRequest ) {
           hostRequest == NULL_KEY;
           transmitURL = body;
           llOwnerSay( "Sending updates to " + transmitURL );
           state payme;
       } else if (request_id == txRequest ) {
           txRequest == NULL_KEY;
           if ( status != 200 && status != 202 ) {
               llOwnerSay( "Sending failed with status " + (string)status
                   + " to " + transmitURL );
           }
       }
   }

}

state payme {

   on_rez( integer p )
   {
       llResetScript();
   }
   
   state_entry()
   {
       llSetClickAction( CLICK_ACTION_PAY );
       llSetText( "Ready", <1, 0.8, 0.8>, 1.0 );
       txRequest = send( "0" );
       llSetTimerEvent( 300 );
   }
   
   changed( integer change )
   {
       if ( change & CHANGED_REGION_START ) {
           hostRequest = get_Grid_URL();
       }
   }
           
   timer()
   {
       hostRequest = get_Grid_URL();
   }
   
   touch_end( integer d )
   {
       key who = llDetectedKey(0);
       txRequest = send( "0" );
   }
   
   money( key who, integer amount )
   {
       llGiveMoney( recipient, amount );
       myTotal += amount;
       llRegionSayTo( who, 0, "Thank you for your donation."
           );
       list inventoryItems;
       integer inventoryNumber = llGetInventoryNumber(INVENTORY_ALL);
       string this = llGetScriptName();
       integer index;
       do
       {
           string itemName = llGetInventoryName(INVENTORY_ALL, index);

           if ( ( llGetInventoryPermMask(itemName, MASK_OWNER) & PERM_COPY ) 
               && ( itemName != this ) )
           {
               inventoryItems += itemName;
           }
       }
       while(++index < inventoryNumber);
       if ( inventoryItems != [] ) {
           llGiveInventoryList(who, llGetObjectName(), inventoryItems);
       }
       
       txRequest = send( (string)amount );
   }
   
   http_response(key request_id, integer status, list metadata, string body)
   {
       if ( request_id == hostRequest ) {
           hostRequest == NULL_KEY;
           if ( body != transmitURL ) {
               transmitURL = body;
               llOwnerSay( "Sending updates to " + transmitURL );
           }
           txRequest = send( "0" );
       } else if (request_id == txRequest ) {
           txRequest == NULL_KEY;
           if ( status != 200 && status != 202 ) {
               llOwnerSay( "Sending failed with status " + (string)status
                   + " to " + transmitURL );
               llSleep( 60 );
               hostRequest = get_Grid_URL();
           } else {
               update_total( body );
           }
       }
   }

} </lsl>

Server

Install this script in exactly one object; if there's more than one the system will get confused.

<lsl> // ========================================================================= // Network giving total \ // By Jack Abraham \__ // =========================================================================

// Change these two for your application ----------------------------------- // 40 character password string PASSWORD = "neduW4AME57UD5m6zudAJEkA6HExet6UyerU6wEw"; // UUID for your application key gridURLkey = "6365ef00-a48b-44cb-a852-9495c2c136a9";

// -------------------------------------------------------------------------

string gridURL = // Latif Khalifa Grid URL Persister

   "http://gridURL.appspot.com/";

integer total = 0; // Total collected

record_payment( integer paid ) {

   total += paid;
   llSetObjectDesc( (string)total );
   llSetText( "L$" + (string)total + " collected", <1.0, 0.6, 0.6>, 1.0 );

}

// -------------------------------------------------------------------------

integer renewInterval = 604800; string myURL; key urlRequest;

// Get a new URL key get_URL() {

   llReleaseURL( myURL );
   llSetLinkColor( LINK_ROOT, <0.5, 0.5, 0.5>, ALL_SIDES );
   myURL = "";
   return llRequestURL();

}

// Register URL with name service register() {

   string send = gridURL + "reg?service=" + (string)gridURLkey + "&url=" +
       llEscapeURL( myURL );
   llHTTPRequest( send, [], "" );
   llSay( 0, "/me updating registration at " + gridURL 
       + "get/" + (string)gridURLkey + " to " + myURL );
   send = gridURL + "reg?service=" + (string)gridURLkey + "&url=" +
       llEscapeURL( myURL );
   llHTTPRequest( send, [], "" );

}

// =========================================================================


default {

   state_entry()
   {
       llSay(0, "/me activated.");
       llSetTouchText( "Reset" );
       llSetLinkColor( LINK_ROOT, <0.5, 0.5, 0.5>, ALL_SIDES );
       llSetText( "Initializing", <1.0, 1.0, 1.0>, 1.0 );
       total = (integer)llGetObjectDesc();
       urlRequest = get_URL();
   }
   
   on_rez( integer d )
   {
       llResetScript();
   }
   http_request(key id, string method, string body)
   {
       if ( urlRequest == id) {                // New URL handling
           urlRequest = NULL_KEY;
           if (method == URL_REQUEST_GRANTED) {
               myURL = body;
               llSetLinkColor( LINK_ROOT, <1.0, 0.6, 0.6>, ALL_SIDES );
               llSetText( "Active\n" + (string)llGetFreeMemory() 
                   + " bytes free", 
                   <1.0, 1.0, 1.0>, 1.0 );
               register();
           } else if (method == URL_REQUEST_DENIED) {
               myURL = "";
               llSetText( "Communications down", <1.0, 0., 0.>, 1.0 );
               llSetTouchText( "Reset" );
           }
       } else if ( method == "POST" ) {
           // Validate sender
           if ( llGetSubString( body, 0, 39 ) == PASSWORD ) {
               body = llGetSubString( body, 40, -1 );
           } else {
               llHTTPResponse( id, 403, "Not authorized." );
               return;
           }
           integer amount = (integer)body;
           record_payment( amount );
           llHTTPResponse( id, 200, (string)total );
       }
   }
   changed( integer change )
   {
       if ( change & CHANGED_REGION_START ) {
           llResetScript();
       }
   }

} </lsl>