Language Scanner

Category:LSL_Library
User:Luxen_Resident | Teleporter_Anywhere | Ultimate_Radar | Language_Scanner | Visitor_Counter_Tracker
==Summary==
Advanced language scanner to detect users language, distance and names on a Sim.
You can easily filter by language with the menu. Useful to find who speak your language.
==History==
This version is optimized for the Language search.
* When a radar displays the nearest avatars, a language scanner need often to scan all the users so the script need to be a bit different than a radar...
== Code: ==
//////////////////////////////////////////////////////////////////////////////
// Zx Language Scanner v5 //
// //
// By Luxen - Zonyx Technology //
//////////////////////////////////////////////////////////////////////////////
integer counter = 0;
key owner = NULL_KEY;
list LangAffich = ["Default", "English", "Danish", "German", "Spanish", "French", "Italian", "Hungarian", "Dutch", "Polish", "Portuguese", "Russian"];
integer ZxMenu = 0;
integer Zchan = -4552155;
integer listenHandle;
string Av_Lang = "Default";
string SLang = "en";
set_time(float Stime, string Stext, integer Scounter)
{
 llSetText(Stext, <0.667, 0.667, 0.667>, 1.0);
 if (Stime != 5.0) llSetTimerEvent(Stime);
 counter = Scounter;
}
default
{
 state_entry()
 {
 if(owner) ;
 else
 {
 owner = llGetOwner();
 set_time(10.0, "[- Starting -]", 0);
 Zchan = 0x80000000 | (integer)("0x"+(string)llGetKey());
 }
 ZxMenu = 0;
 }
 
 on_rez(integer start_param)
 {
 llResetScript();
 }
 changed(integer change)
 {
 if(change & (CHANGED_REGION)) state teleport;
 }
 
 touch_start(integer total_number)
 { 
 if (llGetAttached())
 {
 if (counter) 
 {
 if (!ZxMenu)
 {
 key Touch = llDetectedKey(0);
 if (Touch == owner)
 {
 llListenRemove(listenHandle);
 ZxMenu = 1;
 counter = 0;
 listenHandle = llListen(Zchan, "", owner, "");
 llDialog(owner, "by Luxen, Zonyx technology - Used Memory: " + llGetSubString((string)llGetUsedMemory(), 0, 1) + "k"
 + "\n "
 + "\n - Language: " + Av_Lang
 + "\n (to reopen the menu: to wait some seconds)", LangAffich, Zchan);
 }
 }
 }
 }
 }
 listen(integer channel, string name, key id, string msg)
 {
 if (ZxMenu)
 {
 if (llGetAttached())
 {
 if (channel == Zchan && id == owner)
 {
 integer CheckTab = llListFindList(LangAffich, [msg]);
 if (~CheckTab)
 {
 llListenRemove(listenHandle);
 ZxMenu = 0;
 Av_Lang = llList2String(LangAffich, CheckTab);
 SLang = llList2String(["en", "en", "da", "de", "es", "fr", "it", "hu", "nl", "pl", "pt", "ru"], CheckTab);
 }
 }
 }
 }
 }
 
 timer()
 {
 if (ZxMenu)
 {
 if (ZxMenu > 3)
 {
 llListenRemove(listenHandle);
 ZxMenu = 0;
 llOwnerSay("Resetting listen...\nMenu Off");
 }
 else ++ZxMenu;
 }
 
 list AvatarsDetect = llGetAgentList(AGENT_LIST_REGION, []);
 integer numOfAvatars = llGetListLength(AvatarsDetect);
 if (!llGetAttached())
 {
 if (llGetObjectPrimCount(llGetKey()))
 {
 set_time(0.0, "[- Off -]", 0);
 }
 }
 else if (numOfAvatars < 2)
 {
 if (counter != 2) set_time(5.0, "[- Nobody -]", 2);
 }
 else if (numOfAvatars > 100) return;
 else 
 {
 integer index;
 list NewTab = [];
 vector currentPos = llGetPos();
 integer Zfix = numOfAvatars;
 for (index = 0; index < Zfix; ++index)
 {
 key AvKey = llList2Key(AvatarsDetect, index);
 list AvPos = llGetObjectDetails(AvKey, [OBJECT_POS]);
 if (AvPos) NewTab += [llVecDist(currentPos, llList2Vector(AvPos, 0)), AvKey];
 else --numOfAvatars;
 }
 
 if (numOfAvatars > 1) 
 {
 AvatarsDetect = [];
 NewTab = llListSort(NewTab, 2, TRUE);
 string mode = "[- " + Av_Lang + " -]";
 numOfAvatars *= 2;
 if (llGetAgentLanguage(owner) != SLang) Zfix = FALSE;
 integer Av_Count = 0;
 for(index = 0; index < numOfAvatars; index += 2)
 {
 key id = llList2Key(NewTab, index + 1);
 string DLang = (string)llGetAgentLanguage(id);
 if (DLang == "en-us") DLang = "en";
 if (DLang == SLang) 
 {
 if (Zfix)
 {
 if (id == owner)
 {
 Zfix = FALSE;
 jump Ignore;
 }
 }
 string DName = llGetUsername(id);
 if (DName) DName += " (" + DLang + "-" + (string)llList2Integer(NewTab, index) + "m)";
 else DName = "???";
 if (Av_Count > 9)
 {
 DName = mode + "\n" + DName;
 if (llStringLength(DName) > 254) jump affich;
 else mode = DName;
 }
 else mode += "\n" + DName;
 ++Av_Count;
 }
 @Ignore;
 
 }
 @affich;
 NewTab = [];
 if (!Av_Count) mode = "[- " + Av_Lang + ": 0 -]";
 set_time(5.0, mode, 1);
 }
 }
 }
}
state teleport
{
 state_entry()
 {
 if (counter) set_time(10.0, "[- Searching -]", 0);
 state default;
 }
 
 on_rez(integer start_param)
 {
 llResetScript();
 }
 timer()
 {
 return;
 }
}