Voilà un script qui est plutôt un utilitaire ; vous créez juste un cube en bois SL, vous glissez le script dedans, puis vous y mettez un tas de textures pour lesquelles vous soupçonnez qu'il y en a en double même si elles n'ont pas le même nom ; vous cliquez, vous patientez en surveillant le Chat Local et quand le contrôle est terminé, le programme vous dit combien de textures ont été effacées.


 

// d'après une question de Lyamme Jewell dans le groupe C&S
// Je cherche un script qui effacerait toutes les textures en double dans le contenu de l'objet

// Avec l'aide de Lalwende Leakey qui a remis les choses à l'endroit!!!

list lListUUID; //liste de toutes les clés des textures
list lTextEffac; //liste des noms de texture à enlever
integer iNumbTextures; //Nombre de textures au démarrage du script
integer iNumbEffac; //Nombre de textures à effacer
integer iMemoLibre; //taille mémoire libre au départ
integer i; integer j; integer k;// itérateurs pour boucles et listes

default
{
state_entry()
{
llSay(0, "/me est prêt ; toucher l'objet pour commencer le contrôle");
}

touch_start(integer total_number)
{
iNumbTextures = llGetInventoryNumber(INVENTORY_TEXTURE); // on compte les textures
iNumbEffac = 0; //initialisation du compteur de textures effacées
llSay(0, "Début des opérations de comparaison, veuillez patienter! Il y a " + (string)iNumbTextures + " texture(s)dans la prim");
//Remplissage de la liste des textures
for(i = iNumbTextures - 1; i >= 1; i--) //i fait l'itération dans les textures du contenu de la fin vers le début plus exactement vers la 2ème texture puisque la 1ère texture ne peut être comparée à aucune autre
{
for(j = i - 1; j >= 0; j--) //j fait l'itération dans les textures du contenu de la texture qui précède i vers le début
{
if(
llGetInventoryKey(llGetInventoryName(INVENTORY_TEXTURE, j))
==
llGetInventoryKey(llGetInventoryName(INVENTORY_TEXTURE, i))
) //on compare les clés des 2 textures
{
//llOwnerSay((string)i + " (" + llGetInventoryName(INVENTORY_TEXTURE, j) + ") = " + (string)j + " (" + llGetInventoryName(INVENTORY_TEXTURE, j) + ")");
llRemoveInventory(llGetInventoryName(INVENTORY_TEXTURE, i)); //on supprime la texture pointée par i dans le contenu
iNumbEffac++; //incrémzentation du compteur des effacés
j = -1; //Comme i n'est plus consistant on interrompt la boucle de J
}
}
}

//Le balayage du contenu est fait
if(iNumbEffac) // y at'il eu des supprimés?
{ //oui
if(iNumbEffac == 1)llSay(0, "/me a effacé " + (string)iNumbEffac + " texture.");
else llSay(0, "/me a effacé " + (string)iNumbEffac + " textures.");;
}
else //la liste est vide ! rien à effacer
{
llSay(0, "/me n'a trouvé aucune texture à effacer");
}
}
}

 

 


C'est sûr que le temps de calcul est proportionnel aux nombres de textures à vérifier, disons que pour 150 textures vous comptez sur 1 ou 2 minutes et pour 8 000 ça fsera à lancer le soir avant d'aller dodoter!