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;
}
}