allora, iniziamo l'idea era di far partire delle lezioni di script intermedi che fossero produttivi sulla lavagna vedete il programma che intendevo fare una lezione propedeutica (questa) per fare un riepilogo delle varie cose e poi una serie di lezioni su come scriptare oggetti ed approfondire tematiche 1: comunicare a distanza 2. rezzare oggetti 3. sensori e sonde 4. object inventory 5. lettura di notecard 6. costruzione di un vendor poi si pensava di fare anche corsi avanzati allora adesso vediamo le slide che ho preparato alcune probabilmente sono banali però le ho messe lo stesso perchè qualcuno potrebbe non saperle come vedete ho cominciato proprio con come si fa uno script poi si passa alla sintassi dello scripting e poi si vede come funzionano alcuni comandi fondamentali se per voi le cose sono troppo elementari, ditemelo facciamo una piccola indagine quanti di voi sanno bene come si fa uno script? perfetto, allora vado un po' veloce il sistema b) che vedete qua "create new script" dal content di un oggetto è il più veloce, ma ad esempio non funziona ancora con opensim invece creare uno script nell'inventory e poi trascinarlo sul content dell'oggetto funziona sempre anche se è un po' scomodo quando avete lo script creato con doppio click o con tasto destro open potete editarlo vedere sulla lavagna gli appunti sull'uso del copia / incolla credo che siano cose ovvie per voi giusto? è utile per cercare il testo e la sintassi viene spiegata discretamente dall'editor "embedded" nel vostro browser passando sopra una istruzione vi dice esattamente la sintassi e i parametri ok, passiamo allo stato dello script potete mettere uno script in stato NON running per fermarne l'esecuzione oppure fare il reset dello script quando uno script è non running mantiene tutte le informazioni che stava elaborando è un po' come quando lo mettete nell'inventory si "sospende" quando invece gli fate il reset perde tutte le sue informazioni il reset è l'unico modo per ripristinare uno stato di stack/collision vale a dire quando aveter mandato in "overflow" la memoria degli script che come sapete è molto bassa :( ci sono solo 16Kbyte ma in realtà di usabili effettivamente ce ne sono molto meno perchè bisogna lasciare spazio con il nuovo motore MONO lo spazio utilizzabile aumenta ma non in modo eccezionale :( è chiaro? questo invece è importante gli script hanno la tendenza a "fare i capricci" non funzionano quasi mai al primo colpo :) quindi occorre abituarsi all'idea di mettere istruzioni di debug per capire cosa stanno facendo io le metto sempre, anche quando magari non le userò questione di abitudine poi ognuno ha uno stile personale quindi quello che vi dico non è detto che debba essere la "verità rivelata" anzi cmq, la cosa più semplice è quella di fare dire all'oggetto con llSay in punti opportuni delle informazioni molti usano llOwnerSay oppure llSay(0 ad esempio llOwnerSay("Sono stato toccato, x vale "+(string)x); è sempre bello verificare il valore delle variabili che sia quello che ci aspettiamo qui consiglio di usare come metodo di debug un canale, il 10 che non è quello normalmente usato per chattare e nemmeno l'ownersay in modo tale che se per caso vi dimenticate il debug attivo non abbiate sporcamenti sulle vostre finestre scrivere sul canale 10 potete sempre avere un tool che vi legga il canale 10 e vi rimandi i debug a voi o sul canale 0 ad esempio il Mystitool che io uso normalmente lo fa facilmente è chiaro? Il Mystitool è gratuito per i mentori, se lo desiderate inviatemi un IM alla fine il Mystitool è pieno di cose utilissime quindi io lo raccomando sempre ma anche se non lo avete non è un grosso problema sapendo scriptare si può ovviare LOL :) ecco qui metto in colore azzurro i concetti più avanzati si possono fare debug e tracciature usando altri sistemi oltre a llSay ad esempio si può usare llSetText per scrivere sulla cima di un oggetto delle informazioni preziose ho visto script che colorano dei bottoni per indicare che stanno elaborando si possono mandare IM ma la cosa più interessante è che si possono mandare le tracce i debug su un server web esterno, con comandi http questo è un esempio di una funzione di debug che scrive su un sito web e consente di vedere il tabulato l'ho messo in blu perchè è un argomento avanzato quindi non è necessario che lo capiate (almeno non adesso) prima dobbiamo fare le lezioni sull'http ma se qualcuno è interessato, lo script php è su un mio sito web qui l'ho messo solo per farvi vedere che si può operare in infiniti modi www.salahzar.info è il mio dominio personale /lsl/httplog.php è il programma php che appende una stringa su un file usando un file che si chiama diversamente a seconda della chiave k la traccia la si leggerà poi su un browser (firefox) con la url: http://www.salahzar.info/lsl/httplog.php?pass=PASS&key=k&action=list per evitare usi "abusivi" il programma risponde solo passandogli una password questo per altro è un modello di uso "avanzato" ma ne parleremo moolto più avanti :) ok qui parlo invece dei concetti legati alle permissions suppongo che voi conosciate bene le permission più normali, giusto ? ok, per gli script normalmente le permission che si usano sono le "full-permissions" per prodotti opensource che regalate a chiunque senza scopo di lucro mentre normalmente se volete conservare la proprietà intellettuale usate copy ma NON modify in modo che gli acquirenti non possano vedere il vostro script o trasferirlo l'assenza di permissions è sconsigliabile perchè rende praticamente impossibile usare gli oggetti scriptati l'operazione di settaggio delle permissions almeno per me è una delle cose più noiose e difficili si rischia sempre di sbagliare togliendo troppe permissions o lasciandone troppe chissà se sapete di tools che consentano di verificare le permissions o di impostarle in modo indolore? (questo è in comune anche con i builders etc...) ok adesso andiamo sulla sintassi del linguaggio non mi soffermo troppo sui numeri che vedete nella slide la cosa normalmente più interessante sono le stringhe che in lsl sono molto più complesse di quello che sembra specie se si usano caratteri "strani" in pratica se usate caratteri strani come le vocali accentate queste contano "per due" quindi una stringa di 10 caratteri può utilizzare anche 16-20 bytes come nell'esempio di "città" UTF-8 è la codifica dei caratteri che usa secondlife che è simile alla codifica ASCII per i caratteri non accentati la codifica ASCII è quella usata dalla maggior parte dei linguaggi di programmazione mentre l'UTF-8 è utilizzato da Java e serve per rappresentare i caratteri + strani ditemi se sono troppo complicato .... ok invece qua ci sono gli altri tipi la key che rappresenta un oggetto, un avatar etc ed è una specie di "stringa" i vettori e le rotazioni che servono per le posizioni spaziali e le rotazioni e le liste che sono insieme il gioiello e la croce di lsl :( conoscete tutti questi tipi? se avete qualche dubbio su queste cose potete chiedermi ok allora vado dunque le variabili sono dei pezzi di memoria e sono FONDAMENTALI tutti gli script usano almeno 1 variabile per memorizzare qualcosa anche solo per l'intervallo di qualche istruzione in lsl le variabili globali vanno dichiarate in testa al programma ogni volta che qualcuno modifica una variabile globale questa cambia e potrebbe dare fastidio ad altre parti di programma pensate se avete una variabile intera di nome "i" e ne cambiate il valore quando un pezzo di codice la sta usando per fare un loop il linguaggio lsl è difficile perchè molti eventi accadono praticamente nello stesso momento e quindi è fondamentale evitare che un pezzo di script "sporchi" variabili gestite da altri pezzi di codice le variabili locali invece si possono usare liberamente senza problemi il mio consiglio è quello di usare una convenzione in modo da capire subito se una variabile è globale e specificare il tipo quindi iNOTECARD è una variabile globale di tipo intero vPOS è un vettore globale e così via poi ci sono le funzioni le funzioni come scritto qua servono per "riciclare" pezzi di codice ad esempio per scrivere qualcosa in cima al vostro oggetto potreste avere una funzione info(str) che magari fa una llSetText(str,<1,0,0>,1) sono utilissime quindi ogni volta che fate una cosa ripetutamente utilizzatele ecco e qui veniamo alla struttua a stati struttura in lsl voi potete avere oggetti che hanno più di uno stato anche se francamente la maggior parte degli script che ho visto ne utilizzano 1 o 2 al massimo noi faremo finta per il momento che vi sia un solo stato quello di default quello che siete obbligati a scrivere all'interno di un evento vi sono gli eventi + importanti che sono quelli in basso sulla slide - touch_start on_rez state_entry listen timer conoscete tutti questi eventi? qualcuno mi sa dire la differenza fra touch_start e touch? si infatti il + importante è touch_start (ma c'è anche il touch_end) è quello + utilizzato e parte al momento in cui l'oggetto viene toccato il touch(integer count) continua ad essere chiamato finchè l'avatar continua a toccare l'oggetto quindi diciamo ogni mezzo secondo il che crea anche un po' di stress alla sim quindi potreste fare uno script che distingue le 3 fasi se ne aveste bisogno o che calcoli quanti secondi un avatar ha tenuto cliccato un oggetto potrebbe essere un modo potente che so per fare dei flipper cmq ve l'ho fatto vedere perchè il linguaggio di scripting di sl pur apparentemente spartano è in realtà ricchissimo di cose particolari basta solo la fantasia per farci sopra le cose + strane ok veniamo ai costrutti elementari ritengo che i primi li conosciate tutti giusto? il comando @label e jump label sono l'equivalente del goto e viene utilizzato a volte per due motivi 1\ perchè risparmia bytes 2\ perchè può essere utile per uscire da un ciclo il goto permette di spostare l'elaborazione ad un altro punto dello script è simile all'if then else con la differenza che è "incondizionato" l'if then else va al blocco else se il test non è verificato il jump va "sempre" alla label e di solito come dicevo viene utilizzato per uscire da un loop oppure da qualche programmatore pazzo e scatenato lol io ho visto molti pezzi di codice dei guru pieni di jump diciamo che di solito si riesce "quasi" sempre a farne a meno :) ma ve l'ho messo così se lo vedete lo capite io la prima volta che l'ho visto in lsl mi ha messo un po' in crisi e qui veniamo invece alle cose "truci" la potenza di lsl sta nella sua libreria di funzioni queste in questa pagina le dovreste conoscere già uno scripter elementare dovrebbe averle già usate tutte giusto? :) queste invece sono per i "guru" mi sa che non le avete mai usate in particolare l'ultima istruzione studiatela bene perchè viene usata spesso da script che hanno problemi di memoria nella prima funzione non c'è una vera e prorpia chiave la key è una cosa che viene indicata anche come UUID nella letteratura dei guru ed è un algoritmo complessissimo che usa il computer su cui è stata generata la data e l'ora e alcuni elementi casuali le UUID sono garantite essere UNIVOCHE in tutto l'universo (almeno sulla terra) lol cmq si le puoi vedere come una specie di chiave di accesso all'oggetto qui con MD5 si intende invece un altro algoritmo diverso dall UUID che estrae un integer a partire da una stringa in questo caso non si garantisce l'univocità è un discorso un po' complesso da fare per cui lo saltiamo adesso ve lo facevo vedere come al solito per farvi vedere la ricchezza del linguaggio anche nella sua "semplicità" se trovate da qualche parte x=(x="")+x+c; adesso sapete cosa vuol dire? vuol dire semplicemente l'aggiunta della stringa c alla stringa x viene raccomandata dalla linden per risparmiare spazio ok qui abbiamo invece alcune funzioni matematiche non mi addentro ma llFrand può essere utile per generare dei channel casuali le rotazioni per il momento le lasciamo anche loro tranquille e qui invece abbiamo funzioni sempre + interessanti come dicevo prima le liste sono insieme il gioiello e la croce di lsl si possono fare tantissime cose ma spesso in modo abbastanza complesso comunque le funzioni su questa pagina sono quelle + intuitive tra queste le più usate sono llGetListLength e llList2 la seconda per estrarre un elemento da una lista queste invece sono le funzioni + avanzate allora in realtà molte di queste funzioni meriterebbero una lezione a parte per ognuna di loro io sto facendo solo una carrellata in modo tale che almeno le abbiate già viste poi di volta in volta quando le useremo vi spiegherò i loro vari aspetti delle funzioni di lista che vedete vi sono vari concetti che vi accenno 1\ strided list sono la cosa più vicina alle "matrici" array n-dimensionali che lsl possa fornire in realtà sono un trucco ad esempio se avete una matrice di 10 righe per 2 colonne in lsl si possono rappresentare con una lista "stirata" ad esempio la lista list matrix=[ "a",5,"b",6,"c",7]; potrebbe corrispondere ad una matrice di 3 righe per 2 colonne la prima riga è "a" 5 la seconda "b" 6 ecc questa lista viene indicata come una lista con "stride=2" stride credo che si possa tradurre come "salto" od intervallo quindi dice che "ogni due" parte una nuova riga non so se ve l'ho presentato chiaramente ok allora stop con le stride per il momento l'altro grosso concetto è rappresentato dalla trasformazione di una lista in stringa e viceversa questo è IMPORTANTISSIMO perchè spesso nelle liste vi sono informazioni importanti che devono essere trasmesse fra oggetti come vedremo e dobbiamo avere uno strumento per mandare la lista come se fosse una stringa le funzioni più semplici per fare questo sono llList2CSV (lista=>stringa) e llCSV2List (stringa lista) cosa fa llListStatistics? è una funzione molto potente data una lista con dei valori misurati consente di estrarre informazioni come la media lo scarto quadratico medio ed altre informazioni statistiche provate a farlo in cobol LOL ecco nell'ultima riga avete invece il solito trucco strano lst=(lst=[])+lst+x in particolare per le liste una lista potrebbe essere lunga 4-5000 bytes se non si facesse in quel modo si perderebbero 5000 bytes lst+=x usa 3 volte la memoria per lst mentre la sintassi che vi ho detto usa solo 2 volte lo spazio di memoria se avete script cicciuti dovete sapere fare queste cose altrimenti non vanno :) okay ora torniamo ad argomenti + terra terra sicuramente avete già usato la lllisten (con 3 elle) lol sapete che è importante scegliere un canale e sapete la differenza fra il canale 0, canali positivi e negativi allora lo zero è quello che dà più fastidio e dà anche più lag ma anche i canali positivi sono pesanti i canali negativi, essendo utilizzati solo dagli oggetti generano MENO lag ricordatevi di usare sempre la MINORE quantità possibile di llListen NOTA: gli IM viaggiano su canali propri totalmente diversi dai canali listen i canali negativi generano meno lag perchè non vengono rimbalzati su tutti i browser ma rimangono nel computer remoto => meno traffico di rete questa slide vi spiega la frustrazione che si ha a volte con le lllisten avete fatto uno splendido script ma quando gli parlate o quando fate touch e c'è il menu lui non fa nulla la soluzione è una sola (a parte essere perfettissimi e non dimenticarsi nulla) lol mettete tante scritte di debug per essere sicuri che tutto sia come deve essere la llListen venga fatta sul canale giusto eccetera. poi a volte voi stessi fate in modo che l'oggetto reagisca SOLO se siete l'owner ad esempio io ho modificato questa lavagna in modo che SOLO IO posso cliccarne i tasti poi lo vediamo in apposita lezione e siamo al timer anche questo coso sembra semplice ma ho visto fare delle cose con il timer :) comunque nel suo comportamento più semplice fa esattamente quello che sembra fa scattare l'evento dopo tot secondi come scritto viene spesso utilizzato per rimuovere un listen dopo un certo intervallo di tempo ricordatevi che finchè non fate llSetTimerEvent(0) il timer rimane attivo e continua a scattare sul touch (forse l'evento + usato su secondlife) mi sa che lo sapete usare tutti mi sapete dire che cosa rappresenta quell'integer count? c'è scritto sulla slide :) E' il numero di avatar che tocca l'oggetto... però la maggior parte dei programmatori non lo considerano e usano semplicemente llDetectedKey(0) perchè si suppone che in circostanze normali un solo avatar tocchi l'oggetto e noi faremo anche così (siamo pigri) ecco cosa si dovrebbe fare ok saltiamo le altre interazioni la llDialog è anche usatissima e come vedete quasi sempre insieme a touch-start in questa slide vedete che elenco le opzioni dentro una lista e poi la llDialog visualizza il menù in alto a destra (il classico menu blu) la llDialog ha la particolarità che l'ordine delle scelte nella lista corrisponde in modo "strano" a come le visualizza nel menù questo succede quando avete più di 3 opzioni perchè il "maledetto" engine di sl ordina le opzioni dal basso a sinistra verso destra e poi va su in verticale come se fossero coordinate X,Y e non un testo che parte dall'alto a sinistra e poi scorre verso il basso ci sono numerosi trucchi per ovviare a questo se vedete questo listato vedete che ho messo insieme un po' tutte le funzioni che vi ho descritto prima touch_start listen dialog timer è chiaro quello che fa? => fa apparire un menù dando tot tempo di risposta perfect quella era l'ultima slide vuol dire che adesso siete pronti per la prima lezione