Chatlog vom 04.08.13 Skript-Kurs

* Schedules and informations about training seminars
* Termine und Informationen über Schulungs-Seminare

Chatlog vom 04.08.13 Skript-Kurs

Beitragvon Sheera Khan » So 4. Aug 2013, 18:19

Translate to English translate to German Translate to French Translate to Italian Translate to Spanish Translate to Portuguese Translate to Czech Перевести на русский язык 翻译成中国

This chatlog contains the essence of the session. I deleted some lines for better readability. I'll post a german translation later this day (I hope).

Eine deutsche Übersetzung ist in Arbeit und folgt gleich.

[04:11] Fu Barr: okay so let's run through the script and do a bit of teaching :)
[04:12] Fu Barr: first of all, we see a lump of orange stuff at the top.
[04:12] Fu Barr: the viewers turn any lines in a script that have '//' as the first two characters into a comment
[04:12] Fu Barr: which means the programming engine skips these lines
[04:13] Fu Barr: which is great because you can leave yourself notes in your code so you dont forget why you made certain coding decisions...
[04:14] Fu Barr: comments are used mainly for reminding you or others WHY you did something.
[04:14] Fu Barr: not WHAT you are doing in the code.
[04:14] Fu Barr: WHAT has to come from the code itself.
[04:15] Fu Barr: if you want to know what the code is doing, read the code. Try not to use comments for What, but for Why.
[04:15] Fu Barr: and also of course to threaten your fellow avatars with terrible things if they steal your code.
[04:15] Fu Barr: but that goes without saying *chuckle*
[04:16] Fu Barr: below the orange comments block, you'll see that i've setup a few variables
[04:16] Fu Barr: they are in 3 'groups'
[04:16] Fu Barr: the first two groups only have 1 variable in them, the last group has 3
[04:16] Fu Barr: i group and order these variables by 'access'
[04:17] Fu Barr: the whole point of this script is to give out an invitation to a group.
[04:17] Fu Barr: so the most important user modifiable item is the UUID of the group.
[04:18] Fu Barr: we've talked about UUIDs before - they are the unique numbers that every item in our virtual world has
[04:18] Fu Barr: so my groups UUID is the one I'm using
[04:19] Fu Barr: if somebody wanted to use the script to invite to another group... the only thing they would have to change is the UUID here at the top. the rest of the script would work exactly the same.
[04:20] Fu Barr: now another item that a user might want to change is a variable that keeps track of a TRUE/FALSE value which i use as a 'guard' to toggle certain parts of the script. At the moment I've set it to 'FALSE'.
[04:21] Fu Barr: we'll see in the script what that means :)
[04:21] Fu Barr: the rest of the variable are all lumped together as i never set them myself but the script needs them.
[04:22] Fu Barr: so that's the pre-amble. now let's look at our state and the eventhandlers in it.
[04:22] Fu Barr: as you can see there's only one state, the Default state.
[04:22] Fu Barr: inside the state bracket block you'll find 3 event handlers
[04:23] Fu Barr: state_entry(), touch_end() and listen()
[04:23] Fu Barr: it seems that the only times that i want the script to do something is 1. when the Default state starts (ie. when the script starts running)
[04:24] Fu Barr: 2. when somebody touches the prim this script is in
[04:24] Fu Barr: 3. when the script hears something in the general chat
[04:24] Fu Barr: so let's step back a bit and map these 3 events to how i want the script to behave.
[04:25] Fu Barr: what i want is a script that listens to general chat and when somebody asks for it, gives an invite to my group.
[04:26] Fu Barr: so if you say "I Sheera of sound mind and body do hereby request an invite to Fu's group"
[04:27] Fu Barr: so once the script senses that you Sheera of the House Khan want to join the group, the script sends you an 'invite'.
[04:28] Fu Barr: The thing is that here as a scripter you sort of need to understand how the system works to make the magic happen
[04:28] Fu Barr: there is no direct function 'inviteAvvyToGroup()
[04:29] Fu Barr: what you need to do is print a link in chat so the user can click it and then the system shows the group info dialog and there the user can choose to 'join' the group.
[04:29] Fu Barr: so the basic flow of the script is....
[04:29] Fu Barr: 1. listen to general chat
[04:29] Fu Barr: 2. figure out that somebody wants to join
[04:30] Fu Barr: 3. send an IM with the group info link to that person
[04:30] Fu Barr: 4. go back to listening to the general conversation
[04:31] Fu Barr: so this explains the 3 events we have
[04:31] Fu Barr: 1. event 1: the script starts, do some housekeeping and setup.
[04:31] Fu Barr: 2. event 2: you hear something, so react
[04:32] Fu Barr: 3. event 3: the scripter wanted quick access to the reaction, so he hooked up the same function to the touch_end event
[04:32] Fu Barr: because otherwise you have to talk and talk and talk when you are debugging... and who needs that :)
[04:33] Fu Barr: so now let's look at what happens in the state_entry() event handler...
[04:34] Fu Barr: well inside the state_entry() bracket block we see that i do some more variable work.
[04:34] Fu Barr: i fill the variables i defined outside the Default bracket-block
[04:35] Fu Barr: first i format the group UUID as an URL of type 'secondlife'
[04:35] Fu Barr: URLs can be of many types... ftp, http and also secondlife - as long as the system recognises the value. and our viewers do.
[04:37] Fu Barr: then i do some string manipulation to generate the 'correct' url so that the link is valid in the chat window. this is just boiler plate stuff
[04:42] Fu Barr: so after i make the URL string, i make the instruction string and stick it into 'invite_message', then I set the channel variable to 0 (because 0 is the general chat channel)
[04:43] Fu Barr: and finally I find out what the UUID is of the owner of the prim this script is attached to. if you stick the script into your own prims, that UUID will be your UUID :)
[04:43] Fu Barr: so that's the last bit of setup in the script
[04:44] Fu Barr: these are all things that i want the script to do ONCE, when the script starts running
[04:44] Fu Barr: ie when the event Default state is entered happens
[04:45] Fu Barr: so now that i have all my variable housekeeping out of the way....
[04:45] Fu Barr: i need to tell the script to start listening
[04:46] Fu Barr: llListen() is the function that lets me do that
[04:46] Fu Barr: but like many functions it needs parameters which tell it stuff it needs to know to work properly.
[04:46] Fu Barr: llListen() takes 4 parameters
[04:46] Fu Barr: 1. the number of the chat channel to listen to
[04:47] Fu Barr: 2. the name of the talker to listen to
[04:47] Fu Barr: 3. the UUID of the talker to listen to
[04:47] Fu Barr: 4. a particular message
[04:48] Fu Barr: the functions you need are in the rest of the script and we'll explain them in a minute :)
[04:48] Fu Barr: so
[04:48] Fu Barr: in our case...
[04:49] Fu Barr: i want the llListen to listen to general chat, and listen to all of it
[04:49] Fu Barr: so i dont tell the script a name, UUID or message to listen to
[04:51] Fu Barr: only a channel number - which i put into a variable because if i read my code in 5 months time.. and i just read a number... i won't remember what it means.. if i put the number in a variable with a name.. the code itself becomes my documentation.... i dont need comments to tell me WHAT i was doing here... the variable name helps me understand my own code :)
[04:51] Fu Barr: of course this is a very very simple piece of code, so it seems a little overkill... but it's good to get into the habit of coding this way.
[04:52] Fu Barr: so once i've put the channel number and nothing else into the lListen function..... all I need to do is tell the world that it's ready to Rock n Roll!
[04:52] Fu Barr: which I do with a LOUD llSay()
[04:53] Fu Barr: and that is the whole section of setup for my script.
[04:53] Fu Barr: a bunch of string variables with URL and message. a llListen and a 'im ready now' feedback
[04:54] Fu Barr: so let's move on to the touch_end() event handler
[04:54] Fu Barr: inside the touch_end() brackets we find a condition.
[04:55] Fu Barr: if(something) { do this stuff }
[04:55] Fu Barr: we haven't spoken about cotrol structures yet because I'm trying a new way of introducing them into the sessions
[05:00] Fu Barr: what i want is to only respond to a click if i set my DEBUG variable to TRUE
[05:00] Fu Barr: at the top of my script, under the orange stuff
[05:00] Fu Barr: but because it's set to FALSE now, it doesn't do what is inside the if-funtion brackets
[05:02] Fu Barr: so yes, the script will react to the touch event and fire the touch_event handler... but because the if-condition is testing DEBUG and DEBUG is set by me to FALSE.... the if 'skips' over all the code inbetween its brackets... so the netto result of the touch_end() event handler is NOTHING
[05:02] Fu Barr: touch_end() does nothing in this case
[05:02] Fu Barr: the flow is:
[05:03] Fu Barr: user clicks -> touch_end() is called -> if-condition evaluates the DEBUG value, which is set to FALSE -> the rest of the code inside the if-brackets is skipped -> the touch_end() event handler ends.
[05:04] Fu Barr: so lots of stuff is happening inside the script, but nothing happens out here in the world.
[05:05] Fu Barr: which is EXACTLY what i wanted, because in this case i'm using the touch event only to help me test my script. it's not really part of my original plan for the script.
[05:05] Fu Barr: now we can argue if in a real script i would want to not allow clicking to join a group... but for this educational example it's exactly the behaviour i want to have :)
[05:06] Fu Barr: so that's 2 out of 3 event handlers explained
[05:06] Fu Barr: now let's go to the last one where we react if we hear somebody asking for an invite
[05:06] Fu Barr: the listen() event handler is where all the actual work is done.
[05:07] Fu Barr: again we have a DEBUG related if... can anybody tell me what this DEBUG line does... if DEBUG were set to TRUE?
[05:08] Fu Barr: start on the inside of the fuction parametrs
[05:09] Fu Barr: first the function llKey2Name() called
[05:09] Fu Barr: with on parameter... 'id'
[05:09] Fu Barr: where does id come from?
[05:09] Fu Barr: it comes form the listen() event handler parameter list
[05:09] Fu Barr: and that mirrors the llListen()...
[05:10] Fu Barr: llListen(channel, name, key, message)
[05:10] Fu Barr: listen(channel, name, key, message)
[05:11] Fu Barr: so the id parameter is the UUID of the talker detected by the event handler
[05:11] Fu Barr: it would be something like 342534523-2345-ffre6-356-3566
[05:12] Fu Barr: which makes no sense to me as a human so i want to change that UUID into the name
[05:12] Fu Barr: so i use the function llKey2Name(this_silly_uuid)
[05:12] Fu Barr: and that looks up the name of the avvy with the silly uuid
[05:12] Fu Barr: of course i can just use the name parameter, but then i cant teach what i just explained - lol
[05:13] Fu Barr: then the name gets echoed to the chat of the owner by llOwnerSay()
[05:13] Fu Barr: so fine that's the DEBUG stuff.
[05:13] Fu Barr: now to the real bit
[05:14] Fu Barr: the if-conditional here is important
[05:14] Fu Barr: what it does is it checks to see if the first 7 characters of the chat line it heard is "/signup"
[05:15] Fu Barr: remember we start counting from 0 in computers...
[05:17] Fu Barr: so as you can see we're using a LSL function to get a RANGE OF CHARACTERS from the message.
[05:18] Fu Barr: then we see if that range MATCHES a pattern and if it does we say 'oh this is what i was looking for now do this'
[05:18] Fu Barr: so of course the script doesn't understand ANYTHING it just tries to match a sub-string to a pattern.
[05:19] Fu Barr: so once the pattern has been matched... the code in the if-brackets runs....
[05:19] Fu Barr: if the if-condition doesn't match.... the code is skipped... and the event handler ends.
[05:20] Fu Barr: so once it's matched i create a local variable, and make a greeting
[05:20] Fu Barr: the i have another pointless debug if-condition not going to explain those anymore...
[05:21] Fu Barr: but at the very end of the listen hander i call the llInstantMessage() function twice
[05:21] Fu Barr: the parameters are (of course) 1. the UUID of the avatar to send the message to, and 2. the message to send
[05:22] Fu Barr: i call the funciton twice because i want to send two bits of info and i was too lazy to use string manipulation to make on big fat message string
[05:22] Fu Barr: also it's good programming style to be modular
[05:22] Fu Barr: so two IM function calls.... one to say hello
[05:22] Fu Barr: one to send the group URL
[05:22] Fu Barr: and then the handler ends.
[05:22] Fu Barr: ie. you have to close all the brackets properly.
[05:22] Fu Barr: and that, my friends, is that.
[05:23] Fu Barr: a short script to react to a spoken request for a group join link

A little discussion emerged from a question:
[05:27] Fu Barr: maybe you should think more of semi-colon after each complete set of lines of a function call.
[05:27] Fu Barr: so for example this is valid code:
[05:27] Fu Barr: llSay(
[05:27] Fu Barr: 0,
[05:27] Fu Barr: "Valid"
[05:27] Fu Barr: );
[05:27] Fu Barr: even though it's on 4 lines

[05:28] Fu Barr: the general concepts finally one more time:
[05:29] Fu Barr: use comments for WHY not WHAT, let the code speak for WHAT and to do so use sensible, discriptive variable names
[05:30] Fu Barr: look at the structure first, state->event handlers->if conditions->functions
[05:30] Fu Barr: and try to construct your strings etc. in manageble chunks... dont use MEGA strings... better to use smaller ones and call a functions on each one of them
[05:30] Fu Barr: i think that's about it for today
Sheera Khan
Beiträge: 969
Registriert: Fr 22. Mär 2013, 14:18

Re: Skript vom 04.08.13 Skript-Kurs

Beitragvon Sheera Khan » So 4. Aug 2013, 18:21

Translate to English translate to German Translate to French Translate to Italian Translate to Spanish Translate to Portuguese Translate to Czech Перевести на русский язык 翻译成中国

Code: Alles auswählen
// Fu's Group-o-phone script
// a voice activated group inviter thing with touch fallback.
// version 1.1, August 2013 at Isle of Barr on the Metropolis grid.
// (c)2013 under the GPL by Fu Barr.
// Copying this script without crediting me and leaving the GPL notice up top
// or selling this on the Linden Grid for a few measly linders to unsuspecting newbies,
// is exceptionally bad manners and will cause the Prim Gods to curse you with 7 years of
// Dead Breedables, Bad Crashes and Irretrievable Inventory Loss.
// Don't say I didn't warn you.

string  group_uuid = "8e5b7bb4-b235-4e2f-a6f5-41832093eb65"; // Fu's Fab Group

integer DEBUG = FALSE;

string  group_url;
string  invite_message;
integer chat_channel;

default {

    state_entry() {

        group_url       = "secondlife:///app/group/" + group_uuid + "/about";
        invite_message  = "Please click this link: " + group_url + " and then add yourself to the group.";
        chat_channel    = 0;
        key owner       = llGetOwner();

        llListen(chat_channel, "", NULL_KEY, "");

        llSay(0, " is operational.");
    touch_end(integer count) {

        if(DEBUG) {

            llInstantMessage(llDetectedKey(0), invite_message);
    listen(integer chan, string name, key id, string msg) {
        if(DEBUG) {
        if(llGetSubString(msg, 0, 6) == "/signup") {
            string greeting = "Welcome, " + llKey2Name(id) + ".";

            if(DEBUG) {
            llInstantMessage(id, greeting);
            llInstantMessage(id, invite_message);
Sheera Khan
Beiträge: 969
Registriert: Fr 22. Mär 2013, 14:18

Re: Chatlog vom 04.08.13 Skript-Kurs (Übersetzung de)

Beitragvon Sheera Khan » So 4. Aug 2013, 19:19

Translate to English translate to German Translate to French Translate to Italian Translate to Spanish Translate to Portuguese Translate to Czech Перевести на русский язык 翻译成中国

Die Übersetzung ist stellenweise nicht wörtlich, aber wie ich hoffe gut lesbar - Viel Spaß :-)

[04:11] Fu Barr: Nun denn, lasst uns mal das Skript durchsehen und mit dem Kurs beginnen
[04:12] Fu Barr: Als erstes sehen wir einen orangefarbenen Klumpen zu Beginn des Skripts.
[04:12] Fu Barr: Der Viewer verwandelt alle Zeilen, die mit "//" beginnen in Kommentare
[04:12] Fu Barr: Das bedeutet, dass die Skript-Engine diese Zeilen ignoriert
[04:13] Fu Barr: Das ist gut so, denn so kann man im Skript-Code seine Gedanken dokumentieren, warum man etwas gerade so und nicht anders implementiert hat
[04:14] Fu Barr: Kommentare dienen dazu andere und sich selbst daran zu erinnern, WARUM man etwas so gemacht hat
[04:14] Fu Barr: nicht WIE man es gemacht hat.
[04:14] Fu Barr: Das WARUM steht im Programm-Code selber.
[04:15] Fu Barr: Wenn Du wissen willst, was der Programm-Code macht, dann lies ihn. Benutze keine Kommentare dafür, die sind für das WARUM.
[04:15] Fu Barr: Und außerdem kann man in den Kommentaren wüste Drohungen gegen diejenigen ausstoßen, die den Programm-Code klauen ;-)
[04:15] Fu Barr: Aber das versteht sich von selbst.
[04:16] Fu Barr: Unter dem Kommentarblock seht ihr 3 Gruppen von Variablen.
[04:16] Fu Barr: In den ersten beiden Gruppen ist nur jeweils eine Variable, die dritte Gruppe umfasst 3 Variable.
[04:16] Fu Barr: Ich gruppiere und ordne die Variablen nach dem Zugriff darauf.
[04:17] Fu Barr: Der Sinn dieses Skriptes besteht darin, eine Gruppeneinladung zu versenden.
[04:17] Fu Barr: Für den Benutzer ist daher das wichtigste, die Gruppen UUID anpassen zu können.
[04:18] Fu Barr: Wir haben bereits früher über die UUIDs gesprochen - das sind die eindeutigen Kennungen, die jedes Ding in unserer virtuellen Welt hat.
[04:18] Fu Barr: Daher ist die UUID meiner Gruppe diejenige, die in dem Skript verwendet wird.
[04:19] Fu Barr: Wenn jemand das Skript verwenden möchte für eine andere Gruppe... er müsste nur die Variable am Anfang des Skripts anpassen. Der Rest des Skriptes würde unverändert weiter funktionieren.
[04:20] Fu Barr: Eine weitere Sache, die der Benutzer gerne ändern möchte, ist eine Variable, die mit ihrem TRUE/FALSE Wert die Ausführung bestimmter Code-Bestandteile steuert. Zu diesem Zeitpunkt steht sie erstmal auf FALSE.
[04:21] Fu Barr: Wir werden später im Skript sehen, wozu sie gut ist ;-)
[04:21] Fu Barr: Die restlichen Variablen stehen alle auf einem Haufen. Wir setzen dort keine Werte ein, aber das Skript braucht sie im weiteren Verlauf..
[04:22] Fu Barr: So, das war die Präambel. Schauen wir uns nun den state (Zustand) und die Event-Handler an.
[04:22] Fu Barr: Wie sie sehen, gibt es nur einen einzigen Zustand, den "default"-state.
[04:22] Fu Barr: Innerhalb der begrenzenden Klammern des states gibt es drei Event-Handler.
[04:23] Fu Barr: state_entry(), touch_end() and listen()
[04:23] Fu Barr: Das Skript soll nur dann etwas tun, wenn: 1. der "default"-state aufgerufen wird (d.h. das Programm zu laufen beginnt)
[04:24] Fu Barr: 2. jemand auf den Prim klickt, der das Skript enthält
[04:24] Fu Barr: 3. das Skript im lokalen Chat etwas liest
[04:24] Fu Barr: Lasst uns einen Schritt zurückgehen und ansehen, wie die Events den erwünschten Verhaltensweisen des Skripts zugeordnet sind:.
[04:25] Fu Barr: Ich möchte ein Skript haben, das am öffentlichen Chat lauscht und auf Anforderung eine Einladung in eine Gruppe versendet..
[04:26] Fu Barr: Wenn Du also sagst: "Ich, Sheera Khan, fordere im Vollbesitz meiner geistigen und körperlichen Kräfte eine Einladung in Fu's Gruppe.",
[04:27] Fu Barr: dann soll das Skript erkennen, dass Du, Sheera aus dem Hause Khan, der Gruppe beitreten möchtest und Dir eine Einladung senden.
[04:28] Fu Barr: Dazu musst Du als Skripter verstehen, wie das System arbeitet, damit die magischen Dinge passieren.
[04:28] Fu Barr: Denn es gibt keine Funktion 'inviteAvvyToGroup()'.
[04:29] Fu Barr: Du musst einen Text mit einem Link in den Chat schreiben, auf den der Benutzer klicken kann. Dann zeigt das System den Info-Dialog zu der Gruppe und der Benutzer kann beitreten..
[04:29] Fu Barr: Der Ablauf des Skriptes ist also....
[04:29] Fu Barr: 1. höre auf den allgemeinen offenen Chat
[04:29] Fu Barr: 2. versuche herauszufinden, ob jemand der Gruppe beitreten möchte
[04:30] Fu Barr: 3. schicke eine IM an den Benutzer mit dem Link zur Info-Seite der Gruppe
[04:30] Fu Barr: 4. gehe wieder zurück und horche weiter am öffentlichen Chat
[04:31] Fu Barr: Das erklärt die drei Events, die wir haben:
[04:31] Fu Barr: 1. event 1: Wenn das Skript startet erledige einige interne, vorbereitende Arbeiten.
[04:31] Fu Barr: 2. event 2: Wenn du etwas hörst, so reagiere darauf.
[04:32] Fu Barr: 3. event 3: Der Entwickler wollte eine schnelle Testmöglichkeit und hat daher dieselbe Funktionalität in das touch_end() Ereignis gelegt.
[04:32] Fu Barr: weil er andernfalls während der Erprobung des Skriptes ständig chatten müsste.
[04:33] Fu Barr: Lasst uns also schauen, was im state_entry() Event Handler passiert...
[04:34] Fu Barr: Innerhalb des state_entry() Anweisungsblocks sehen wir weitere Zuweisungen an die verschiedenen Variablen.
[04:35] Fu Barr: Zuerst wandele ich die UUID der Gruppe um in eine URL für den Link, auf den der Benutzer klicken möge. Diese hat den Typ "secondlife://..." (auch in Metropolis)
[04:35] Fu Barr: URLs können verschiedene Typen haben... ftp, http und eben auch secondlife - solange das System sie erkennt - und unsere Viewer können damit umgehen.
[04:37] Fu Barr: Nachdem ich die URL aus einigen Textbausteinen und der Gruppen-UUID zusammengesetzt habe,
[04:42] Fu Barr: erstelle ich damit einen Hinweis für den Benutzer, wie er damit umgehen solle, dann setze ich den Ausgabe-Channel auf 0 (0 steht für den öffentlichen Chat).
[04:43] Fu Barr: Zum Schluss ermittele ich die UUID des Eigentümers des Prims, in dem das Skript steckt. Wenn das Skript sich in einem Ihrer Prims befindet, wird das Ihre UUID sein :)
[04:43] Fu Barr: Damit ist die Initialisierung des Skriptes abgeschlossen.
[04:44] Fu Barr: All diese Dinge sollen nur einmal erfolgen - beim Start des Skriptes.
[04:44] Fu Barr: wenn also das Ereignis state_entry() des "default"-states eintritt.
[04:45] Fu Barr: Nun, da wir die Verwaltung unserer Variablen erledigt haben....
[04:45] Fu Barr: muss ich dem Skript mitteilen, dass es den allgemeinen Chat belauschen soll.
[04:46] Fu Barr: llListen() ist die Funktion, mit der man das erreicht.
[04:46] Fu Barr: Wie so viele andere Funktionen benötigt auch diese eine Reihe von Angaben, um funktionieren zu können.
[04:46] Fu Barr: llListen() benötigt 4 Parameter, von denen nicht alle mit Werten versehen sein müssen:
[04:46] Fu Barr: 1. Die Nummer des Kanals, der abgehört werden soll
[04:47] Fu Barr: 2. Den Namen des Avatars, auf den das Skript hören soll
[04:47] Fu Barr: 3. Die UUID des Avatars, auf den das Skript hören soll
[04:47] Fu Barr: 4. Eine genaue Nachricht, auf die gewartet werden soll.
[04:48] Fu Barr: Die weiteren benötigten Funktionen stehen weiter unten im Skript und wir besprechen sie gleich.
[04:48] Fu Barr: In unserem Fall:
[04:49] Fu Barr: Ich möchte, dass llListen am allgemeinen Chat lauscht (Kanal 0) und das unabhängig vom Avatar (Name bzw. UUID also leer). Außerdem soll das Skript jede Textzeile bearbeiten.
[04:49] Fu Barr: Daher lasse ich den Avatar-Namen leer, übergebe den NULL_KEY als Avatar-ID und lasse auch den Wert für die gesuchte Nachricht leer.
[04:51] Fu Barr: Ich übergebe also nur die Kanal-Nummer, die ich oben in eine Variable gepackt habe. Wenn ich mir in einiger Zeit das Skript wieder ansehen würde und nur die Nummer selbst sähe... Ich wüsste kaum, was sie bedeutet.. Packe ich sie dagegen in eine Variable mit aussagekräftigen Namen wird der Code selbst dokumentierend..... Ich brauche keine Kommentare mehr, die mir sagen WAS ich tue... Der Variablenname hilft mir beim Verstehen des Codes. :)
[04:51] Fu Barr: Natürlich ist ds hier nur ein sehr kleines Beispiel und da scheint es übertrieben... aber man sollte sich an diese Art der Programmierung gleich gewöhnen
[04:52] Fu Barr: Nachdem die Channel-Nummer an die Funktion lListen übergeben wurde..... kann ich der Welt mitteilen, dass das Skript bereit ist für den großen Einsatz!
[04:52] Fu Barr: Ich mache das hier mit einem lauten llSay()
[04:53] Fu Barr: Und damit wäre der Initialisierungsteil des Skriptes beendet.
[04:53] Fu Barr: Einige Variablen mit URL und Texten. ein llListen() und eine "ich bin fertig" Meldung.
[04:54] Fu Barr: Lasst uns nun zum touch_end() Event Handler kommen.
[04:54] Fu Barr: Innerhalb der touch_end() Klammern finden wir eine Bedingung.
[04:55] Fu Barr: if( Bedingung ) { mache irgendwas }
[04:55] Fu Barr: Wir haben bisher noch nicht über die Kontrollstrukturen gesprochen, weil ich eine neue Methode ausprobieren wollte, sie einzuführen.
[05:00] Fu Barr: Ich möchte, dass das Skript nur dann auf einen Mausklick reagiert, wenn die Variable DEBUG auf den Wert TRUE gesetzt ist.
[05:00] Fu Barr: Zu Beginn des Skriptes, unter dem orangefarbenem Kommentarblock
[05:00] Fu Barr: aber derzeit ist die Variable auf FALSE gesetzt, daher wird der Code in den Klammern nicht ausgeführt.
[05:02] Fu Barr: Ja, beim Anklicken des Prims wird der touch_end Event Handler aufgerufen... weil aber die if-Anweisung die DEBUG-Variable abfragt und diese auf FALSE gesetzt ist.... überspringt das if alle Anweisungen zwischen den Klammern... im Endeffekt macht der touch_end() Event Handler also GAR NICHTS.
[05:02] Fu Barr: touch_end() tut also derzeit nichts.
[05:02] Fu Barr: Der Ablauf ist:
[05:03] Fu Barr: Der Benutzer klickt -> touch_end() wird aufgerufen -> die if-Anweisung ermittelt den DEBUG-Wert, dieser ist auf FALSE gesetzt -> die restlichen Anweisungen innerhalb der Klammern werden übersprungen -> der touch_end() Event Handler beendet sich.
[05:04] Fu Barr: In dem Skript passiert also eine ganze Menge, aber nichts davon wird außerhalb sichtbar.
[05:05] Fu Barr: Das ist GENAU was ich erreichen wollte,denn in meinem Fall wollte ich das touch_end Event nur zum Testen verwenden. Es ist kein Bestandteil meines Plans für das Endprodukt.
[05:05] Fu Barr: Man könnte argumentieren, dass es sinnvoll wäre, einen Klick durch den Benutzer als Anforderung für die Gruppeneinladung zuzulassen... aber für die Zwecke des Kurses wollte ich es genu so haben :)
[05:06] Fu Barr: So, zwei der drei Event Handler wären damit erklärt.
[05:06] Fu Barr: Nun zum letzten, in dem wir darauf reagieren, wenn jemand eine Gruppeneinladung anfordert.
[05:06] Fu Barr: Der listen() Event Handler ist es, in dem die eigentliche Arbeit erfolgt.
[05:07] Fu Barr: Und wieder haben wir eine if-Anweisung mit dem DEBUG-Wert... Was würde passieren, wenn DEBUG auf TRUE gesetzt wäre?
[05:09] Fu Barr: zuerst wird die Funktion llKey2Name() aufgerufen
[05:09] Fu Barr: mit einem einzigen Parameter... 'id'
[05:09] Fu Barr: Wo kommt diese Id her?
[05:09] Fu Barr: Sie kommt aus der Parameterliste des listen() Event Handlers.
[05:09] Fu Barr: Und die ähnelt derjenigen von llListen()...
[05:10] Fu Barr: llListen(channel, name, key, message)
[05:10] Fu Barr: listen(channel, name, key, message)
[05:11] Fu Barr: Der id Parameter ist die UUID des Benutzers, der die Textzeile in den Chat geschrieben hat
[05:11] Fu Barr: Also so etwas ähnliches wie 342534523-2345-ffre6-356-3566
[05:12] Fu Barr: Was für mich als Menschen unverständlich ist, daher hätte ich lieber den Namen des Avatars.
[05:12] Fu Barr: Daher benutze ich die Funktion llKey2Name(this_silly_uuid)
[05:12] Fu Barr: und die sucht den Namen des Avatars mit der UUID aus der Datenbank heraus.
[05:12] Fu Barr: Ich hätte natürlich genauso gut gleich den Name-Parameter verwenden können,aber dann hätte ich das eben nicht erklären können - lol
[05:13] Fu Barr: Der Name des Avatars wird dann via llOwnerSay() an den Prim-Eigentümer weitergesagt
[05:13] Fu Barr: Soweit zum DEBUG Kram.
[05:13] Fu Barr: Nun zum normalen Ablauf
[05:14] Fu Barr: Die if-Abfrage ist hier wichtig
[05:14] Fu Barr: Sie überprüft, ob die ersten 7 Zeichen der Chatzeile mit der Zeichenfolge "/signup" übereinstimmen.
[05:15] Fu Barr: Computer beginnen die Zählung mit 0...
[05:17] Fu Barr: und wir benutzen eine LSL Funktion um einen BEREICH VON ZEICHEN aus der Nachricht zu extrahieren..
[05:18] Fu Barr: Dann schauen wir nach, ob dieser Bereich mit einem Vergleichsmuster übereinstimmt und wenn das der Fall ist sagen wir: "Oh, das ist genau das, wonach ich suchte. Machen wir nun also folgendes..."
[05:18] Fu Barr: Natürlich versteht das Skript nicht den Text der Nachricht. Es kann nur Textmuster vergleichen.
[05:19] Fu Barr: und wenn die Muster übereinstimmen... dann wird der Code innerhalb der if-Klammern ausgeführt....
[05:19] Fu Barr: ist die if-Bedingung dagegen nicht erfüllt.... wird der Code in den Klammern übersprungen... und der Event Handler wird beendet.
[05:20] Fu Barr: Wenn die Muster denn übereinstimmen erstelle ich eine lokale Variable greeting.
[05:20] Fu Barr: Und eine weitere sinnlose DEBUG-Abfrage, auf die ich nicht mehr eingehen möchte...
[05:21] Fu Barr: Aber am Schluss des listen Event Handlers rufe ich die llInstantMessage() Funktion zweimal auf
[05:21] Fu Barr: Die Parameters sind (natürlich) 1. die UUID des Avatars, dem die Nachricht gesendet werden soll, und 2. die zu sendende Nachricht selbst
[05:22] Fu Barr: Ich rufe die Funktion zweimal auf, weil ich zwei Nachrichten versenden möchte und zu faul war daraus eine längere Nachricht zu machen ;-)
[05:22] Fu Barr: außerdem ist es ein besserer Programmierstil
[05:22] Fu Barr: der erste Aufruf schickt also ein "Hallo" an den Avatar
[05:22] Fu Barr: und der zweite die URL für den Gruppenbeitritt
[05:22] Fu Barr: und damit endet der Event Handler..
[05:22] Fu Barr: Wir müssen also nur noch alle Klammern sauber schließen.
[05:22] Fu Barr: Und das war's dann Freunde :-)
[05:23] Fu Barr: Ein kurzes Skript, das auf Anforderung im Chat eine Gruppeneinladung versendet.

Eine kleine Diskussion entsprang der anschließenden Fragerunde:
[05:27] Fu Barr: Das Semikolon beendet eine vollständige Anweisung, und nicht unbedingt eine Zeile.
[05:27] Fu Barr: die folgende Anweisung wäre so korrekt:
[05:27] Fu Barr: llSay(
[05:27] Fu Barr: 0,
[05:27] Fu Barr: "Valid"
[05:27] Fu Barr: );
[05:27] Fu Barr: obwohl sie sich über vier Zeilen erstreckt

[05:28] Fu Barr: Zum Abschluss nochmal das generelle Konzept:
[05:29] Fu Barr: verwende Kommentare für das WARUM, und nicht für's WIE, lasse den Code für das WIE sprechen und verwende vernünftige sprechende Variablennamen
[05:30] Fu Barr: Schaue zuerst auf die Struktur, state -> Event Handlers -> if-Abfragen -> Funktionen
[05:30] Fu Barr: und verwaltet eure Zeichenketten etc. in vernünftigen Abschnitten... benutzt keine Riesen-Strings... es ist besser mit kleineren Einheiten zu arbeiten und gegebenenfalls die Funktionen mhrfach aufzurufen
[05:30] Fu Barr: das war's für heute
Sheera Khan
Beiträge: 969
Registriert: Fr 22. Mär 2013, 14:18

Zurück zu MetroAcademy

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

Powered by phpBB

Deutsche Übersetzung durch

Style designed by Artodia.