Problème d'affichage d'un Dialog Menu

Répondre
Partager Rechercher
Bonjour à tous et toutes,

J'ai un soucis avec la fonction llDialog. Je voudrais pouvoir sélectionner un résident présent sur une parcelle afin de lui envoyer un cadeau.
Malheureusement mon script doit être très bancal car j'ai une erreur qui sous entend que je suis limité à 12 choix et donc à 12 résidents dans l'affichage de la boite de dialogue !
Si quelqu'un pouvait m'aider, je lui en serais reconnaissant !

Code PHP:

​key Owner;

default
{
    
touch_start(integer num_detected)
    {
        
Owner llGetOwner();
        list 
keys llGetAgentList(AGENT_LIST_PARCEL, []);
        
integer numberOfKeys llGetListLength(keys);
 
        
vector currentPos llGetPos();
        list 
newkeys;
        
key thisAvKey;
 
        
integer i;
        for (
0numberOfKeys; ++i) {
            
thisAvKey llList2Key(keys,i);
            
newkeys += [llRound(llVecDist(currentPos,
                            
llList2Vector(llGetObjectDetails(thisAvKey, [OBJECT_POS]), 0))),
                        
thisAvKey];
        }
 
        
newkeys llListSort(newkeys2TRUE);    
 
        
llDialog(Owner"\nEnvoi de Cadeaux",newkeys, -19);
        
        
    }

Hellow...la fonction llDialog est limitée de base à 12 boutons....pour avoir plus, il faut crée une fonction..."Dialog+" (trouvable sur wiki par ex.) par exemple....mais ton script aura d' autres problèmes...les intitulés des boutons doivent être des "strings", ne dépassant pas 24 caractères....et rien ne sert d' afficher les keys et les distances des avats....les noms devraient suffire....
Moui la fonction DialogPlus
Citation :
Publié par MenthalOH
Hellow...la fonction llDialog est limitée de base à 12 boutons....pour avoir plus, il faut crée une fonction..."Dialog+" (trouvable sur wiki par ex.) par exemple....mais ton script aura d' autres problèmes...les intitulés des boutons doivent être des "strings", ne dépassant pas 24 caractères....et rien ne sert d' afficher les keys et les distances des avats....les noms devraient suffire....
Merci pour ces indications MenthalOH, je ne connaissais pas la fonction Dialog+ !

J'ai essayé, pendant de longues heures je dois l'avouer, de réaliser un script. Alors je pense avoir plusieurs problèmes

- je ne pense pas que les noms des résidents s'affichent par ordre de proximité dans la boite de dialogue
- je pense qu'il doit y avoir des petits problèmes dans la boite de dialogue quand les boutons dépassent les 12 unités !
- de temps en temps, en sélectionnant un résident, je n'arrive pas à afficher son UUId et j'obtiens 00000000-0000-0000-0000-000000000000

Bref, c'est le bordel
Code:
key owner; 
list keys;
list ListeBoutons;
integer menuindex;
integer listen_handle;




list order_buttons(list buttons)
{
    return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4) +
          llList2List(buttons, -10, -7) + llList2List(buttons, -12, -10);
}

DialogPlus(key avatar, string message, list buttons, integer channel, integer CurMenu)
{
  if (12 < llGetListLength(buttons))
    {
        list lbut = buttons;
        list Nbuttons = [];
        if(CurMenu == -1)
        {
            CurMenu = 0;
            menuindex = 0;
        }
 
        if((Nbuttons = (llList2List(buttons, (CurMenu * 10), ((CurMenu * 10) + 8)) + ["<<<", ">>>"])) == ["<<<", ">>>"])
            DialogPlus(avatar, message, lbut, channel, menuindex = 0);
        else
            llDialog(avatar, message,  order_buttons(Nbuttons), channel);
    }
    else
        llDialog(avatar, message,  order_buttons(buttons), channel);
}


default
{
 state_entry()
    {
      owner = llGetOwner();
     
    }
    
 touch_start(integer total_number)
    {        
    if(owner==llDetectedKey(0))
      {        
      
        list keys = llGetAgentList(AGENT_LIST_PARCEL, []);
        
        ListeBoutons = [];
        integer i;
        integer a = llGetListLength(keys);
 
        do
        {
            
 
        string agent = llList2Key(keys, i);
        string ownername;
        ownername = llKey2Name(agent);
                    
               
        ListeBoutons += llGetSubString(ownername,0,12);
        }
        while (++i < a); 
  
        listen_handle = llListen(-18, "", owner,"");
              
        DialogPlus(owner, "Choisir un résident", ListeBoutons, -18, menuindex = 0);
      }
    }
    
   
   
   listen(integer chan, string name, key id, string msg)
{
key owner = llGetOwner();

integer index = llListFindList(ListeBoutons, [msg]);


string nom;
nom = llName2Key(msg);
                    
llOwnerSay(msg + " : " + nom);



}
       

}

Dernière modification par ladybianca ; 01/02/2023 à 08h56.
Mise à jour du DialogMEnu ++++++
Citation :
Publié par MenthalOH
Hellow...la fonction llDialog est limitée de base à 12 boutons....pour avoir plus, il faut crée une fonction..."Dialog+" (trouvable sur wiki par ex.) par exemple....mais ton script aura d' autres problèmes...les intitulés des boutons doivent être des "strings", ne dépassant pas 24 caractères....et rien ne sert d' afficher les keys et les distances des avats....les noms devraient suffire....
Alors je crois avoir en partie résolu certains soucis

Par contre j'ai toujours des problèmes et notamment :

- les noms des résidents dans la boîte de dialogue ne s'affichent pas par ordre de proximité !
- j'aimerais que mon pseudo n'y figure pas mais je ne sais pas comment faire pour l'enlever !
- j'aimerais également afficher dans la boite de dialogue le nombre de page à consulter ...

Une aide serait précieuse

Code:
key owner; 
list keys;
list ListeBoutons;
integer menuindex;
integer listen_handle;
integer maxDialogStringLength = 24;


list order_buttons(list buttons)
{
    return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4) +
          llList2List(buttons, -10, -7) + llList2List(buttons, -12, -10);
}

DialogPlus(key avatar, string message, list buttons, integer channel, integer CurMenu)
{
  if (12 < llGetListLength(buttons))
    {
        list lbut = buttons;
        list Nbuttons = [];
        if(CurMenu == -1)
        {
            CurMenu = 0;
            menuindex = 0;
        }
 
        if((Nbuttons = (llList2List(buttons, (CurMenu * 10), ((CurMenu * 10) + 8)) + ["<<<", ">>>"])) == ["<<<", ">>>"])
            DialogPlus(avatar, message, lbut, channel, menuindex = 0);
        else
            llDialog(avatar, message,  order_buttons(Nbuttons), channel);
    }
    else
        llDialog(avatar, message,  order_buttons(buttons), channel);
}


default
{
 state_entry()
    {
      owner = llGetOwner();
     
    }
    
 touch_start(integer total_number)
    {        
    if(owner==llDetectedKey(0))
      {        
      
        list keys = llGetAgentList(AGENT_LIST_PARCEL, []);
        
        ListeBoutons = [];
        integer i;
        integer a = llGetListLength(keys);
 
        do
        {
            
 
        string agent = llList2Key(keys, i);
        string ownername;
        ownername = llKey2Name(agent);
                    
               
        ListeBoutons += llGetSubString(ownername, 0, maxDialogStringLength - 1);
        }
        while (++i < a); 
  
        listen_handle = llListen(-18, "", owner,"");
              
        DialogPlus(owner, "\n" + "Choisir dans ces " + (string)a + " résidents :", ListeBoutons, -18, menuindex = 0);
      }
    }
    
   
   
   listen(integer chan, string name, key id, string msg)
{
    
    
  if(msg == ">>>")
        {
            DialogPlus(owner, "\n", ListeBoutons, -18, ++menuindex);

return;
        }

        else if(msg == "<<<")
        {
            DialogPlus(owner, "\n", ListeBoutons, -18, --menuindex);

return;
        }  
    
    
key owner = llGetOwner();

integer index = llListFindList(ListeBoutons, [msg]);

string nom;
nom = llName2Key(msg);
llOwnerSay(msg + " : " + nom);



}
       

}
Je n' arrive pas à me connecter pour l' instant, mais, pour supprimer ton nom de la liste, tu peux par exemple faire ça.....

......
list keys = llGetAgentList(AGENT_LIST_PARCEL, []);
integer index = llListFindList(keys,[owner]);
keys = llDeleteSubList(keys,index,index);
......


pour info, la fonction llName2Key est à éviter, elle donne des "NULL_KEY" avec les anciens noms.....


pour la distance, il faut faire comme la 1ere version de ton script....

.......

newkeys += [llRound(llVecDist(currentPos,
llList2Vector(llGetObjectDetails(thisAvKey, [OBJECT_POS]), 0))),
thisAvKey];

.....
celà calcule la distance de l' avatar au script pour chaque avat....et l' ajoute avec la clé du même avat ds la liste......la liste est donc de la forme...[distance avat1, clé avat1,distance avat2,clé avat2......distance avat n, clé avat n].....

en faisant un tri ascendant de pas 2.....
Code:
newkeys = llListSort(newkeys, 2, TRUE);
la liste se refera selon l' ordre croissant....par exemple...[3,avat5,12,avat3,25,avat1.......]

suite quand j 'arriverai à me reco.....et il serait interressant de savoir ce que le script doit faire exactement ....

Dernière modification par MenthalOH ; 02/02/2023 à 10h13.
après un retour aux affaires, j' ai test ça...


Code PHP:

key owner;
key agentkey;
 
list 
keys;
list 
newkeys;
list 
ListeBoutons;

integer menuindex;
integer listen_handle;
integer agentdistance;
integer i;
integer listlength;
integer nbboutons;
integer nbpages;

string agentname;
string agentbutname;

list 
order_buttons(list buttons)
{
    return 
llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4) +
        
llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);
}

DialogPlus(key avatarstring message, list buttonsinteger channelinteger CurMenu)
{
    if (
12 llGetListLength(buttons))
    {
        list 
lbut buttons;
        list 
Nbuttons = [];
        if(
CurMenu == -1)
        {
            
CurMenu 0;
            
menuindex 0;
        }

        if((
Nbuttons = (llList2List(buttons, (CurMenu 10), ((CurMenu 10) + 9)) + ["Back""Next"])) == ["Back""Next"])
        {
            
DialogPlus(avatarmessagelbutchannelmenuindex 0);
        }
        
        else
            
llDialog(avatarmessage,  order_buttons(Nbuttons), channel);
    }
    else
        
llDialog(avatarmessage,  order_buttons(buttons), channel);
}


default
{
 
on_rez(integer start_param)
    {
        
llResetScript();
    }
    
 
state_entry()
    {
      
owner llGetOwner();    
    }
    
 
touch_start(integer total_number)
    { 
        
llListenRemove(listen_handle);                  
        
vector currentPos llGetPos();
        
keys = [];
        
newkeys = [];
        
ListeBoutons = [];
        
        
keys llGetAgentList(AGENT_LIST_REGION, []);
        
integer ind llListFindList(keys,[owner]);
        
keys llDeleteSubList(keys,ind,ind);
              
        
listlength llGetListLength(keys);

        for (
0listlength; ++i
        {
            
agentkey llList2Key(keys,i);
            
agentdistance llRound(llVecDist(currentPos,llList2Vector(llGetObjectDetails(agentkey, [OBJECT_POS]), 0)));  
            
agentname llKey2Name(agentkey);
            
agentbutname llGetSubString(agentname,0,12);
            
            
newkeys += [agentdistance,agentbutname,agentname,agentkey];
        }
  
        
newkeys llListSort(newkeys4TRUE);
                
        
ListeBoutons llList2ListStrided(llDeleteSubList(newkeys00), 0, -14);
        
        
nbboutons llGetListLength(ListeBoutons);
        
            if(
nbboutons == 0)
            {
                
llOwnerSay("Personne dans le coin");
            }
            
            else if(
nbboutons <= 12)
            {          
                
listen_handle llListen(-18""owner,"");
                
llSetTimerEvent(30.0);
              
                
DialogPlus(owner"Choisir un résident"ListeBoutons, -18menuindex 0);                
            }
            else if(
nbboutons >12)
            {
                
listen_handle llListen(-18""owner,"");
                
llSetTimerEvent(30.0);
                
                
nbpages llCeil(nbboutons*0.1);
                
                
DialogPlus(owner"Choisir un résident"": page"+ (string)(menuindex+1) +"/"+ (string)(nbpages), ListeBoutons, -18menuindex 0);
            }                    
    }
      
 
listen(integer chanstring namekey idstring msg)
    {
      if(
msg == "Next")
        {
            ++
menuindex;
            if(
menuindex == nbpages)
              { 
menuindex 0;}
                
            
DialogPlus(owner"Choisir un résident"": page"+ (string)(menuindex+1) +"/"+ (string)(nbpages), ListeBoutons, -18menuindex);
        }

        else if(
msg == "Back")
        {
            --
menuindex;
            if(
menuindex == -1)
              { 
menuindex 0;}
            
DialogPlus(owner"Choisir un résident"": page"+ (string)(menuindex+1) +"/"+ (string)(nbpages), ListeBoutons, -18menuindex);
        }
        
        else
        {        
            
llListenRemove(listen_handle);
            
llSetTimerEvent(0.0);
        
            
integer index llListFindList(newkeys, [msg]);

            
llOwnerSay(llList2String(newkeys,index+1)+ " : " llList2String(newkeys,index-1) + "m" "  clé"+":"+" "+llList2String(newkeys,index+2));
        }
    }
    
 
timer()
    {
        
llOwnerSay("Temps ecoulé.");
        
llListenRemove(listen_handle);
        
llSetTimerEvent(0.0);
    }    
    
 
changed(integer change)
    {
        if (
change CHANGED_OWNER
        {
            
llResetScript();
        }
    }


Dernière modification par MenthalOH ; 02/02/2023 à 15h14.
Sarcastique
Re:
Merci grandement MenthalOH pour la refonte du script car de mon coté, avec celui que j'avais posté, j'avais un nombre de bugs incalculables dont de beaux "llDialog: button list too long, must be 12 or fewer entries" !!!!

Je vais tester ton script qui semble contrairement au mien, parfaitement conçu !

Sinon, comme son utilisation est pour l'envoi de récompenses (cadeaux), y'aurait t'il un moyen assez simple avant de tomber sur la fenêtre de Dialog Menu affichant les résidents, d'afficher un premier Dialog Menu demandant de choisir entre deux récompenses ?
Je pensais utiliser la fonction llGetInventoryName(INVENTORY_OBJECT, 0) pour les deux premiers boutons, qui quand l'un aurait été sélectionné, afficherait cette fois ci le Dialog Menu laissant choisir un résident



Citation :
Publié par MenthalOH
après un retour aux affaires, j' ai test ça...


Code PHP:

key owner;
key agentkey;
 
list 
keys;
list 
newkeys;
list 
ListeBoutons;

integer menuindex;
integer listen_handle;
integer agentdistance;
integer i;
integer listlength;
integer nbboutons;
integer nbpages;

string agentname;
string agentbutname;

list 
order_buttons(list buttons)
{
    return 
llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4) +
        
llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);
}

DialogPlus(key avatarstring message, list buttonsinteger channelinteger CurMenu)
{
    if (
12 llGetListLength(buttons))
    {
        list 
lbut buttons;
        list 
Nbuttons = [];
        if(
CurMenu == -1)
        {
            
CurMenu 0;
            
menuindex 0;
        }

        if((
Nbuttons = (llList2List(buttons, (CurMenu 10), ((CurMenu 10) + 9)) + ["Back""Next"])) == ["Back""Next"])
        {
            
DialogPlus(avatarmessagelbutchannelmenuindex 0);
        }
        
        else
            
llDialog(avatarmessage,  order_buttons(Nbuttons), channel);
    }
    else
        
llDialog(avatarmessage,  order_buttons(buttons), channel);
}


default
{
 
on_rez(integer start_param)
    {
        
llResetScript();
    }
    
 
state_entry()
    {
      
owner llGetOwner();    
    }
    
 
touch_start(integer total_number)
    { 
        
llListenRemove(listen_handle);                  
        
vector currentPos llGetPos();
        
keys = [];
        
newkeys = [];
        
ListeBoutons = [];
        
        
keys llGetAgentList(AGENT_LIST_REGION, []);
        
integer ind llListFindList(keys,[owner]);
        
keys llDeleteSubList(keys,ind,ind);
              
        
listlength llGetListLength(keys);

        for (
0listlength; ++i
        {
            
agentkey llList2Key(keys,i);
            
agentdistance llRound(llVecDist(currentPos,llList2Vector(llGetObjectDetails(agentkey, [OBJECT_POS]), 0)));  
            
agentname llKey2Name(agentkey);
            
agentbutname llGetSubString(agentname,0,12);
            
            
newkeys += [agentdistance,agentbutname,agentname,agentkey];
        }
  
        
newkeys llListSort(newkeys4TRUE);
                
        
ListeBoutons llList2ListStrided(llDeleteSubList(newkeys00), 0, -14);
        
        
nbboutons llGetListLength(ListeBoutons);
        
            if(
nbboutons == 0)
            {
                
llOwnerSay("Personne dans le coin");
            }
            
            else if(
nbboutons <= 12)
            {          
                
listen_handle llListen(-18""owner,"");
                
llSetTimerEvent(30.0);
              
                
DialogPlus(owner"Choisir un résident"ListeBoutons, -18menuindex 0);                
            }
            else if(
nbboutons >12)
            {
                
listen_handle llListen(-18""owner,"");
                
llSetTimerEvent(30.0);
                
                
nbpages llCeil(nbboutons*0.1);
                
                
DialogPlus(owner"Choisir un résident"": page"+ (string)(menuindex+1) +"/"+ (string)(nbpages), ListeBoutons, -18menuindex 0);
            }                    
    }
      
 
listen(integer chanstring namekey idstring msg)
    {
      if(
msg == "Next")
        {
            ++
menuindex;
            if(
menuindex == nbpages)
              { 
menuindex 0;}
                
            
DialogPlus(owner"Choisir un résident"": page"+ (string)(menuindex+1) +"/"+ (string)(nbpages), ListeBoutons, -18menuindex);
        }

        else if(
msg == "Back")
        {
            --
menuindex;
            if(
menuindex == -1)
              { 
menuindex 0;}
            
DialogPlus(owner"Choisir un résident"": page"+ (string)(menuindex+1) +"/"+ (string)(nbpages), ListeBoutons, -18menuindex);
        }
        
        else
        {        
            
llListenRemove(listen_handle);
            
llSetTimerEvent(0.0);
        
            
integer index llListFindList(newkeys, [msg]);

            
llOwnerSay(llList2String(newkeys,index+1)+ " : " llList2String(newkeys,index-1) + "m" "  clé"+":"+" "+llList2String(newkeys,index+2));
        }
    }
    
 
timer()
    {
        
llOwnerSay("Temps ecoulé.");
        
llListenRemove(listen_handle);
        
llSetTimerEvent(0.0);
    }    
    
 
changed(integer change)
    {
        if (
change CHANGED_OWNER
        {
            
llResetScript();
        }
    }

Hellow.....il serait plus simple de faire l' inverse....selectionner un nom et ensuite choisir le cadeau....dans ce style...pour cet exemple, le prim contenant le script doit aussi contenir un objet nommé "cadeau1" et un autre "cadeau2"......



Code PHP:

key owner;
key agentkey;
key agentcadeau;
 
list 
keys;
list 
newkeys;
list 
ListeBoutons;

integer menuindex;
integer listen_handle;
integer agentdistance;
integer i;
integer listlength;
integer nbboutons;
integer nbpages;
integer ecoute;
integer canal_cadeaux = -22;


string agentname;
string agentbutname;

list 
order_buttons(list buttons)
{
    return 
llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4) +
        
llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);
}

DialogPlus(key avatarstring message, list buttonsinteger channelinteger CurMenu)
{
    if (
12 llGetListLength(buttons))
    {
        list 
lbut buttons;
        list 
Nbuttons = [];
        if(
CurMenu == -1)
        {
            
CurMenu 0;
            
menuindex 0;
        }

        if((
Nbuttons = (llList2List(buttons, (CurMenu 10), ((CurMenu 10) + 9)) + ["Back""Next"])) == ["Back""Next"])
        {
            
DialogPlus(avatarmessagelbutchannelmenuindex 0);
        }
        
        else
            
llDialog(avatarmessage,  order_buttons(Nbuttons), channel);
    }
    else
        
llDialog(avatarmessage,  order_buttons(buttons), channel);
}


default
{
 
on_rez(integer start_param)
    {
        
llResetScript();
    }
    
 
state_entry()
    {
        
owner llGetOwner();    
    }
    
 
touch_start(integer total_number)
    { 
        
llListenRemove(listen_handle);
        
llListenRemove(ecoute);                  
        
vector currentPos llGetPos();
        
keys = [];
        
newkeys = [];
        
ListeBoutons = [];
        
        
keys llGetAgentList(AGENT_LIST_REGION, []);
        
integer ind llListFindList(keys,[owner]);
        
keys llDeleteSubList(keys,ind,ind);
              
        
listlength llGetListLength(keys);

        for (
0listlength; ++i
        {
            
agentkey llList2Key(keys,i);
            
agentdistance llRound(llVecDist(currentPos,llList2Vector(llGetObjectDetails(agentkey, [OBJECT_POS]), 0)));  
            
agentname llKey2Name(agentkey);
            
agentbutname llGetSubString(agentname,0,12);
            
            
newkeys += [agentdistance,agentbutname,agentname,agentkey];
        }
  
        
newkeys llListSort(newkeys4TRUE);
                
        
ListeBoutons llList2ListStrided(llDeleteSubList(newkeys00), 0, -14);
        
        
nbboutons llGetListLength(ListeBoutons);
        
            if(
nbboutons == 0)
            {
                
llOwnerSay("Personne dans le coin");
            }
            
            else if(
nbboutons <= 12)
            {          
                
listen_handle llListen(-18""owner,"");
                
llSetTimerEvent(30.0);
              
                
DialogPlus(owner"Choisir un résident"ListeBoutons, -18menuindex 0);                
            }
            else if(
nbboutons >12)
            {
                
listen_handle llListen(-18""owner,"");
                
llSetTimerEvent(30.0);
                
                
nbpages llCeil(nbboutons*0.1);
                
                
DialogPlus(owner"Choisir un résident"": page"+ (string)(menuindex+1) +"/"+ (string)(nbpages), ListeBoutons, -18menuindex 0);
            }                    
    }
      
 
listen(integer chanstring namekey idstring msg)
    {
    if(
chan == -18)
    {
      if(
msg == "Next")
        {
            ++
menuindex;
            if(
menuindex == nbpages)
              { 
menuindex 0;}
                
            
DialogPlus(owner"Choisir un résident"": page"+ (string)(menuindex+1) +"/"+ (string)(nbpages), ListeBoutons, -18menuindex);
        }

        else if(
msg == "Back")
        {
            --
menuindex;
            if(
menuindex == -1)
              { 
menuindex 0;}
            
DialogPlus(owner"Choisir un résident"": page"+ (string)(menuindex+1) +"/"+ (string)(nbpages), ListeBoutons, -18menuindex);
        }
        
        else
        {        
            
llListenRemove(listen_handle);
            
llSetTimerEvent(0.0);
        
            
integer index llListFindList(newkeys, [msg]);

            
llOwnerSay(llList2String(newkeys,index+1)+ " : " llList2String(newkeys,index-1) + "m" "  clé"+":"+" "+llList2String(newkeys,index+2));

            
agentcadeau llList2Key(newkeys,index+2);

            
integer ecoute;
            
ecoute llListen(canal_cadeaux""owner,"");
            
llSetTimerEvent(30.0);
                
            
llDialog(owner,"Choix du cadeau",["cadeau1","Cancel","cadeau2"], canal_cadeaux);
        }
      }
      
      if(
chan == canal_cadeaux)
      {
          if(
msg == "Cancel")
          {
              
llListenRemove(ecoute);
              
llSetTimerEvent(0.0);
              
llOwnerSay("Cadeau annulé");
            }
            else
            {
                
llGiveInventory(agentcadeau,msg);
                
llListenRemove(ecoute);
                
llSetTimerEvent(0.0);
                
llOwnerSay(msg " envoyé à:" " " + (string)llKey2Name(agentcadeau));
            }          
      }
    }
    
 
timer()
    {
        
llOwnerSay("Temps ecoulé.");
        
llListenRemove(listen_handle);
        
llListenRemove(ecoute);
        
llSetTimerEvent(0.0);
    }    
    
 
changed(integer change)
    {
        if (
change CHANGED_OWNER
        {
            
llResetScript();
        }
    }


Dernière modification par MenthalOH ; 03/02/2023 à 16h30.
et petite variante, si tu veux absolument choisir avant....le choix se lit sur la boite de dial et se fait par une simple touche ....

Code PHP:

key owner;
key agentkey;
key agentcadeau;
 
list 
keys;
list 
newkeys;
list 
ListeBoutons;

integer menuindex;
integer listen_handle;
integer agentdistance;
integer i;
integer listlength;
integer nbboutons;
integer nbpages;
integer choix;

string agentname;
string agentbutname;
string textecadeau;
string cadeau;

list 
order_buttons(list buttons)
{
    return 
llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4) +
        
llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);
}

DialogPlus(key avatarstring message, list buttonsinteger channelinteger CurMenu)
{
    if (
12 llGetListLength(buttons))
    {
        list 
lbut buttons;
        list 
Nbuttons = [];
        if(
CurMenu == -1)
        {
            
CurMenu 0;
            
menuindex 0;
        }

        if((
Nbuttons = (llList2List(buttons, (CurMenu 9), ((CurMenu 9) + 9)) + ["Back","Choix cadeau""Next"])) == ["Back","Choix cadeau""Next"])
        {
            
DialogPlus(avatarmessagelbutchannelmenuindex 0);
        }
        
        else
            
llDialog(avatarmessage,  order_buttons(Nbuttons), channel);
    }
    else
        
llDialog(avatarmessage,  order_buttons(buttons), channel);
}


default
{
 
on_rez(integer start_param)
    {
        
llResetScript();
    }
    
 
state_entry()
    {
        
owner llGetOwner();
        
textecadeau "Envoyer cadeau1";     
    }
    
 
touch_start(integer total_number)
    { 
        
llListenRemove(listen_handle);                 
        
vector currentPos llGetPos();
        
keys = [];
        
newkeys = [];
        
ListeBoutons = [];
        
        
keys llGetAgentList(AGENT_LIST_PARCEL, []);
        
integer ind llListFindList(keys,[owner]);
        
keys llDeleteSubList(keys,ind,ind);
               
        
listlength llGetListLength(keys);

        for (
0listlength; ++i
        {
            
agentkey llList2Key(keys,i);
            
agentdistance llRound(llVecDist(currentPos,llList2Vector(llGetObjectDetails(agentkey, [OBJECT_POS]), 0)));   
            
agentname llKey2Name(agentkey);
            
agentbutname llGetSubString(agentname,0,12);
            
            
newkeys += [agentdistance,agentbutname,agentname,agentkey];
        }
  
        
newkeys llListSort(newkeys4TRUE);
                
        
ListeBoutons llList2ListStrided(llDeleteSubList(newkeys00), 0, -14);
        
        
nbboutons llGetListLength(ListeBoutons);
        
            if(
nbboutons == 0)
            {
                 
llOwnerSay("Personne dans le coin");
            }
            
            else if(
nbboutons <= 11)
            {           
                 
listen_handle llListen(-18""owner,"");
                 
llSetTimerEvent(30.0);
              
                 
DialogPlus(owner"Choisir un résident""\n\n\n"textecadeauListeBoutons+["Choix cadeau"], -18menuindex 0);                
            }
            else if(
nbboutons >12)
            {
                
listen_handle llListen(-18""owner,"");
                
llSetTimerEvent(30.0);
                
                
nbpages llCeil(nbboutons/9.0);
                
                
DialogPlus(owner"Choisir un résident"": page"+ (string)(menuindex+1) +"/"+ (string)(nbpages)+ "\n\n\n"textecadeauListeBoutons, -18menuindex 0);
            }                     
    }
       
 
listen(integer chanstring namekey idstring msg)
    {
       if(
msg == "Next")
        {
            ++
menuindex;
            if(
menuindex == nbpages)
               { 
menuindex 0;}
                
            
DialogPlus(owner"Choisir un résident"": page"+ (string)(menuindex+1) +"/"+ (string)(nbpages)+ "\n\n\n"textecadeauListeBoutons, -18menuindex);
        }

        else if(
msg == "Back")
        {
            --
menuindex;
            if(
menuindex == -1)
               { 
menuindex 0;}
            
DialogPlus(owner"Choisir un résident"": page"+ (string)(menuindex+1) +"/"+ (string)(nbpages)+ "\n\n\n"textecadeauListeBoutons, -18menuindex);
        }
        
        else if(
msg == "Choix cadeau")
        {
            if(
choix)
            {
                
textecadeau "Envoyer cadeau1";
                
cadeau "cadeau1";
                
DialogPlus(owner"Choisir un résident""\n\n\n"textecadeauListeBoutons+["Choix cadeau"], -18menuindex 0);   
            }
            else
            {
                
textecadeau "Envoyer cadeau2";
                
cadeau "cadeau2";
                
DialogPlus(owner"Choisir un résident""\n\n\n"textecadeauListeBoutons+["Choix cadeau"], -18menuindex 0);   
            }
            
choix = !choix;            
        }
        
        else
        {        
             
llListenRemove(listen_handle);
             
llSetTimerEvent(0.0);
        
            
integer index llListFindList(newkeys, [msg]);

            
llOwnerSay(llList2String(newkeys,index+1)+ " : " llList2String(newkeys,index-1) + "m" "  clé"+":"+" "+llList2String(newkeys,index+2));

            
agentcadeau llList2Key(newkeys,index+2);

            
llGiveInventory(agentcadeau,cadeau);
            
llOwnerSay(cadeau " envoyé à:" " " + (string)llKey2Name(agentcadeau));
         }
    }
    
 
timer()
    {
        
llOwnerSay("Temps ecoulé.");
        
llListenRemove(listen_handle);
        
llSetTimerEvent(0.0);
    }    
    
 
changed(integer change)
    {
        if (
change CHANGED_OWNER
        {
            
llResetScript();
        }
    }

Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés