• Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
  • Wir freuen uns, wenn du dich in unserem Forum anmeldest. Bitte beachte, dass die Freigabe per Hand durchgeführt wird (Schutz vor Spammer). Damit kann die Freigabe bis zu 24 Stunden dauern.
  • Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Sie geben Einwilligung zu unseren Cookies, wenn Sie unsere Webseite weiterhin nutzen.

Scripten Lernen (Deutsch)

Wer hat Interesse, Scripte zu verstehen?


  • Umfrageteilnehmer
    19
  • Umfrage geschlossen .
Guten morgen,

wir haben gestern Abend eine Notecard ausgelesen.
Doch im spaeteren verlauf wurde es etwas kompliziert, da man ebenfalls den Inhalt Notecard im Hinterkopf halten und im Script beruecksichtigen musste.
Darum werden wir im naechsten Kurs erneut auf den Card Reader eingehen, da es fuer uns alle ein wenig anstrengend wurde.

Das Script was wir erarbeitet haben folgt in kuerze.

Der naechste Kurs ist am 4.11.2018 voraussichtlich um 20 Uhr.
Allerdings waere ich bereit das auf 18 Uhr vor zu-verlegen, da ich denke das es fuer alle beteiligten besser ist.

LG
Dae
 
@Brigitt Loening

Kleiner Insider ;)
Ich weiss jetzt wieder in welchem Zusammenhang die else if im Dataserver Kacke war.
Wenn man eine NC ohne Interpreter (Farbe=) ausliest und nur anhand der Zeilen die Parameter sammelt.
Wenn man dabei nicht genau auf die selbe Reihenfolge wie im Script achtet, geht es mit einer else if in die Hose.

LG
Dae
 
Guten Morgen,

so wie es aussieht habe ich beim Blick auf den Kalender wohl geschielt.
Der naechste Kurs waere nicht am 4. sondern heute Abend den 28.10. um 20 Uhr.
Es tut mir echt leid, wenn ihr also schon was anderes vor habt, kann ich das verstehen.
Dennoch habe ich fuer jene die heute Abend Lust haben folgendes vorgesehen.

Wir gehen noch mal den Dataserver durch und wenn wir noch Lust haben lassen wir uns eine Notecard Zeile fuer Zeile automatisch im Chat vorlesen.

Doch jetzt erst mal das Script welches wir im Letzten Kurs erstellt haben.
Wieder zuerst ganz ohne Kommentare, um zu sehen wie ueberschaubar es eigentlich ist.

Fangen wir mal mit der Notecard an.
Mit dem Format wie wir die Notecard auslesen, ist es moeglich auch in der Notecard Leerzeilen und sogar Kommentare zu verwenden.
Macht die Notecard aber nicht zu voll, sonst dauert es eine gefuehlte Ewigkeit bis der Dataserver irgend wann mal fertig wird.

!Config Notecard:
// Text fuer den Hovertext
Text=mein hovertext

// Hovertext-Farbe
Farbe=<0,1,0>

// Tranparenz
Alpha=1.0


Das Script liest zwar jede einzelne Zeile aus, verarbeitet jedoch nur die Zeilen die wir moechten.
Wir zerlegen die einzelnen Zeilen und pruefen ob ein = Zeichen vorhanden ist.

Notecard Reader Script:
Code:
string nc_name = "!Config";
integer startzeile = 0;
key Query;

string hovertext = "kriggel kraggel";
vector farbe = <1,1,1>;
float alpha = 0.5;

default
{
    state_entry()
    {
        llSetText(hovertext, farbe, alpha);
       
        Query = llGetNotecardLine(nc_name, startzeile);
    }
   
    dataserver(key requested, string data)
    {
        if(Query == requested && data != EOF)
        {
            if(data != "")
            {
                list temp = llParseString2List(data, ["="], []);
                string cmd = llList2String(temp,0);
                string text = llList2String(temp,1);
               
                if(cmd == "Text")
                {
                    hovertext = text;
                }
                else if(cmd == "Farbe")
                {
                    farbe = (vector)text;
                }
                else if(cmd == "Alpha")
                {
                    alpha = (float)text;
                }
            }
            startzeile++;
            Query = llGetNotecardLine(nc_name, startzeile);
        }
        else if(EOF)
        {
            llSetText(hovertext, farbe, alpha);
        }
    }
   
    changed(integer ch)
    {
        if(ch & CHANGED_INVENTORY)
        {
            startzeile = 0;
            Query = llGetNotecardLine(nc_name, startzeile);
        }
    }
   
    on_rez(integer Dae)
    {
        llResetScript();
    }
}


Hier folgt nun das gleiche Script mit Kommentaren.

Notecard Reader Script:
Code:
// Wichtige Konfiguration
string nc_name = "!Config"; // Name der Notecard im inhalt des Objects.
integer startzeile = 0; // Zeile bei der das Script anfangen soll die Notecard auszulesen.
key Query; // Key request fuer den Dataserver.

// Vorgegebene Variablen
string hovertext = "kriggel kraggel"; // Text fuer den Hovertext.
vector farbe = <1,1,1>; // Farbe fuer den Hovertext.
float alpha = 0.5; // Transparenz fuer den Hovertext.

default
{
    state_entry()
    {
        llSetText(hovertext, farbe, alpha); // Erste Hovertext anzeige beim starten des Scripts.
        
        Query = llGetNotecardLine(nc_name, startzeile); // Befehl zum auslesen der Notecard.
    }
    
    dataserver(key requested, string data) // Der Dataserver kann mehr als nur Notecards auslesen, aber das ein ander mal.
    {
        if(Query == requested && data != EOF) // diese if ueberprueft den request  und anschliessend ob die Notecard nicht schon zu ende ist.
        {
            if(data != "") // Bei dieser if wird geprueft ob die aktuelle Zeile leer ist. (Ist sie leer, wird sie uebersprungen.)
            {
                // Nachfolgende Zeile liest die gesamte Zeile der Notecard aus und zerlegt sie in eine Liste.
                // Als trennung wird hier das = Zeichen verwendet. (Andere Zeichen sind moeglich.)
                list temp = llParseString2List(data, ["="], []); // Beispiel: ["Text","mein hovertext"]
                
                // Die beiden folgenden Befehle nehmen jeweils die einzelnen Bestandteile der Liste auf.
                string cmd = llList2String(temp,0); // Beispiel: Stellenwert 0 = Erster Eintrag der Liste = "Text"
                string text = llList2String(temp,1); // Beispiel: Stellenwert 1 = Zweiter Eintrag der Liste = "mein hovertext"
                
                // Diese drei if pruefen jeweils ob der erste Eintrag zu einer Vorgabe passt.
                // Stimmt eine Vorgabe mit dem ersten Eintrag ueberein, wird die Variable entsprechend mit dem zweiten Eintrag ueberschrieben.
                if(cmd == "Text") // Erster Eintrag
                {
                    hovertext = text; // Zweiter Eintrag
                }
                else if(cmd == "Farbe") // Erster Eintrag
                {
                    farbe = (vector)text; // Zweiter Eintrag
                }
                else if(cmd == "Alpha") // Erster Eintrag
                {
                    alpha = (float)text; // Zweiter Eintrag
                }
            }
            startzeile++; // Counter zum erhoehen der Zeilen Nummer um 1.
            Query = llGetNotecardLine(nc_name, startzeile); // Anweisung zum auslesen der naechsten Zeile.
        }
        else if(EOF) // EOF = End Of File, Wenn die Notecard zu Ende ist, wird der Dataserver Event hier beendet.
        {
            llSetText(hovertext, farbe, alpha); // Aktuallisierter Hovertext mit den Werten aus der Notecard.
        }
    }
    
    changed(integer ch) // Der changed Event erkennt saemtliche Veraenderungen des Objects.
    {
        if(ch & CHANGED_INVENTORY) // In diesem Fall pruefen wir jedoch nur ob sich der Inhalt veraendert.
        {
            // Speichert ihr einen neuen Wert in der Notecard veraendert sich der Inhalt des Objects.
            startzeile = 0; // Setzt die Notecard wieder auf Anfang.
            Query = llGetNotecardLine(nc_name, startzeile); // Startet den Dataserver um die komplette Notecard auszulesen.
        }
    }
    
    on_rez(integer Dae) // Erkennt ob das Object neu gerezzt wird.
    {
        llResetScript(); // Resettet das Script.
    }
}

Auch hier empfehle ich das Script Inworld in ein Script zu kopieren, weil es dort einfach leserlicher ist.

LG
Dae
 
Böses SL hat mich gestern verabschiedet und nicht mehr reingelassen - obwohl ich meine horrende Miete gezahlt habe :)
Wir haben gestern darüber gesprochen, wo der SetTimerEvent im Vorleser hingehört - und da kam ich heute morgen auf die Problematik des Designs im Allgemeinen.
Das wäre ein Punkt, über den wir vielleicht mal reden sollten - wenn Sl uns lässt.
 
Guten morgen,

ja ausgerechnet gestern Abend mitten in einem Beispiel fuer klassisches copy/paste von Komponenten aus mehreren Scripten.
Dabei waren wir schon fast fertig. (menno)

Also, wir haben uns einfach einen Schalter aus einem frueheren Kurs geschnappt und da einfach einen Timer und den Dataserver aus dem aktuellen Card Reader hinzugefuegt.
Anders als bei der Konfigurations Notecard starten wir den Query Request nicht sofort im state_entry Event, sondern erst bei Touch auf den Prim.

Im Inventar beim Script haben wir jetzt auch eine andere Notecard liegen.
Der Name der Notecard lautet diesmal Der Mythos des Atlas und muss im Script ebenfalls uebernommen werden.

Hier erst mal die Notecard:
Der Mythos des Atlas
Der Mythos des Atlas
Er war der Sohn des Titanen Iapetos und der Okeanide (Meeresnymphe) Klymene (Homer, Odyssee, 1.51-54).
Manchmal wird auch die Titanin Themis als seine Mutter genannt.
Menoitios, Prometheus und Epimetheus waren die Brüder des Atlas (Theogonie 510-511).
Als Strafe für seine Teilnahme am Kampf der Titanen gegen die Götter verdammte ihn Zeus dazu,
für alle Zeiten den Himmel auf seinen Schultern zu tragen:
Daher auch seine Personifizierung als Atlasgebirge.
Atlas ist der Gatte der Pleione, eine Tochter des Okeanos und der Tethys,
und mit ihr Vater der Plejaden (Atlantiden).
Mit einer anderen Gattin, der Hya (auch eine Tochter des Okeanos), ist er Vater der Hyaden.
Des Weiteren soll er Vater der Hesperiden,
des Hyas und des Hesperos sein,
obwohl letzterer auch sein Bruder sein soll.
Nach Platons Kritias war Atlas ein Sohn von Poseidon und der Kleito und der erste König von Atlantis.
In seiner elften Arbeit für Eurystheus sollte Herakles die Äpfel der Hesperiden holen.
Der goldene Apfelbaum stand in einem Garten am Abhang des Berges Atlas im Westen der Welt.
Hera hatte ihn den Töchtern des Atlas, den Hesperiden, anvertraut.
Um diese jedoch von den Äpfeln fernzuhalten, l
ieß sie den Drachen Ladon den Baum bewachen. Herakles bat Atlas,
für ihn die Äpfel zu holen,
im Gegenzug würde er ihm die Last des Himmels abnehmen.
Atlas war froh, seine Last, wenn auch nur für kurze Zeit, loszuwerden und willigte ein.
Nachdem Herakles den Drachen Ladon erschossen hatte,
nahm er Atlas den Himmel von den Schultern.
Atlas holte drei goldene Äpfel und wollte,
berauscht von seiner neuen Freiheit,
diese selbst dem Eurystheus bringen.
Herakles war jedoch gewarnt und bat Atlas,
den Himmel nur für einen Moment noch einmal zu tragen,
damit er es sich für diese Aufgabe bequemer machen könne.
Atlas ließ sich täuschen und nahm den Himmel wieder auf seine Schultern.
Herakles zog mit den Äpfeln davon.
Nachdem Perseus im Land der Hyperboreer die Gorgo Medusa enthauptet hatte,
gelangte er auf seinem Weg nach Süden zum Palast des Atlas.
Dieser verweigerte ihm aber die gastliche Aufnahme.
Perseus hielt ihm daraufhin das Haupt der Medusa entgegen,
worauf Atlas zu einem gigantischen Felsen versteinerte.
[ END OF FILE ]
Die Quelle des Textes ist die Wiki: https://de.wikipedia.org/w/index.php?title=Atlas_(Mythologie)&oldid=66651533
Allerdings musste ich wegen des Limits von 256 Zeichen pro Zeile den Zeilenumbruch manuell anpassen.

Nun aber unser Frankenstein Script.
Natuerlich erst mal wieder zwecks uebersicht ohne Kommentare
*DS* Notecard vorlesen (Schalter)
Code:
integer Status = FALSE;

string nc_name = "Der Mythos des Atlas";
integer startzeile = 0;
key Query;

default
{
    state_entry()
    {
        
    }

    touch_start(integer total_number)
    {
        if(Status == FALSE)
        {
            Status = TRUE;
            llOwnerSay("AN");
            llSetTimerEvent(3.0);
            
            Query = llGetNotecardLine(nc_name, startzeile);
        }
        else if(Status == TRUE)
        {
            Status = FALSE;
            llOwnerSay("AUS");
            llSetTimerEvent(0.0);
        }
    }
    
    timer()
    {
        Query = llGetNotecardLine(nc_name, startzeile);
    }
    
    dataserver(key requested, string data)
    {
        if(Query == requested && data != EOF)
        {
            if(data != "")
            {
                llSay(0, data);
            }
            startzeile++;
        }
        else if(EOF)
        {
            Status = FALSE;
            llOwnerSay("AUS");
            llSetTimerEvent(0.0);
            startzeile = 0;
        }
    }
    
    changed(integer ch)
    {
        if(ch & CHANGED_INVENTORY)
        {
            llResetScript();
        }
    }
    
    on_rez(integer Dae)
    {
        llResetScript();
    }
}

Nun das Script mit Kommentaren.
Auch hier empfehle ich wieder das Script Inworld in ein Script zu kopieren.
*DS* Notecard vorlesen (Schalter)
Code:
integer Status = FALSE; // globale Variable fuer den Schalter

string nc_name = "Der Mythos des Atlas"; // Name der Notecard im inhalt des Objects.
integer startzeile = 0; // Zeile bei der das Script anfangen soll die Notecard auszulesen.
key Query; // Key request fuer den Dataserver.

default
{
    state_entry()
    {
        // Diesmal starten wir den Query nicht im state_entry, da es keine Konfiguration ist.
        // Erst wenn wir den Schalter betaetigen wird der Query aufgerufen
    }

    touch_start(integer total_number)
    {
        if(Status == FALSE) // Abfrage nach uebereinstimmung der Variable
        {
            Status = TRUE; // Zuweisung einer neuen Variable
            llOwnerSay("AN"); // Befehl
            llSetTimerEvent(3.0); // Startet den Timer mit einem 3 sec. Intervall
            
            Query = llGetNotecardLine(nc_name, startzeile); // Anweisung zum auslesen der aktuellen startzeile.
        }
        else if(Status == TRUE) // Abfrage nach uebereinstimmung der Variable
        {
            Status = FALSE; // Zuweisung einer neuen Variable
            llOwnerSay("AUS"); // Befehl
            llSetTimerEvent(0.0); // Stopt den Timer
        }
    }
    
    timer() // Der Timer tickt immer in dem Rytmuss, welcher im llSetTimerEvent eingestellt wird.
    {
        Query = llGetNotecardLine(nc_name, startzeile); // Anweisung zum auslesen der aktuellen startzeile.
    }
    
    dataserver(key requested, string data) // Der Dataserver kann mehr als nur Notecards auslesen, aber das ein ander mal.
    {
        if(Query == requested && data != EOF) // diese if ueberprueft den request und anschliessend ob die Notecard nicht schon zu ende ist.
        {
            if(data != "") // Bei dieser if wird geprueft ob die aktuelle Zeile leer ist. (Ist sie leer, wird sie uebersprungen.)
            {
                // Da es sich in der Notecard bereits um strings handelt, ist keine konvertierung notwendig.
                // Wir koennen die variablen aus der Notecard gleich als das was sie sind weiter verwenden.
                // Das llSay gibt mit der variable data nun die gesamte Zeile aus der Notecard im lokalen Chat aus.
                llSay(0, data);
            }
            
            startzeile++; // Counter zum erhoehen der startzeile Nummer um 1.
            // Sobald der Timer wieder zuschlaegt, wird die Notecard nun mit der naechsten zeile ausgelesen.
        }
        else if(EOF) // EOF = End Of File, Wenn die Notecard zu Ende ist, wird der Dataserver Event hier beendet.
        {
            // Diese EOF if macht im grunde das selbe wie Status TRUE if.
            // Sobald die Notecard zu Ende ist, soll sie beim naechsten klicken wieder von vorn anfangen.
            // Dazu ist es notwendig den Status des Schalters auch hier wieder zu veraendern.
            Status = FALSE; // Zuweisung einer neuen Variable
            llOwnerSay("AUS"); // Befehl
            llSetTimerEvent(0.0);  // Stopt den Timer
            
            startzeile = 0; // Setzt den Counter wieder auf null.
        }
    }
    
    changed(integer ch) // Der changed Event erkennt saemtliche Veraenderungen des Objects.
    {
        if(ch & CHANGED_INVENTORY) // In diesem Fall pruefen wir jedoch nur ob sich der Inhalt veraendert.
        {
            llResetScript(); // Resettet das Script.
        }
    }
    
    on_rez(integer Dae) // Erkennt ob das Object neu gerezzt wird.
    {
        llResetScript(); // Resettet das Script.
    }
}

@Wolwaner Jervil
Ja wo der llSetTimerEvent zum starten hin sollte war schon eine Ueberlegung wert.
Am Ende hab ich mich dazu entschlossen, erst den Timer zu starten und dann erst das Script in den dataserver Event zu schicken.
Die umgekehrte Reihenfolge fuehlte sich an wie ein Zungenbrecher.

LG
Dae
 
Wie ihr sehen koennt, haben wir im aktuellen Script einen leeren state_entry Event.
Diesen Event koennen wir dazu nutzen, den Namen der Notecard automatisch auszulesen. ;)

Das wird dann unsere Aufgabe im naechsten Kurs wenn wir dieses Script noch mal fuer alle durchgehen, die gestern geflogen sind.

LG
Dae
 
Guten Abend,

Ja diesen Sonntag ist wieder ein Kurs. :)
Fuer ein spezielles Thema haben wir uns beim letzten mal aber nicht entschieden.

Allerdings fand ich den letzten Kurs wieder sehr spannend, als wir aus einer einfachen Frage ein komplettes Beispielscript erstellten.

LG
Dae
 
huhu,

die urspruengliche Frage des letzten Kurses lautete:
Ist es moeglich, mit einem Script zu kommunizieren, doch ein weiteres Script in einem anderen Object antwortet ausschliesslich dem Avatar, der mit dem ersten Object spricht?

Ich gebe zu, ohne einen direkten verwendungszweck klingt diese Frage etwas verwirrend, doch ich weiss einen guten Verwendungszweck.

Beispiel: Du bezahlst an einem Vendor und ein Inworld Server schickt dir das gewuenschte Produkt.

Folgende Beispiel Scripte dienen lediglich dem Verstaendniss und sind nicht als Vollwertiges Produkt zu betrachten.

Script 1
Beim ersten Script handelt es sich um einen Sender, der ausschlisslich einen festen Channel zuhoert.
Die Message und der Key des Avatars werden dabei direkt an ein weiteres Script uebertrgen.
Code:
integer Kanal = 666; // Globale Variable fuer den Channel

default
{
    state_entry()
    {
        llListen(Kanal, "","",""); // Befehl zum zuhoeren auf den angegebenen Channel
        llSetText("channel " + (string)Kanal , <1,1,1>, 1.0); // Einfacher Hovertext zum anzeigen des Channels
    }
 
    listen(integer channel, string name, key id, string message)
    {
        llSay(2, message + "@" + (string)id); // Dieses llSay gibt lediglich die Message und den erkannten key im naechsten Channel weiter.
    }
}

Script 2
Das zweite Script empfaengt nun die Message inclusive des enthaltenen Avatar-Keys.
Diese Message wird nun wiederum Mitteilung und Avatar-key (UUID) zerlegt.
Code:
default
{
    state_entry()
    {
        llListen(2, "","",""); // Listrener zum zuhoeren
    }

    listen(integer channel, string name, key id, string message)
    {
        if(llGetOwnerKey(id) == llGetOwner()) // Prueft ob der Besitzer des Senders mit dem dieses Objects ueberein stimmt.
        {
            list temp = llParseString2List(message, ["@"], []); // Zerlegt die message in ihre Bestandteile
            string nachricht = llList2String(temp, 0); // Bestandteil 1  = vor dem @
            key UUID = llList2Key(temp, 1); // Bestandteil 2 = nach dem @
       
            llRegionSayTo(UUID, 0, nachricht); // Spricht zum erkannten Key des ersten Objects.
        }
    }
}

Warum wir was, wo und wie in diesem Beispiel gemacht haben, darf gerne hier im Thread besprochen werden. ;)

LG
Dae
 
Zuletzt bearbeitet:
huhu ihr suessen,

weil das Thema gerade sehr aktuell ist, plane ich fuer den kommenden Kurs AniMesh.
Ja ihr lest richtig, AniMesh.

Keine Sorge, es klingt dramatischer als es ist.
Da es fuer mich ebenfalls Neuland ist, werden wir uns zusammen damit auseinander setzen und darauf eingehen worauf es beim AniMesh ankommt.
Neue Script Befehle die dafuer noetig sind gibt es nur 3 stueck und die sind genau so einfach zu handhaben, wie ein PoseScript.

Zum animieren besorgen wir uns einfach irgend welche billigen Avatare fuer 10l. zur not hab ich auch noch was fullperm da. :)
Dann mal schauen was wir so damit anstellen koennen.
Wichtig ist, das ihr fuer diesen Kurs einen Viewer verwendet, der AniMesh tauglich ist, sonst werdet ihr nichts sehen koennen.
Empfehlen kann ich den aktuellen Firestorm Viewer (Firestorm-Betax64).

Der naechste Kurs ist am Sonntag den 06.01.2019 um 20 Uhr.
Fuer die die nicht dabei sein koennen, ich moechte ausnahmsweise diesen Kurs dann am Sonntag den 13.01.2019 um 18 Uhr wiederholen.

LG
Dae
 
Vielen Dank, freut mich das doch einige Spass hatten. :)

Gestern war unser Script eigentlich ehr Nebensache und lediglich Mittel zum Zweck.
Wichtiger waren gestern die Reihenfolge des Verlinken, die Komplexytaet des AniMesh und viele andere Dinge die es zu beachten lohnt.
Wie zum Beispiel, das man die Komplexytaet von AniMesh ganz einfach ueber (Avatar / Avatar-Befinden / Informationen ueber Avatar-Komplexytaet anzeigen) ueberpruefen kann.
Das bedeutet, das AniMesh in dem Augenblick als Avatare gewertet und bei zu hoher Komplexytaet sogar als Jelly-Bean dargestellt werden.

Dann ist mir gestern aufgefallen, das unser einfacher Schalter leicht in Vergessenheit geraten ist.
Drum moechte ich ihn hier noch einmal ganz ohne Schnik Schnak auffuehren.
Diesen Schalter benoetigen wir immer wieder, weil es einfach die einfachste und verstaendlichste Methode zum ein und aus schalten unserer Funktionen ist.
Code:
integer Schalter = FALSE; // Globale Variable fuer den Schalter (Status aus).

default
{
    touch_start(integer total_number) // Wird beim klicken ausgefuehrt
    {
        if(Schalter == FALSE) // prueft Schalter ( Status aus? )
        {
            Schalter = TRUE; // setzt den Status des Schalters auf an.
        }
        else if(Schalter == TRUE) // prueft Schalter ( Status an? )
        {
            Schalter = FALSE; // setzt den Status des Schalters auf aus.
        }
    }
}

Dann moechte ich hier noch einmal erwaehnen, das "Abgucken" ausdruecklich erlaubt ist.
Wenn jemand wo anders, sei es in der Wiki oder in aelteren Scripten nach sieht und es auch noch richtig abschreibt, weiss ich derjenige hat es verstanden.
Von da an ist der naechste Schritt zum selber schreiben in greifbarer naehe.

Nun aber unser AniMesh Script des gestrigen Kurses.
Code:
integer Schalter = FALSE; // Globale Variable fuer den Schalter (Status aus).
string Animation = ""; // Global angelegter Name fuer die Animation.

default
{
    state_entry() // Eingang, wird bei jedem Reset oder Speichern ausgefuehrt.
    {
        if(llGetInventoryNumber(INVENTORY_ANIMATION) > 0) // Abfrage ob mehr als keine Animation im Objekt liegt.
        {
            // Setzt hier den Namen der ersten Animation in die globale Variable ein.
            Animation = llGetInventoryName(INVENTORY_ANIMATION,0);
        }
    }

    touch_start(integer total_number) // Wird beim klicken ausgefuehrt
    {
        if(Animation != "") // Prueft ob ein Name in der globalen Variable eingetragen ist.
        {
            if(Schalter == FALSE) // prueft Schalter ( Status aus? )
            {
                Schalter = TRUE; // setzt den Status des Schalters auf an.
                llStartObjectAnimation(Animation); // Startet die Animation im AniMesh.
            }
            else if(Schalter == TRUE) // prueft Schalter ( Status an? )
            {
                Schalter = FALSE; // setzt den Status des Schalters auf aus.
                llStopObjectAnimation(Animation); // Stopt die Animation im AniMesh.
            }
        }
    }
  
    changed(integer ch) // Wird immer ausgefuehrt, wenn sich am Object irgend etwas aendert.
    {
        if(ch & CHANGED_INVENTORY) // Prueft ob sich der Inhalt des Objects aendert.
        {
            llResetScript(); // resettet das Script.
        }
    }
  
    on_rez(integer Dae) // Wird immer ausgefuehrt, wenn das Object gerezzt wird, auch als Attachment.
    {
        llResetScript(); // resettet das Script.
    }
}
Ja, bei diesem Script handelt es sich tatsaechlich um unseren einfachen Schalter, den wir lediglich um die notwendigen Funktionen erweitert haben, die Animation im Object automatisch auszulesen und per Klick an/aus zu schalten.
Viel mehr kann unser aktuelles Script nicht.

Natuerlich moechte ich euch nicht den Shop vorenthalten, dessen Avatare wir gestern als AniMesh missbraucht haben.
https://marketplace.secondlife.com/de-DE/stores/122082
Die Komplexytaet der meisten Avatare ist ideal fuer AniMesh-NPC's und fuer unsere Zwecke perfekt.

LG
Dae
 
Zuletzt bearbeitet:
Unglaublich, die 10 - 50 Linden$ Mesh Avatare die wir beim letzten Kurs zum Animieren missbraucht haben, werden von einigen auf dem Marketplace nun als offizielle AniMesh Figuren mit Preisen bis zu 500 Linden$ gehandelt.

LG
Dae
 
Es gibt übrigens vier Animesh Regionen um Animesh Sachen zu testen. Sinnigerweise heissen mit Animesh1 - Animesh4.
Der Clou: am Landepunkt gibt es ein Paket mit drei animierten Meshavataren. ein Raptor, ein Lindenbär und ein Typ.
Kann man für 0 L$ kaufen und dort auch gleich rezzen. Die Dinger sind Fullperm inkl. der Animationen und Scripte.

Ich war auf Animesh4

Viel Spaß mit den Viechern:)
 

Users who are viewing this thread

Zurück
Oben Unten