lang="en-US"> SecondLife Tutorial: Single Controller For Multiple Objects –  Design1online.com, LLC

SecondLife Tutorial: Single Controller For Multiple Objects

Create a controller object with on button and an off button. Assign the on button code to the on button, the off button code to the off button and the block code to the object you want to effect with the controller. Each object should have a number in its description field. The object with number 1 will be the first object to appear. The object with number 2 will be the second, so forth and so on.

On Button Code:

//**************************
// Script Name: Block Controller 1.0
// Author: Jade Battery
// Purpose: turn the controller on
//**************************

integer controllerOn = FALSE; //have the other things respond
integer index = 1; //show the correct block

//**************************
// Purpose: Turn the controller on
// Precondition: none
// Postcondition: make sure all the blocks are off,
//   show the appropriate block above the controller
//**************************
default
{
state_entry()
{
//listen to this specific channel
llListen(1361, "",NULL_KEY, "");
llListen(1360, "",NULL_KEY, "");
llSetText("On", <1,1,1>, 1);
}

touch_start(integer total_number)
{

//they want the controller to start responding
if (controllerOn == FALSE)
{
controllerOn == TRUE;
llSay(0, "Online");

//tell all the other controller objects to start responding
llSay(1361, "controllerOn");

//set the index to zero
llSay(1361, "restart");

//hide all the blocks again
llSay(1360, "allOff");
index = 0;
}
}

//listen to see if they've touched a block
listen(integer channel, string name, key id, string message)
{

//check to see which block they touched
if (message == "Pressed")
{
//display that block above the controller
}
}
}//end default

Off Button Code

//**************************
// Script Name: Block Controller 1.0
// Author: Jade Battery
// Purpose: stop the controller from responding
//**************************

integer respond = FALSE; //have the other things respond
integer index = 0; //show the correct block

//**************************
// Purpose: Turn the controller on
// Precondition: none
// Postcondition: make sure all the blocks are off,
//   show the appropriate block above the controller
//**************************
default
{
state_entry()
{
//listen to this specific channel
llListen(1361, "",NULL_KEY, "");
llListen(1360, "",NULL_KEY, "");
llSetText("Off", <1, 1, 1>, 1);
}

touch_start(integer total_number)
{
//send a message to turn all the blocks off
if (respond == TRUE)
{
llSay(0, "Offline");
llSay(1360, "allOff");
llSay(1361, "controllerOff");
}
}

//listen to see if the controller is on or off
listen(integer channel, string name, key id, string message)
{
if (message == "controllerOn")
respond = TRUE;
if (message == "controllerOff")
respond = FALSE;
}
}//end default

Block Code

//**************************
// Script Name: Block Controller 1.0
// Author: Jade Battery
// Purpose: modify the appearance of the block based on actions
//     sent by the controller
//**************************

vector blockcolor = <1.0, 1.0, 1.0>; //color of the block
vector flashcolor = <1.0, 0.0, 1.0>; //color of the flashing block
integer isOn = TRUE; //the block is set to being off
integer i;

//**************************
// Purpose: Toggle the state of the block
//   if the block is on, show it
//   otherwise don't show it
// Precondition: none
// Postcondition: if block was showing it isn't anymore
//**************************
blockstate(integer flash)
{
//turn the block on
if(isOn == TRUE)
{
//change transparency
llSetAlpha(1, ALL_SIDES);
llSetLinkAlpha(LINK_ALL_CHILDREN, 1, ALL_SIDES);

//flash the block
if (flash == TRUE)
flashblock();

//turn phantom status off
llSetStatus( STATUS_PHANTOM, FALSE);

//change the color
llSetColor(blockcolor, ALL_SIDES);
llSetLinkColor(LINK_ALL_CHILDREN, blockcolor, ALL_SIDES);

}

//turn the block off
else if (isOn == FALSE)
{
//turn phantom status on
llSetStatus( STATUS_PHANTOM, TRUE);

//change transparency
llSetAlpha(0, ALL_SIDES);
llSetLinkAlpha(LINK_ALL_CHILDREN, 0, ALL_SIDES);
}
}

//**************************
// Purpose: Flash the block once it shows up
// Precondition: Block is visible
// Postcondition: if block was showing it isn't anymore
//**************************
flashblock()
{

for (i = 0; i < 100; i++)
{
//show the flashing color
if (i % 10 == 0)
{
llSetColor(flashcolor, ALL_SIDES);
llSetLinkColor(LINK_ALL_CHILDREN, flashcolor, ALL_SIDES);
}
else //show the normal color
{
llSetColor(blockcolor, ALL_SIDES);
llSetLinkColor(LINK_ALL_CHILDREN, blockcolor, ALL_SIDES);
}
}//end for loop
}//end flashing block

//**************************
// Purpose: Have the block listen for the controller
// Precondition: block description has been set to ID number
// Postcondition: block is listening and responding to
//   any message sent from the controller for this blockid
//**************************
default
{
state_entry()
{
//make it so they can walk through this
llSetStatus( STATUS_PHANTOM, TRUE);

//listen to this specific channel
llListen(1361, "",NULL_KEY, "");
llListen(1360, "",NULL_KEY, "");
llSay(1361,"Pressed" + (string)llGetObjectDesc());
}

//listen for something to happen
listen(integer channel, string name, key id, string message)
{

//listen for a message to turn all blocks off
if (message == "allOff")
isOn = FALSE;

//listen for a message to turn all blocks on
if (message == "allOn")
isOn = TRUE;

//the controller is calling to this block
if (message == llGetObjectDesc() && isOn == FALSE)
isOn = TRUE;
else if (message == llGetObjectDesc())
isOn = FALSE;

//update the current state
if (message == llGetObjectDesc())
blockstate(TRUE);
else
blockstate(FALSE);

}
}

You may also like...

Leave a Reply