User:Daemonika Nightfire/Scripts/Greeter&Co
*DS* Greeter (volume_detect) v1.0.05
Dieses einfache script ist dafuer gedacht in einem unsichtbaren Object im Eingang oder Teleport Punkt eines Shops zu liegen. Das Object sollte natuerlich gross genug sein, um sicher zu gehen das Besucher auch wirklich durch gehen. Es begruesst jeden Besucher nur 1x am Tag und gibt dir am Ende eines Tages eine Zusammenfassung per InstantMessage. <lsl> /*
*DS* Greeter (volume-detect) ist ein ganz einfacher Besucherzaehler mit Begruessungs-Funktion. Damit der Greeter nicht nervt, speichert der jeden neuen AvatarKey in eine Liste um sie am selben Tag nicht erneut zu begruessen. Der Greeter zaehlt dabei jeden Avatar und gibt die Anzahl am naechsten Morgen per Instant Message zurueck. (Wenn du Email-Weiterleitung aktiviert hast, bekommst du die Instant Message an deine Email-Adresse geschickt.) Zudem verfuegt der Greeter ueber eine Speicherkontrolle, um eine Speicher-Ueberladung (Stack Heap Collision) zu vermeiden. Das Script ist ausschliesslich darauf ausgelegt die Anzahl Besucher zu zaehlen und speichert die Keys ledglich temporaer. Die Keys werden nicht weiter verarbeitet, entschluesselt oder wiedergegeben.
- /
key owner; // Speicher fuer den OwnerKey string date; // Speicher fuer das Datum vector pos; // Speicher fuer die Object-Position string region; // Speicher fuer den Region-Namen list parcel; // Speicher fuer den Parzellen-Namen
list visitor_list = []; // Speicher fuer die Besucher-Liste (AvatarKeys) integer length = 0; // Speicher fuer die aktuelle Listen-Laenge integer backup = 0; // Speicher fuer das backup
default {
state_entry() { owner = llGetOwner(); // speichert den aktuellen OwnerKey date = llGetDate(); // speichert das aktuelle Datum pos = llGetPos(); // speichert die Position region = llGetRegionName(); // speichert den Region-Namen parcel = llGetParcelDetails(pos, [PARCEL_DETAILS_NAME]); // speichert den Parzellen-Namen llVolumeDetect(TRUE); // damit erkennt das Object collision wenn es phantom ist llSetTimerEvent(300); // 5 minuten reicht voellig, schneller waere hirnrissig } collision_start(integer num_detected) { key Avatar = llDetectedKey(0); // lokale variable fuer den aktuellen AvatarKey if(Avatar != owner) // wird ausgefuehrt, wenn fremde Avatare collidieren { if(llGetDisplayName(Avatar)) // damit geht der greeter nicht bei physischen prims los { if(!~llListFindList(visitor_list, [Avatar])) // prueft ob der aktuelle AvatarKey schon bekannt ist { visitor_list += Avatar; // fuegt den unbekannten Avatarkey in der Liste hinzu length = llGetListLength(visitor_list); // zaehlt die anzahl der Eintraege in der Liste // ↓↓↓↓↓↓↓↓↓ Bereich fuer individuelle Meldungen, Sounds, Particle usw. ↓↓↓↓↓↓↓↓↓ \\ llPlaySound("bc8c684d-d3a8-448b-91ae-0286255e6cea", 1.0); // Boing llRegionSayTo(Avatar, 0, "Hello " + llGetDisplayName(Avatar) + ", welcome to " + llList2String(parcel,0)); // ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ \\ if(llGetFreeMemory() < 10000) // prueft nach jedem AvatarKey ob noch genuegend Memory frei ist { llInstantMessage(owner, "/me Low Memory: cleaning List\nVisitors today: " + (string)length); backup += length; // speichert die aktuelle Anzahl ins backup length = 0; // setzt den counter auf null visitor_list = []; // leert die aktuelle Besucher-Liste } } } } else if(Avatar == owner) // wird nur ausgefuehrt, wenn der Owner collidiert { llRegionSayTo(owner, 0, "Welcome back " + llGetDisplayName(owner) + ", you had " + (string)length + " Visitors today."); } } timer() { if(llGetDate() != date) // vergleicht das gespeicherte Datum mit dem aktuellen { length += backup; // zaehlt die aktuelle liste mit dem aktuellen backup zusammen llInstantMessage(owner, "Visitors yesterday: " + (string)length + "\nsecondlife:///app/teleport/" + llEscapeURL(region) + "/" + (string)(llRound(pos.x)) + "/" + (string)(llRound(pos.y)) + "/" + (string)(llCeil(pos.z))); length = 0; // setzt den counter auf null backup = 0; // setzt das backup auf null visitor_list = []; // leert die aktuelle Besucher-Liste date = llGetDate(); // aktuallisiert das Datum } } on_rez(integer Dae) { llResetScript(); // resettet das Script beim rezzen }
} </lsl>