1. Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
    Information ausblenden
  2. 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.
    Information ausblenden
  3. 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.
    Information ausblenden

Scripten Lernen (Deutsch)

Dieses Thema im Forum "Scripting" wurde erstellt von Daemonika Nightfire, 20. März 2018.

?

Wer hat Interesse, Scripte zu verstehen?

Diese Umfrage wurde geschlossen: 24. März 2018
  1. JA

    100,0%
  2. NEIN

    0 Stimme(n)
    0,0%
  1. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.757
    Zustimmungen:
    1.029
    Punkte für Erfolge:
    123
    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
     
  2. Brigitt Loening

    Brigitt Loening Superstar

    Beiträge:
    1.962
    Zustimmungen:
    380
    Punkte für Erfolge:
    83
    Also ich könnte um 18:00 Uhr nicht, aber ich bin da sicher nicht ausschlaggebend.
     
  3. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.757
    Zustimmungen:
    1.029
    Punkte für Erfolge:
    123
    @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
     
    Brigitt Loening gefällt das.
  4. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.757
    Zustimmungen:
    1.029
    Punkte für Erfolge:
    123
    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:

    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
     
  5. Wolwaner Jervil

    Wolwaner Jervil Freund/in des Forums

    Beiträge:
    720
    Zustimmungen:
    71
    Punkte für Erfolge:
    38
    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.
     
  6. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.757
    Zustimmungen:
    1.029
    Punkte für Erfolge:
    123
    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
    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
     
    surini gefällt das.
  7. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.757
    Zustimmungen:
    1.029
    Punkte für Erfolge:
    123
    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
     
    surini gefällt das.
  8. Wolwaner Jervil

    Wolwaner Jervil Freund/in des Forums

    Beiträge:
    720
    Zustimmungen:
    71
    Punkte für Erfolge:
    38
    Gibts diesen Sonntag wieder Kurs?
     
  9. Brigitt Loening

    Brigitt Loening Superstar

    Beiträge:
    1.962
    Zustimmungen:
    380
    Punkte für Erfolge:
    83
    Ja, mir ist nichts anderes bekannt.
     
  10. surini

    surini Aktiver Nutzer

    Beiträge:
    114
    Zustimmungen:
    117
    Punkte für Erfolge:
    44
    Komme diesmal auch wieder , war krank..
     
  11. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.757
    Zustimmungen:
    1.029
    Punkte für Erfolge:
    123
    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
     
  12. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.757
    Zustimmungen:
    1.029
    Punkte für Erfolge:
    123
    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: 8. Dezember 2018
  13. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.757
    Zustimmungen:
    1.029
    Punkte für Erfolge:
    123
    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
     
  14. Tanja Byron

    Tanja Byron Superstar

    Beiträge:
    3.223
    Zustimmungen:
    215
    Punkte für Erfolge:
    64
    War solange ich folgen konnte, wie immer, ein toller Kurs .... Dackeschön Dae:thumpup:
     
    Brigitt Loening gefällt das.
  15. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.757
    Zustimmungen:
    1.029
    Punkte für Erfolge:
    123
    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: 7. Januar 2019
  16. Nepomuk1 Nemeth

    Nepomuk1 Nemeth Neuer Nutzer

    Beiträge:
    8
    Zustimmungen:
    0
    Punkte für Erfolge:
    17
    das hast du wirklich toll und sehr schön formuliert,gefällt mir,danke dir recht herzlichst
     
  17. Tanja Byron

    Tanja Byron Superstar

    Beiträge:
    3.223
    Zustimmungen:
    215
    Punkte für Erfolge:
    64
    Super Dae, mit den Erklärungen in jeder Zeile, was das überhaupt bedeutet. :thumpup:
     
  18. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.757
    Zustimmungen:
    1.029
    Punkte für Erfolge:
    123
    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
     
  19. Natascha Randt

    Natascha Randt Freund/in des Forums

    Beiträge:
    774
    Zustimmungen:
    2.106
    Punkte für Erfolge:
    103
    Animesh ist ja mal der Hammer!
    Vielen Dank für das Script, scripten und programmieren ist nicht so meins ...

    Mußte ich gleich mal mit einer Kohorte Cybermen testen :)

     
  20. Natascha Randt

    Natascha Randt Freund/in des Forums

    Beiträge:
    774
    Zustimmungen:
    2.106
    Punkte für Erfolge:
    103
    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:)
     

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden