Voici une version simple de ce que tu demandes.
Émetteur dans le HUD
Je pars du principe que ton HUD a un root et autant de primitives enfants que de textures à afficher. Pour être reconnues tes primitives enfants doivent avoir un nom. Dans mon script j'ai choisi le nom générique "T" suivi d'un index. Ainsi la première s'appelle T0, la seconde T1, la troisième T3 et ainsi de suite. Il faut mettre aussi les clés des textures dans le script, là aussi j'en ai mis que 5 évidemment. Donc pour avoir plus de textures il faut ajouter les clés dans le script et les primitives sur le HUD. Voilà le script émetteur :
//------------------------------------------------
//
// Emetteur HUD ongles V 1.0
//
//------------------------------------------------
// A placer dans la racine du HUD
// -----------------------------------------------
// Paramètres
// -----------------------------------------------
string NOM = "Emetteur HUD Ongles";
string VERSION = "1.0";
// Canal de communication (choisir un différent par produit)
integer CHANNEL = -56212545;
// Nom des primitives (ce qui donnera T0, T1, T2... )
string PRIM_NOM = "T";
// Face de la primitive pour la texture
integer FACE = 2;
// -----------------------------------------------
// Textures
// -----------------------------------------------
// Mettre les clés de toutes les textures dans l'ordre
list TEXTURES = [
"23bfc465-8db2-2447-eb14-86c719e73bde",
"71e2689c-7c54-231c-c49a-97e563d166eb",
"13827c31-c917-7f9b-ea3e-f01227dee957",
"a71bd989-73c5-627b-d6ee-6e421ff3a61b",
"39aab78d-ba31-050a-0116-add4f24c7751"
];
// -----------------------------------------------
// Variables
// -----------------------------------------------
list l_ongles = [];
// -----------------------------------------------
// Détection des primitives
// -----------------------------------------------
get_prims(){
// Initialisation liste des ongles
integer n = llGetListLength(TEXTURES);
while(n--) l_ongles += 0;
// Récupération des index des primitives
integer i;
n = llGetNumberOfPrims();
string nom;
for(i = 2; i <= n; ++i) {
// Nom de la primitive
nom = llList2String(llGetObjectDetails(llGetLinkKey(i), [OBJECT_NAME]), 0);
// Sauvegarde si primitive d'ongle
if(llGetSubString(nom, 0, 0) == PRIM_NOM) {
integer id = (integer)llGetSubString(nom, 1, -1);
l_ongles = llListReplaceList(l_ongles, [i], id, id);
}
}
}
// -----------------------------------------------
// Etat unique
// -----------------------------------------------
default
{
state_entry() {
llOwnerSay(NOM + " " + VERSION + " initialisation...");
get_prims();
// Mise en place des textures (remplissage lent mais une seule fois à l'initialisation)
integer n = llGetListLength(l_ongles);
integer i;
for(; i < n; ++i) llSetLinkTexture(llList2Integer(l_ongles, i), llList2Key(TEXTURES, i), FACE);
llOwnerSay(NOM + " " + VERSION + " prêt");
}
touch_start(integer total_number)
{
// Test ongle et envoi index
integer id = llListFindList(l_ongles, [llDetectedLinkNumber(0)]);
if(~id) llWhisper(CHANNEL, (string)llGetOwner() + ":" + (string)id);
}
}
Le fonctionnement est simple : au départ le script scanne l'objet à la recherche des primitives qui se nomment "T...", il mémorise leur numéro de liaison dans une liste. Ensuite il applique les textures sur les primitives. J'ai prévu une variable FACE pour la face qui doit afficher la texture.
Récepteur dans les ongles
Les ongles sont évidemment groupés, en général par main, donc par paquets de 5 ongles. En général on prévoit aussi un root pour le positionnement. Le script doit aussi reconnaître les primitives des ongles, il faut donc aussi les nommer. Dans le script j'ai prévu le nom "T". Voici le script :
//------------------------------------------------
//
// Récepteur HUD ongles V 1.0
//
//------------------------------------------------
// A placer dans la racine des ongles
// -----------------------------------------------
// Paramètres
// -----------------------------------------------
string NOM = "Récepteur HUD Ongles";
string VERSION = "1.0";
// Canal de communication (choisir un différent par produit)
integer CHANNEL = -56212545;
// Nom des primitives des ongles
string PRIM_NOM = "T";
// Face de la primitive pour la texture
integer FACE = 2;
// -----------------------------------------------
// Textures
// -----------------------------------------------
// Mettre les clés de toutes les textures dans l'ordre
list TEXTURES = [
"23bfc465-8db2-2447-eb14-86c719e73bde",
"71e2689c-7c54-231c-c49a-97e563d166eb",
"13827c31-c917-7f9b-ea3e-f01227dee957",
"a71bd989-73c5-627b-d6ee-6e421ff3a61b",
"39aab78d-ba31-050a-0116-add4f24c7751"
];
// -----------------------------------------------
// Variables
// -----------------------------------------------
list l_ongles = [];
// -----------------------------------------------
// Détection des primitives
// -----------------------------------------------
get_prims(){
integer i;
integer n = llGetNumberOfPrims();
string nom;
for(i = 2; i <= n; ++i) {
// Nom de la primitive
nom = llList2String(llGetObjectDetails(llGetLinkKey(i), [OBJECT_NAME]), 0);
// Sauvegarde si primtive d'ongle
if(nom == PRIM_NOM) l_ongles += i;
}
}
// -----------------------------------------------
// Fonctions
// -----------------------------------------------
set_texture(integer i) {
key k = llList2Key(TEXTURES, i);
integer n = llGetListLength(l_ongles);
while(n--) {
integer id = llList2Integer(l_ongles, n);
list l = llGetLinkPrimitiveParams(id, [PRIM_TEXTURE, FACE]);
llSetLinkPrimitiveParamsFast(id, [PRIM_TEXTURE, FACE, k] + llList2List(l, 1, 3));
}
}
// -----------------------------------------------
// Etat unique
// -----------------------------------------------
default
{
state_entry() {
llListen(CHANNEL, "", NULL_KEY, "");
get_prims();
llOwnerSay(NOM + " " + VERSION + " prêt");
}
listen(integer channel, string name, key id, string message) {
list l = llParseString2List(message, [":"], []);
// Test de l'owner et mise à jour de la texture
if(llGetOwner() == (key)llList2String(l, 0)) set_texture((integer)llList2String(l, 1));
}
}
Là aussi je n'ai prévu que 5 textures, il faut donc adapter selon le nombre que tu as et qui doit évidemment correspondre à celui de l'émetteur

.
Le canal de communication entre le HUD et les ongles doit être spécifique au produit pour éviter les mélanges ultérieurs entre produits, et évidemment le même pour les deux scripts

.
Le système filtre les messages avec la clé de l'owner pour éviter que deux avatars étant à proximité avec le même produit ne subissent d'interférences (remarque ça peut être amusant

).
Voilà j'espère que tout ça est clair, j'ai fait un test rapide IW et ça fonctionne.