|
On essaie encore une fois ?
- Beaucoup de mise en page :
- Des espaces bien placés pour faciliter la navigation avec les Ctrl-flèche droite ou gauche
- Une indentation strictement respectée.
- Un peu de correction :
- Je n'ai pas bien compris les instruction llSetLinkAlpha(2,1.0,1-3); Que vient faire ce 1-3 dont le résultat est -2 ? Je l'ai remplacé par ALL_SIDES.
- Si tu veux gérer un timer pour les menus, il faut, d'une part, l'initialiser (touch_start), d'autre par, le réinitialiser à chaque appel de llDialog.
- Dans la version précédente de ton script, j'avais corrigé l'ouverture de l'écoute. Comme tu n'en as pas tenu compte, je recommence.
- Beaucoup d'optimisation :
- Une organisation du listen pour n'appeler qu'une seule fois la fonction resetEcoute().
- Pour l'appel des sous menus de couleurs.
- Pour la gestion de la couleur de l'objet.
- Pour la gestion de la transparence.
Résultat : 150 lignes de code gagnées.
key user;
//integer on;
//integer ok;
//integer go;
//integer ja;
//integer vi;
//integer oui;
// Remplaçons ton oui plyglotte par une liste
list lAlphaLink = [ 0, 0, 0, 0, 0, 0 ];
integer ecoute;
float delai = 60.0;
integer canal; // < plus de canal defini
list lColorTxt = [ "*Banane*",
"*Blanc*",
"*Bleu*",
"*Jaune*",
"*Noir*",
"*Rouge*",
"*Rose*",
"*Vert*",
"*Violet*",
"*Fushia*"
];
list lVecColorTxt = [ <0.890, 0.812, 0.341>, // *Banane*
<1.000, 1.000, 1.000>, // *Blanc*
<0.000, 0.000, 1.000>, // *Bleu*
<1.000, 1.000, 0.000>, // *Jaune*
<0.000, 0.000, 0.000>, // *Noir*
<1.000, 0.000, 0.000>, // *Rouge*
<1.000, 0.753, 0.796>, // *Rose*
<0.000, 0.502, 0.000>, // *Vert*
<0.561, 0.369, 0.600>, // *Violet*
<1.000, 0.000, 0.667> // *Fushia*
];
list lColorObj = [ "Banane",
"Antique",
"Ivoire",
"Blank",
"B.Clair",
"Turquoise",
"Nuit",
"J.Clair",
"Pop-Corn",
"Citron",
"Noir",
"Rouges",
"Cerise",
"Indien",
"R.Clair",
"Broadway",
"Mat",
"V.Clair",
"Olive",
"Pin",
"Violette",
"Outremer",
"Sombre"
];
list lVecColorObj = [ <0.890, 0.812, 0.341>, // Banane
<0.980, 0.922, 0.843>, // Antique
<1.000, 1.000, 0.941>, // Ivoire
<1.000, 1.000, 1.000>, // Blank
<0.690, 0.878, 0.902>, // B.Clair
<0.000, 0.780, 0.549>, // Turquoise
<0.098, 0.098, 0.439>, // Nuit
<1.000, 1.000, 0.878>, // J.Clair
<1.000, 1.000, 0.667>, // Pop-Corn
<1.000, 0.890, 0.012>, // Citron
<0.000, 0.000, 0.000>, // Noir
<1.000, 0.000, 0.000>, // Rouges
<0.200, 0.000, 0.000>, // Cerise
<0.690, 0.090, 0.122>, // Indien
<1.000, 0.431, 0.780>, // R.Clair
<1.000, 0.000, 0.400>, // Broadway
<1.000, 0.800, 0.800>, // Mat
<0.596, 0.984, 0.596>, // V.Clair
<0.310, 0.310, 0.184>, // Olive
<0.000, 0.200, 0.000>, // Pin
<0.561, 0.369, 0.600>, // Violette
<0.361, 0.141, 0.431>, // Outremer
<0.529, 0.122, 0.471> // Sombre
];
list menu0 = [ "Banane", "Blanc", "Bleu", "Jaune", "Noir", "Rouge", "Rose", "Vert", "Violet", "Retour" ];
list menu1 = [ "+", "-", "Retour" ];
list menu2 = [ "1", "2", "3", "4", "5", "6", "Retour" ];
list menu_principal;
string Option_Hide = "Hide text";
string Option_Show = "Show text";
string Option_Color = "Couleurs Texte";
list lSousCouleursMess = [
"Blanc",
"Bleu",
"Jaune",
"Rouge",
"Rose",
"Vert",
"Violet"
];
list lSousCouleursList = [
// Blanc
"Antique",
"Ivoire",
"retour",
"Blank",
// Bleu
"B.Clair",
"Turquoise",
"retour",
"Nuit",
// Jaune
"J.Clair",
"Pop-Corn",
"retour",
"Citron",
// Rouge
"Rouges",
"Cerise",
"retour",
"Indien",
// Rose
"R.Clair",
"Broadway",
"retour",
"Mat",
// Vert
"V.Clair",
"Olive",
"retour",
"Pin",
// Violet
"Violette",
"Outremer",
"retour",
"Sombre"
];
vector vColor = <1.0,1.0,1.0>;
string sMessage;
integer index;
list lMaList;
key kReq;
integer iLine;
string aNote;
resetEcoute()
{
llSetTimerEvent( 0.0 );
llListenRemove( ecoute );
}
init()
{
vidage();
//je trouve le nom de la 1ere (zeroième) notecard du contenu de l'objet
aNote = llGetInventoryName( INVENTORY_NOTECARD, 0 );
llOwnerSay( "ready" );
}
vidage()
{
iLine = 0;
lMaList = [];
}
lecture()
{
kReq = llGetNotecardLine( aNote, iLine++ );
}
default
{
state_entry()
{
init();
canal = (integer)llFrand( 10000000.0 ) - 10000000; // canal dynamique pour éviter la communication entre un meme prim identique
llSetText( sMessage, vColor, 1.0 ) ;
menu_principal = [ "Show Text", "Couleurs", "Taille", "Billets", "Info", "Hud Jarretiere", "Load" ];
}
touch_start( integer total_number )
{
user = llDetectedKey(0);
if( user == llGetOwner() )
{
ecoute = llListen( canal, "", user, "" ); // plus de NULL_KEY , on cible l'user. Limitation du lag au moment de l ecoute
llSetTimerEvent( delai );
llDialog( user, "Personnalisation de la Jarretière", menu_principal, canal ); // on precise les menus "menu_pincipal"
}
}
listen( integer channel, string name, key id, string message )
{
if( message == "Couleurs Texte" )
{
llSetTimerEvent( 0.0 );
llSetTimerEvent( delai );
llDialog( id, "Choisissez une Couleur", lColorTxt, canal );
}
else if( message == "Couleurs" )
{
llSetTimerEvent( 0.0 );
llSetTimerEvent( delai );
llDialog( id, "Choisissez une Couleur", menu0, canal ); // pas d'arret de l'ecoute et du timer , on en a encore besoin
}
else if( ( index = llListFindList( lSousCouleursMess, [ message ] ) ) >= 0 )
{
llSetTimerEvent( 0.0 );
llSetTimerEvent( delai );
llDialog( id, "Choisissez une Couleur", llList2List( lSousCouleursList, index * 4, index * 4 + 3 ), canal ); // idem
}
else if( message == "Taille")
{
llSetTimerEvent( 0.0 );
llSetTimerEvent( delai );
llDialog( id, "Réglez votre taille", menu1, canal ); // idem
}
else if( message == "Billets" )
{
llSetTimerEvent( 0.0 );
llSetTimerEvent( delai );
llDialog( id, "Nombre de billets visibles", menu2, canal ); // idem
}
else if( message == "Retour" )
{
llSetTimerEvent( 0.0 );
llSetTimerEvent( delai );
llDialog( id, "Personnalisation de la jarretière", menu_principal, canal );
}
else if( message == "retour" )
{
llSetTimerEvent( 0.0 );
llSetTimerEvent( delai );
llDialog( id, "Choisissez une couleur", menu0, canal );
}
else
{
resetEcoute();
if( message == "Show Text" )
{
sMessage = llDumpList2String( lMaList, "\n" );
llSetText( sMessage, vColor, 1.0 ) ;
menu_principal = [ "Hide Text", "Couleurs Texte", "Couleurs", "Taille", "Billets", "Info", "Hud Jarretiere", "Load" ];
}
else if( message == "Hide Text" )
{
sMessage = "";
llSetText( sMessage, vColor, 1.0 );
menu_principal = [ "Show Text", "Couleurs", "Taille", "Billets", "Info", "Hud Jarretiere", "Load" ];
}
else if( message == "Load" )
{
vidage();
if( aNote != "" ) // y'a-t-il bien une carte a lire
lecture();
else
// Puisque seul le owner peut appeler le menu, pourquoi polluer le chat ?
llOwnerSay( "Merci de me donner une notecard à lire" );
}
// Gestion de la couleur du texte
else if( ( index = llListFindList( lColorTxt, [ message ] ) ) >= 0 )
{
vColor = llList2Vector( lVecColorTxt, index );
llSetText( sMessage, vColor, 1.0 );
}
// Gestion de la couleur de l'objet
else if( ( index = llListFindList( lColorObj, [ message ] ) ) >= 0 )
{
llSetColor( llList2Vector( lVecColorObj, index ), ALL_SIDES );
}
else if( message == "+" )
{
llMessageLinked( LINK_SET, 0, "+", NULL_KEY );
llSetScale( llGetScale() + <0.0, 0.02, 0.02> );
}
else if( message == "-" )
{
llMessageLinked( LINK_SET, 0, "-", NULL_KEY );
llSetScale( llGetScale() - <0.0, 0.02, 0.02> );
}
// Gestion de la transparence/opacité des prims (de 1 à 6)
else if( (string)((integer)message) == message &&
(integer)message >= 1 && (integer)message <= 6 )
{
index = (integer)message;
llSetLinkAlpha( index + 1, (float)llList2Integer( lAlphaLink, index - 1 ), ALL_SIDES );;
lAlphaLink = llListReplaceList( lAlphaLink, [ ! llList2Integer( lAlphaLink, index - 1 ) ], index - 1, index - 1 );
}
else if( message == "Info" || message == "Hud Jarretiere" )
{
llGiveInventory( id, message );
}
}
}
dataserver( key id, string data )
{//passons au choses serieuses
if (id == kReq) { // juste pour etre sur que dataserver répond bien a ma question et non a une autre
if (data != EOF) {// rappel : EOF pour End Of Files
data = llStringTrim(data, STRING_TRIM); // efface les espaces parasites en début et fin de ligne
string initial = llGetSubString(data, 0,0); // quel est le premier caractère
if ((initial != "") && (initial != "#")) {
//initial != "" permet de pas mettre de lignes vide ds la list
// initial != "#" une ligne de la notecard commençant par # sera considérer comme commentaire
// et donc pas mémorisée. (facultatif)
lMaList += [data]; // mémorisation dans la liste
}
lecture(); // ligne suivante
}
else { // on est en EOF (toute la carte a été lue
// reste plus qu'a utiliser la carte
// ici par un simple llSay
llSay(0, "Chargement Message Jarretière : \n" + llDumpList2String(lMaList, "\n"));
}
}
}
timer()
{
resetEcoute();
}
changed( integer chang ) // lors de la vente de l objet , on reset le script pour prendre en compte le nouveau Owner (l'ecoute)
{
if( chang & CHANGED_OWNER )
{
llResetScript();
}
}
attach( key id )
{
llResetScript();
}
on_rez( integer i ) // lors de la pose de l objet au sol , on reset pour modifier le canal dynamique
{
llResetScript();
}
}
Voilà, et comme disait Marie-Pierre Casey :
|