Tableaux à touches virtuelles pour un hud.

Répondre
Partager Rechercher
Coucou scriptland!

Je cherche ces derniers temps à compacter et alléger mon hud, j'utilise pour l'instant un système de HUD que j'ai acheté et qui est très bien pour certaines commandes basiques comme la couleur et les effets, mais pour le choix des textures il fonctionne avec des tuiles individuelles, et l'ennui c'est que mon hud en comporte plus de cent...
Il en résulte des contraintes structurelles et une lourdeur de fonctionnement assez fatiguante...

Donc je voudrais remplacer ça par un système de panneaux à touches virtuelles, j'ai déjà réussi en faisant des recherches ici et en me creusant la cervelle, à faire un script qui me permet de déplacer les différents panneaux avec des boutons pour faire un hud plus compact, mais le script pour les touches virtuelles me pose soucis.

J'ai essayé de partir du script de Seb-01 ici: https://forums.jeuxonline.info/showt...php?p=19024770
Mais il est farci de fonctions qui change la taille du prim, qui divise la texture, et moi je n'ai pas besoin de tout ça, et ça m'embrouille je comprends plus rien...

J'ai juste besoin d'un script qui divise le prim et qui permet de rentrer l'uuid des textures dans une liste, par script ou notecard, et qui envois la "texture" touchée, je ferai simplement la texture avec les tuiles virtuelles dessus.
Ensuite un script receveur dans l'objet linké à commander.

Pouvez-vous m'aider à réaliser ce script?
Il y a plusieurs façons d'envisager la question. Je t'en propose une simple. Imagine que la face sur laquelle tu vas dessiner tes boutons est une grille de ce genre :

grille1.jpg

Donc composée de petites cases numérotées. Maintenant tu dessines tes boutons sur cette grille en t'arrangeant pour qu'ils coïncident avec les cases, par exemple j'ai dessiné ici 6 boutons qui occupent chacun 4 cases :

grille2.jpg

La grille peut être plus large ou plus fine, l'important est la coïncidence avec les limites des boutons. Les boutons peuvent évidemment avoir des tailles variables.

Maintenant il faut déterminer pour chaque bouton les cases correspondantes, on va mettre ça dans une liste. Dans mon cas de figure ça donne ça :

Code PHP:

// Liste des boutons
list lBoutons = [
    
"82,83,122,123",
    
"85,86,125,126",
    
"88,89,128,129",
    
"91,92,131,132",
    
"94,95,134,135",
    
"97,98,137,138"
    
]; 
Sur chaque ligne je mets les cases du bouton en commençant par le premier en bas à gauche et en me déplaçant vers la droite.

Il faut une fonction pour savoir quelle case est cliquée :

Code PHP:

// Détermine l'index de la case touchée
integer indexZone(integer xinteger y) {
    
vector v llDetectedTouchST(0);
    return (integer)(
v.x) + ((integer)(v.y)) * x;

Il faut également une fonction pour savoir quel bouton est cliqué :

Code PHP:

// Détermine l'index du bouton touché
integer indexBouton(string iCase) {
    
integer n llGetListLength(lBoutons);
    while(
n--) {
        
string s llList2String(lBoutonsn);
        list 
llCSV2List(s);
        if(~
llListFindList(l, [iCase])) return n;
    }
    return -
1;

Avec tout ça on peut créer un script à mettre dans le HUD :

Code PHP:

// Script de commande dans le HUD

// Canal 
integer iCanal = -455821201;

// Liste des boutons
list lBoutons = [
    
"82,83,122,123",
    
"85,86,125,126",
    
"88,89,128,129",
    
"91,92,131,132",
    
"94,95,134,135",
    
"97,98,137,138"
    
];

// Détermine l'index de la case touchée
integer indexZone(integer xinteger y) {
    
vector v llDetectedTouchST(0);
    return (integer)(
v.x) + ((integer)(v.y)) * x;
}

// Détermine l'index du bouton touché
integer indexBouton(string iCase) {
    
integer n llGetListLength(lBoutons);
    while(
n--) {
        
string s llList2String(lBoutonsn);
        list 
llCSV2List(s);
        if(~
llListFindList(l, [iCase])) return n;
    }
    return -
1;
}

default
{

    
touch_start(integer total_number)
    {
        
//llOwnerSay("Clic sur la case " + (string)indexZone(40, 23));
        
integer iCase indexZone(4023);
        
integer iBouton indexBouton((string)iCase);
        if(~
iBouton) {
            list 
message = [llGetOwner(), iBouton];
            
//llOwnerSay(llDumpList2String(message, "@"));
            
llWhisper(iCanalllDumpList2String(message"@"));
        }
    }

J'ai mis deux lignes de code qu'il est possible de décommenter pour tester les cases cliquées et l'envoi du message. Attention : la fonction indexZone attend 2 paramètres, le premier est le nombre de cases horizontales et le second le nombre de cases verticales. Si tu changes la grille il faut changer ces valeurs. Le message qu'on envoie est de la forme :

clé_avatar@index_bouton

La clé de l'avatar est nécessaire pour individualiser le HUD en cas (peu probable mais possible) d'un autre avatar à proximité avec le même produit.

Dans l'objet qui doit être texturé il suffit de mettre ce script :

Code PHP:

// Script de réception

// Canal 
integer iCanal = -455821201;

// Textures
list lTextures = [
    
"1e5b3d96-61a3-b3a2-bb64-3c24a0bd6ba5",
    
"7baf93b1-0635-bd12-dfc1-c95da1b20439",
    
"b43728c3-7bba-91e3-46fd-abff206af5b3",
    
"c67fbf0d-77bd-2d7d-fed1-dc044c7fa7a2",
    
"0f73c222-ca6d-802e-f94f-10e755eed4c1",
    
"da4e8cbd-cb21-cfab-8c5f-219d67131cd6"
    
];

default
{
    
state_entry()
    {
        
llListen(iCanal""NULL_KEY"");
    }
    
listen(integer channelstring namekey idstring message)
    {
        list 
llParseString2List(message, ["@"], []);
        if((
key)llList2String(l0) == llGetOwner())
            
llSetTexture(llList2Key(lTextures, (integer)llList2String(l1)), 0);
    }

Les clés des textures sont dans ce script, inutile de les transmettre. On reçoit juste l'index du bouton et il suffit dans la liste des textures de prévoir le bon ordre pour envoyer la bonne texture. Comme j'ai 6 boutons j'ai mis 6 clés de textures (ce sont de vraies clés d'images quelconques).

Évidemment dans ce script il faut le même numéro de canal que dans celui du HUD. Ici j'envoie les textures sur la face 0, tout ça est à adapter selon l'objet de réception.
Héhé je me doutais que tu allais éclairer mes lanternes bestmomo .

Bon il va me falloir un peu de temps pour potasser tout ça, je commence tout juste à comprendre le scriptage...

En tout cas merci beaucoup de cette réponse rapide et détaillée!
Ok j'ai eu le temps de potasser, le principe de la grille que je trouve totalement idéal, plus besoin de se limiter à un simple quadrillage, on peut aussi déterminer des zones!

Je crois avoir bien assimilé le principe de base, et si c'est bien le cas, on ne peut avec ce script que piloter avec un tableau, un seul prim.
Par contre j'aimerai faire un tableau pour chaque partie de l'objet linké, chaque tableaux aurait la même taille et quadrillage.
Donc ça implique un script dans chaque tableaux, avec chacun un identifiant d'index pour que le script receveur sache à quelle liste de texture se référer et sur quel prim appliquer cette dernière?
Tu peux très bien regrouper dans un script (placé dans le root) la gestion de plusieurs tableaux, tant que tu restes dans la mémoire autorisée. Le script détermine la primitive touchée puis la zone, etc... Il y a donc juste l'étape supplémentaire de détermination de la primitive. Après tu prévois autant de tableaux que de primitives et tu envoies un index supplémentaire.

Par exemple si tu as deux tableaux à gérer (avec la même grille), voici le script dans le root du HUD :

Code PHP:

// Script de commande dans le HUD

// Canal 
integer iCanal = -455821201;

// Liste des boutons
list lBoutons1 = [
    
"82,83,122,123",
    
"85,86,125,126",
    
"88,89,128,129",
    
"91,92,131,132",
    
"94,95,134,135",
    
"97,98,137,138"
    
];

list 
lBoutons2 = [
    
"82,83,122,123",
    
"85,86,125,126",
    
"88,89,128,129",
    
"91,92,131,132",
    
"94,95,134,135",
    
"97,98,137,138"
    
];

// Liste des numéros des primitives
list lPrims = [2,3];

// Détermine l'index de la case touchée
integer indexZone(integer xinteger y) {
    
vector v llDetectedTouchST(0);
    return (integer)(
v.x) + ((integer)(v.y)) * x;
}

// Détermine l'index du bouton touché
integer indexBouton(integer idstring iCase) {
    list 
lBoutons;
    
// Choix de la liste concernée 
    
if(id == 0lBoutons lBoutons1;
    else 
lBoutons lBoutons2;
    
// Balayage
    
integer n llGetListLength(lBoutons);
    while(
n--) {
        
string s llList2String(lBoutonsn);
        list 
llCSV2List(s);
        if(~
llListFindList(l, [iCase])) return n;
    }
    return -
1;
}

default
{

    
touch_start(integer total_number)
    {
        
//llOwnerSay("Clic sur la case " + (string)indexZone(40, 23));
        
integer iPrimitive llDetectedLinkNumber(0);
        
integer id llListFindList(lPrims, [iPrimitive]);
        if(~
id) {
            
integer iCase indexZone(4023);
            
integer iBouton indexBouton(id, (string)iCase);
            if(~
iBouton) {
                list 
message = [llGetOwner(), idiBouton];
                
//llOwnerSay(llDumpList2String(message, "@"));
                
llWhisper(iCanalllDumpList2String(message"@"));
            }
        }
    }

La liste lPrims contient le numéro de liaison des deux primitives qui présentent les tableaux. Là j'ai juste pris 2 et 3.

Le message est de la forme :

c109aac8-458c-49c5-a5da-75bd722e486f@1@2

Le script récepteur devient alors :

Code PHP:

// Script de réception

// Canal
integer iCanal = -455821201;

// Textures
list lTextures1 = [
    
"1e5b3d96-61a3-b3a2-bb64-3c24a0bd6ba5",
    
"7baf93b1-0635-bd12-dfc1-c95da1b20439",
    
"b43728c3-7bba-91e3-46fd-abff206af5b3",
    
"c67fbf0d-77bd-2d7d-fed1-dc044c7fa7a2",
    
"0f73c222-ca6d-802e-f94f-10e755eed4c1",
    
"da4e8cbd-cb21-cfab-8c5f-219d67131cd6"
        
];

list 
lTextures2 = [
    
"1e5b3d96-61a3-b3a2-bb64-3c24a0bd6ba5",
    
"7baf93b1-0635-bd12-dfc1-c95da1b20439",
    
"b43728c3-7bba-91e3-46fd-abff206af5b3",
    
"c67fbf0d-77bd-2d7d-fed1-dc044c7fa7a2",
    
"0f73c222-ca6d-802e-f94f-10e755eed4c1",
    
"da4e8cbd-cb21-cfab-8c5f-219d67131cd6"
        
];

// Primitves cibles
list lPrimitives = [2,3];

// Faces cibles
list lFaces = [0,0];

default
{
    
state_entry()
    {
        
llListen(iCanal""NULL_KEY"");
    }
    
listen(integer channelstring namekey idstring message)
    {
        list 
llParseString2List(message, ["@"], []);
        if((
key)llList2String(l0) == llGetOwner()) {
            
integer i = (integer)llList2String(l1);
            list 
lTextures;
            if(
== 0lTextures lTextures1;
            else 
lTextures lTextures2;
            
llSetLinkTexture(
                
llList2Integer(lPrimitivesi),
                
llList2Key(lTextures, (integer)llList2String(l2)),
                
llList2Integer(lFacesi));
        }
    }

Là j'ai prévu une liste (lPrimitives) pour les numéros des primitives cibles et une liste pour les numéros des faces cibles (lFaces). C'est à adapter à ton cas évidemment mais ça te montre le principe de base .

Dernière modification par bestmomo ; 01/06/2014 à 17h07.
Bon c'est impressionant tu as pensé à tout, je crois que qu'on est à deux doigts de la solution^^

Je pense avoir à gérer au maximum 8 tableaux sur un hud, 9 gros maximum, deux questions:
-Est-ce que ça pose un soucis de mémoire?
-j'ai essayé de rajouter des lignes else lBoutons = lBoutonsX; pour rajouter des tableaux mais il me dit syntax error...
Bon pour la syntaxe quand tu as plus de deux boutons, voilà pour 3 l'émetteur :

Code PHP:

// Script de commande dans le HUD

// Canal 
integer iCanal = -455821201;

// Liste des boutons
list lBoutons1 = [
    
"82,83,122,123",
    
"85,86,125,126",
    
"88,89,128,129",
    
"91,92,131,132",
    
"94,95,134,135",
    
"97,98,137,138"
    
];

list 
lBoutons2 = [
    
"82,83,122,123",
    
"85,86,125,126",
    
"88,89,128,129",
    
"91,92,131,132",
    
"94,95,134,135",
    
"97,98,137,138"
    
];

list 
lBoutons3 = [
    
"82,83,122,123",
    
"85,86,125,126",
    
"88,89,128,129",
    
"91,92,131,132",
    
"94,95,134,135",
    
"97,98,137,138"
    
];

// Liste des numéros des primitives
list lPrims = [2,3,4];

// Détermine l'index de la case touchée
integer indexZone(integer xinteger y) {
    
vector v llDetectedTouchST(0);
    return (integer)(
v.x) + ((integer)(v.y)) * x;
}

// Détermine l'index du bouton touché
integer indexBouton(integer idstring iCase) {
    list 
lBoutons;
    
// Choix de la liste concernée 
    
if(id == 0lBoutons lBoutons1;
    else if(
id == 1lBoutons lBoutons2;
    else 
lBoutons lBoutons3;
    
// Balayage
    
integer n llGetListLength(lBoutons);
    while(
n--) {
        
string s llList2String(lBoutonsn);
        list 
llCSV2List(s);
        if(~
llListFindList(l, [iCase])) return n;
    }
    return -
1;
}

default
{
    
state_entry()
    {
        
llOwnerSay("La mémoire utilisée est : " + (string)llGetUsedMemory() + " octects");
    }

    
touch_start(integer total_number)
    {
        
//llOwnerSay("Clic sur la case " + (string)indexZone(40, 23));
        
integer iPrimitive llDetectedLinkNumber(0);
        
integer id llListFindList(lPrims, [iPrimitive]);
        if(~
id) {
            
integer iCase indexZone(4023);
            
integer iBouton indexBouton(id, (string)iCase);
            if(~
iBouton) {
                list 
message = [llGetOwner(), idiBouton];
                
//llOwnerSay(llDumpList2String(message, "@"));
                
llWhisper(iCanalllDumpList2String(message"@"));
            }
        }
    }

J'ai ajouté au démarrage du script l'affichage de la mémoire utilisée (le max est 64Ko en mono). Comme ça en fonction du nombre et de la longueur de tes listes tu sauras où tu en es.

Voilà le récepteur version 3 listes :

Code PHP:

// Script de réception

// Canal
integer iCanal = -455821201;

// Textures
list lTextures1 = [
    
"1e5b3d96-61a3-b3a2-bb64-3c24a0bd6ba5",
    
"7baf93b1-0635-bd12-dfc1-c95da1b20439",
    
"b43728c3-7bba-91e3-46fd-abff206af5b3",
    
"c67fbf0d-77bd-2d7d-fed1-dc044c7fa7a2",
    
"0f73c222-ca6d-802e-f94f-10e755eed4c1",
    
"da4e8cbd-cb21-cfab-8c5f-219d67131cd6"
        
];

list 
lTextures2 = [
    
"1e5b3d96-61a3-b3a2-bb64-3c24a0bd6ba5",
    
"7baf93b1-0635-bd12-dfc1-c95da1b20439",
    
"b43728c3-7bba-91e3-46fd-abff206af5b3",
    
"c67fbf0d-77bd-2d7d-fed1-dc044c7fa7a2",
    
"0f73c222-ca6d-802e-f94f-10e755eed4c1",
    
"da4e8cbd-cb21-cfab-8c5f-219d67131cd6"
    
];

list 
lTextures3 = [
    
"1e5b3d96-61a3-b3a2-bb64-3c24a0bd6ba5",
    
"7baf93b1-0635-bd12-dfc1-c95da1b20439",
    
"b43728c3-7bba-91e3-46fd-abff206af5b3",
    
"c67fbf0d-77bd-2d7d-fed1-dc044c7fa7a2",
    
"0f73c222-ca6d-802e-f94f-10e755eed4c1",
    
"da4e8cbd-cb21-cfab-8c5f-219d67131cd6"
        
];

// Primitves cibles
list lPrimitives = [2,3,4];

// Faces cibles
list lFaces = [0,0,0];

default
{
    
state_entry()
    {
        
llListen(iCanal""NULL_KEY"");
    }
    
listen(integer channelstring namekey idstring message)
    {
        list 
llParseString2List(message, ["@"], []);
        if((
key)llList2String(l0) == llGetOwner()) {
            
integer i = (integer)llList2String(l1);
            list 
lTextures;
            if(
== 0lTextures lTextures1;
            else if(
== 1lTextures lTextures2;
            else 
lTextures lTextures3;
            
llSetLinkTexture(
                
llList2Integer(lPrimitivesi),
                
llList2Key(lTextures, (integer)llList2String(l2)),
                
llList2Integer(lFacesi));
        }
    }

Bien j'ai presque fini, j'ai modifié le script du hud pour 8 panneaux de 22 cases en 11x2, les boutons prennent une simple case chaque.

Il me dis 11604 octets, ça va y a pas mal de marge...

j'arrive à ça, il a bien voulu enregistrer donc ça doit pas être mauvais.

Code PHP:

// Script de commande dans le HUD

// Canal 
integer iCanal = -455821201;

// Liste des boutons
list lBoutons1 = [
    
"0",
    
"1",
    
"2",
    
"3",
    
"4",
    
"5",
    
"6",
    
"7",
    
"8",
    
"9",
    
"10",
    
"11",
    
"12",
    
"13",
    
"14",
    
"15",
    
"16",
    
"17",
    
"18",
    
"19",
    
"20",
    
"21"
    
];

list 
lBoutons2 = [
    
"0",
    
"1",
    
"2",
    
"3",
    
"4",
    
"5",
    
"6",
    
"7",
    
"8",
    
"9",
    
"10",
    
"11",
    
"12",
    
"13",
    
"14",
    
"15",
    
"16",
    
"17",
    
"18",
    
"19",
    
"20",
    
"21"
    
];

list 
lBoutons3 = [
    
"0",
    
"1",
    
"2",
    
"3",
    
"4",
    
"5",
    
"6",
    
"7",
    
"8",
    
"9",
    
"10",
    
"11",
    
"12",
    
"13",
    
"14",
    
"15",
    
"16",
    
"17",
    
"18",
    
"19",
    
"20",
    
"21"
    
];

list 
lBoutons4 = [
    
"0",
    
"1",
    
"2",
    
"3",
    
"4",
    
"5",
    
"6",
    
"7",
    
"8",
    
"9",
    
"10",
    
"11",
    
"12",
    
"13",
    
"14",
    
"15",
    
"16",
    
"17",
    
"18",
    
"19",
    
"20",
    
"21"
    
];

list 
lBoutons5 = [
    
"0",
    
"1",
    
"2",
    
"3",
    
"4",
    
"5",
    
"6",
    
"7",
    
"8",
    
"9",
    
"10",
    
"11",
    
"12",
    
"13",
    
"14",
    
"15",
    
"16",
    
"17",
    
"18",
    
"19",
    
"20",
    
"21"
    
];

list 
lBoutons6 = [
    
"0",
    
"1",
    
"2",
    
"3",
    
"4",
    
"5",
    
"6",
    
"7",
    
"8",
    
"9",
    
"10",
    
"11",
    
"12",
    
"13",
    
"14",
    
"15",
    
"16",
    
"17",
    
"18",
    
"19",
    
"20",
    
"21"
    
];

list 
lBoutons7 = [
    
"0",
    
"1",
    
"2",
    
"3",
    
"4",
    
"5",
    
"6",
    
"7",
    
"8",
    
"9",
    
"10",
    
"11",
    
"12",
    
"13",
    
"14",
    
"15",
    
"16",
    
"17",
    
"18",
    
"19",
    
"20",
    
"21"
    
]; 

list 
lBoutons8 = [
    
"0",
    
"1",
    
"2",
    
"3",
    
"4",
    
"5",
    
"6",
    
"7",
    
"8",
    
"9",
    
"10",
    
"11",
    
"12",
    
"13",
    
"14",
    
"15",
    
"16",
    
"17",
    
"18",
    
"19",
    
"20",
    
"21"
    
];
                   
// Liste des numéros des primitives
list lPrims = [21,35,36,34,31,29,33,28];

// Détermine l'index de la case touchée
integer indexZone(integer xinteger y) {
    
vector v llDetectedTouchST(0);
    return (integer)(
v.x) + ((integer)(v.y)) * x;
}

// Détermine l'index du bouton touché
integer indexBouton(integer idstring iCase) {
    list 
lBoutons;
    
// Choix de la liste concernée 
    
if(id == 0lBoutons lBoutons1;
    else if(
id == 1lBoutons lBoutons2;
    else if(
id == 2lBoutons lBoutons3;
    else if(
id == 3lBoutons lBoutons4
    else if(
id == 4lBoutons lBoutons5;
    else if(
id == 5lBoutons lBoutons6;
    else if(
id == 6lBoutons lBoutons7;               
    else 
lBoutons lBoutons8;
    
// Balayage
    
integer n llGetListLength(lBoutons);
    while(
n--) {
        
string s llList2String(lBoutonsn);
        list 
llCSV2List(s);
        if(~
llListFindList(l, [iCase])) return n;
    }
    return -
1;
}

default
{
    
state_entry()
    {
        
llOwnerSay("La mémoire utilisée est : " + (string)llGetUsedMemory() + " octects");
    }

    
touch_start(integer total_number)
    {
        
llOwnerSay("Clic sur la case " + (string)indexZone(211));
        
integer iPrimitive llDetectedLinkNumber(0);
        
integer id llListFindList(lPrims, [iPrimitive]);
        if(~
id) {
            
integer iCase indexZone(211);
            
integer iBouton indexBouton(id, (string)iCase);
            if(~
iBouton) {
                list 
message = [llGetOwner(), idiBouton];
                
llOwnerSay(llDumpList2String(message"@"));
                
llWhisper(iCanalllDumpList2String(message"@"));
            }
        }
    }

Tu peux optimiser ton script pour trois raisons :

  • tes listes sont identiques,
  • les valeurs sont identiques à l'index,
  • tes boutons occupent tout l'espace.
Du coup ton cas se résume dans ce code :


Code PHP:

// Script de commande dans le HUD

// Canal
integer iCanal = -455821201;

// Liste des numéros des primitives
list lPrims = [21,35,36,34,31,29,33,28];

// Détermine l'index de la case touchée
integer indexZone(integer xinteger y) {
    
vector v llDetectedTouchST(0);
    return (integer)(
v.x) + ((integer)(v.y)) * x;
}

default
{
    
touch_start(integer total_number)
    {
        
//llOwnerSay("Clic sur la case " + (string)indexZone(2, 11));
        
integer id llListFindList(lPrims, [llDetectedLinkNumber(0)]);
        if(~
id) {
            list 
message = [llGetOwner(), idindexZone(211)];
            
//llOwnerSay(llDumpList2String(message, "@"));
            
llWhisper(iCanalllDumpList2String(message"@"));
        }
    }

Ah ouais carrément!

Petite question, certain tableaux ne seront pas pleins, dans le script récepteur, les listes de textures peuvent elles être composés que de trois ou quatre uuids ou il faut tout de même lui dire que les autres indexs ne doivent pas répondre?
Si ça pose soucis il est facile de diviser autrement le tableau de manière à ne plus avoir le problème...
Citation :
Publié par Gaelle Minois
Petite question, certain tableaux ne seront pas pleins, dans le script récepteur, les listes de textures peuvent elles être composés que de trois ou quatre uuids ou il faut tout de même lui dire que les autres indexs ne doivent pas répondre?
Si ça pose soucis il est facile de diviser autrement le tableau de manière à ne plus avoir le problème...
Tu peux faire un test dans le script, par exemple si tu as 4 tableaux :

Code PHP:

integer i = (integer)llList2String(l1);
if(
3) return;    // Ici le test !
list lTextures
Si tu trouves que c'est un peu bête d'envoyer une information qui sert à rien alors il faut faire le grand jeu côté émetteur.
Ah j'ai essayé ton script condensé mais on dirait qu'il n'envois plus l'index, rien ne se passe coté reception...
Et il ne fait que me dire quel case je touche et pas le message derrière.

Edit: Ah non erreur de ma part dans la liste des prims...

Oui voilà en essayant d'enlever des uuids dans la liste du script recepteur arrivé sur la case concerné il me dit "could not find texture"...
Je crois que je suis obligée de passer par la liste des boutons si je veux garder le même quadrillage pour tous les tableaux...

Dernière modification par Gaelle Minois ; 03/06/2014 à 17h56.
Il suffit de tester que l'index envoyé est dans les limites de la liste concernée :

Code PHP:

listen(integer channelstring namekey idstring message)
{
    list 
llParseString2List(message, ["@"], []);
    if((
key)llList2String(l0) == llGetOwner()) {
        
integer i = (integer)llList2String(l1);
        list 
lTextures;
        if(
== 0lTextures lTextures1;
        else if(
== 1lTextures lTextures2;
        else 
lTextures lTextures3;
        
integer id_texture = (integer)llList2String(l2);
        if(
id_texture llGetListLength(lTextures)) {
            
llSetLinkTexture(
                
llList2Integer(lPrimitivesi),
                
llList2Key(lTexturesid_texture),
                
llList2Integer(lFacesi));
        }
    }

Bon j'ai testé, tout d'abord il manque une accolade pour que le script veuille bien s'enregistrer, mais bon malgré ça il me dis quand même "could not find texture" quand j'arrive sur une case avec aucune texture associée, après ça vient peut être de la façon d’écrire les listes.

Mais bon finalement tout ça n'est pas tellement important je vais simplement reprendre le système de liste de boutons et configurer chaque tableaux c'est pas si long à faire, et ça fonctionne très bien, même coté mémoire on est large, même avec une trentaines de tableaux pleins ça passerait encore!

Bref j'essaye de finir ça et je te remercie déjà de tout mon coeur bestmomo pour le travail que tu as fais pour moi, tu ne voles pas ton statut!
Je vais enfin pouvoir sortir mes nouvelles créations!
Je remonte ce topic pour une petite question car un point m'est encore flou:

Dans le script récepteur je comprends bien comment lister les prims dans le link:
Code PHP:

// Primitves cibles
list lPrimitives = [2,3,4]; 
Par contre je ne comprends pas comment gérer les faces de certains prims:
Code PHP:

// Faces cibles
list lFaces = [0,0,0]; 
Je n'ai que quelques prims qui ont plusieurs faces dans le link, comment lister seulement ces prims là?
Merci d'avance...
Bonjour,

Le script récepteur a été conçu dans l'optique de renseigner une face par primitive. Donc dans la liste lFaces les numéros de faces correspondent aux primitives dont les numéros sont dans la liste lPrimitives. Veux-tu dire que pour certaines primitives tu as plusieurs faces à renseigner ?
Voici mon exemple avec trois tableaux de textures modifié en conséquence. Dans la liste des faces si tu as plusieurs faces tu les notes dans une chaîne de caractères :

Code PHP:

// Script de réception

// Canal
integer iCanal = -455821201;

// Textures
list lTextures1 = [
    
"1e5b3d96-61a3-b3a2-bb64-3c24a0bd6ba5",
    
"7baf93b1-0635-bd12-dfc1-c95da1b20439",
    
"b43728c3-7bba-91e3-46fd-abff206af5b3",
    
"c67fbf0d-77bd-2d7d-fed1-dc044c7fa7a2",
    
"0f73c222-ca6d-802e-f94f-10e755eed4c1",
    
"da4e8cbd-cb21-cfab-8c5f-219d67131cd6"
        
];

list 
lTextures2 = [
    
"1e5b3d96-61a3-b3a2-bb64-3c24a0bd6ba5",
    
"7baf93b1-0635-bd12-dfc1-c95da1b20439",
    
"b43728c3-7bba-91e3-46fd-abff206af5b3",
    
"c67fbf0d-77bd-2d7d-fed1-dc044c7fa7a2",
    
"0f73c222-ca6d-802e-f94f-10e755eed4c1",
    
"da4e8cbd-cb21-cfab-8c5f-219d67131cd6"
        
];

list 
lTextures3 = [
    
"1e5b3d96-61a3-b3a2-bb64-3c24a0bd6ba5",
    
"7baf93b1-0635-bd12-dfc1-c95da1b20439",
    
"b43728c3-7bba-91e3-46fd-abff206af5b3",
    
"c67fbf0d-77bd-2d7d-fed1-dc044c7fa7a2",
    
"0f73c222-ca6d-802e-f94f-10e755eed4c1",
    
"da4e8cbd-cb21-cfab-8c5f-219d67131cd6"
        
];

// Primitves cibles
list lPrimitives = [2,3,4];

// Faces cibles
list lFaces = ["01",0,0];

default
{
    
state_entry()
    {
        
llListen(iCanal""NULL_KEY"");
    }
    
listen(integer channelstring namekey idstring message)
    {
        list 
llParseString2List(message, ["@"], []);
        if((
key)llList2String(l0) == llGetOwner()) {
            
integer i = (integer)llList2String(l1);
            list 
lTextures;
            if(
== 0lTextures lTextures1;
            else if(
== 1lTextures lTextures2;
            else 
lTextures lTextures3;
            
integer iLink llList2Integer(lPrimitivesi);
            
key kTexture llList2Key(lTextures, (integer)llList2String(l2));
            
string sFaces llList2String(lFacesi);
            
integer n llStringLength(sFaces);
            while(
n--) {
                
llSetLinkTexture(
                    
iLink,
                    
kTexture,
                    (integer)
llGetSubString(sFacesnn));
            }
        }
    }

La texture est placée sur les faces au niveau d'une boucle. La fonction llSetLinkTexture temporise le script de 0,2 seconde. Ça ne me paraît pas gênant dans ce cas. Sinon on peut arranger ça en changeant de fonction.
Encore moi, bonjour à tous!

Voilà j'aurai voulu savoir si il était possible d'avoir les uuids des textures dans le le script du HUD plutôt que dans le script receveur?
Pour la bonne raison que quand je vend une paire de chaussures, je fais après en add-ons des packs de textures où je ne vends que le HUD.
Sinon avec les textures dans le script receveur obligé de revendre les chaussures avec ce qui est pas très commercial...
Merci d'avance.
Dans ce cas tu vas transmettre en clair les clé de tes textures dans le tchat. Ta seule protection est le numéro du canal qui doit rester secret. Une autre possibilité consisterait à crypter les clés mais c'est pour les paranos .

En gardant mon exemple initial avec 3 panneaux voici pour le HUD :

Code PHP:

// Script de commande dans le HUD

// Canal
integer iCanal = -455821201;

// Liste des boutons
list lBoutons1 = [
    
"82,83,122,123",
    
"85,86,125,126",
    
"88,89,128,129",
    
"91,92,131,132",
    
"94,95,134,135",
    
"97,98,137,138"
        
];

list 
lBoutons2 = [
    
"82,83,122,123",
    
"85,86,125,126",
    
"88,89,128,129",
    
"91,92,131,132",
    
"94,95,134,135",
    
"97,98,137,138"
        
];

list 
lBoutons3 = [
    
"82,83,122,123",
    
"85,86,125,126",
    
"88,89,128,129",
    
"91,92,131,132",
    
"94,95,134,135",
    
"97,98,137,138"
        
];

// Textures
list lTextures1 = [
    
"1e5b3d96-61a3-b3a2-bb64-3c24a0bd6ba5",
    
"7baf93b1-0635-bd12-dfc1-c95da1b20439",
    
"b43728c3-7bba-91e3-46fd-abff206af5b3",
    
"c67fbf0d-77bd-2d7d-fed1-dc044c7fa7a2",
    
"0f73c222-ca6d-802e-f94f-10e755eed4c1",
    
"da4e8cbd-cb21-cfab-8c5f-219d67131cd6"
        
];

list 
lTextures2 = [
    
"1e5b3d96-61a3-b3a2-bb64-3c24a0bd6ba5",
    
"7baf93b1-0635-bd12-dfc1-c95da1b20439",
    
"b43728c3-7bba-91e3-46fd-abff206af5b3",
    
"c67fbf0d-77bd-2d7d-fed1-dc044c7fa7a2",
    
"0f73c222-ca6d-802e-f94f-10e755eed4c1",
    
"da4e8cbd-cb21-cfab-8c5f-219d67131cd6"
        
];

list 
lTextures3 = [
    
"1e5b3d96-61a3-b3a2-bb64-3c24a0bd6ba5",
    
"7baf93b1-0635-bd12-dfc1-c95da1b20439",
    
"b43728c3-7bba-91e3-46fd-abff206af5b3",
    
"c67fbf0d-77bd-2d7d-fed1-dc044c7fa7a2",
    
"0f73c222-ca6d-802e-f94f-10e755eed4c1",
    
"da4e8cbd-cb21-cfab-8c5f-219d67131cd6"
        
];

// Liste des numéros des primitives
list lPrims = [2,3,4];

// Détermine l'index de la case touchée
integer indexZone(integer xinteger y) {
    
vector v llDetectedTouchST(0);
    return (integer)(
v.x) + ((integer)(v.y)) * x;
}

// Détermine l'index du bouton touché
integer indexBouton(integer idstring iCase) {
    list 
lBoutons;
    
// Choix de la liste concernée
    
if(id == 0lBoutons lBoutons1;
    else if(
id == 1lBoutons lBoutons2;
    else 
lBoutons lBoutons3;
    
// Balayage
    
integer n llGetListLength(lBoutons);
    while(
n--) {
        
string s llList2String(lBoutonsn);
        list 
llCSV2List(s);
        if(~
llListFindList(l, [iCase])) return n;
    }
    return -
1;
}

default
{
    
state_entry()
    {
        
llOwnerSay("La mémoire utilisée est : " + (string)llGetUsedMemory() + " octects");
    }

    
touch_start(integer total_number)
    {
        
//llOwnerSay("Clic sur la case " + (string)indexZone(40, 23));
        
integer iPrimitive llDetectedLinkNumber(0);
        
integer id llListFindList(lPrims, [iPrimitive]);
        if(~
id) {
            
integer iCase indexZone(4023);
            
integer iBouton indexBouton(id, (string)iCase);
            if(~
iBouton) {
                list 
lTextures;
                if(
id == 0lTextures lTextures1;
                else if(
id == 1lTextures lTextures2;
                else 
lTextures lTextures3;
                
llWhisper(iCanal, (string)id "@" llList2String(lTexturesiBouton));
            }
        }
    }

Et voici pour la réception :

Code PHP:

// Script de réception

// Canal
integer iCanal = -455821201;

// Primitives cibles
list lPrimitives = [2,3,4];

// Faces cibles
list lFaces = ["01",0,0];

default
{
    
state_entry()
    {
        
llListen(iCanal""NULL_KEY"");
    }
    
listen(integer channelstring namekey idstring message)
    {
        if(
llGetOwnerKey(id) == llGetOwner()) {
            list 
llParseString2List(message, ["@"], []);
            
integer i = (integer)llList2String(l0);
            
integer iLink llList2Integer(lPrimitivesi);
            
key kTexture = (key)llList2String(l1);
            
string sFaces llList2String(lFacesi);
            
integer n llStringLength(sFaces);
            while(
n--) {
                
llSetLinkTexture(
                    
iLink,
                    
kTexture,
                    (integer)
llGetSubString(sFacesnn));
            }
        }
    }

Super merci infiniment bestmomo, c’était le dernier détails qui me manquait, tu ne t'imagines pas à quel point tu me rends service!

Pour le cryptage des uuids j'y ai pensé, mais je me suis aussi dit qu'il était possible de récupérer les texture de sl avec une facilité déconcertante, et qu'il existera toujours un petit malin pour trouver une parade. Du coup pas la peine de se fatiguer, 95% des gens utiliseront tout ça honnêtement.
Et puis mes chaussures sont no mod, si ils veulent frauder il faudra aussi voler les meshs, et là je leur souhaites bien du courage!
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés