Prim Attribute Overloading/fr

From Second Life Wiki
Jump to navigation Jump to search

Zone de stockage supplémentaire temporaire lors de l’exécution de script

Cette astuce a été désactivée par la mise à jour des serveurs du 31 Janvier 2008 en réponse à la fiche SVC-674 classé comme une faille de sécurité. 
Le système actuel coupe les noms et les descriptions à 63 et 127 bytes (SVC-674 ), cette limitation peut encore évoluer compte tenu de la récente réouverture de la fiche  SVC-1394 par les équipes LL, mais il y a peu de chances pour que la nouvelle capacité de stockage dépasse 255 bytes par champs.
-- Void Singer 14:48, 19 February 2008 (PST)

Il est possible de stocker jusqu’à 8034 caractères dans la description d’une prim pendant l’exécution d’un script. Une fois que le script se termine, tout ce qui aura été saisi dans la description sera tronqué à 127 / 255 caractères. Bien que cette zone ne soit pas stable sur le long terme, elle peut être utilisée pour gérer temporairement de grosses quantités de données dans un script.

Le scénario suivant illustre cette possibilité:

Incrémentez une chaîne de caractère jusqu’à 7127 caractères, puis écrivez la dans la description de la prim avec llSetObjectDesc().
Videz la variable de stockage, desc_data = "",
Relisez la donnée et placez la dans une nouvelle variable : string tmp; tmp = llGetObjectDesc();
La longueur de tmp sera 7127 caractères
Utilisez un timer (la donnée est stockée au moins 4 minutes, voire plus), puis videz la variable tmp = ""; Relisez la donnée avec une 3eme variable: string new; new = llGetObjectDesc(); Puis mesurez la longueur de la chaîne : 7127 caractères. A présent mettez en commentaire la commande ayant écrit la donnée initiale et contentez vous de lire la description avec llGetObjectDesc(), la donnée renvoyée ne mesure plus que 255 caractères (après recompilation du script).

Il semble ainsi qu’aussi longtemps que vous écrivez et lisez la donnée dans la même occurrence d’un script cela fonctionne, mais que la donnée est tronquée dès la génération d’une nouvelle version du script. L’hypothèse actuelle est que lorsque le script a terminé son exécution, les paramètres de prim sont mis à jour et passent ainsi la description à 127-255 caractères. --Geuis Dassin 6/16/07

<lsl>

   touch_start(integer total_number)
   {
       llOwnerSay("Début");
       //127 caractères de long, complétés avec des espaces
       desc_data = "NE PAS EDITER, NE PAS CLIQUER ICI" +  //33 car
                   "..............................................."+ //47 car
                   "..............................................."; //47 car
       //construit la chaîne de 7127 caractères
       integer i=0;
       for(i=0;i<1500;i++){
           if(i % 100 == 0){
               //fait savoir que le script fonctionne
               llOwnerSay((string)i);   
           }
           desc_data = (desc_data="") + desc_data + "aaaaa";
       }
       //Renvoie la longueur de la chaîne de caractères avant de l’écrire.
       llOwnerSay((string)llStringLength(desc_data));
       //##### Mettez la ligne suivante en commentaire lors de la deuxième exécution du script. 
       //##### La donnée renvoyée sera tronquée à 255 caractères.
       //Ecrit la chaîne de caractères dans la description de la prim
       llSetObjectDesc(desc_data);
       //vide la première variable
       desc_data = "";
       //Lit la donnée qui vient juste d’être écrite.
       string temp;
       temp = (temp="") + temp + llGetObjectDesc();
       //Renvoie la longueur de la chaîne
       llOwnerSay((string)llStringLength(temp));
       //Endort le script pendant quelques secondes (ici 10s) pour prouver que la donnée est conservée tant que le script fonctionne.
       llSleep(10);
       llOwnerSay("dort 10s");


       //On relit la description dans une 3eme variable.
       string new;
       new = (new="") + new + llGetObjectDesc();
       //Ré écriture de la chaîne de caractère.
       llOwnerSay((string)llStringLength(new));
   }

</lsl>