Inventory Based Menu >> help pour modif.

Répondre
Partager Rechercher
hello ,

j' ai trouvé ce sricpt rezzer , qui est d' ailleurs particulierement efficace sur cette page wiki LSL http://wiki.secondlife.com/wiki/Inventory_Based_Menu , un rezzer avec un menu pop up bleu qui indique chaque objet dans le contenu de la prim ( dernier onglet quand on édite un objet )

je voudrais transformer ce script en distributeur de notecard avec le meme systeme , seulement voilà tout fonctionne techniquement mais ça ne donne pas de notecard comme prévu

le script original pour rez un object en ayant juste à glisser des objects dans le contenu de la prim et ça fonctionne à merveille :

Code PHP:

list MENU1 = [];
list 
MENU2 = [];
integer listener;
integer MENU_CHANNEL 1000;
 
 
Dialog(key id, list menu)
{
    
llListenRemove(listener);
    
listener llListen(MENU_CHANNEL""NULL_KEY"");
    
llDialog(id"Select one object below: "menuMENU_CHANNEL);
}
 
default
{
    
on_rez(integer num)
    {
        
llResetScript();
    }
 
    
touch_start(integer total_number)
    {
        
integer i 0;
        
MENU1 = [];
        
MENU2 = [];
        
integer c llGetInventoryNumber(INVENTORY_OBJECT);
        if (
<= 12)
        {
            for (; 
c; ++i)
                
MENU1 += llGetInventoryName(INVENTORY_OBJECTi);
        }
        else
        {        
            for (; 
11; ++i)
                
MENU1 += llGetInventoryName(INVENTORY_OBJECTi);
            if(
22)
                
22;
            for (; 
c; ++i)
                
MENU2 += llGetInventoryName(INVENTORY_OBJECTi); 
            
MENU1 += ">>";
            
MENU2 += "<<";                          
        }
        
Dialog(llDetectedKey(0), MENU1);
    }
 
    
listen(integer channelstring namekey idstring message
    {
        if (
channel == MENU_CHANNEL)
        {
            
llListenRemove(listener);  
            if (
message == ">>")
            {
                
Dialog(idMENU2);
            }
            else if (
message == "<<")
            {
                
Dialog(idMENU1);
            }        
            else                    
            {
                
// todo add offsets so box sites perfect on rezzer 
                
llRezAtRoot(messagellGetPos(), ZERO_VECTORllGetRot(), 0);
            }      
        }
    }  

et ma modif. parmi les dernieres lignes avec llGiveInventory :

Code PHP:

list MENU1 = [];
list 
MENU2 = [];
integer listener;
integer MENU_CHANNEL 1000;
 
 
Dialog(key id, list menu)
{
    
llListenRemove(listener);
    
listener llListen(MENU_CHANNEL""NULL_KEY"");
    
llDialog(id"Select one object below: "menuMENU_CHANNEL);
}
 
default
{
    
on_rez(integer num)
    {
        
llResetScript();
    }
 
    
touch_start(integer total_number)
    {
        
integer i 0;
        
MENU1 = [];
        
MENU2 = [];
        
integer c llGetInventoryNumber(INVENTORY_OBJECT);
        if (
<= 12)
        {
            for (; 
c; ++i)
                
MENU1 += llGetInventoryName(INVENTORY_OBJECTi);
        }
        else
        {        
            for (; 
11; ++i)
                
MENU1 += llGetInventoryName(INVENTORY_OBJECTi);
            if(
22)
                
22;
            for (; 
c; ++i)
                
MENU2 += llGetInventoryName(INVENTORY_OBJECTi); 
            
MENU1 += ">>";
            
MENU2 += "<<";                          
        }
        
Dialog(llDetectedKey(0), MENU1);
    }
 
    
listen(integer channelstring namekey idstring message
    {
        if (
channel == MENU_CHANNEL)
        {
            
llListenRemove(listener);  
            if (
message == ">>")
            {
                
Dialog(idMENU2);
            }
            else if (
message == "<<")
            {
                
Dialog(idMENU1);
            }        
            else                    
            {
                
llGiveInventory(llDetectedKey(0),llGetInventoryName(INVENTORY_NOTECARD0)); 
            }      
        }
    }  

pas d' erreur de script signalée ( quand on enregistre le script ) le menu apparait bien avec le nom de chaque notecard mais ça ne délivre pas de notecard comme un llGiveInventory basique ,

mais pourquoi ça ne marche pas ??? svp , help !

llGetInventoryNumber(INVENTORY_OBJECT);

====>
llGetInventoryNumber(INVENTORY_NOTECARD);

MENU1 += llGetInventoryName(INVENTORY_OBJECT, i);

====>
MENU1 += llGetInventoryName(INVENTORY_NOTECARD, i);

llGiveInventory(llDetectedKey(0),llGetInventoryName(INVENTORY_NOTECARD, 0));

====>
llGiveInventory(id,message);

Quelques remarques en plus :

  1. llListen non ciblé sur id
  2. Construction des listes dans le touch_start alors que ca suffit dans un state_entry avec au besoin une reconstruction au changement d'inventaire.
  3. Tu ne vérifies pas la taille des boutons du menu ca va planter
  4. un llListenRemove mal placé en début de listen (il devrait se trouver à l'entrée du else car il est déjà appliqué dans Dialog).

pour (INVENTORY_NOTECARD); au lieu de (INVENTORY_OBJECT); c' est une simple erreur de ma part en copier/coller depuis la page wiki , je l' avais bien remplacé dans le script partout où c' etait nécéssaire ,

et j' ai suivi ton conseil pour ====> llGiveInventory(id,message); , maintenant ça fonctionne merci beaucoup ....

quant à
Citation :
Tu ne vérifies pas la taille des boutons du menu ca va planter
, en effet quand le nombre de caractères de l' object ou notecard ( ou autre ) dépasse 24 caractères , espace compris , ça plante , comment le corriger , si toutefois c' est possible ? ( Notecard Menu Giver: llDialog: button labels must be 24 or fewer characters long )
tout en sachant aussi que le bouton du menu pop up a une longueur définie qui ne pourra pas afficher toutes les lettres , une vingtaine de i , mais seulement 123456789 qui prend plus de place en longueur ! ( les regles SL )
Voilà une possibilité en collant le plus possible à ton code existant :

Code PHP:

list MENU1;
list 
MENU2;
list 
l_noms_courts;
integer listener;
integer i_nbr_notes;
integer MENU_CHANNEL 1000;

Dialog(key id, list menu) {
    
llListenRemove(listener);
    
listener llListen(MENU_CHANNEL""NULL_KEY"");
    
llDialog(id"Select one object below: "menuMENU_CHANNEL);
}

string get_nom(integer i) {
    return 
llList2String(l_noms_courtsi);
}

get_noms_courts(integer nbr) {
    
l_noms_courts = [];
    
integer i;
    for(; 
nbr; ++i) {
        
string s llGetInventoryName(INVENTORY_NOTECARDi);
        
integer n llStringLength(s);
        if(
24llGetSubString(s023);
        
l_noms_courts += s;
    }
}

init() {
    
i_nbr_notes llGetInventoryNumber(INVENTORY_NOTECARD);
    
get_noms_courts(i_nbr_notes);
}

default
{
    
state_entry()
    {
        
init();
    }

    
changed(integer change)
    {
        if(
change CHANGED_INVENTORYinit();
    }

    
touch_start(integer total_number)
    {
        
integer i;
        
MENU1 = [];
        
integer c i_nbr_notes;
        if (
<= 12)
        {
            for (; 
c; ++i)
                
MENU1 += get_nom(i);
        }
        else
        {
            for (; 
11; ++i)
                
MENU1 += get_nom(i);
            if(
2222;
            
MENU2 = [];
            for (; 
c; ++i)
                
MENU2 +=  get_nom(i);
            
MENU2 += "<<";
        }
        
MENU1 += ">>";
        
Dialog(llDetectedKey(0), MENU1);
    }

    
listen(integer channelstring namekey idstring message)
    {
        
llListenRemove(listener);
        if (
message == ">>")
        {
            
Dialog(idMENU2);
        }
        else if (
message == "<<")
        {
            
Dialog(idMENU1);
        }
        else
        {
            
integer i llListFindList(l_noms_courts, [message]);
            
llGiveInventory(idllGetInventoryName(INVENTORY_NOTECARDi));
        }
    }

Répondre

Connectés sur ce fil

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