Probesitzen beim Kurs in der SL- Schule, 07.06.2012
Man kann sich bekanntermaßen in SL an sehr vielen möglichen und auch eher unmöglichen Orten hinsetzen. Allerdings sieht der Avatar dann gelegentlich doch etwas steif und immer gleich aus. Dies liegt daran, dass standardmäßig immer die Animation "sit" abgespielt wird, die sich irgendwo in den Tiefen des Systems befindet. Aus diesem Grund erfreuen sich Sitzanimationen in SL einiger Beliebtheit, die man entweder direkt in einem Animation Overrider (AO) mit sich herumträgt oder aber in einem Objekt speichert, auf das sich Avatare setzen können. Verbreitet sind sogenannte Sitzbälle, die man an bestimmten Stellen mehr oder minder teuer erwerben kann. Man kann die Animationen aber auch in jedes andere Objekt packen (Bauen-Menü, Karteikarte "Inhalt"), auf dem es sich einigermaßen sitzen lässt.
Das hier vorgestellte Script ist dazu gedacht, zwei Animationen aus dem Objektinventar wechselweise abzuspielen. Welche das genau sind, bleibt einem selbst überlassen; vorzugsweise sollten es aber zwei relativ ähnliche sein, sonst kann es Probleme mit der Avatarposition geben. Der Wechsel zwischen den Animationen wird durch Berühren des Sitzobjekts herbeigeführt. Bevor das Script eingehend erklärt werden wird, werfen wir gleich einmal einen Blick in den Code:
Am Beginn stehen zwei globale Variablen, die - wie wir bereits gelernt haben - für das gesamte Script gelten werden.
Den Anfang macht sitzer
. Das Wort key
bedeutet, dass der gespeicherte Wert die Identifikationsnummer
(UUID) des Avatars - also von Herr oder Frau "sitzer" - aufnehmen wird. Die zweite Variable animation
steht für
die erste Animation im Inventar des Sitzobjekts. Da die Indexzählung hier mit null beginnt, wird dieser Wert der Variable
zugeordnet. Oder um es im Computerdeutsch zu sagen: Die Variable wird mit 0 initialisiert.
Dieses Script kommt mit nur einem state aus; dieser wird stets mit default
bezeichnet.
Das erste Event state_entry
läuft bei (Neu-)Start des Scripts immer automatisch ab. Die in ihm enthaltenen
Funktionen sorgen für das Festlegen der Sitzposition auf dem Objekt. Je nach Position des Sitzobjekts im Raum müssen die
Werte in llSitTarget
allerdings noch angepasst werden. Dabei enthält der erste Satz spitze Klammern die drei
Float-Werte für die Achsen x, y und z als Vector
-Variable und der zweite Satz die Drehung in einer
Rotation
-Variable mit sogar gleich vier Float-Werten. Hier kann man entweder selbst ausprobieren oder
sich zur Ermittlung der korrekten Werte des freien Tools
Sit Target Helper bedienen,
dass man in Second Life Marketplace von Learjeff Innis für 0 L$ erwerben kann und sogar frei mit seinen eigenen
Produkten vertreiben darf.
Das zweite Ereignis
wird durch bestimmte
Änderungen am Prim aktiviert, in diesem Fall durch Hinsetzen oder Aufstehen. Die Festlegung, auf was im konkreten Fall gewartet
werden soll, erfolgt durch die Verbindung mit der Konstante changed
(integer
change)CHANGED_LINK
. Genau das ist auch der Sinn
des Ampersand-Zeichens &
zwischen perm
und der Konstante. Man sollte sich gleich einmal merken,
dass man in diesem Fall von einer bitweisen VerUNDung spricht.
Es gäbe auch andere Ereignisse, die als Veränderung registriert werden würden, die dann mit anderen passenden Konstanten
verbunden werden könnten. Im vorliegenden Fall verhält es sich aber einfach wie folgt: Beim Hinsetzen werden Avatare mit dem
Objekt verlinkt, beim Aufstehen wird die Verlinkung wieder gelöst. Sobald eine dieser beiden Aktionen geschieht, kommt es zu
einer Veränderung. Das Event changed
wird also aktiviert.
Wenn sich ein Avatar auf das Objekt setzt, wird zunächst seine Identität ermittelt und der Variable "sitzer" zugeteilt.
Die Funktion
fragt ab, ob der Avatar durch die Sitzanimation animiert werden darf. Beim Sitzen ist das reine Formsache, weil man durch das
Hinsetzen schon automatisch seine Zustimmung gegeben hat (sonst würde nämlich auch die standardmäßige"sit"-Animation nicht
laufen). Dennoch ist die Konstante llRequestPermissions
(sitzer,PERMISSION_TRIGGER_ANIMATION
)PERMISSION_TRIGGER_ANIMATION
für das Script wichtig. Sie sorgt
als Schalterfunktion dafür, gewissermaßen die Weichen für das folgende Event run_time_permissions
zu
stellen. Sollte sich hinter dieser Funktion noch Programmcode befinden, würde dieser aber erst bis zum Ende ausgeführt, bevor
der Wechsel in das Event run_time_permissions
vollzogen würde.
Die Funktion
bewirkt
das Abschalten eines Stuhlsymbols, das man bei Berühren des Sitzobjekts angezeigt bekommt und ein Hinsetzen ohne Öffnen des
Tortenmenüs nur durch Anklicken ermöglicht (siehe unten).llSetClickAction
(CLICK_ACTION_NONE
)
Das dritte Event dieses Scripts wird durch die beschriebene Rechteänderung ausgelöst. In diesem Falle wird die durch
llRequestPermission
erfolgte formale Abfrage einer Erlaubnis durch Lesen der vom Server gemeldeten
Variable perm
abgefragt, die durch die Konstante PERMISSION_TRIGGER_ANIMATION
konkretisiert wird. Es wäre nämlich durchaus auch möglich, dass andere Genehmigungen erteilt worden sind als diejenige zum
Animieren. Beispielsweise bedarf auch der Zahlungsverkehr per Script einer Erlaubnisabfrage, die allerdings dann auch mit einer
anderen Konstante logisch verbunden wird. Das Verfahren mit dem bitweise VerUNDen haben wir nun bereits oben kennengelernt.
Ist also die Genehmigung des Avatars erteilt, wird die Standard-Animation "sit" gestoppt und stattdessen die erste Animation
aus dem Inhalt des Objekts gestartet. Die Konstante INVENTORY_ANIMATION
sorgt dafür, dass die
richtige Kategorie im Inhalt durchsucht wird, und die bereits anfangs als "0" deklarierte Variable animation
bezeichnet das erste Element des gesuchten Inhalts.
Beim Aufstehen ändert sich wieder etwas am Prim, da die Verlinkung zwischen Avatar und Objekt gelöst wird. Also wird das
Ereignis changed
wieder aufgerufen. Da die Bedingung des Sitzens nicht mehr erfüllt wird, geht das
Script sogleich in den else if
-Teil der Abfrage: Das Anhalten der aus dem Objektinhalt geladenen Animation und der Austausch des gespeicherten
sitzer
-Keys gegen den konstanten Platzhalter NULL_KEY
sind die Folge. Allerdings wird das Script
nicht zurückgesetzt, auch wenn alles wieder wie ganz am Anfang aussieht.
Abschließend wird noch das Stuhlsymbol durch
reaktiviert.llSetClickAction
(CLICK_ACTION_SIT
)
Unser Wechselschalter leistet uns auch hier gute Dienste, haben wir doch gleich zwei Animationen im Objektinventar untergebracht.
Das Hin- und Herschalten erfolgt über eine Abfrage des Steuerwertes animation
, der durch Hochzählen um 1
(animation++
) bzw. Herunterzählen um 1 (animation--
) hin- und herwechselt. Dabei wird jeweils die
eine Animation gestoppt und die andere gestartet. Damit nur der Sitzende seine Lage durch Klicken beeinflussen kann, ist dem
Wechselschalter nur eine Abfrage der gegebenen Zustimmung zur Animation vorgeschaltet:
.if
(llDetectedKey
(0) == sitzer)
Wer mehr als zwischen nur zwei Animationen hin- und herschalten möchte, kann sich einmal Gedanken um die Erweiterung der
Abfragebedingungen machen. Ausgehend von dieser Basis ist das nun nicht mehr allzu schwierig. Man muss nur den Wert für
animation
weiter hochzählen und den entsprechenden Code in einer eigenen else if
-Abfrage
unterbringen. Es gibt hierfür noch clevere Wege, die wir aber erst im Zusammenhang mit dem ersten Dialogmenü kennenlernen werden.