Notecard avec Menu

Répondre
Partager Rechercher
Bonjour à tous,

Ayant consulté le moteur de recherche du Forum,
et ayant obtenu quelques vagues explications,
je pose ce post pour une petite question simple.

Voilà mon problème :

J'utilise actuellement deux types de NoteCards pour mes clients,
les unes sont en Français, les autres en Anglais.

Quand ces derniers cliqueront sur une de mes Prim,
je souhaiterais qu'un menu "bleu" se déroule en haut
à droite sur leur écran, en leur indiquant la langue à choisir.
Ainsi, une fois le bouton cliqué, leur délivrer
la NoteCard correspondant à leur langage.

Pour faire court, je recherche ce qu'on pourrait appeler
communément un script "NoteCard With Menu".

http://stats.slbuzz.com/jenzinewebzine-miles.png
Ca:

Code:
list choix=["français","anglais"];
default
{
    state_entry()
    {
        llListen(56,"",NULL_KEY,"");
    }
    touch_start(integer total_number)
    {
        llDialog(llDetectedKey(0),"Choix de la langue/Choose your language",choix,56);
    }
    listen(integer channel,string name,key id,string message){
        if(message=="français"){
            llGiveInventory(id,"notecardfr");
        }
        else if(message=="anglais"){
            llGiveInventory(id,"notecarden");
        }
    }
tu remplaces "notecardfr" et "notecarden" par le nom de tes notecards respectivent. Testé sous lsleditor.
Merci beaucoup Seb,

J'ai testé sous LSL Editor et In-Game,
mais il semblerait qu'il persiste une erreur
de syntaxe quelque part...

Le script ne prend pas...

http://stats.slbuzz.com/jenzinewebzine-miles.png
J'avais, en effet, remarqué les caractères spéciaux que j'avais corrigés,
mais je n'avais pas remarqué le "}" manquant à la fin du script.

Merci beaucoup pour ce chouette script qui fonctionne désormais !

http://stats.slbuzz.com/jenzinewebzine-miles.png
... Je ré-interviens, car il persiste un petit problème...
Le menu fonctionne très bien, et distribue donc les NoteCards correspondantes...

En revanche, j'ai plusieurs panneaux. Dans chaque panneau, j'y ai placé
des NoteCards différentes, mais au final, pour chaque panneau cliqué,
le script délivre TOUTES les NoteCards en même temps !
Le GiveInventory est pourtant bien renseigné pour chacun de ses panneaux,
et devrait - dans la logique - ne pas interagir avec les autres...

De quoi cela peut-il venir ??

http://stats.slbuzz.com/jenzinewebzine-miles.png
C'est parceque les panneaux proches entendent tous le message qui déclenche l'envoit des notecards. Si tu veux être tranquile sans faire dans le complexe au niveau script, change le numéro de channel utilisé par el menu de façon à ce que chaque panneau en utilise un différent.

Code:
list choix=["francais","anglais"];
integer channel=-305790;
integer handler;

sleep()
{
    llListenRemove(handler);
    llSetTimerEvent(0);
}

default
{
    state_entry()
    {
    }
    
    touch_start(integer total_number)
    {
        handler=llListen(channel,"",NULL_KEY,"");
        llSetTimerEvent(300);
        llDialog(llDetectedKey(0),"Choix de la langue/Choose your language",choix,channel);
    }
    
    listen(integer channel,string name,key id,string message)
    {
        if(message=="francais")
            {
                llGiveInventory(id,"notecardfr");
                sleep();
            }
        else if(message=="anglais")
            {
                llGiveInventory(id,"notecarden");
               sleep();
            }
    }
    
    timer()
       {
            sleep();
       }
}
Et pour chaque panneau tu mets une valeur différente ici :
Code:
integer channel=-305790;
Tant qu'à faire une valeur négative vu que seuls les scripts peuvent parler dessus, contrairement aux positives que les AV peuvent directement exploiter.

P.S. : J'en ai profité pour modifier le script de telle façon que le listen soit fermé une fois l'action finie ou après 5 minutes d'ouverture.
[edit] Correction de plusieurs erreurs.
Citation :
L’origine de cette expression n’étant plus comprise, la graphie Autant pour moi est courante aujourd’hui, mais rien ne la justifie.
Ils ont pas dit que c'était faux.... la blonde tu sors

(ouais niquel le hs)
Citation :
Bon, je sais c'est HS, mais euh... Bah... J'apprends peut-être un truc aux gens ^^
Les deux sont courament admis d'autant plus que l'expression a un sens sous cette forme.

Citation :
Autant pour moi j'avais pas pensé à tout ca..... Dommage de ne pas pouvoir restreindre un llDialog à un seul objet (écouteur interne).
Hmmm c'est possible en fait ...

Code:
list choix=["francais","anglais"];
integer channel=-305790;
integer handler;

sleep()
{
    llListenRemove(handler);
    llSetTimerEvent(0);
}

default
{
    state_entry()
    {
    }
    
    touch_start(integer total_number)
    {
        handler=llListen(channel,"",llDetectedKey(0),"");
        llSetTimerEvent(300);
        llDialog(llDetectedKey(0),"Choix de la langue/Choose your language",choix,channel);
    }
    
    listen(integer channel,string name,key id,string message)
    {
        if(message=="francais")
            {
                llGiveInventory(id,"notecardfr");
                sleep();
            }
        else if(message=="anglais")
            {
                llGiveInventory(id,"notecarden");
               sleep();
            }
    }
    
    timer()
       {
            sleep();
       }
}
Là, le script n'écoutera que la personne qui aura touché l'objet en dernier et le canal est fermé après utilisation du menu. Mais ce n'est pas parfait dans le sens ou un menu non-validé restera ouvert un moment et pourra réagir à un message d'un script voisin. De plus si quelqu'un cible entre-temps, le menu ouvert ne sera plus fonctionnel.

Une autre solution serait de générer aléatoirement le numéro du canal, étant donné que les interger prennent des valeurs allant de -2147483648 à 2147483647, ça limite la probabilité d'avoir 2 script utilisant le même canal.
Le script pourrait attendre sur un canal défini aléatoirement au début. Pour éviter de tomber deux fois sur le même, il envoie un message au début (ping) et change de canal s'il reçoit une réponse (pong).
C'est une solution qui fonctionne oui, je ne l'ai pas développée car ça commence à tourner à l'usine à gaz et n'est pas forcement accessible aux personnes qui ne savant pas (ou très peu) scripter
Encore que le ping ne soit pas vraiment nécessaire si on considère la plage de valeur que peu prendre un integer et la probabilité que 2 scripts écoutent un même channel à un instant donné.
Répondre

Connectés sur ce fil

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