Simple Texture Changer (for inventory)(multiple prims & multiple sides).lsl

Part of Bobbyb's texture changer collection 
//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.");
 }
 }
}