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.515
    Zustimmungen:
    653
    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.835
    Zustimmungen:
    311
    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.515
    Zustimmungen:
    653
    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.515
    Zustimmungen:
    653
    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:
    707
    Zustimmungen:
    62
    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.515
    Zustimmungen:
    653
    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.515
    Zustimmungen:
    653
    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:
    707
    Zustimmungen:
    62
    Punkte für Erfolge:
    38
    Gibts diesen Sonntag wieder Kurs?
     
  9. Brigitt Loening

    Brigitt Loening Superstar

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

    surini Aktiver Nutzer

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

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.515
    Zustimmungen:
    653
    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.515
    Zustimmungen:
    653
    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 um 16:55 Uhr

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deinem Erleben 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