float red = 1;
float green = 0;
float blue = 0;
vector currentColour = <1,1,1>;
float COLOUR_INCREMENT = 0.01;
float TIMER_INT = 0.01;
changeColour()
{
if (red == 1.0)
{
if (blue > 0.1)
{
blue = blue - COLOUR_INCREMENT;
}
else
{
green = green + COLOUR_INCREMENT;
}
}
else if (green == 1.0)
{
if (red > 0)
{
red = red - COLOUR_INCREMENT;
}
else if (blue < 1.0)
{
blue = blue + COLOUR_INCREMENT;
}
}
else if (blue == 1.0)
{
if (green > 0)
{
green = green - COLOUR_INCREMENT;
}
else if (red < 1.0)
{
red = red + COLOUR_INCREMENT;
}
}
currentColour = <red, green, blue>;
llSetLinkColor(LINK_ALL_OTHERS, currentColour, ALL_SIDES);
}
integer IsValidString(string input)
{
string allowedChars = "0123456789abcdef";
input = llStringTrim(llToLower(input), STRING_TRIM);
integer length = llStringLength(input);
if(length != 6)
return 0;
integer i;
for( i = 0; i < length; i++ )
{
if(llSubStringIndex(allowedChars, llGetSubString(input, i, i)) == -1)
return 0;
}
return 1;
}
integer iComponentLength = 2;
string sHexPrefix = "0x";
float fColorMax = 255.0;
vector vColorFromHex(string sColor)
{ //Convert hex-string (e.g. "aaff00") to vector color.
string sX; string sY; string sZ; integer iHelper; vector vColor;
iHelper = 0;
sX = llGetSubString(sColor, iHelper, iHelper + iComponentLength - 1);
iHelper = iHelper + iComponentLength;
sY = llGetSubString(sColor, iHelper, iHelper + iComponentLength - 1);
iHelper = iHelper + iComponentLength;
sZ = llGetSubString(sColor, iHelper, iHelper + iComponentLength - 1);
vColor = <((integer)(sHexPrefix + sX)) / fColorMax, ((integer)(sHexPrefix + sY)) / fColorMax, ((integer)(sHexPrefix + sZ)) / fColorMax>;
return vColor;
}
integer iListener;
integer iChannel = -938475;
//float fTimer = 30.0; //Seconds.
string sMessageDialog = "wich color settings would you use? \nhex-color : type in a hex-code fpr your own color \nPsychedelic : smooth rainbow color-change";
string sMessageTextBox = "Please enter the hex-code to re-color this prim-face, e.g. ff7f00";
string sMessageWrongColor = "Invalid color-code.";
//integer iTOUCHFACE;
//integer iTOUCHPRIM;
default
{
touch_start(integer num_detected)
{
if (llDetectedKey(0) != llGetOwner())
{ //Only listen to owner.
return;
}
//iTOUCHFACE = llDetectedTouchFace(0); //Store face and prim.
//iTOUCHPRIM = llDetectedLinkNumber(0);
iListener = llListen(iChannel, "", llDetectedKey(0), "");
//llSetTimerEvent(fTimer);
llDialog(llDetectedKey(0), sMessageDialog, ["hex-color", "Psychedelic"], iChannel);
}
listen(integer channel, string name, key id, string message)
{
if (message == "hex-color")
{
llSetTimerEvent(0);
llTextBox(llDetectedKey(0), sMessageTextBox, iChannel);
}
else if (message == "Psychedelic")
{
llListenRemove(iListener);
llSetTimerEvent(TIMER_INT);
}
//llSetTimerEvent(0);
//llListenRemove(iListener);
//Delete timer and listener.
else
{
if (IsValidString(message) == 1)
{
llSetLinkColor(LINK_ALL_OTHERS, vColorFromHex(message), ALL_SIDES);
llListenRemove(iListener);
}
else
{ //Invalid color-code.
llOwnerSay(sMessageWrongColor);
llListenRemove(iListener);
}
}
}
timer()
{
changeColour();
}
}