Simple Texture Changer (input list)(multiple prims & multiple sides).lsl

From Second Life Wiki
Jump to navigation Jump to search
//***********************************************************************************************************
//                                                                                                          *
//              --Simple Texture Changer (input list)(multiple prims & multiple side)--                     *
//                                                                                                          *
//***********************************************************************************************************
// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)
//Creator: Bobbyb30 Swashbuckler
//Attribution: None required, but it is appreciated.
//Created: October 6, 2009
//Last Modified: November 28, 2009
//Released: Saturday, November 28, 2009
//License: Public Domain

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

//Name: Simple Texture Changer (input list)(multiple prims & multiple side).lsl
//Purpose: To change the texture on certain prims on certain sides of a linked set.
//Technical Overview: The script finds how many textures there are in the input list, and uses a timer to change the
//                    texture on a side based on randomness or order. It changes all sides of the certain prim to the
//                    specified texture
//Description: A simple texture changer script that changes the texture on certain sides of certain prims in a linked
// 			   set to those in the input list. It allows for a random order, or a logical "next up" order.
//Directions: Create a prim. Place the script in prim inventory. Modify the script parameters to suit your needs and
//            save.

//Compatible: Mono & LSL compatible
//Other items required: None.
//Notes: Uses a timer event. Should be low lag. Commented for easier following.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//Adjustable global variables...you may change these
//texture list...this list should have 2 or more textures
list textures = [
    "00000000-0000-0000-0000-0000f0000000",
    "00000000-0000-0000-0000-0000d0000000",
    "00000000-0000-0000-0000-0000e0000000"];//put your texture UUIDs/keys in here

//Please note there is a .2 second delay between prims.
//"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;
    key texture = llList2String(textures,currenttexture);//gets texture key from list
    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 (input list)(multiple prims & multiple side).lsl' (Public Domain 2009)");
        llOwnerSay("Scripting made easy.");
        numberoftextures = llGetListLength(textures);//speed hack here
        numberofsidestochange = llGetListLength(sides);//length of the sides list...possible speed hack goes here
        //assume correct
        llOwnerSay("There are " + (string)numberoftextures + " pictures which I will change every "
            + (string)frequency + " seconds.");
        llOwnerSay("My current free memory is : " + (string)llGetFreeMemory()
            + " bytes. If it is below 2500 bytes, I may not work properly.");
        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));//generate random number
                }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
        }
        else//not random, go in order
        {
            ++currenttexture;
            if(currenttexture == numberoftextures)//if current texture = number of textures, reset counter
                currenttexture = 0;
            changetexture();//change the texture
        }
    }
}