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>
*DS* Group Joiner
Dieses Script ist eigentlich nichts besonderes, aber ich ziehe es jedem Bot vor. <lsl> /*
Dieses Script erzeugt einen Link zum oeffnen des Gruppenfensters wo sich der [Join] Button befindet. Voraussetzung zum joinen einer Gruppe ist die Gruppen-Einstellung 'Eintreten offen'.
- /
string Text = "Feel free and join our support group:"; string Group = "6fcac03d-2c09-d5a7-e73f-ff73e15965d4";
default {
state_entry() { // Auf Hovertext habe ich hier verzichtet, Bilder sind viel schoener. } touch_start(integer num_detected) { key Avatar = llDetectedKey(0); llRegionSayTo(Avatar, 0, Text + " secondlife:///app/group/" + Group + "/about"); } on_rez(integer Dae) { llResetScript(); }
} </lsl>
*DS* Group Key
Bei folgendem Script handelt es sich um ein ueber 5 jahre altes Relikt. Ich habe es lediglich ausgegraben und auf den neusten Stand gebracht. <lsl> /*
Mit diesem kleinen Script kannst du den Key (UUID) jeder Gruppe heraus finden. Dazu musst du lediglich das Object mit diesem Script in der gewuenschten Gruppe rezzen.
- /
default {
state_entry() { llSetText("Touch to learn\nGroup Key", <1,1,1>, 1.0); } touch_start(integer num_detected) { key Avatar = llDetectedKey(0); list Details = llGetObjectDetails(llGetKey(), [OBJECT_GROUP]); key Group_Key = llList2Key(Details, 0); if(Group_Key != NULL_KEY) { llRegionSayTo(Avatar, 0, "The Group Key is: " + (string)Group_Key); } else if(Group_Key == NULL_KEY) { llRegionSayTo(Avatar, 0, "Please set the Group for this object in EDIT under the GENERAL tab first."); } } on_rez(integer Dae) { llResetScript(); }
} </lsl>
*DS* LM Pin (Landmark Giver)
Dieses Script verwende ich in all meinen Shops und bin dadurch immer auf dem laufenden, welche Region neustartet und wie frequentiert der Shop ist. Fuer viele ist eine LOW TRAFFIK Location uninteressant, ich sehe das aber anders. Sehr oft beobachte ich, dass die Leute sich in den Satelite-Shops lediglich eine Landmark nehmen und dann im Mainstore erscheinen. <lsl> key owner;
// ### setz hier TRUE oder FALSE fuer ja oder nein ### integer MESSAGE = TRUE; // Besitzer-Mitteilung
// ### setz hier TRUE oder FALSE fuer ja oder nein ### integer THANKS = TRUE; string thx_msg = "Thank you for visit *DaeSigns*."; // Besucher-Mitteilung
// ### setz hier TRUE oder FALSE fuer ja oder nein ### integer TEXT = TRUE; string text = "*DaeSigns*\nMainstore"; // Hovertext vector color = <0.8,0.6,0.2>; // Hovertext-Farbe float alpha = 1.0; // Hovertext-Tranzparenz
///////////////////// SLurl ///////////////////// vector pos; string region; list parcel;
string SLurl(string region_name, vector pos) {
return "secondlife:///app/teleport/" + llEscapeURL(region_name) + "/" + (string)(llRound(pos.x)) + "/" + (string)(llRound(pos.y)) + "/" + (string)(llCeil(pos.z));
}
// ########## NOTHING TO DO UNDER THIS LINE ########## default {
state_entry() { llSetMemoryLimit(20000); owner = llGetOwner(); pos = llGetPos(); region = llGetRegionName(); parcel = llGetParcelDetails(pos, [PARCEL_DETAILS_NAME]); llSetText("",ZERO_VECTOR,0); if(TEXT) { llSetText(text, color, alpha); } llOwnerSay(llGetScriptName() + " memory: loaded [ " + (string)llGetUsedMemory() + " | " + (string)llGetMemoryLimit() + " ] limit"); } touch_start(integer total_number) { key Avi = llDetectedKey(0); if(llGetInventoryNumber(INVENTORY_LANDMARK) > 0) { llGiveInventory(Avi,llGetInventoryName(INVENTORY_LANDMARK, 0)); if(THANKS) { llSay(0, thx_msg); } if(MESSAGE) { llInstantMessage(owner, "/me on parcel '" + llList2String(parcel ,0) + "' noticed, that the visitor " + llGetUsername(Avi) + " has taken a landmark. " + SLurl(region,pos)); } } } changed(integer change) { if(change & CHANGED_REGION_START) { if(MESSAGE) { llInstantMessage(owner, "/me on parcel '" + llList2String(parcel ,0) + "' noticed, that the region '" + region + "' has been restarted. " + SLurl(region,pos)); } } if(change & CHANGED_INVENTORY) { llResetScript(); } } on_rez(integer Dae) { llResetScript(); }
} </lsl>