Repair
De DigiWiki.
Repair Listener (à mettre dans un autre prim que le root)
InitConnection() { llListenRemove( gListenId ); // on active l'écoute du linked prim correspondant sur DEBUG_CHANNEL gListenId = llListen( DEBUG_CHANNEL, "", llGetLinkKey(LISTEN_LINK), "" ); } // adresse du script qui va s'occuper de reset integer IC_SCRIPTREP_ADD = -258954; // 1 = root prim integer LISTEN_LINK = 1; integer gListenId; default { on_rez( integer p) {InitConnection();} state_entry() {InitConnection();} listen( integer chan, string name, key id, string msg) { // si "run-time error" est présent dans msg alors on envoie le nom du script par linked message if (~llSubStringIndex(msg, "run-time error")) llMessageLinked(LISTEN_LINK, IC_SCRIPTREP_ADD, llGetSubString(msg, llSubStringIndex(msg, ":") + 1, llSubStringIndex(msg, "]") - 1), NULL_KEY); } }
Repair Core (à mettre dans le root prim)
AddScript( string scriptName ) { // si le nom n'est pas déjà présent dans la liste, on l'ajoute if (!~llListFindList(gScriptList, [scriptName])) { gScriptList += scriptName; llOwnerSay( scriptName + " sera reset au prochain demarrage." ); } } RepairScript() { // on compte le nombre de noms dans la liste integer m = (gScriptList!=[]); string scriptName; while(~--m) { // on récupère le nom de la liste scriptName = llList2String( gScriptList, m ); // si le script est bien présent dans l'inventaire et qu'il s'agit bien d'un script if( llGetInventoryType(scriptName) == INVENTORY_SCRIPT) { llOwnerSay( "Reset : " + scriptName ); llResetOtherScript( scriptName ); // on reset llSetScriptState( scriptName, TRUE ); // on le reactive } } gScriptList = []; // on vide la liste } // adresse pour ajouter un script integer IC_SCRIPTREP_ADD = -258954; // liste des scripts à reset list gScriptList; default { on_rez( integer p ) { RepairScript();} link_message(integer link, integer adress, string data, key data2) { // on reçoit une demande d'ajout de script à reset if (adress == IC_SCRIPTREP_ADD) AddScript(data); } }
Fonctionnement :
Le principe est très simple, j'utilise dans un premier temps "Repair Listener", il s'agit d'un script qui va écouter le DEBUG_CHANNEL (là où les erreurs sont envoyées). Il faudra mettre ce script dans un autre prim que celui où vous souhaitez réparer vos scripts (la raison est qu'un prim ne peut pas s'écouter lui-même quand il envoie des messages dans un canal). Il va envoyer le nom du script qui a une erreur type "run-time error" au Repair Core.
Le Repair Core, lui, va s'occuper de stocker les noms reçus dans une liste puis les reset/activer au prochain démarrage de l'objet, c'est à dire quand :
- Vous re-portez l'objet
- Vous re-rezzez l'objet