SL - Forum scripts

Ligne de code

Répondre
Partager Rechercher
bonjour,
j'ai trouvé un script sur ce forum appartenant a bestmomo qui consiste a changer la texture sur des ongles,
je voudrais faire pareil mais avec des couleurs plutôt que des textures,j'ai essayer de le modifier mais j'ai un problème
avec cette ligne de code

Code:
for(; i < n; ++i) llSetLinkTexture(llList2Integer(l_ongles, i), llList2Key(TEXTURES, i), FACE);
quand je change le "llSetLinkTexture" en "llSetLinkColor" le script bloque sur la fin de ligne "FACE"
j'ai essayer plusieurs chose mais rien ne fonctionne,quelqu'un pourrait m'aider svp ?
Citation :
Publié par MenthalOH
pas très claire comme demande, mais la syntaxe pour la couleur devrait être du genre ....

llSetLinkColor(llList2Integer(l_ongles, i),<1.0,0.0,0.0>, FACE);
oui pardon j'ai peut ètre pas tous expliqué,je voudrais changer des couleurs sur des ongles,avec le script que j'ai sa change de texture,
mais pas de couleurs,la ligne de code que tu me propose doit marcher mais dans le script que j'ai il y a un bouton qui donne la couleur a la mesh,
je te donne le script complet tu comprendras mieux car moi je connais rien hihi

Emetteur
Code:
//------------------------------------------------
//
//            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);
    }
}
Recepteur
Code:
//------------------------------------------------
//
//            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, ALL_SIDES]);
        llSetLinkPrimitiveParamsFast(id, [PRIM_TEXTURE, ALL_SIDES, 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));
    }
}
bon, ya moyen de faire plus simple....
tu fais autant de boutons couleur que tu veux.....tu colories chaque bouton de la couleur voulue pour les ongles....et tu mets ce script dans chaque bouton.....

integer canal = -12345;

default
{
touch_start(integer total_number)
{
integer face = llDetectedTouchFace(0);
string color = (string)llGetColor(face);
llWhisper(canal,color);
}
}




et après, dans le prim root des ongles de chaque main, tu mets celui là......


integer canal = -12345;
integer face = 4;

default
{
state_entry()
{
llListen(canal, "", "", "");
}

listen( integer canal, string name, key id, string msg )
{
llSetLinkPrimitiveParamsFast(LINK_SET, [PRIM_COLOR,face,(vector)msg,1.0]);
}
}
Content
sa marche super,un grand merci,mais si je veux sur toute les face je dois changer et mettre "ALL_SIDES" je suppose ?

edit:voila sa marche nickel,un TRES GRAND merci a toi, kiss

aaaaah Zut j'ai oublié de préciser une chose,en fait sur mes ongles j'ai des diamants dont j'aimerais changer la couleur independement
des ongles,sur ma mesh il y a 5 ongles et 30 diamants

Dernière modification par Ceejay ; 05/04/2021 à 23h25. Motif: Auto-fusion
euuuuh j'ai un soucis ton script fonctionne plus !? je clic sur n'importe quel bouton sa me change juste la 1ère couleur et plus rien sur les autres bouton !?
pour les diams....ils ont surement un numero de face different des ongles, il faut donc mettre le numero de face corrsepondant seulement aux ongles...
et refaire des boutons pour colorier les diams sur un canal different par exemple.
Un script qui a déjà marché n' arrête pas soudainement de marcher si on ne change pas un truc ou si on ne le desactive pas
je ne comprends pas cette phrase..."je clic sur n'importe quel bouton sa me change juste la 1ère couleur et plus rien sur les autres bouton !?"
sinon reposte les scripts qui ne "marchent plus"
Euuuuh autant pour moi lol,je dois ètre fatigué,j'ai cru qu'il fallait mettre la 1ère partie du script juste dans le root loool je viens de reteste,
c'est sur quand mettant le script dans tous les boutons ça va mieux

hum il y a combien de face maximum ?

Dernière modification par Ceejay ; 06/04/2021 à 10h56. Motif: Auto-fusion
ah ben la j'ai un sacré probleme je suis a la face 12 et toujours rien,evidement si je met "ALL_SIDES" tous change mais les diams aussi lol

Citation :
Publié par Ceejay
ah ben la j'ai un sacré probleme je suis a la face 12 et toujours rien,evidement si je met "ALL_SIDES" tous change mais les diams aussi lol
Edit: sur la Face zero ça marche,mais pareil que ALLSIDES tous change même les diams ça m'arrange pas

Dernière modification par Ceejay ; 06/04/2021 à 11h44. Motif: Auto-fusion
si les ongles changent en même temps que les diams sur la face 0 .....c 'est que ton mesh ne pourra pas mettre une autre couleur sur les diams, vu qu'ils sont sur la même face que l' ongle....euh, petit truc....pas la peine de tester les numeros de faces un à un dans le script, dans la boite d' edition, en cochant "select face"....le numero de la face cliquée est affichées....avec Firestorm du moins....
oui la mesh ne va pas,j'ai réessayer d'en sortir un de Blender mais c'est la même chose,
c'est comme si je devais exporté tout en pièce détaché lol;a part mettre un script dans chaque partie de la mesh je vois pas ce que je pourrais
faire d'autre (a part tous recommencer depuis zero)
oui peut ètre mais je comprend maintenant pourquoi la plupart des créateurs font des ongles simple sans rien dessus

et il y a pas moyen de mettre un script genre ou on nomme les objets faisant partie d'une mesh pour les changer de couleur ?

Dernière modification par Ceejay ; 06/04/2021 à 15h59. Motif: Auto-fusion
s' ils font partie d'un même mesh, non....sauf s'ils ont une face differente....ou il faut texturer sur blender ton truc en faisant autant de couleurs et de couleurs de diams que tu veux....et ça reviendra à un changement de texture....mais ça va être long
oui voila,un peu comme le script de bestmomo qui change les textures de parties nommé d'une mesh,sa marchais mais avec des textures,
comme ma mesh est raté je peut juste camouflé avec de la couleur
bon j'ai essayé de bidouiller ton script avec celui de bestmomo pour changer par nom les objets de ma mesh en couleur
ça donne ça:

Code:
EMetteur:

integer canal = -12345;
Code:
string      PRIM_NOM        = "T";
Code:
// -----------------------------------------------
Code:
//        Variables
Code:
// -----------------------------------------------
Code:
list l_ongles = [];
Code:
// -----------------------------------------------
Code:
//        Détection des primitives
Code:
// -----------------------------------------------
Code:
get_prims(){
Code:
    // Initialisation liste des ongles
Code:
    integer n;
Code:
    while(n--) l_ongles += 0;
Code:
    // Récupération des index des primitives
Code:
    integer i;
Code:
    n = llGetNumberOfPrims();
Code:
    string nom;
Code:
    for(i = 2; i <= n; ++i) {
Code:
        // Nom de la primitive
Code:
        nom = llList2String(llGetObjectDetails(llGetLinkKey(i), [OBJECT_NAME]), 0);
Code:
        // Sauvegarde si primitive d'ongle
Code:
        if(llGetSubString(nom, 0, 0) == PRIM_NOM) {
Code:
            integer id = (integer)llGetSubString(nom, 1, -1);
Code:
            l_ongles = llListReplaceList(l_ongles, [i], id, id);
Code:
        }
Code:
    }
Code:
}
Code:
default
Code:
{
Code:
touch_start(integer total_number)
Code:
{
Code:
integer face = llDetectedTouchFace(0);
Code:
string color = (string)llGetColor(face);
Code:
llWhisper(canal,color);
Code:
}
Code:
}
Code:
Recepteur

integer canal = -12345;
Code:
integer face = ALL_SIDES;
Code:
string      PRIM_NOM        = "T";
Code:
// -----------------------------------------------
Code:
//        Variables
Code:
// -----------------------------------------------
Code:
list l_ongles = [];
Code:
// -----------------------------------------------
Code:
//        Détection des primitives
Code:
// -----------------------------------------------
Code:
get_prims(){
Code:
    integer i;
Code:
    integer n = llGetNumberOfPrims();
Code:
    string nom;
Code:
    for(i = 2; i <= n; ++i) {
Code:
        // Nom de la primitive
Code:
        nom = llList2String(llGetObjectDetails(llGetLinkKey(i), [OBJECT_NAME]), 0);
Code:
        // Sauvegarde si primtive d'ongle
Code:
        if(nom == PRIM_NOM) l_ongles += i;
Code:
    }
Code:
}
Code:
default
Code:
{
Code:
state_entry()
Code:
{
Code:
llListen(canal, "", "", "");
Code:
}
Code:
listen( integer canal, string name, key id, string msg )
Code:
{
Code:
llSetLinkPrimitiveParamsFast(LINK_SET, [PRIM_COLOR,face,(vector)msg,1.0]);
Code:
}
Code:
}
apparement il continue a employer ton script sans que ma bidouille change quelque chose!?
bah oui, ton "bidouillage".....ne sert pas à grand chose ...de toute façon, on ne peut pas nommer des "objets" faisant partie d' un même mesh et d' une même face.....et appliquer des couleurs differentes....
ben si on peut,j'ai accès a toute les partie de ma mesh,je peut les nommer leur mettre une couleur tous ce que je veux mais
en passant par "modifer" et "modification liée" sa prend du temps c'est sur,c'est pour ça que le script de bestmomo étais bien
juste que moi c'est les couleurs que je dois changer et pas les textures
lol, ok, j' ai capté le problème....le prob, c 'est la description de ce que tu as et ce que tu souhaites.....les diams sont des meshes à part liés aux ongles.....mais pour faire court.....on ne peut pas juste changer une ligne du script de Best, il faut le retravailler ...sinon, il faut mettre un script dans chaque ongle et un dans chaque diams.....ce qui est assez moyen.....et changer la ligne llSetLinkPrimitiveParamsFast(LINK_SET, [PRIM_COLOR,face,(vector)msg,1.0]); en llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_COLOR,face,(vector)msg,1.0]);....

Dernière modification par MenthalOH ; 07/04/2021 à 14h34.
oui c'est pour ça que l'idée de best est pratique il suffit de nommer les parties a changer, sa fait juste 2 script au lieu de 100
10 ongles + 60 diams + 2x15 couleurs = 100 script a mettre
à mettre dans chaque boutons couleur d' ongle...


integer canal = -12345;

default
{
touch_start(integer total_number)
{
integer face = llDetectedTouchFace(0);
string color = (string)llGetColor(face);
llWhisper(canal,color);
}
}





à mettre ds chaque bouton couleur de diams

integer canal = -123456;

default
{
touch_start(integer total_number)
{
integer face = llDetectedTouchFace(0);
string color = (string)llGetColor(face);
llWhisper(canal,color);
}
}



à mettre dans le root de l' ensemble ongles-diams...


integer canalongles = -12345;
integer canaldiams = -123456;

integer face = ALL_SIDES;
integer nbprims;
integer i;
integer index;
integer nb_ongles;
integer nb_diams;

list nomprim;
list ongles;
list diams;

string nom;


default
{
on_rez(integer start_param)
{
llResetScript();
}

state_entry()
{
llListen(canalongles, "", "", "");
llListen(canaldiams, "", "", "");

ongles = [];
diams = [];

nbprims = llGetNumberOfPrims();

do
{
nom = llGetLinkName(i);
if (nom == "ongle")
ongles += [i];

else if(nom == "diam")
diams +=[i];

}
while(++i <= nbprims);

nb_ongles = llGetListLength(ongles);
nb_diams = llGetListLength(diams);
}

listen( integer canal, string name, key id, string msg )
{
if(canal == canalongles)
{
index = 0;
do
{
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_LINK_TARGET,llList2Integer(ongles, index),PRIM_COLOR,face,(vector)msg,1.0]);
}
while (++index < nb_ongles);
}
else if(canal == canaldiams)
{
index = 0;
do
{
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_LINK_TARGET,llList2Integer(diams, index),PRIM_COLOR,face,(vector)msg,1.0]);
}
while (++index < nb_diams);
}
}

changed(integer change)
{
if (change & CHANGED_LINK)
{
llResetScript();
}
}
}




les diams doivent avoir le nom "diam"......les ongles "ongle"
Répondre

Connectés sur ce fil

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