16 avril 2011

LSL : un script giver

Pour changer un peu, et comme ça fait un bon moment que je n'en ai pas fait, voici un petit tuto de scripting. Nous allons faire évoluer notre script, d'une version simple à une version plus amusante.

Le défi du jour : réaliser une boite qui donne un objet quand on clique dessus. Pour cela, je vais devoir builder une boite (facile), mettre dedans (onglet inventaire en mode édition) le script et l'objet à donner.

Nous allons avoir besoin des fonctions suivantes :

  • llGiveInventory : c'est elle qui permet de donner ce que contient l'inventaire d'une prim.
  • llGetInventoryName : cette fonction renvoie le nom d'un objet de l'inventaire. Nous utiliserons cette fonction pour connaitre le nom de l'objet. Ainsi, notre script pourra être réutilisable avec tout objet sans avoir besoin de le modifier.

la fonction llGiveInventory prend plusieurs paramètres :
  • la key de l'avatar qui doit recevoir l'objet. Pour l'obtenir, on utilisera llDetectedKey. Lorsque l'on clique sur un objet, un évènement touch_start se déclenche et permet de récupérer des informations sur l'avatar qui l'a touché, comme par exemple son nom (llDetectedName), sa clé ou UUID (llDetectedKey), savoir s'il est de même groupe que l'objet (llDetectedGroup), sa position (llDetectedPos), etc...
  • le nom de l'objet : plutot que de l'écrire textuellement, on utilisera donc llGetInventoryName, avec la constante INVENTORY_OBJECT, pour préciser que on veut le nom d'un objet, et l'indice 0, qui signifie le premier objet de l'inventaire (de toute façon,il n'y en aura pas d'autre).
Notre script s'écrit donc :


default{

touch_start(integer total_number){
//donne l'objet de l'inventaire
llGiveInventory(llDetectedKey(0), llGetInventoryName(INVENTORY_OBJECT, 0));
}

}


Allons plus loin. Imaginons à présent qu'on veuille que notre boite donne son objet une seule fois, pas plus. Par exemple dans le cadre d'une chasse au trésor, le premier qui trouve gagne.
On peut alors envisager deux solutions :
  1. une fois donné son objet, la boite disparait
  2. la boite reste mais refuse de donner quoi que ce soit

Solution 1 : on ajoute juste dans le script un llDie, pour que la boite se dereze toute seule. Notre script devient :


default{

touch_start(integer total_number){
//donne l'objet de l'inventaire
llGiveInventory(llDetectedKey(0), llGetInventoryName(INVENTORY_OBJECT, 0));
// bye bye ! Adieu monde cruelle
llDie();
}

}


Solution 2 : poussons plus loin l'idée. La boite donnera un nombre de fois fini l'objet et se bloquera. On va donc utiliser un compteur. A chaque fois que la boite donne un objet, on augmente le compteur. Dès qu'elle a atteint la limite, on arrête. Je vais donc définir une constante (le maximum) et une variable pour le compteur. Prenons un exemple à 10.


// le nombre maximum de don de l'objet
integer MAX_GIFT = 10;
// le compteur qui est initialisé à 0
integer counter = 0;


default{

touch_start(integer total_number){
//test pour donner
if (counter < MAX_GIFT) {
//donne l'objet de l'inventaire
llGiveInventory(llDetectedKey(0), llGetInventoryName(INVENTORY_OBJECT, 0));
//incrémente le compteur
counter++;
} else {
llSay(0, "Désolé, la boite est vide !!");
}
}


}

Et voila, le travail est fini.
Pour toute idée de tuto de script, n'hésitez pas à me contacter sur le blog ou inworld. Le plus dur, c'est pas de scripter, mais d'avoir des idées de scripts.

2 commentaires:

darkmoustique a dit…

merci pour cela, vraiment bien expliqué, bravo, bravo :)

Deirdre Thor a dit…

Merci beaucoup !

Si vous avez des idées de tuto de LSL, dites le moi !!

Il y a des jours où je sèche pour écrire.