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();
}
}
}