8 octobre 2008

Cours d'initiation au langage LSL (IV)

Aujourd'hui, nous allons voir les fonctions LSL liées aux variables de type KEY, ainsi que quelques constantes utilisables à tout moment dans vos scripts, sans avoir besoin de les définir, cela est déjà fait dans le langage LSL.

Mais avant, voici quelques fonctions essentielles et les plus courantes du LSL...



I. Les fonctions de communication


Pour communiquer, un objet fait appel à un certain nombre de fonctions. Pour parler, on doit le faire dans un canal de chat. Le canal lisible par tous est le canal publique 0. Tout ce qui est dit sur ce canal est perceptible par tous, dans une limite de distance.


Une limite ??

Et oui, quand on chuchote, parle ou crie, on touche plus ou moins de personnes. Ainsi :


Chuchoterwhisper10m
Parlersay20m
Criershout100m



L'avatar ne peut que parler ou crier, mais un objet scripté peut en plus chuchoter.

Par contre, on peut choisir le canal sur lequel on parle. Si on ne précise rien, il s'agit du canal 0.
Si on veut parler sur un autre canal, on doit ecrire le numéro du canal précédé de /
Par exemple :

/100 kikooooo !

Ecrira donc "kikooooo !" sur le canal 100.

Toutefois, un avatar ne peut pas écouter sur ce canal, et toute phrase écrite dessus ne produit rien sur le chat (qui est le canal 0). Par contre un objet le peut (nous verrons comment plus tard). C'est de cette manière que l'on peut commander certain objet via le chat.

Si je veux faire cracher du feu à mon dragonnet, je lui parle sur le canal 28 (par exemple).
Ainsi : /28 flammeon, et il souffle, et /28 flammeoff, et il s'arrete. Personne ne m'a vu écrire un ordre, ni quel est cet ordre, ni le canal que j'utilise.

Ainsi donc, dans toutes les fonctions qui vont suivre, l'un des paramètres est ce canal.
Toutefois, pour plus de compréhension dans la lecture du script, on evitera d'écrire 0 pour indiquer le canal public.
Il existe des constantes que l'on utilisera. Ecrire le nom de la constante revient à ecrire la valeur à laquelle elle correspond, mais en rendant son script plus lisible.
  • PUBLIC_CHANNEL : le chat public, de valeur 0

  • DEBUG_CHANNEL : le canal utilisé pour le débuggage de script


1) Chuchoter, parler, crier.


llWhisper(integer channel, string message);
llSay(integer channel, string message);
llShout(integer channel, string message);


  • channel : le canal ou l'on parle

  • message : le message.


Par exemple :

llWhisper(PUBLIC_CHANNEL, "Bisous toi !!");
llSay(PUBLIC_CHANNEL, "Bonjour à tous !!");
llShout(PUBLIC_CHANNEL, "Lapin !!!!");



Note : Lapin ??
Ben oui.... vous savez comment on dit lapin à un sourd ?? non ?? on dit : LAPIN !!




2) Plus loin c'est possible ?

Et oui, un objet peut parler sur une sim entiere. Mais attention, il ne peut pas le faire sur le canal PUBLIC_CHANNEL. Imaginer le spam sur une sim où toutes les dix secondes, on aurait une voix qui parlait !!!

llRegionSay(integer channel, string message);



3) Plus prêt, dans le creux de l'oreille ? Rooooo !!

Encore oui !! Rooooo derechef !! Cela est possible.
L'objet parle dans le chat, mais seul son propriétaire peut entendre ce qu'il dit. Dans ce cas pas besoin de préciser le canal, il n'y a que le message en paramettre à cette fonction. Le message s'affiche dans votre fenetre de chat, dans une couleur jaune, indiquant que seul vous pouvait l'entendre


llOwnerSay(string message);


4) Il y a autre chose ?

Oui, mais nous verrons plus tard; Il s'agit de la petite boite de dialogue bleue, qui apparait dans le coin supérieur droit de la fenetre de SL.
Elle fait dejà l'objet d'un tutorial entier.



II. Tout (ou presque) sur les KEY



Petit retour sur les Key.
C'est un identifiant unique, ou UUID pour Universally Unique Identifier, qui caractérise chaque objet de SL. C'est en fait une STRING dont le format est défini d'une certaine manière. Un UUID est donc stocké dans une variable de type KEY.

Masque d'une Key : XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX, soit donc une série de 5 nombres ecrits en base hexadécimale. Par exemple : 153f69ca-1de5-ffff-0000-125cb84a58e2.

Il existe pour les Keys une constante, la clé "nulle" :
  • NULL_KEY , de valeur : 00000000-0000-0000-0000-000000000000


llGetKey( ) ==> key

Cette fonction retourne la Key de l'objet qui la contient, ou pour etre plus précis, du prim dans lequel se trouve le script. Ainsi, un objet constitué de plusieurs prims possède une Key par prim le composant.



llDetectedKey( integer number ) ==> key

number représente la valeur de l'index de détection.
Cette fonction sert souvent pour connaitre la key d'un objet détecté.
Exemple d'utilisation : connaitre qui touche l'objet. L'index correspondant à un avatar est 0.


default
{

touch_start(integer total_number)
{
key k = llDetectedKey(0);
llSay("j'ai été touché par " k);
}
}



Créez un objet et copier ce script dedans. Puis cliquer sur l'objet, et vous obtiendrez une key qui est celle de votre avatar, votre UUID personnel.



llKey2Name( key id ) ==> string

Cette fonction renvoie de le nom correspondant à la prim ou à l'avatar dont la key est passée en paramètre.
Nous pouvons utiliser cette fonction avec celle vue précedemment. llDetectedKey donne la clé de celui qui touche, et passe cette clé à llKey2Name, qui la convertit en un nom.

Exemple :


default
{

touch_start(integer total_number)
{
llSay("Bonjour " llKey2Nam(llDetectedKey(0)));
}
}




llGetOwnerKey(key id) ==> key
llGetOwner() ==>key


La fonction llGetOwnerKey retourne la clé du propriétaire de l'objet que l'on passe à la fonction par sa key.
llGetOWner retourne la key du propriétaire de l'objet.

Arrêtons sur ce point. Imaginons un objet qui effectue une action quand on le touche. Je veux que seul le propriétaire de l'objet puisse le faire fonctionner. Pour cela il faut que je regarde si celui qui le touche est bien le propriétaire. Cela se fera par key interposées.



key proprio;

default
{

state_entry()
{
// à l'entrée dans le script, on affecte à proprio
// la key du propriétaire de l'objet
proprio = llGetOwner();
}

on_rez(integer a)
{
// Si jamais on rez l'objet, on affecte à proprio
// la key du propriétaire de l'objet
proprio = llGetOwner();
}


touch_start(integer total_number)
{
if ( proprio == llDetectedKey(0))
{
llSay(PUBLIC_CHANNEL, "Bonjour mon Maître !!);
} else {
llSay(PUBLIC_CHANNEL, "Vous n'êtes pas mon Maître !!);
}
}
}



Encore une petite chose.
Si on donne notre objet à quelqu'un, le propriétaire change. Notre objet doit donc obéir à son nouveau propriétaire. Toutefois, la valeur retournée par llGetOwner n'est pas remise à jour immédiatement, ni automatiquement. D'où la présence de l'évenement on_rez, qui est appelé lorsque l'on pose l'objet au sol, ce qu'on appelle faire un rez de l'objet. C'est en général la technique la plus souvent utilisée.
Mais imaginons un objet que l'on porte sur soi.... On ne vas pas tout le temps le poser au sol, cela est casse pied. Pour l'utilisateur final qui se moque bien de savoir comment ca marche, ce n'est pas très pratique...

Alors ??

Et bien, on va utliser le bout de code suivant. Il suffit de l'ajouter dans le script et le tour est joué. L'evenement est appelé chaque fois que quelque chose change dans l'objet. Ici on ne s'interesse qu'au changement de propriétaire. Nous verrons cet evenement plus en detail plus tard.


changed(integer change)
{
if (change & CHANGED_OWNER)
llResetScript();
}



La fonction llResetScript permet de réinitialiser un script.
Dès que l'objet change de proprietaire, l'evenement changed est appelé, et fait un reset du script.

Il faut savoir que lorsque l'on utilise un objet, les variables qui le contiennent varient en fonction de ce que leur demande le script. Si je range l'objet dans mon inventaire, l'etat de ces variables est sauvegardé. Et lorsque je le sors, je le retrouve avec ces variables.
Ce qui signifie que si il y a une erreur de code dans mon script qui fait "planter" l'objet, le fait de le remettre dans mon inventaire et de le ressortir ne sert à rien. Si c'est un petit plantage de sl, là, cela fonctionne. Parfois, mon katana plante et ne fonctionne plus. Le seul moyen pour moi pour le refaire fonctionner est de le réinitialiser entièrement, en posant au sol la boite que j'ai achetée, qui me rend un katana tout neuf, avec des variables réinitialisées.




III. Conclusion


Voila pour aujourd'hui. La prochaine fois, nous étudierons en detail quelques fonctions très utiles concernant le type STRING, ainsi que le type LIST, si j'ai du courage !!

Aucun commentaire: