//---------------------------------------------------------------- // Manager V1.1 // Bestmomo Lagan //---------------------------------------------------------------- // // A placer dans une prim différente du dépôt // accompagné d'un script module // Peut cohabiter avec d'autres scripts // Mais il vaut mieux l'isoler dans une prim // //---------------------------------------------- // PARAMETRES //---------------------------------------------- string SCRIPT_NAME = "module"; string SEPARATEUR = "|"; //---------------------------------------------- // COMMUNICATION //---------------------------------------------- // Liaison avec le dépôt integer DEP_ASK = 24000; // Demande de link dépôt integer DEP_ASK_BACK = 24001; // Réponse // Commandes externes integer COM_ADD = 25610; // format : nom_liste | valeur integer COM_OK = 25611; // retour OK pour ADD et DEL integer COM_DEL = 25612; // format : nom_liste | valeur integer COM_LENGTH = 25613; // taille de la liste : nom_liste integer COM_LENGTH_BACK = 25614; // integer COM_EXIST = 25615; // valeur existante ? nom_liste | valeur integer COM_EXIST_BACK = 25616; // integer COM_DEL_ALL = 25617; // format : nom_liste integer COM_DEL_ALL_BACK = 25618; integer COM_ERROR = 25619; // erreur integer COM_LIST = 25620; // listing de liste : nom_liste integer COM_LIST_NEXT = 25621; integer COM_LIST_BACK = 25622; integer COM_LIST_BACK_END = 25623; // Commandes avec les modules integer MOD_ADD = 35611; integer MOD_FULL = 35612; integer MOD_OK = 35613; integer MOD_DEL = 35614; integer MOD_LENGTH = 35615; integer MOD_LENGTH_BACK = 35616; integer MOD_EXIST = 35617; integer MOD_EXIST_BACK = 35618; integer MOD_DEL_ALL = 35619; integer MOD_DEL_ALL_BACK = 35620; integer MOD_DEL_ALL_BACK_FREE = 35621; integer MOD_LIST = 35622; integer MOD_LIST_BACK = 35623; integer MOD_LIST_BACK_END = 35624; integer MOD_SET_FREE = 35625; integer MOD_FREE = 35626; //---------------------------------------------- // VARIABLES //---------------------------------------------- list l_modules = [0]; // Etats des modules (un au départ) list l_listes; // Noms des listes string s_nom; string s_mess; integer i_id; integer i_sender; integer id_module; key i_key; integer i_stock; integer i_test_exist; key k_depot; //---------------------------------------------- // FONCTIONS //---------------------------------------------- // Envoi message à un module send_module(integer cmd) { llMessageLinked(LINK_THIS, cmd, (string)id_module + SEPARATEUR + s_mess, NULL_KEY); } // Envoi message au sender send_sender(integer cmd, string mess) { llMessageLinked(i_sender, cmd, mess, i_key); } // Renvoie le premier module disponible, -1 si aucun integer get_mod_free() { return llListFindList(l_modules, [0]); } // Fonction qui renvoie le nombre de scripts de même nom (mais index différent) integer nombre_scripts(string nom) { integer i; integer n = llGetInventoryNumber(INVENTORY_SCRIPT); while(n--) if(llSubStringIndex(llGetInventoryName(INVENTORY_SCRIPT, n), nom) == 0) ++i; return i; } // Création d'un module create_module() { llGiveInventory(k_depot, SCRIPT_NAME); } //---------------------------------------------- // ETAT D'INITIALISATION //---------------------------------------------- default { state_entry() { llSetTimerEvent(.4); } timer() { llMessageLinked(LINK_SET, DEP_ASK, "", NULL_KEY); } link_message(integer sender_number, integer number, string message, key id) { if(number == DEP_ASK_BACK) { // Référence de la prim de dépôt k_depot = llGetLinkKey(sender_number); llSetTimerEvent(.0); state go; } } } //---------------------------------------------- // ETAT DE FONCTIONNEMENT //---------------------------------------------- state go { changed(integer change) { if(change & CHANGED_INVENTORY) { if(nombre_scripts(SCRIPT_NAME) > llGetListLength(l_modules)) { // Mise à jour liste des modules l_modules += 0; // Index du dernier module id_module = llGetListLength(l_modules) - 1; // Ajout de l'info send_module(MOD_ADD); } } } link_message(integer sender_number, integer number, string message, key id) { // Commandes externes if(number > 25609 && number < 25630) { // Numéro de link du sender i_sender = sender_number; // Clé d'identification i_key = id; // Traitement du message list l = llParseString2List(message, [SEPARATEUR], []); // Nom de la liste s_nom = llList2String(l, 0); // Index de la liste i_id = llListFindList(l_listes, [s_nom]); // Constitution du message pour les modules s_mess = (string)i_id; if(llGetListLength(l) == 2) s_mess += SEPARATEUR + llList2String(l, 1); // Ajout d'une donnée (nom_liste | valeur) if(number == COM_ADD) { // La liste n'existe pas ? if(i_id == -1) { l_listes += s_nom; i_id = llGetListLength(l_listes) - 1; // Reconstitution du message pour les modules s_mess = (string)i_id + SEPARATEUR + llList2String(l, 1); } // Pas de module disponible if((id_module = llListFindList(l_modules, [0])) == -1) // Création du module create_module(); // Module dispo else // Ajout de l'info send_module(MOD_ADD); } // Listing (nom_liste) else if(number == COM_LIST_NEXT) { // Demande suite listing send_module(MOD_LIST); } // Listing (nom_liste) else if(number == COM_LIST) { // Demande listing au premier module id_module = 0; send_module(MOD_LIST); } // Suppression d'une donnée (nom_liste | valeur) else if(number == COM_DEL) { // Index de balayage des modules id_module = llGetListLength(l_modules) - 1; // La liste n'existe pas ? if(i_id == -1) send_sender(COM_ERROR, ""); else { i_test_exist = TRUE; // Demande existence au dernier module send_module(MOD_EXIST); } } // Suppression d'une liste (nom_liste) else if(number == COM_DEL_ALL) { // Index de balayage des modules id_module = llGetListLength(l_modules) - 1; // La liste n'existe pas ? if(i_id == -1) send_sender(COM_ERROR, ""); else { // Suppression du nom dans la lise l_listes = llDeleteSubList(l_listes, i_id, i_id); // Demande del_all au dernier module send_module(MOD_DEL_ALL); } } // Longueur d'une liste (nom_liste) else if(number == COM_LENGTH) { // Index de balayage des modules id_module = llGetListLength(l_modules) - 1; // La liste n'existe pas ? if(i_id == -1) send_sender(COM_ERROR, ""); else { // Mise à zero du total i_stock = 0; // Demande length au dernier module send_module(MOD_LENGTH); } } // Existence d'une valeur (nom_liste | valeur) else if(number == COM_EXIST) { // La liste n'existe pas ? if(i_id == -1) send_sender(COM_EXIST_BACK, "PAS_TROUVE"); else { // Index de balayage des modules id_module = llGetListLength(l_modules) - 1; // Demande existence au dernier module send_module(MOD_EXIST); } } } // Retour des modules else if(number > 35609 && number < 35630) { // Retour ajout OK if(number == MOD_OK) send_sender(COM_OK, ""); // Retour full else if(number == MOD_FULL) { l_modules = llListReplaceList(l_modules, [1], id_module, id_module); send_sender(COM_OK, ""); } // Retour free else if(number == MOD_FREE) { l_modules = llListReplaceList(l_modules, [0], id_module, id_module); send_sender(COM_OK, ""); } // Retour length else if(number == MOD_LENGTH_BACK) { // Ajout i_stock += (integer)message; // Encore un module ? if(~--id_module) send_module(MOD_LENGTH); // Sinon on envoie le résultat else send_sender(COM_LENGTH_BACK, (string)i_stock); } // Retour exist else if(number == MOD_EXIST_BACK) { // Trouvé ? if(message == "TROUVE") { if(i_test_exist) { i_test_exist = FALSE; // Destruction de l'info send_module(MOD_DEL); } else send_sender(COM_EXIST_BACK, "TROUVE"); } else { // Encore un module ? if(~--id_module) send_module(MOD_EXIST); // Sinon on envoie le résultat else { if(i_test_exist) { i_test_exist = FALSE; send_sender(COM_ERROR, ""); } else send_sender(COM_EXIST_BACK, "PAS_TROUVE"); } } } // Retour dell_all else if(number == MOD_DEL_ALL_BACK) { // Encore un module ? if(~--id_module) send_module(MOD_DEL_ALL); // Sinon on envoie le résultat else send_sender(COM_DEL_ALL_BACK, ""); } // Retour dell_all_free else if(number == MOD_DEL_ALL_BACK_FREE) { l_modules = llListReplaceList(l_modules, [0], id_module, id_module); // Encore un module ? if(~--id_module) send_module(MOD_DEL_ALL); // Sinon on envoie le résultat else send_sender(COM_DEL_ALL_BACK, ""); } // Retour list else if(number == MOD_LIST_BACK) { // Envoi de la valeur au sender send_sender(COM_LIST_BACK, message); } // Retour list_end else if(number == MOD_LIST_BACK_END) { // Encore un module ? if(++id_module != llGetListLength(l_modules)) send_module(MOD_LIST); // Sinon on envoie la fin else send_sender(COM_LIST_BACK_END, ""); } // Info mémoire des modules else if(number == MOD_SET_FREE) { integer i = (integer)message; l_modules = llListReplaceList(l_modules, [0], i, i); } } } }