Difference between revisions of "Simple Texture Changer (for inventory)(multiple prims & multiple sides).lsl"

From Second Life Wiki
Jump to navigation Jump to search
(added script)
 
m (added backlink)
Line 1: Line 1:
Part of [[Bobbyb's texture changer]] collection
<lsl>
<lsl>
//https://wiki.secondlife.com/wiki/Simple_Texture_Changer_(for_inventory)(multiple_prims_%26_multiple_sides).lsl
//***********************************************************************************************************
//***********************************************************************************************************
//                                                                                                          *
//                                                                                                          *

Revision as of 08:13, 28 November 2009

Part of Bobbyb's texture changer collection <lsl> //https://wiki.secondlife.com/wiki/Simple_Texture_Changer_(for_inventory)(multiple_prims_%26_multiple_sides).lsl //*********************************************************************************************************** // * // --Simple Texture Changer (for inventory)(multiple prims & multiple sides)-- * // * //*********************************************************************************************************** // www.lsleditor.org by Alphons van der Heijden (SL: Alphons Jano) //Creator: Bobbyb30 Swashbuckler //Attribution: None required, but it is appreciated. //Created: November 26, 2009 //Last Modified: November 26, 2009 //Released: Saturday, November 28, 2009 //License: Public Domain

//Status: Fully Working/Production Ready //Version: 1.0.3

//Name: Simple Texture Changer (for inventory)(multiple prims & multiple sides).lsl //Purpose: To change the texture on multiple prim sides(faces) of certain prims in a linked set based on the // textures in inventory. //Technical Overview: The script finds how many textures there are in inventory, and uses a timer to change the // texture on a side based on randomness or order. It takes into account inventory changes. It uses // a user defined list to determine which sides to change. //Description: A simple textre changer script that changes the texture on multiple sides of multiple linked prims to // those in inventory. It allows for a random order, or a logical "next up" order. //Directions: Create a prim. Place pictures in prim inventory. Place script in prim inventory. Modify script parameters // to suit your needs. If you add pictures, and the script does not reset, manually reset the script. If you // only need to change one side (or all sides), use the // "Simple Texture Changer (for inventory)(for one side or all sides).lsl" script.

//Compatible: Mono & LSL compatible //Other items required: More than 1 texture in inventory. //Notes: Uses a timer event. Should be low lag. Commented for easier following. This will change the various sides // of linked prims to the *same* texture. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//Adjustable global variables...you may change these //Please note there is a .2 second delay between sides. //"prim number, side number, side number...side number" //-1 equals all sides for that prim list sides = [

   "0,1,2,5",
   "1,3,4,1"];//put in which sides you want the texture to be changed on.

float frequency = 2.0;//how often to change the texture in seconds. Shouldn't be below 2.0

//please note that the last and first texture will be shown less frequently than those in between integer random = TRUE;//whether to show the textures randomly, or in order integer duplicatecheck = TRUE;//if random is true, this will check to make sure the random selection is a new texture


///////////////////////////////////////////////////////////// //global variables...do not change integer numberoftextures;//number of textures in inventory integer currenttexture;//inventory number of current texture integer numberofsidestochange;//the length of the sides list

changetexture()//user fucntion to change texture; {

   integer counter;
   string texture = llGetInventoryName(INVENTORY_TEXTURE,currenttexture);//gets texture name
   do
   {
       //also with another script
       list primdata = llCSV2List(llList2String(sides,counter));
       integer prim = llList2Integer(primdata,0);
       integer primlistlength = llGetListLength(primdata);//speed hack could go here
       integer primlistcounter = 1;//start at 1 since the prim datalist's 1st entry is the prim
       do
       {
           //probably best to use llSetLinkPrimitiveParams
           //prim, texture, side
           llSetLinkTexture(prim,texture,llList2Integer(sides,primlistcounter));
       }while(++primlistcounter < primlistlength);
   }while(++counter <numberofsidestochange);

}

default {

   on_rez(integer start_param)//on rez reset...probably not needed.
   {
       llResetScript();
   }
   state_entry()
   {
       llOwnerSay("Bobbyb's 'Simple Texture Changer (for inventory)(multiple prims & multiple sides).lsl' (Public Domain 2009)");
       llOwnerSay("Because knowledge should be free.");
       numberoftextures = llGetInventoryNumber(INVENTORY_TEXTURE);//number of textures in inventory
       numberofsidestochange = llGetListLength(sides);//length of the sides list...possible speed hack goes here
       if(numberoftextures <= 0)//no textures
           llOwnerSay("No textures were found in my inventory. Please add textures.");
       else if(numberoftextures == 1)//only 1 texture
           llOwnerSay("I only found 1 picture in my inventory. I need more in order to change them.");
       //for 2 random isn't needed...but I'm too lazy to add that in
       else//more than 1 texture found...
       {
           llOwnerSay("I found " + (string)numberoftextures + " pictures which I will change every "
               + (string)frequency + " seconds.");
           llSetTimerEvent(frequency);
       }
   }
   timer()
   {
       if(random)//show pics randomly
       {
           integer randomtexture;
           if(duplicatecheck)//whether to make sure random doesn't repeat itself
           {
               do
               {
                   randomtexture= llRound(llFrand(numberoftextures - 1));
                   //llOwnerSay("r" + (string)randomtexture);//debug
               }while(randomtexture == currenttexture);//make sure the random one isn't the same as the current one
           }
           else//no duplicate check
               randomtexture = llRound(llFrand(numberoftextures - 1));//generate random texture number
           currenttexture = randomtexture;//set the current one to the random one selected
           changetexture();//change the texture
           //llOwnerSay("c" + (string)currenttexture);//debug
       }
       else//not random, go in order
       {
           ++currenttexture;
           if(currenttexture == numberoftextures)//if current texture = number of textures, reset counter
               currenttexture = 0;
           changetexture();//change the texture
           //llOwnerSay("c" + (string)currenttexture);//debug
       }
   }
   changed(integer change)
   {
       if(change & CHANGED_INVENTORY)
       {
           llOwnerSay("Inventory change detected.");
           numberoftextures = llGetInventoryNumber(INVENTORY_TEXTURE);
           llOwnerSay("I found " + (string)numberoftextures + " pictures which I will change every "
               + (string)frequency + " seconds.");
       }
   }

} <lsl>