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
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.");
}
}
}
// 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));
}
}
}