mercredi 9 janvier 2008

llListenRemove


Le llListenRemove est très simple à comprendre, il arrete l'ecoute que l'on avait lancé. la fonction llListen renvoit un integer, celui ci identifie de quelle ecoute on parle. Cet identifiant est pris en paramètre par llListenRemove pour etre arreté.
Mais pourquoi avoir fais ca me diriez vous? pour des raisons de sécurité de la vente et de lag.
Si on reprends note script d'hier, le dernier client peut profiter d'une faille car notre channel est toujours ouvert pour lui. Si il connait le channel(pas de bol quand même) il lui suffit de répeter sur ce channel les nom des objets et on lui donne tout ce que l'on veut.

Cette fois-ci c'est blindé car on ecoute que pour le client et une fois qu'il a eu son objet on ecoute plus.

Il y a l'effet lag qui est très important, en utilisant cette fonction, vous scriptez proprement...


// la liste des objet à vendre dans votre vendor
list obj=[];

// permetra l'identification du listen
integer IdListen;

default
{
    state_entry()
    {

        // donne le nombre d'objet contenu dans l'inventaire du prim
        integer NbObj=llGetInventoryNumber(INVENTORY_OBJECT);

        // compteur de boucle
        integer i;

        // rempli la list des objets
        // les acccolade ne sont pas nécéssaire car il n'y a que
        // une ligne dans la boucle
        for(i=0;i<NbObj;i++)
            obj+=llGetInventoryName(INVENTORY_OBJECT,i);
    }

    listen(integer channel, string name, key id, string message)
    {

        // donne l'objet acheté
        llGiveInventory(id,message);

        // la fonction du jour
        llListenRemove(IdListen);
    }
    money(key giver, integer amount)
    {
        // choisi un channel au hasard pour securisé
        integer mychannel=(integer)llFrand(1000.0)+5000;

        // ecoute le channel et concerve le id de l'ecoute
        IdListen=llListen(mychannel,"",giver,"");

        // laisse le choix de l'objet à l'utilisateur
        llDialog(giver,"Choisissez votre objet",obj,mychannel);
    }
}

Aucun commentaire: