Table of Contents

Gruppen-Invitor mit Sensor-Attachment

Einfach ein Prim erstellen und diese zwei Scripte reinlegen, danach noch ggf. die Range anpassen und BOT_KEY, BOT_GROUP und MASTER ändern. Größe des Prims ändern und an einen beliebigen attachemnt point des AV/Bot tragen.
Der Bot selbst und der Bot-Master können das Attachment über die chat commands steuern.

REZ es ↔ TRAG es

Zusätzliche Funktionen:
→ Besucher Liste
→ Sensor-System (einstellbare Reichweite/Abtastrate)
→ Spam Schutz (eine Einladung pro AV)
→ Automatische Listenbereinigung (einstellbar)
→ Fehlersuch-System

Skript 1

list visitor_list;

float range = 90.0; // in Meter (max. 96m)
float rate =  30.0; // in Sekunden

// Bot UUID (status 3 in der GUI für den Bot-Key)
key BOT_KEY=" >>> HERE <<< ";

// Die Gruppe in die der Bot einladen soll, 
// einfach den Bot in die Gruppe einladen und dann "mygroups" aufrufen
key BOT_GROUP=" >>> HERE <<< ";

// Master UUID (Bot Eigentümer)
key MASTER=" >>> HERE <<< ";

integer gListener1; // Bot
integer gListener2; // Master
integer isNameOnList( string name )
{
    integer len = llGetListLength( visitor_list );
    integer i;
    for( i = 0; i < len; i++ )
    {
        if( llList2String(visitor_list, i) == name )
        {
            if (len > 50)
            {
                visitor_list = [];
                llSay( 0, "List Cleard.");
            }
            return TRUE;
        }
    }
    if (len > 50)
    {
        visitor_list = [];
        llSay( 0, "List Cleard.");
    }
    return FALSE;
}
default
{
    state_entry()
    {
        llSay(0, "Visitor List Maker started...");
        llSay(0, "The owners can say 'help' for instructions."); 
        llSensorRepeat( "", "", AGENT, range, TWO_PI, rate );
        gListener1 = llListen(0, "", llGetOwner(), "");
        gListener2 = llListen(0, "", (string)MASTER, "");
        llMessageLinked(LINK_THIS, 0, (string)BOT_KEY +  "|Group UID: " + (string)BOT_GROUP, NULL_KEY);
    }
    sensor( integer number_detected )
    {
        integer i;
        integer len = llGetListLength( visitor_list );
        for( i = 0; i < number_detected; i++ )
        {
            if( llDetectedKey( i ) != llGetOwner() )
            {
                string detected_name = llDetectedName( i );
                if( isNameOnList( detected_name ) == FALSE )
                {
                    visitor_list += detected_name;
                    llMessageLinked(LINK_THIS, 0, (string)BOT_KEY +"|invite " + (string)llDetectedKey(i) + " " + (string)BOT_GROUP, NULL_KEY);
                    llSay( 0, "Invite was send." );
                    if (len > 50)
                    {
                        visitor_list = [];
                        llSay( 0, "List Cleared.");
                    }
                }
            }
        }    
    }
    listen( integer channel, string name, key id, string message )
    {
        if( message == "help" )
        {
            llSay( 0, "This object records the names of everyone who" );
            llSay( 0, "comes within "+ (string)range + " meters." );
            llSay( 0, "The list will be automatically cleared after 50 entries." );
            llSay( 0, "Commands the owners can say:" );
            llSay( 0, "'help'   - Shows these instructions." );
            llSay( 0, "'list'   - Says the names of all visitors on the list.");
            llSay( 0, "'reset'  - Removes all the names from the list." );
        }
        else
        if( message == "list" )
        {
            llSay( 0, "Visitor List:" );
            integer len = llGetListLength( visitor_list );
            integer i;
            for( i = 0; i < len; i++ )
            {
                llSay( 0, llList2String(visitor_list, i) );
            }
            llSay( 0, "Total = " + (string)len ); 
        }
        else
        if( message == "reset" )
        {
            llListenRemove(gListener1);
            llListenRemove(gListener2);
            visitor_list = llDeleteSubList(visitor_list, 0, llGetListLength(visitor_list));
            gListener1 = llListen(0, "", llGetOwner(), "");
            gListener2 = llListen(0, "", (string)MASTER, "");
            llSleep(1);
            llSay( 0, "Done resetting.");
        }
    }        
}

Skript 2

// InstantMessage per llLinkedMessage (API-Schnittstelle)
integer DEBUG = FALSE; // Debug AN|AUS (true|false)
integer isKey(key in) 
{
    if (in) return 2;
    return (in == NULL_KEY);
}
default
{
    link_message(integer sender_num, integer num, string str, key id)
    {
        if (num != 0) { return; }
        list PARS;
        PARS = llParseString2List(str, ["|"], []);
        if (isKey(llList2Key(PARS,0)))
        {
            llInstantMessage(llList2Key(PARS,0), llList2String(PARS, 1));
        }
        if ( DEBUG )
        {
            llSay(DEBUG_CHANNEL, "debug => " + llList2String(PARS, 0) + " => " + llList2String(PARS, 1));
            llWhisper( 0, "debug => " + llList2String(PARS, 0) + " => " + llList2String(PARS, 1));
        }
    }
}