detailed explanation continues to following comment.
CODE
float ProjectorX = 5;
float ProjectorY = 5;
float ProjectorH = 5;
key DefaultTexture = "5748decc-f629-461c-9a36-a35a221fe21f";
string Name = "";
key AvatarKey = NULL_KEY;
key TextureKey = NULL_KEY;
list DialogText = ["Black", "White","Yellow","OFF"];
list DialogTexture = ["Lesser X","Lesser Y","Bottom","Greater X","Greater Y","Top","All Side","Off"];
list DialogParticle = ["Enable","Disable"];
list DialogRange = ["8m","16m","24m","32m","40m","48m","56m","64m","72m","80m","78m","96m"];
list DialogRefresh = ["10sec","20sec","30sec","1min","2min","3min","5min","10min","15min","Non"];
integer _DialogText = 3;
integer _DialogTexture = 6;
integer _DialogParticle = 1;
integer _DialogRange = 3;
integer _DialogRefresh = 2;
integer Listen = 0;
integer Channel = 0;
list TextureSide = [4,1,5,2,3,0,-1,-128];
list RefreshTime = [10,20,30,60,120,180,300,600,900,0];
list SensorRange = [8,16,24,32,40,48,56,64,72,80,78,96];
list ListOption = ["Text","Texture","Particle","Range","Refresh","Reset"];
Key2Texture(key i)
{
AvatarKey = i;
Name = llKey2Name(i);
llHTTPRequest("http://world.secondlife.com/resident/" + (string)AvatarKey,[HTTP_METHOD,"GET"],"");
}
UpdeteTexture(key i)
{
TextureKey = i;
SetText(_DialogText);
SetTexture(_DialogTexture);
SetParticle(_DialogParticle);
}
string ExtractString(string data, string begin, string end)
{
integer IndexB = llSubStringIndex(data,begin);
integer IndexE = llSubStringIndex(data,end);
if(IndexB != -1 && IndexE != -1)
return llGetSubString(data,IndexB + llStringLength(begin),IndexE - 1);
return "";
}
key ExtractKey(string data)
{
string Data = ExtractString(data,"<img alt=\"profile image\" src=\"http://secondlife.com/app/image/","\" class=\"parcelimg\" />");
Data = llGetSubString(Data,0,llStringLength(Data) - 3);
key Key = NULL_KEY;
if(llStringLength(Data) == 36)
Key = (string)Data;
return Key;
}
SetText(integer index)
{
_DialogText = index;
llSetText(Name,llList2Vector([<0,0,0>,<1,1,1>,<1,1,0>,<0,0,0>],_DialogText),llList2Float([1,1,1,0],_DialogText));
}
SetTexture(integer index)
{
if(index == 7 && _DialogTexture != 7)
llSetTexture(DefaultTexture,ALL_SIDES);
else if(index != 7)
llSetTexture(llList2Key([TextureKey,DefaultTexture],(TextureKey == NULL_KEY)),llList2Integer(TextureSide,index));
_DialogTexture = index;
}
SetParticle(integer index)
{
_DialogParticle = index;
if(_DialogParticle == 0)
{
llParticleSystem([
PSYS_PART_FLAGS,0,PSYS_SRC_PATTERN,4,
PSYS_PART_START_ALPHA,1.0,PSYS_PART_END_ALPHA,1.0,
PSYS_PART_START_COLOR,<1,1,1>,PSYS_PART_END_COLOR,<1,1,1>,
PSYS_PART_START_SCALE,<ProjectorX,ProjectorY,0>,
PSYS_PART_END_SCALE,<ProjectorX,ProjectorY,0>,
PSYS_PART_MAX_AGE,llList2Float(RefreshTime,_DialogRefresh),
PSYS_SRC_MAX_AGE,0.0,
PSYS_SRC_ACCEL,<0,0,0>,
PSYS_SRC_ANGLE_BEGIN,0.0,PSYS_SRC_ANGLE_END,0.0,
PSYS_SRC_BURST_PART_COUNT,1,
PSYS_SRC_BURST_RADIUS,ProjectorH,
PSYS_SRC_BURST_RATE,llList2Float(RefreshTime,_DialogRefresh) - 0.5,
PSYS_SRC_BURST_SPEED_MIN,0.0,PSYS_SRC_BURST_SPEED_MAX,0.0,
PSYS_SRC_OMEGA,<0,0,0>,
PSYS_SRC_TEXTURE,llList2Key([TextureKey,DefaultTexture],(TextureKey == NULL_KEY))]);
}
else if(_DialogParticle == 1)
llParticleSystem([]);
}
SetRange(integer index)
{
_DialogRange = index;
}
SetRefresh(integer index)
{
_DialogRefresh = index;
llSetTimerEvent(llList2Float(RefreshTime,_DialogRefresh));
if(index != 9)
llSensor("","",AGENT,llList2Float(SensorRange,_DialogRange),PI);
else
{
Name = "";
SetText(_DialogText);
llSetTexture(DefaultTexture,llList2Integer(TextureSide,_DialogTexture));
}
}
Dialog(key i)
{
string Data = "\n";
Data += "hover text: " + llList2String(DialogText,_DialogText) + "\n";
Data += "use texture: " + llList2String(DialogTexture,_DialogTexture) + "\n";
Data += "use particle: " + llList2String(DialogParticle,_DialogParticle) + "\n";
Data += "sensor range: " + llList2String(DialogRange,_DialogRange) + "\n";
Data += "refresh time: " + llList2String(DialogRefresh,_DialogRefresh) + "\n";
llListenRemove(Listen);
Listen = llListen(Channel,"",i,"");
llDialog(i,Data,ListOption,Channel);
}
SetChannel()
{
Channel = (integer)llFrand(123456789);
if(Channel < 10000) Channel += 10000;
}
Reset()
{
SetText(_DialogText);
SetTexture(_DialogTexture);
SetRange(_DialogRange);
SetRefresh(_DialogRefresh);
llParticleSystem([]);
SetChannel();
}
default
{
on_rez(integer i)
{
SetChannel();
}
state_entry()
{
Reset();
}
touch_start(integer i)
{
key Key = llDetectedKey(0);
if(Key == llGetOwner())
Dialog(Key);
}
timer()
{
llSensor("","",AGENT,llList2Float(SensorRange,_DialogRange),PI);
}
sensor(integer num)
{
Key2Texture(llDetectedKey((integer)llFrand((float)num)));
}
no_sensor()
{
AvatarKey = NULL_KEY;
Name = "";
UpdeteTexture(NULL_KEY);
}
http_response(key id, integer status, list metadata, string body)
{
UpdeteTexture(ExtractKey(body));
}
listen(integer ch, string name, key id, string message)
{
if(ch == Channel)
{
if(message == "Reset")
llResetScript();
else if(message == "Text")
llDialog(llGetOwner(),"select color of Hover Text.",DialogText,Channel);
else if(message == "Texture")
llDialog(llGetOwner(),"select side where texture is paste.",DialogTexture,Channel);
else if(message == "Particle")
llDialog(llGetOwner(),"select use particle (projector)",DialogParticle,Channel);
else if(message == "Range")
llDialog(llGetOwner(),"select range of sensor.",DialogRange,Channel);
else if(message == "Refresh")
llDialog(llGetOwner(),"select update time.",DialogRefresh,Channel);
else if(llListFindList(DialogText,[message]) != -1)
SetText(llListFindList(DialogText,[message]));
else if(llListFindList(DialogTexture,[message]) != -1)
SetTexture(llListFindList(DialogTexture,[message]));
else if(llListFindList(DialogParticle,[message]) != -1)
SetParticle(llListFindList(DialogParticle,[message]));
else if(llListFindList(DialogRange,[message]) != -1)
SetRange(llListFindList(DialogRange,[message]));
else if(llListFindList(DialogRefresh,[message]) != -1)
SetRefresh(llListFindList(DialogRefresh,[message]));
if(llListFindList(["Text","Texture","Particle","Range","Refresh"],[message]) == -1)
llListenRemove(Listen);
}
}
}

