User:Daemonika Nightfire/Scripts/Greeter&Co

From Second Life Wiki
< User:Daemonika Nightfire
Revision as of 08:19, 30 April 2014 by Daemonika Nightfire (talk | contribs) (Created page with "==*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 s…")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

*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>