User:Daemonika Nightfire/Scripts/Privat Sky

From Second Life Wiki
Jump to: navigation, search

*DS* Privat-Sky (Gruppen-Land) v3.0.08

Das Script verwendet llTeleportAgentHome(id) und llEjectFromLand(id), beachte die Ownership Limitations beider Befehle.

/*
    *DS* Privat-Sky (Gruppen-Land)
    Dieses Security Script sperrt Parzellen-/Region-weit den kompletten Sky ab der gewuenschten hoehe.
    Der Sinn besteht darin, unerwuenschte Besucher von Bauplattformen fern zu halten, die sich oft ueber einem Mainstore befinden.
    Mit der aktuellen Konfiguration ist es fuer Gruppenland bestimmt und muss deshalb an die gruppe uebertragen (deeden) werden.
 
    Zusaetzlich empfiehlt es sich, das script fullperm zu lassen und mit der Gruppe zu teilen,
    um auch nach dem deeden Keys hinzufuegen oder entfernen zu koennen.
*/
 
// Die beiden folgenden Listen koennen beliebig verlaengert werden.
// In diese Liste trage die Avatar-Keys (UUID) ein, die den Orb ein/aus schalten koennen.
list Manager = [
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",  // Platzhalter
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",  // Platzhalter
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",  // Platzhalter
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"]; // Platzhalter
 
// Die Manager muessen hier nicht erneut angegeben werden.
// In diese Liste trage alle ein die sich im Sky auch ohne Gruppe aufhalten duerfen.
list Access = [
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",  // Platzhalter
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",  // Platzhalter
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",  // Platzhalter
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",  // Platzhalter
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",  // Platzhalter
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",  // Platzhalter
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",  // Platzhalter
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",  // Platzhalter
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",  // Platzhalter
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"]; // Platzhalter
 
// Entscheide hier ob der Sky einer ganzen Region oder einer einzelnen Parzelle gesperrt sein soll.
//integer scope = AGENT_LIST_REGION; // (< -- dieses nur wenn die ganze Region eine Parzelle ist)
integer scope = AGENT_LIST_PARCEL;
 
float high = 3000.0;    // hoehe in meter
float time = 10.0;      // intervall in sekunden
 
 
//////////////////// Ab hier muss nichts geaendert werden. \\\\\\\\\\\\\\\\\\\\
integer status = FALSE;
list status_message = ["Offline","Online",<1,0,0>,<0,1,0>];
list Blacklist = [];
 
// Alle eingetragenen Manager werden hier ueber jeden Eject/Bann informiert.
Manager_Notification(string force, string name, string position)
{
    integer Manager_length = llGetListLength(Manager);
    integer i;
    for(i=0; i < Manager_length; i++)
    {
        key executive = llList2Key(Manager, i);
        llInstantMessage(executive, force + " " + name + " @ " + position);
    }
}
 
default
{
    state_entry()
    {
        Access = llListInsertList(Access, Manager, 0);
        //llSay(0,"Manager = " + llDumpList2String(Manager, ","));
        //llSay(0,"Access = " + llDumpList2String(Access, ","));
        llSetText("Security-Status: " + llList2String(status_message, status), llList2Vector(status_message, status+2), 1.0);
    }
 
    touch_start(integer num_detected)
    {
        key Agent = llDetectedKey(0);
 
        // ↓ Ausschliesslich Manager koennen das Script ein/aus schalten.
        if(~llListFindList(Manager, llCSV2List(Agent)))
        {
            if(!status)
            {
                status = TRUE;
                llSetTimerEvent(time);
            }
            else if(status)
            {
                status = FALSE;
                llSetTimerEvent(0);
            }
            llSetText("Security-Status: " + llList2String(status_message, status), llList2Vector(status_message, status+2), 1.0);
            llRegionSayTo(Agent, 0, "Security-Status: " + llList2String(status_message, status));
        }
    }
 
    timer()
    {
        if(status)
        {
            list Agents = llGetAgentList(scope, []);
            integer Length = llGetListLength(Agents);
 
            integer index;
            for(index=0; index < Length; index++)
            {
                key id = llList2Key(Agents, index);
                list details = llGetObjectDetails(id, [OBJECT_POS]);
                vector pos = llList2Vector(details,0);
 
                // ↓ Wird nur ausgefuehert, wenn die Positions-hoehe des Avatars das Limit uebersteigt.
                if(pos.z > high)
                {
                    if(!llSameGroup(id))
                    {
                        if(!~llListFindList(Access, llCSV2List(id)))
                        {
                            string Name = llKey2Name(id);
 
                            // ↓ Wer noch nicht auf der Blacklist steht, wird lediglich vom Land gekickt und in die Blacklist eingetragen.
                            if(!~llListFindList(Blacklist, llCSV2List(id)))
                            {
                                llEjectFromLand(id);
                                Blacklist += llCSV2List(id); // fuegt den aktuellen Key zur Blacklist hinzu.
 
                                Manager_Notification("ejected", Name, (string)llRound(pos.z));
                            }
 
                            // ↓ Wer bereits in der Blacklist vorhanden ist, wird sofort nach Hause teleportiert und fuer 1 stunde gebannt.
                            else if(~llListFindList(Blacklist, llCSV2List(id)))
                            {
                                llTeleportAgentHome(id);
                                llAddToLandBanList(id, 1.0); // temporaerer bann, 1.0 = 1 Stunde | 0.0 = permanent
 
                                integer i = llListFindList(Blacklist, llCSV2List(id));
                                llDeleteSubList(Blacklist, i, i); // entfernt den aktuellen Key von der Blacklist
 
                                Manager_Notification("banned", Name, (string)llRound(pos.z));
                            }
 
                            // ↓ Mitteilung an den Avatar welcher gekickt wurde.
                            llInstantMessage(id, "Sorry, the Sky above " + (string)llRound(high) +
                            " meters is not public.\nYou have been ejected because you don't wear the correct group, or you're not on the access list.");
 
                            // ↓ prueft nach jedem AvatarKey ob noch genuegend Memory frei ist.
                            if(llGetFreeMemory() < 10000)
                            {
                                Blacklist = [];  // leert die aktuelle Blacklist
                            }
                        }
                    }
                    else if(llSameGroup(id))
                    {
                        // ↓ Hier werden Gruppenmitglieder von der Blacklist entfernt, wenn sie mit aktiver Gruppe zurueck kehren.
                        if(~llListFindList(Blacklist, llCSV2List(id)))
                        {
                            integer i = llListFindList(Blacklist, llCSV2List(id));
                            llDeleteSubList(Blacklist, i, i); // entfernt den aktuellen Key von der Blacklist
                        }
                    }
                }
            }
        }
    }
 
    on_rez(integer Dae)
    {
        llResetScript();
    }
}