User:Daemonika Nightfire/Scripts/perm trigger anim

From Second Life Wiki
< User:Daemonika Nightfire
Revision as of 05:29, 18 March 2024 by Daemonika Nightfire (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

In diesem Beispiel habe ich die wichtigsten Funktionen fuer den reibungslosen Ablauf zum Animieren eines Avatars durch ein Attachment aufgelistet. Fuer die Funktionalitaet des Beispiels wird eine Animation im Inhalt des objects vorausgesetzt. Bei meinen Erklaerungen habe ich versucht mich moeglichst kurz zu fassen und bin nur auf den Sinn und Zweck eingegangen. Ausserdem habe ich die Erklaerungen als Abschnitte ueber den Events einsortiert, um die einzelnen Events nicht zu zerreissen. Weiter fuehrende Informationen zu einzelnen Befehlen schlage bitte in der Wiki nach.

Wenn du das Script ohne die ganzen Kommentare speicherst, wirst du sehen wie klein es eigentlich ist.

*DS* Permission Trigger Animation

// Globale Variablen
// Speicherort / Variable fuer den Besitzer-Key
key owner;

// Speicherort / Variable fuer den Animations-Namen
string animation = "";

// Status fuer den booleschen Schalter
integer st = 0;


// Script-Anfang
default
{
    // Aufrufen/setzen der Werkseinstellung
    /*
        Der folgende Event wird nur dann ausgefuehrt, wenn das Script gespeichert oder resettet wird.
        Im aktuellen Beispiel wird als erstes der key des Besitzers abgefragt und global gespeichert.
        
        Danach wird geprueft ob sich im Inhalt eine Animation befindet.
        Wenn das der Fall ist, wird der Name der Animation global gespeichert.
        
        Zum Schluss wird der aktuelle Attachpoint abgefragt.
        Wenn eine Zahl groesser 0 zurueck gegeben wird, bedeutet es das Object wird getragen.
        Damit wird dann die Erlaubnis den "owner" zum Animieren abgefragt.
    */
    state_entry()
    {
        owner = llGetOwner();
        
        if(llGetInventoryNumber(INVENTORY_ANIMATION) > 0)
        {
            animation = llGetInventoryName(INVENTORY_ANIMATION, 0);
        }
        
        if(llGetAttached() != 0)
        {
            llRequestPermissions(owner, PERMISSION_TRIGGER_ANIMATION);
        }
    }
    
    // Rechte-Verwaltung
    /*
        Dieser Event wird in diesem Beispiel von 2 Stellen aufgerufen.
        Beim resetten/speichern "state_entry()" des Scripts und beim Anziehen "attach(key id)".
        
        Wird der Dialog mit der Anfrage zum animieren mit [JA] bestaetigt, loest es die erste "if" mit der Bestaetigung aus.
        Bei getragenen Attachments wird diese Erlaubnis durch die eindeutige Handlung automatisch mit [JA] bestaetigt.
        
        Wird der Dialog jedoch mit [NEIN] abgelehnt springen wir sofort in die "else".
        Dazu wird es aber nur bei gerezzten Objecten und nicht bei getragenen Attachments kommen.
        
        Info:
            Eine Permission muss nur 1x erteilt werden und gilt dann fuers ganze Script.
            Zurueckziehen kann man die Permission nicht mehr, dazu ist es erforderlich das Script zu resetten.
    */
    run_time_permissions(integer perm)
    {
        if(perm & PERMISSION_TRIGGER_ANIMATION)
        {
            llOwnerSay("ready...");
            llOwnerSay("Erlaubnis wurde erteilt.");
        }
        else // Gegenprobe (wenn gerezzt)
        {
            llOwnerSay("Erlaubnis wurde verweigert.");
        }
    }
    
    // klicken erkennen
    /*
        Der Touch Event beinhaltet lediglich einen einfachen booleschen Schalter "st" zum starten und stoppen der Animation.
        
        Als erstes wird geprueft, wer das object klickt.
        Mit der ersten "if" vergleichen wir den aktuell klickenden Avatar mit dem gespeicherten "owner".
        
        Stimmt der ueberein, pruefen wir erst einmal ob eine Animation eingetragen wurde.
        Wenn keine vorhanden ist, hat sich die ganze Funktion ab hier erledig und nichts passiert.
        
        Haben wird aber eine Animation, nutzen wir den Schalter "st" um den Status zu wechseln.
        Entsprechend des aktuellen Status wird die jeweilige "if" / "else if" ausgefuehrt.
    */ 
    touch_start(integer num)
    {
        key agent = llDetectedKey(0);
        if(agent == owner)
        {
            if(animation != "" && llGetAttached() != 0)
            {
                st = !st;
                if(st)
                {
                    llStartAnimation(animation);
                    llOwnerSay("Animation wird abgespielt.");
                }
                else if(!st)
                {
                    llStopAnimation(animation);
                    llOwnerSay("Animation wird angehalten.");
                }
            }
        }
    }
    
    // an/ausziehen erkennen
    /*
        Der Attach Event erkennt beim anziehen den aktuellen Key des Avatars.
        Beim ausziehen wird der NULL_KEY zurueck gegeben.
        
        Die "if(id)" wird ausgeloest, wenn der Key des Avatars erkannt wird.
        Hier bietet sich an, einen Owner-Wechsel zu pruefen.
        Sollte der aktuelle Besitzer nicht mit dem "owner" ueberein stimmen, wird das Script ganz einfach resettet und wir starten im "state_entry()".
        
        Ist der Besitzer und der "owner" der selbe, fragen wir einfach wieder nach Erlaubnis zum animieren (Erlaubnis auffrischen).
        Ich weiss, ich habe in der Info zur Rechte-Verwaltung geschrieben, das das eigentlich nicht noetig ist, weil man das nicht zurueck ziehen kann.
        Doch wir alle kennen SL, also verlass dich nicht drauf das die Permission nicht mal verloren geht. (Sim-Crash oder warum auch immer.)
        
        Sobald das Object ausgezogen wird, gibt der Attach Event den NULL_KEY zurueck und die "else" loest aus.
        Hier lassen sich noch einige wenige Funktionen ausloesen, bevor das Object wirklich weg ist.
        Aber vorsicht, verwende keine Funktionen die einen Avatar bezogenen Key benoetigen.
    */
    attach(key id)
    {
        if(id)
        {
            if(llGetOwner() != owner)
            {
                llResetScript();
            }
            
            llRequestPermissions(owner, PERMISSION_TRIGGER_ANIMATION);
            llOwnerSay("Angezogen & Permission wird abgefragt.");
        }
        else
        {
            llStopAnimation(animation);
            llOwnerSay("Ausgezogen & Animation wird angehalten.");
        }
    }
    
    // Veraenderungen erkennen
    /*
        Der changed Event erkennt automatisch jede Veraenderung des Objects.
        In diesem aktuellen Beispiel befindet sich lediglich eine Funktion, Veraenderungen im Inhalt zu pruefen.
        Sollte sich der Inhalt aendern, wird das Script einfach resettet um die globalen Variablen zu aktuallisieren.
    */
    changed(integer ch)
    {
        if(ch & CHANGED_INVENTORY)
        {
            llResetScript();
        }
    }
    
    // Hallo Welt
    /*
        Ja, die Ueberschrift habe ich mit absicht so gewaehlt.
        Der on_rez Event wird naemlich immer dann ausgeloest, sobald das Object das Licht der Welt erblickt.
        Dazu gehoeren:
        ➤ Vom Inventar auf den Boden ziehen.
        ➤ Inworld kopieren (Kopie ziehen).
        ➤ Mittels Tools rezzen (Rezzer).
        ➤ Am Avatar anziehen.
        ➤ Du traegst es beim Einloggen.
        
        Selbstverstaendlich kann man in diesem Event vielseitige Funktionen ausfuehren.
        Einen Reset sollte man an dieser Stelle jedoch nur dann ausfuehren,
        wenn keine anderen Funktionen davon abhaengig sind vorherige Aufgaben auszufuehren oder temporaere Variablen bei zu behalten.
        
        Aus diesem Grund resettet dieser Event in diesem Beispiel nur dannn, wenn das Object auf dem Boden gerezzt wird.
        Die Abfrage "llGetAttached()" gibt in diesem Fall naemlich die 0 zurueck.
    */
    on_rez(integer Dae)
    {
        if(llGetAttached() == 0)
        {
            llResetScript();
        }
    }
}
// Script-Ende