integer channelGESTURE=1; // CANAL D'ECOUTE DE LA GESTURE integer channelRLV; // CANAL UTILISE POUR LE RLV integer strip=FALSE; // ETAT DU CLICK GAUCHE DE LA SOURIS FALSE=NON PRESSE TRUE =PRESSE list request; // Stockage des handle de listen rlv en cas de fort lag default { state_entry() { // Ouverture du canal d'ecoute de la gesture, on ne stocke pas le handle // vue que forcement l'on devra ecouter tout le temps llListen(channelGESTURE,"",NULL_KEY,""); // requete pour avoir l'autorisation de recevoir le click souris llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS); } touch_start(integer total_number) { llSay(0, "Touched."); } listen(integer channel, string name, key id, string msg) { // Si l'on est sur le canal de dialoge avec les gestures if (channelGESTURE == channel) { // Determiner un canal rlv en se basant sur le nombre de sec depuis 1970 // avantage forcement positif channelRLV=llGetUnixTime(); // stocker dans une liste le canal, le message c'est a dire le rep sur lequel on travail puis le handle pour fermer le listen request=request+[channelRLV,msg,llListen(channelRLV,"",llGetOwner(),"")]; // Lancer l'appel pour avoir l'inventaire llOwnerSay("@getinvworn:"+msg+"="+(string) channelRLV); // on retourne chez papa maman en attendant la reponse return; } // rechercher si ce que l'on recoit est en rapport avec une de nos demandes // histoire de gerer les sims laggy integer i=llListFindList(request,[channel]); // Preparer une string pour recuperer le rep sur lequel on travail string reptraitement; // si -1 c'est que ce n'est pas un dialogue initié par nous et pourquoi que l'on ecoute d'abord ? if ( i== -1) return; // fermer le canal en extrayant le handle suivant comme nous l'avons stockés llListenRemove(llList2Integer(request,i+2)); // recupereration du rep sur lequel nous travaillons lors de l'appel de la gesture reptraitement=llList2String(request,i+1)+"/"; // destruction de la pile des données puisque nous sommes pret à traiter request=llDeleteSubList(request,i,i+2); // transformons la reponse en liste list temp=llParseString2List(msg,[",","|"],[]); // regardons si nous avons un dossier que nous portons integralement integer iweared=llListFindList(temp,["30"]); // Non ? Donc on s'en va. On pourrait aussi regarder ici si la touche est // pressé et considere qu'en fait puisque nous portons rien c'est que nous volions porter // qqe chose mais je m'enfonce, laissons tomber if (iweared == -1) return; // Demandons à enelver tout ce que l'on portait dans le fameursx repertoire llOwnerSay("@detachall:"+reptraitement+llList2String(temp,iweared-1)+"=force"); // Si le click souris est enfoncé en fait nous ne voulosn pas changer mais uniquement // nous deshabiller donc on arrete if (strip==FALSE) { // Ajoutons +1 pour passer au repoertoire suivant iweared=iweared+1; // Verifions que nous n'etions pas sur le dernier. Si oui revenir au premier if (iweared >= llGetListLength(temp)) iweared=1; // Envoyer l'ordre de nous habiller avec le repertoire llOwnerSay("@attachallover:"+reptraitement+llList2String(temp,iweared)+"=force"); } // ligne de debug llOwnerSay(llDumpList2String (temp,"****:") ); } run_time_permissions(integer perm) { // validons la permission et indiquons ce que nous devons surveiller. integer controls = CONTROL_LBUTTON ; if(perm & PERMISSION_TAKE_CONTROLS) llTakeControls(controls, TRUE, FALSE); } control(key id, integer held, integer change) { // stockons dans strip le fait que nous enfoncions ou non nla touche. integer pressed = held & change; integer down = held & ~change; integer released = ~held & change; integer inactive = ~held & ~change; if (pressed & CONTROL_LBUTTON) strip=TRUE; if (released & CONTROL_LBUTTON) strip=FALSE; } }