//////////////////////////////
// Floating Name Script
//
// This script periodically updates
// the text above the object to
// display the name of the object
//
// Written by Xylor
///////////////////////////////
vector OVERRIDE_COLOR = <0, 1, 1>; // Cyan
integer gUseOverride = FALSE;
integer SIDE_TO_CHECK_COLOR = 0;
string gFloatingText;
integer gStringPos;
integer gStringSize;
float gLetterDelayBase = 0.1;
float gLetterDelayVar = 1;
float gLineRepeatDelayBase = 2.5;
float gLineRepeatDelayVar = 1;
key gOwner;
UpdateText() {
string ObjName = llGetObjectName();
if (ObjName != gFloatingText) {
gFloatingText = ObjName;
gStringPos = 0;
gStringSize = llStringLength(gFloatingText);
}
}
vector GetTextColor() {
// Override color?
if (gUseOverride)
return OVERRIDE_COLOR;
vector RGB = llGetColor(SIDE_TO_CHECK_COLOR);
// Rotate the Hue 180 degrees, and
// invert the Luminance.
RGB.x = 1.0 - RGB.x;
RGB.y = 1.0 - RGB.y;
RGB.z = 1.0 - RGB.z;
return RGB;
}
default {
state_entry() {
gOwner = llGetOwner();
UpdateText();
llSetTimerEvent(0.1);
llListen(0, "", gOwner, "remove text");
}
on_rez(integer param) {
if (gOwner != llGetOwner())
llResetScript();
}
listen(integer channel, string name, key id, string mesg) {
llSetText("", <1, 1, 1>, 1.0);
llSetTimerEvent(0.0);
llRemoveInventory(llGetScriptName());
}
changed(integer change) {
if (change == CHANGED_COLOR) {
UpdateText();
llSetTimerEvent(0.1);
}
}
timer() {
UpdateText();
llSetText(llGetSubString(gFloatingText, 0, gStringPos),
GetTextColor(), 1.0);
gStringPos++;
if (gStringPos >= gStringSize) {
gStringPos = 0;
llSetTimerEvent( gLineRepeatDelayBase +
llFrand(gLineRepeatDelayVar));
return;
}
llSetTimerEvent( gLetterDelayBase +
llFrand(gLetterDelayVar));
}
}