LlGetNumberOfNotecardLines/fr

From Second Life Wiki
Jump to: navigation, search

Description

Fonction: Key llGetNumberOfNotecardLines( string nom );

Demande le nombre de lignes dans la note identifiée par son nom via un évenement de type dataserver

Renvoie un Key qui sert de clé pour identifier la réponse du serveur de données via l’évènement dataserver.

• string nom un note de l'inventaire

Avertissements

  • Cette fonction fait dormir le script pendant 0.1 secondes.
  • Si nom n'est pas dans l'inventaire de la prim ou n'est pas un note alors une erreur se produit sur le canal DEBUG_CHANNEL.
  • Si la note contient des objets (telles de textures ou des landmarks), une donnée invalide sera renvoyée.

Exemples

<lsl> string NOTECARD_NAME = "config"; // nom de la note à lire integer notecard_line = 0; integer num_notecard_lines = 0; key notecard_request = NULL_KEY; list card_data; // les données dans la note

integer check_card(string name) // Vérifie que le nom correspond bien à une note {

   integer i = llGetInventoryType(name);
   return i == INVENTORY_NOTECARD;

}

default {

   state_entry()
   {
       state init;
   }

}

state ready {

   touch_start(integer detected)
   {
       llOwnerSay("La note contient les données suivantes : ");
       llOwnerSay(llDumpList2String(card_data, "\n"));
   }
   changed(integer change)
   {
       if (change & (CHANGED_INVENTORY)) // Si quelqu’un édite la note, le script est réinitialisé
       {
           llResetScript();
       }
   }

}

state init {

   state_entry()
   {
       if (!check_card(NOTECARD_NAME)) // Vérifie que la note existe
       {
           state error;
       }
       llSetText("initialising...", <1, 1, 1>, 0);
       notecard_request = NULL_KEY;
       notecard_line = 0;
       num_notecard_lines = 0;
       notecard_request = llGetNumberOfNotecardLines(NOTECARD_NAME); // Demande le nombre de lignes de la note
       llSetTimerEvent(5.0); // Sans retour dans les 5sec, alors la carte peut être vide
   }
   timer() // si l’on sort du délai, cela peut signifier que quelque chose s’est mal passé et que la note était probablement vide
   {
       llSetTimerEvent(0.0);
       state error;
   }
   dataserver(key query_id, string data)
   {
       if (query_id == notecard_request) // Vérifie qu’il s’agit bien d’une réponse à notre demande (contrôle non obligatoire)
       {
           llSetTimerEvent(0.0); // au moins une ligne, donc on ne s’inquiète plus.
           if (data == EOF) // fin de la note, on repasse dans l’état ‘ready’ 
           {
               state ready;
           }
           else if (num_notecard_lines == 0) // première requête du nombre de lignes
           {
               num_notecard_lines = (integer)data;
               notecard_request = llGetNotecardLine(NOTECARD_NAME, notecard_line); // renvoie à présent la première ligne
           }
           else
           {
               if (data != "" && llGetSubString(data, 0, 0) != "#") // ignore les lignes vides ou celles débutant par un "#"
               {
                   card_data = (card_data = []) + card_data + data;
               }
               ++notecard_line;
               notecard_request = llGetNotecardLine(NOTECARD_NAME, notecard_line); // Demande la ligne suivante
           }
       }
       // Mise à jour du texte flottant pendant l’opération
       llSetText((string)(notecard_line) + " lignes lues sur " + (string)num_notecard_lines , <1, 1, 1>, 1);
   }
   state_exit()
   {
       llSetText("", <0, 0, 0>, 0);
   }

}

state error {

   state_entry()
   {
       llOwnerSay("Erreur, vérifiez que la note [ " + NOTECARD_NAME + " ] existe et n’est pas vide");
   }
   changed(integer change)
   {
       if (change & CHANGED_INVENTORY)
       {
           llResetScript();
       }
   }

}</lsl>

Voir également

Évènement

•  dataserver Evènement déclenché par un appel au serveur de données

Fonctions

•  llGetNotecardLine Renvoie une ligne d’une note
Vous cherchez encore des informations ? Peut-être cette page du LSLwiki pourra vous renseigner.