Archivi categoria: Second Life

Attenti al Lupo

WolfDuff

Perché un moderatore smette di moderare? Perché un moderatore ha bisogno di una pausa? Per quale motivo un Lupo non ha più fame?
Tante domande ma nessuna apparente risposta.

Resta soltanto un sorriso orgoglioso. Quel sorriso che ti esce fuori quando vieni ignorato, quando lasci senza risposta la preda, quando senti che l’agnello continua a trovare giustificazioni inverosimili pur di dire “L’avevo detto io!”.
Per fortuna, hai la verità dentro di te, che custodisci gelosamente. Sai di aver lasciato per rispetto, rispetto a te stesso. Ma sai di averlo fatto al momento giusto. Dopo che hai attraversato due tempeste, felice di averle combattuto insieme a dei veri Lupi di mare.

Tre Lupi non hanno più fame. Alcuni hanno bisogno di leccarsi le ferite, altri sono solo stanchi, altri hanno capito che era arrivato il momento… il momento giusto per non rendere più debole tutto il Branco. Nessun Lupo è indispensabile, ogni Lupo fa parte del Branco. Il suo compito è capire quando lo rende più debole ed, in questi casi, farsi da parte.

E allora si capisce che la fame non è passata, che un Lupo ha sempre una preda, che continua a sbranare, che c’è ancora una tempesta, che altri Lupi sono pronti a combatterla. Ed esce di nuovo il sorriso, lo stesso di prima, sempre orgoglioso, ancora più cattivo… si ritirano le zanne, si allungano le orecchie, adesso si combatte insieme ai conigli.

Quello che bisogna domandarsi adesso è… è meglio farsi sbranare da un Lupo dichiarato o essere rosicchiato lentamente da un coniglio!

Seconda lezione di LSL

Giorno 26 Maggio si è tenuta la seconda lezione di LSL sempre alla Land del Forum. Oggetto della lezione, questa volta, la Comunicazione degli oggetti.

Abbiamo tre tipi fondamentali di comunicazione nel linguaggio LSL:

  • Comunicazione all’interno dell’oggetto, ovvero tra i prim che compongono l’oggetto;
  • Comunicazione tra un oggetto ed un altro oggetto o un Agent;
  • Comunicazione tra un oggetto e l’esterno.

Nella lezione ci siamo soffermati sulla comunicazione tra un oggetto e l’agent, ma abbiamo già predisposto l’oggetto per effettuare una comunicazione interna tra i prim che lo compongono. Abbiamo, infatti, creato un oggetto formato da due prim: un cubo come root e una piramide come child. Una primissima osservazione che abbiamo fatto è stata quella di notare la seguente differenza:

Uno script inserito nel prim root di un oggetto ha effetto su tutto l’oggetto, mentre uno script inserito in un prim child ha effetto esclusivamente su quel child.

Abbiamo notato questa differenza semplicemente inserendo lo script di default (quello che viene creato in automatico quando si crea un nuovo script) prima sul prim child e poi su quello root.

Ebbene, se inserito solo nel child ottenevamo la scritta “Touched.” esclusivamente se toccavamo il prim piramide dell’oggetto non nel cubo, mentre se inserito nel root ottenevamo la scritta “Touched.” sia se toccavamo la piramide sia se toccavamo il cubo.

Notata questa differenza, ci siamo inoltrati nello studio della Comunicazione tra oggetto ed Agent. Ci siamo quindi dedicati allo studio della funzione

integer llListen(integer canale, string nome, key id, string messaggio)

e del suo evento associato

listen(integer canale, string nome, key id, string messaggio)

I parametri di ingresso, come potete notare da soli, sono del tutto simili ed infatti assumono lo stesso significato:

Canale – Indica il canale di comunicazione. Vi ricordo che il canale pubblico ha valore 0 ed è identificato dalla costante PUBLIC_CHANNEL. Tutti gli altri canali, in un range compreso tra -2.147.483.648 a 2.147.483.647, sono i canali privati. Comunemente bisognerebbe utilizzare i canali negativi per interazioni tra oggetti e quelli positivi per interazioni con agent;
Nome – Indica il filtro di ascolto su un determinato nome;
Id – Indica il filtro di ascolto su una determinata key;
Messaggio – Indica il filtro su un determinato messaggio.

Il nostro intento è stato quello di creare uno script in ascolto su un canale privato della parola “Ciao” detta dall’owner, al quale l’oggetto doveva rispondere con messaggio “Ciao a te!” diretto esclusivamente
all’owner.

Abbiamo dovuto applicare i seguenti filtri alla funzione llListen:
Canale = 1
Nome = “”
Key = llGetOwner()
Messaggio = “Ciao”

Ovvero, abbiamo usato il canale 1, non abbiamo specificato il nome ma la key dell’owner dell’oggetto (recuperata in automatico grazie alla funzione llGetOwner()), ed abbiamo aggiunto il filtro “Ciao” al messaggio.

Tradotto in LSL, il comando da eseguire per impostare un ascoltatore è il seguente:

integer handler = llListen(1, "", llGetOwner(), "Ciao")

questo comando restituisce un handler dell’ascoltatore. Questo può essere usato per disattivare l’ascoltatore in un altro punto del codice. In questo nostro semplice script, abbiamo ignorato l’handler.

Una volta che abbiamo impostato il nostro ascoltatore, non ci resta che rispondere “Ciao a te!” quando viene sollevato l’evento ed il gioco è fatto!

Questo è lo script risultante:

default {
	state_entry() {
		llListen(1, "", llGetOwner(), "Ciao");
	}

	listen(integer canale, string nome, key id, string messaggio) {
		llOwnerSay("Ciao a te!");
	}
}

Per poterlo provare ci basta scrivere:

/1 Ciao

(vi ricordo che il “/1” iniziale significa “ridirigi questa stringa sul canale 1”. Infatti, questa comunicazione non viene letto in modo diretto da nessun agent, non essendo fatta nel canale pubblico).

Ricordatevi che c’è differenza tra “Ciao”, “CIAO” e “ciao”… il nostro script funziona solo con la prima stringa visto che il linguaggio LSL è case-sensitive!

Se tutto va bene il nostro oggetto ci risponderà con “Ciao a te!” e noi abbiamo completato con successo la nostra comunicazione tra Agent e Oggetto!

Alla prossima lezione!

Prima lezione di LSL

Lezione di LSL alla Land del Forum

Giorno 19 Maggio alle 21:30 si è tenuta la prima Lezione di Scripting LSL alla Land del Forum. Era la prima lezione ufficiale, in passato ne avevo tenuta un’altra per fare delle prove generali. Devo dire che nel complesso tutto è andato bene! Alcuni miei problemi legati al client: ho avuto tre crash e addirittura una schermata blu… ma forse quello è più un problema di Vista!

Il log completo della serata e tutte le foto della serata, compresa questa nel mio blog, sono disponibili nel Blog di Eleonora Porta.

Il tema della serata è stato quello di spiegare, banalmente, come è strutturato un listato LSL: che cosa sono gli stati, che cosa sono gli eventi, che cosa sono le funzioni. Fatto questo ci siamo dedicati allo studio di una funzione in particolare: llSetText, utile per visualizzare un testo sopra un prim. La firma della funzione è la seguente:

llSetText(string testo, vector colore, float alpha)

Testo – Indica il testo da visualizzare sopra il prim;
Colore – Indica il colore del testo nelle componenti RGB;
Alpha – Indica il livello di trasparenza in percentuale (1.0 totalmente opaco, 0.0 trasparente).

Molti dubbi sono nati con l’utilizzo del colore. Infatti, non si riesce a capire infatti come rappresentare un colore attraverso tre numeri. La questione è più semplice di quello che sembra. La totalità dei colori rappresentabili non sono altro che una combinazione dei tre colori del modello RGB (Red, Green, Blue).

Per fare qualche esempio:
la totale assenza dei tre colori indica il Nero;
la presenza contemporanea massima dei tre colori indica il Bianco;
la presenza massima delle sole componenti Red è Green indica il Giallo.

Quindi ci basta mischiare nella variabile vector colore la presenza in percentuale dei vari colori, per ottenere il colore voluto.

Alla fine della lezione abbiamo ottenuto il seguente codice:

default {
	state_entry() {
		llSetText("Esempio prima lezione LSL!",<1.0,0.0,0.0>,1.0);
	}
}

che visualizza il testo “Esempio prima lezione LSL!” di colore rosso sopra il prim.

Ringrazio tutti gli intervenuti alla Lezione e rinnovo l’appuntamento per la seconda lezione!