Kleine LSL-Scripte für eigene Projekte

Scripting Library
Scripting Library
 Member edited April 1 in Create & Objects
Huhus liebe Metros,

in diesem Thread möchte ich gelegentlich ein paar Scripte vorstellen, die man vielleicht für eigene Projekte gut brauchen kann. Die Scripte beleuchten jeweils einen bestimmten Aspekt und sind für sich genommen vielleicht nicht besonders toll, aber das spannende wird sein, was ihr daraus macht ;-)

Die Scripte stehen unter der CC-BY-Lizenz https://creativecommons.org/licenses/by/2.0/de/.

Viel Spass beim Scripten ;)

Scripting Library

Comments

  • Scripting Library
    Scripting Library
     Member edited 10:12PM
    Huhus,

    und hier gleich das erste Beispiel. Benötigt wurde eine Kommunikation zwischen zwei Prims, die sich auf einer Region befinden und die nicht miteinander verlinkt sind.

    Dafür stehen dem Sender vier mögliche Funktionen zur Verfügung, die unterschiedliche Reichweiten abdecken:
    - llWhisper() bis 10m Abstand
    - llSay() bis 20m Abstand
    - llShout() bis 100m Abstand
    - llRegionSay() innerhalb derselben Region auch bei Var-Regionen

    Sender:
    Das folgende Script in einen Prim werfen. Ein Mausklick auf den Prim schaltet den Sender ein bzw. aus. Im Beispiel versendet der Prim alle 10 Sekunden eine Nachricht über den Kanal -4711
    // Sender llSay
    // Kommunikation zweier Prims, die nicht mit einander verbunden (gelinkt) sind. Geht natürlich auch mit gelinkten Prims
    //      aber da wäre eine andere Technik Lag-ärmer...
    // llSay sendet die Nachricht via Chat, aber über einen eigenen Kanal, so dass der OpenChat nicht zugespammt wird.
    // Es gibt folgende Alternativen:
    //      llWhisper()     Reichweite: <10m
    //      llSay()         Reichweite: <20m
    //      llShout()       Reichweite: <100m
    //      llRegionSay()   Reichweite: die gesamte Region auch bei Var-Regionen (getestet bis 3x3)
    // Aktivieren/Deaktivieren mit einem Klick auf den Prim
    // Demo-Programm by Scripting Library, Metropolis Grid
    
    integer KanalNr = 0;
    float SendeIntervall = 10.0;
    string Nachricht = "Hier ist der Sender";
    integer sendet = FALSE;
    
    default
    {
        state_entry()
        {
            // Für das Testprogramm wird ein fester Kanal verwendet. Im Dauerbetrieb sollte man das vielleicht anders regeln.
            KanalNr = -4711;
            llOwnerSay( "Dieses Skript verwendet den Sendekanal " + (string) KanalNr );
            llOwnerSay("Aktiviere bzw. deaktiviere den Sender durch einen Klick auf den Prim.");
            sendet = FALSE;
            llSetTimerEvent( 0.0 );
        }
        
        touch_start(integer T)
        {
            if( T == llGetOwner() )
            {
                if( sendet )
                {
                    llOwnerSay( "Beende das Senden der Nachricht." );
                    llSetTimerEvent( 0.0 );
                    llSetPrimitiveParams( [PRIM_FULLBRIGHT, ALL_SIDES, FALSE] );
                    sendet = FALSE;
                } else
                {
                    llOwnerSay( "Starte das Senden der Nachricht" );
                    llSetTimerEvent( SendeIntervall );
                    llSetPrimitiveParams( [PRIM_FULLBRIGHT, ALL_SIDES, TRUE] );
                    sendet = TRUE;
                }
            } else
            {
                llSay( 0, "Pfoten weg!" );
            }
        }
        
        timer()
        {
    // Hier wird die Nachricht versendet und die Reichweite festgelegt gemäß obiger Beschreibung
            llRegionSay( KanalNr, Nachricht );
            llOwnerSay( "Nachricht gesendet" );
        }
    }
    

    Empfänger:
    Das folgende Script in einen Prim werfen. Jede Nachricht, die über den Kanal -4711 eintrifft wird an den Prim-Eigentümer weitergeleitet.
    // Empfaenger llSay
    // Dieses Skript empfängt Nachrichten, die auf einem Kanal gesendet werden (im Bsp.: -4711) und gibt sie geflüstert im OpenChat wieder.
    // Aktivieren/Deaktivieren mit einem Klick auf den Prim
    // Demo-Programm by Scripting Library, Metropolis Grid
    
    integer KanalNr = -4711;
    integer aktiv = FALSE;
    integer ListenerHandle;
    
    default
    {
        state_entry()
        {
            llOwnerSay("Dieses Script protokolliert alle Mitteilungen, die auf Kanal -4711 empfangen werden.");
            llOwnerSay("Aktiviere bzw. deaktiviere den Empfänger durch einen Klick auf den Prim.");
            aktiv = FALSE;
        }
        
        touch_start(integer T)
        {
            if( T == llGetOwner() )
            {
                if( aktiv )
                {
                    llOwnerSay( "Beende das Empfangen der Nachrichten." );
                    llListenRemove( ListenerHandle );
                    llSetPrimitiveParams( [PRIM_FULLBRIGHT, ALL_SIDES, FALSE] );
                    aktiv = FALSE;
                } else
                {
                    llOwnerSay( "Starte das Empfangen der Nachrichten." );
                    ListenerHandle = llListen( KanalNr, "", "", "");
                    llSetPrimitiveParams( [PRIM_FULLBRIGHT, ALL_SIDES, TRUE] );
                    aktiv = TRUE;
                }
            } else
            {
                llSay( 0, "Pfoten weg!" );
            }
        }
        
        listen( integer channel, string name, key id, string message )
        {
            llOwnerSay( message );
        }
    }
    

    Ich hoffe sehr, dass diese Scripte der Kommunikation förderlich sein mögen ;-) Verbesserungsvorschläge sind jederzeit willkommen.

    Ciaoo

    Scripting Library
  • Eryn Galen
    Eryn Galen
     Moderator CreativeGroup edited 10:12PM
    Eine prima Idee :)
    Darf ich einen Verbesserungsvorschlag machen? Ich würde noch einen Kommentar beim Kanal machen, denn der sollte für mehrere gescriptete Prims / Objekte auf einer Region, die nicht dasselbe ausführen sollen, nicht gleich sein. So könnte man mehrere Prims "vernetzen" oder eben verschiedene Kanäle für verschiedene Aktionen / verschiedene Prims / Objekte nutzen.
  • Scripting Library
    Scripting Library
     Member edited 10:12PM
    Huhu Eryn,

    ja, das sollte nochmal ein eigenes Script-Schnippselchen werden: wie generiere ich mir eine halbwegs sinnvolle Kanalnummer... Danke für den Hinweis :-)

    Ciaoo

    Scripting Library
  • Scripting Library
    Scripting Library
     Member edited 10:12PM
    Huhus,

    und gleich ein weiteres Beispiel...

    Gelegentlich benötigt man eine Kommunikation zwischen verschiedenen Teilen eines Link-Sets, also zwischen mehreren Scripten in unterschiedlichen Teilen eines Objekts. Hier helfen die Link-Messages die Kommunikation stiller abzuwickeln. Im Gegensatz zu llSay() & Co benötigen diese Link-Messages keinen Listener und sollen daher etwas weniger Lag verursachen. Der Geheimhaltung der Nachrichten hilft es wenig, da müsste man die Nachrichten schon verschlüsseln - aber das wäre ein anderes Projekt...

    Wir beginnen mit zwei Prims, die erstellt und verlinkt werden. Es ist sinnvoll, beiden Prims unterschiedliche Namen zu geben, um den Ablauf des Programms besser verfolgen zu können. In den einen Prim geben wir das Sender Script, das Empfänger Script kommt in den anderen Prim. Die Scripte sind so gemacht, dass man mit einem Klick auf den jeweiligen Prim die Funktion an- bzw. abschalten kann.

    Sender:
    // Sender llMessageLinked
    // Kommunikation zweier Prims, die mit einander verbunden (gelinkt) sind. Vorteil: weniger Lag als llSay &Co.
    // Aktivieren/Deaktivieren mit einem Klick auf den Prim
    // Demo-Programm by Scripting Library, Metropolis Grid
    
    string Nachricht = "Hier ist der Sender";
    integer sendet = FALSE;
    float SendeIntervall = 10.0;
    
    default
    {
        state_entry()
        {
            llOwnerSay( "Dieses Skript verwendet LinkMessages." );
            llOwnerSay("Aktiviere bzw. deaktiviere den Sender durch einen Klick auf den Prim.");
            sendet = FALSE;
            llSetTimerEvent( 0.0 );
        }
        
        touch_start(integer T)
        {
            if( T == llGetOwner() )
            {
                if( sendet )
                {
                    llOwnerSay( "Beende das Senden der Nachricht." );
                    llSetTimerEvent( 0.0 );
                    llSetPrimitiveParams( [PRIM_FULLBRIGHT, ALL_SIDES, FALSE] );
                    sendet = FALSE;
                } else
                {
                    llOwnerSay( "Starte das Senden der Nachricht" );
                    llSetTimerEvent( SendeIntervall );
                    llSetPrimitiveParams( [PRIM_FULLBRIGHT, ALL_SIDES, TRUE] );
                    sendet = TRUE;
                }
            } else
            {
                llSay( 0, "Pfoten weg!" );
            }
        }
        
        timer()
        {
            llMessageLinked( LINK_ALL_OTHERS, 0, Nachricht, "");
            llOwnerSay( "Nachricht gesendet" );
        }
    }
    

    und hier der Empfänger:
    // Empfaenger link_message
    // Dieses Skript empfängt Nachrichten, die als LinkMessage an diesen Prim gesendet werden und gibt sie geflüstert im OpenChat wieder.
    // Aktivieren/Deaktivieren mit einem Klick auf den Prim
    // Demo-Programm by Scripting Library, Metropolis Grid
    
    integer aktiv = FALSE;
    
    default
    {
        state_entry()
        {
            llOwnerSay("Dieses Script protokolliert alle Mitteilungen, die als LinkMessage empfangen werden.");
            llOwnerSay("Aktiviere bzw. deaktiviere den Empfänger durch einen Klick auf den Prim.");
            aktiv = FALSE;
        }
        
        touch_start(integer T)
        {
            if( T == llGetOwner() )
            {
                if( aktiv )
                {
                    llOwnerSay( "Beende das Empfangen der Nachrichten." );
                    llSetPrimitiveParams( [PRIM_FULLBRIGHT, ALL_SIDES, FALSE] );
                    aktiv = FALSE;
                } else
                {
                    llOwnerSay( "Starte das Empfangen der Nachrichten." );
                    llSetPrimitiveParams( [PRIM_FULLBRIGHT, ALL_SIDES, TRUE] );
                    aktiv = TRUE;
                }
            } else
            {
                llSay( 0, "Pfoten weg!" );
            }
        }
        
        link_message(integer sender_num, integer num, string message, key id)
        {
            if( aktiv ) llWhisper(0, message);
        }    
    }
    

    Viel Spaß mit diesen Code-Schnippseln :-)

    Ciaoo

    Scripting Library
  • Kxirya Weytana
    Kxirya Weytana
     Member edited 10:12PM
    Also zur direkten Kommunikation würde ich (fast) immer "osMessageObject" verwenden, da dies keinen permanenten Listener braucht.
    Wenn Die UUID des Empfängers unklar ist, mache ich am Scriptanfang einen Sensor, der nach dem Empfängernamen sucht, dann bekomme ich dessen UUID.

    Vorteil:
    Der Empfänger hat keinen Listener, Timer oder sonstwas, der permanent läuft.
    Erst wenn die Nachricht versendet wird, wird das Empfängerscript aktiv.

    (siehe aich http://opensimulator.org/wiki/OsMessageObject)

    Hinweis: Die entsprechenden Kommandos müssen in der INI mit "... = TRUE" freigeschaltet werden!

    Ansonsten finde ich aber eine solche Scriptsammlung generell eine sehr gute Idee, da hierbai auch immer Erfahrungen 'gesammelt' werden, nicht nur Textdateien XD

    Grüße,
Sign In or Register to comment.

Welcome

It looks like you're new here. If you want to get involved, click one of these buttons!

Discussions

© Copyright 2017 - Metropolis Metaversum
All times are GMT