Sitzscript: Von der Kunst, seine Selbstkontrolle aufzugeben

Probesitzen beim Kurs in der SL- Schule, 07.06.2012

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.

Tipp: Wer lernen möchte, wie man Posen und Animationen selbst erstellt, kann sich gern auch die Referenz zu QAvimator auf diesen Seiten anschauen.

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:

Sitzscript mit Wechselschalter

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.

state_entry: Alles bereitmachen!

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.

changed: Wer sitzt denn da auf einmal?

Das zweite Ereignis changed(integer change) 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_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.

"Eselsbrücke": Bildlich kann man sich eine bitweise VerUNDung wie ein Kofferradio vorstellen, bei dem man auf jeden Fall immer den Netzschalter bedienen muss, aber mittels Wahltasten auch zwischen verschiedenen Betriebsarten (UKW, Kurzwelle, Langewelle, CD abspielen usw.) wählen kann.

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 llRequestPermissions(sitzer,PERMISSION_TRIGGER_ANIMATION) 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 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 llSetClickAction (CLICK_ACTION_NONE) 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).

run_time_permissions: Sitz nicht immer nur gerade, sondern auch mal ganz anders!

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.

Noch einmal changed: Aufstehen und alles gründlich ausschütteln!

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 llSetClickAction (CLICK_ACTION_SIT) reaktiviert.

touch_start: Ein alter Bekannter hilft beim Lagewechsel

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.

© 2012 ff. Almut Brunswick. Nur für den persönlichen Gebrauch! Aus rechtlichen Gründen distanziere ich mich von allen externen Links.