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
Outils personnels
  • Cette page a été consultée 904 fois.
donate
Google Ads