Rang: Ehrenmitglied
Mitglied seit: 05.09.2014(UTC) Beiträge: 84  Wohnort: Tulln und Rostock Dankte: 1 mal(e)
|
Mit folgendem Skript kann man die Farbe jeder Fläche in einem Linkset (oder einzelnen Prim) einzeln durch Eingabe eines Hex-Codes (z.B. "a0db8e") einstellen. Man klickt dazu auf die Fläche die man verändern will, und gibt dann den Code in die Textbox ein, die sich öffnet. Das funktioniert in diesem Beispiel nur für den Owner. Code:
integer Ord(string chr)
{
if (chr == "")
return 0;
chr = llGetSubString(chr, 0, 0);
string hex = llEscapeURL(chr);
if (llGetSubString(hex, 0, 0) != "%")
{
// Regular character - we can't take advantage of llEscapeURL in this case,
// so we use llStringToBase64/llBase64ToInteger instead.
return llBase64ToInteger("AAAA" + llStringToBase64(chr));
}
integer b = (integer)("0x" + llGetSubString(hex, 1, 2));
if (b < 194 || b > 244)
return b;
if (b < 224)
return ((b & 0x1F) << 6) | (integer)("0x" + llGetSubString(hex, 4, 5)) & 0x3F;
integer cp;
if (b < 240)
{
cp = (b & 0x0F) << 12;
cp += ((integer)("0x" + llGetSubString(hex, 4, 5)) & 0x3F) << 6;
cp += (integer)("0x" + llGetSubString(hex, 7, 8)) & 0x3F;
return cp;
}
cp = (b & 0x07) << 18;
cp += ((integer)("0x" + llGetSubString(hex, 4, 5)) & 0x3F) << 12;
cp += ((integer)("0x" + llGetSubString(hex, 7, 8)) & 0x3F) << 6;
cp += (integer)("0x" + llGetSubString(hex, 10, 11)) & 0x3F;
return cp;
}
integer iValidRange1Start = 48;
integer iValidRange1End = 57;
integer iValidRange2Start = 97;
integer iValidRange2End = 102;
integer iValidLength = 6;
integer isValidColorstring(string sInput)
{ //Returns true if sInput is a valid color-string.
integer iCounter;
integer iOrd;
if (sInput != llToLower(sInput))
{ //Only lowercase-characters are allowed.
return FALSE;
}
if (llStringLength(sInput) != iValidLength)
{ //Invalid length.
return FALSE;
}
for (iCounter = 0; iCounter < iValidLength; iCounter++)
{
iOrd = Ord(llGetSubString(sInput, iCounter, iCounter));
if ((iOrd < iValidRange1Start || iOrd > iValidRange1End) && (iOrd < iValidRange2Start || iOrd > iValidRange2End))
{
return FALSE;
}
}
return TRUE;
}
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 sMessageTextbox = "Please enter the hex-code to re-color this prim-face, e.g. aaff00";
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);
llTextBox(llDetectedKey(0), sMessageTextbox, iChannel);
}
listen(integer channel, string name, key id, string message)
{
llSetTimerEvent(0);
llListenRemove(iListener);
//Delete timer and listener.
if (isValidColorstring(message))
{
llSetLinkColor(iTOUCHPRIM, vColorFromHex(message), iTOUCHFACE);
}
else
{ //Invalid color-code.
llOwnerSay(sMessageWrongColor);
}
}
timer()
{
llSetTimerEvent(0);
llListenRemove(iListener);
//Delete timer and listener.
}
}
Bearbeitet vom Benutzer Mittwoch, 1. April 2015 10:39:45(UTC)
| Grund: Nicht angegeben |
It is the mark of an educated mind to be able to entertain a thought without accepting it. |