SKRIPTKURS Lektion [ 4 / 4 ]

Auf Grund der Komplexitaet dieser Lektion muss ich die Bestandteile erst einmal aufteilen.

1.)
llGetAttached(); gibt den integer des Attachpoints (Anhaengepunkt) wieder.
Diesen Befehl kann man auch wunderbar dazu verwenden zu pruefen, ob ein Object am Avatar angehangen, oder auf dem Boden gerezzt wurde.

Mit folgendem Beispiel koennt ihr es selbst testen.

Code:
default
{
    state_entry()
    {
    
    }
 
    on_rez(integer Dae)
    {
        if(llGetAttached() == 0)
        {
            llSay(0, "Auf dem Boden gerezzt.");
        }
        else if(llGetAttached() != 0)
        {
            llSay(0, "Am Avatar angezogen.");
        }
    }
}
Beachtet die unterschiedlichen Fragen der jeweiligen if im on_rez(... Event.
Kann der Befehl keinen Attachpoint festgestellen, wird eine 0 zurueck gegeben.
Wird jedoch ein Attachpoint festgestellt, wird die jeweilige Nummer des Attachpoints zurueck gegeben, also nicht 0. Darum frage ich einfach den ausschluss der 0 ab, weil ich ja nicht weiss um welchen Attachpoint es sich handelt. ;)

2.)
Schauen wir uns nun mal den attach(key AvatarID) Event an.
Dieser Event erkennt beim Attachen (anziehen) den Key (Avatar UUID) des Traegers.
Hier kann man sehr bequem vergleichen, ob sich der Besitzer geaendert hat.
Code:
key Owner;

default
{
    state_entry()
    {
        Owner = llGetOwner();
    }
 
    attach(key AvatarID)
    {
        if(AvatarID != Owner)
        {
            llResetScript();
        }
    }
}
Bitte fuer Attachments auf keinen Fall den Changed Event mit der CHANGED_OWNER Option verwenden, der Funktioniert ausschliesslich bei gerezzten Objecten, die als Original verkauft werden und Inworld den Besitzer wechseln, ohne ins Inventar genommen zu werden. Bei Objecten die ueber das Inventar weiter gegeben werden, wird der Changed Event ueberhaupt nicht ausgeloest.


3.)

llRequestPermissions(key AvatarID, PERMISSION_ATTACH ); fragt nach Erlaubniss, in diesem Fall die Erlaubniss ein Attachment an oder auszuziehen.
Fuer diese Anfrage ist der Event run_time_permissions(integer perm) zwingend erforderlich, da sonst eine Fehlermeldung auftreten wuerde.
Ist die Erlaubniss gegeben, kann man mit dem Befehl llDetachFromAvatar(); das Object vom Avatar abnehmen (ausziehen)

Im folgenden Script frage ich im run_time_permission Event mit einer if ab, ob die Erlaubniss erteilt wurde.
Code:
key Owner;

default
{
    state_entry()
    {
        Owner = llGetOwner();
        llRequestPermissions(Owner, PERMISSION_ATTACH );
    }
 
    run_time_permissions(integer perm)
    {
        if(perm & PERMISSION_ATTACH)
        {
            llOwnerSay("ready...");
        }
    }

    touch_start(integer total_number)
    {
        llDetachFromAvatar();
    }
}
Wenn ihr nun einen Wuerfel mit diesem Script anzieht, und ihn dann anklickt, wird er euch wieder ausgezogen.


4.)
Nun kombinieren wir mal die ersten 3 Beispiele zu einem einzigen Script.
Die wichtigen Befehle fuer das ausziehen habe ich in eine if mit der Abfrage ob es angezogen ist gesetzt, da es keinen Sinn macht das auszufuehren, wenn es am Boden liegt.

Mit Reset:

key Owner;

default
{
    state_entry()
    {
        Owner = llGetOwner();
        if(llGetAttached() != 0)
        {
            llRequestPermissions(Owner, PERMISSION_ATTACH );
        }
    }
 
    run_time_permissions(integer perm)
    {
        if(perm & PERMISSION_ATTACH)
        {
            llOwnerSay("ready...");
        }
    }

    touch_start(integer total_number)
    {
        if(llGetAttached() != 0)
        {
            llDetachFromAvatar();
        }
    }
 
    attach(key AvatarID)
    {
        if(AvatarID != Owner)
        {
            llResetScript();
        }
    }
 
    on_rez(integer Dae)
    {
        llResetScript();
    }
}
Dieses Beispiel dient dem Verstaendniss.
Es kommt vor, das man diese Funktionen jedoch nicht mit Reset verwenden kann, weil man eventuell bestimmte Einstellungen oder temporaere Werte erhalten will.
In diesem Fall muss man wiefolgt vorgehen.

Ohne Reset:

key Owner;

default
{
    state_entry()
    {
        Owner = llGetOwner();
        if(llGetAttached() != 0)
        {
            llRequestPermissions(Owner, PERMISSION_ATTACH );
        }
    }
 
    run_time_permissions(integer perm)
    {
        if(perm & PERMISSION_ATTACH)
        {
            llOwnerSay("ready...");
        }
    }

    touch_start(integer total_number)
    {
        if(llGetAttached() != 0)
        {
            llDetachFromAvatar();
        }
    }
 
    attach(key AvatarID)
    {
        if(AvatarID != Owner)
        {
            Owner = llGetOwner();
            if(llGetAttached() != 0)
            {
                llRequestPermissions(Owner, PERMISSION_ATTACH );
            }
        }
    }
 
    on_rez(integer Dae)
    {
        //llResetScript();
    }
}
Ihr werdet feststellen, das ich lediglich im Attach Event das Reset raus geschmissen und den Inhalt des State Entry dort hinein kopiert habe. Allerdings habe ich den State Entry nicht geleert, eben weil man das Script immer noch manuell mit dem Baumenue resetten kann und dann wird der Attach Event nunmal nicht ausgeloest, aber der State Entry. ;)
Das Reset im On Rez Event habe ich ganz einfach nur deaktiviert, wenn der Event ueberhaupt nicht benoetigt wird, kann man ihn auch komplett loeschen.

Im naechsten Inworld Kurs lernen wir, wie wir alle 4 Lektionen sinnvoll in einem einzigen Script miteinander kombinieren. Darum bitte ich euch, mit allen 4 Lektionen zu experimentieren.

LG
Dae
 

Kommentare