transferer un script contenu dans une poseball a un objet (encore)

Répondre
Partager Rechercher
A ce que j'ai pu lire dans un post précédent, il est donc possible de faire ce transfert (bien que pas mal de poseball ne soient pas "livrée" avec l'acces au script)

J'ai donc essayé de transferer le script d'une kissball que ma compagne et moi avions mise devant la porte de notre maison dans une sorte de paillasson et là malheureusement no avatar ce retrouvent couchés.

voici le code de la boule
Code:
 // position to sit on the ball e.g <0.0, 0.0, 0.43>
// sit  0.5 meter above the ball
vector POSITION=<0.0, 0.0, 0.73>;

// hovertext above ball. "" for none.
// add '\n ' at the end to move text up i.e.
// string HOVERTEXT="Sit Here\n ";
string HOVERTEXT="Sit Here";

// Pie Menu Sit Text. Will only work for the
// main prim but included it anyway. If no text
// is entered between "" it won't be used.
string SIT_TEXT="";


// hovertext color 'r,g,b' e.g. "255,255,255" (white)
string HOVER_RGB="255,255,255";

// LISTEN sets if this ball should listen for voice commands
// or not. You only need to enable this for 1 ball if you
// link several balls to an object. (to reduce lagg).
// Change to TRUE to enable FALSE to disable. 
integer LISTEN=FALSE;

// What channel to listen for hide/show on. If you want to
// listen to normal conversation (hide/show), set channel
// to 0 otherwise the command will be /channel hide, show 
integer CHANNEL=8;

// * * * * * * * STOP MODIFY * * * * * * * *//




set_text()
{
       if (llStringLength(HOVERTEXT)>0)
        {
            rgb=llCSV2List(HOVER_RGB);
            llSetText(HOVERTEXT,<llList2Float(rgb,0)*0.003921568627450980392156862745098,llList2Float(rgb,1)*0.003921568627450980392156862745098,llList2Float(rgb,2)*0.003921568627450980392156862745098>,1.0);
            
        }    
        else
           llSetText("",<0,0,0>,0.0);     
}
start_listen()
{
    llListenRemove(listener);
    if (LISTEN==TRUE)
        listener=llListen(CHANNEL,"","","");
}
hide_me()
{
    llSetAlpha(0.0, ALL_SIDES);
    llSetText("",<0,0,0>,0.0);     
}
show_me()
{
    llSetAlpha(1.0, ALL_SIDES);
    set_text();                
}
list rgb;
string animation;
integer listener;
default 
{
    state_entry() 
    {
        if (llStringLength(SIT_TEXT)>0)
            llSetSitText(SIT_TEXT);
        llSitTarget(POSITION, ZERO_ROTATION); 
        set_text();
        start_listen();
    }
    
    on_rez(integer r)
    {
        start_listen();
    }
    
    listen(integer channel, string name, key id, string msg)  
    {
        if (msg=="hide")
        {
            hide_me();
            llMessageLinked(LINK_SET,0,"hide", NULL_KEY);
        }
        else if (msg=="show")
        {
            show_me();
            llMessageLinked(LINK_SET,0,"show", NULL_KEY);
        }
    }
    
    changed(integer change) 
    { 
        if (change & CHANGED_LINK) 
        {
            
            if (llAvatarOnSitTarget() != NULL_KEY) 
            { 
                llRequestPermissions(llAvatarOnSitTarget(), PERMISSION_TRIGGER_ANIMATION);
            }
            else
            {
                integer perm=llGetPermissions();
                if ((perm & PERMISSION_TRIGGER_ANIMATION) && llStringLength(animation)>0)       
                llStopAnimation(animation);
                llSetAlpha(1.0, ALL_SIDES);
                set_text();
                animation="";
            }
        }
    }
    run_time_permissions(integer perm)
    {
        if (perm & PERMISSION_TRIGGER_ANIMATION)
        {
                llStopAnimation("sit");
                animation=llGetInventoryName(INVENTORY_ANIMATION,0);
                llStartAnimation(animation);
                llSetAlpha(0.0, ALL_SIDES);
                llSetText("",<0,0,0>,0.0);
        }
    }

    link_message(integer sender_num, integer num, string str, key id)
    {
        if (str=="hide")
        {
            hide_me();
        }
        else if (str=="show")
        {
            show_me();
        }
    }
}
je suppose donc que :

Code:
 // position to sit on the ball e.g <0.0, 0.0, 0.43>
// sit  0.5 meter above the ball 
vector POSITION=<0.0, 0.0, 0.73>;
correspond au placement de l'avatar par rapport au centre du prims

Mais pour la rotation ? (la programmation c'est pas mon domaine du tout) est-ce code qui la gère ?

Code:
  if (llStringLength(SIT_TEXT)>0)
            llSetSitText(SIT_TEXT);
        llSitTarget(POSITION, ZERO_ROTATION); 
        set_text();
        start_listen();
    }
Et finalement y'a-t-il un moyen de modifier ce script pour indiquer dedans la rotation des avatars?

Car si c'est le cas ça me permettrait de gagner en esthétisme (plus de ball visible ou en tout cas beaucoup moins) et de gagner quelque prims.

Merci d'avance (Master71 )
Voici comment faire ta rotation (j'ai repris le script de master):

//A mettre en dès le début du script
vector var = <0.0, 0.0, 0.0>; // orientation de l'avatar par rapport aux axes du prim ou est le script, les angles sont donnes en degres autour des axes <x, y, z>.
vector getpos;
rotation rX;
rotation rY;
rotation rZ;
rotation r;

//A mettre dans le state_entry (en remplacement de llSitTarget(...,ZERO_ROTATION);

rX = llAxisAngle2Rot( <1,0,0>, var.x * DEG_TO_RAD);
rY = llAxisAngle2Rot( <0,1,0>, var.y * DEG_TO_RAD);
rZ = llAxisAngle2Rot( <0,0,1>, var.z * DEG_TO_RAD);
r = rX * rY * rZ;
llSitTarget(pos, r);

//fin modifs
Il te faut rajouter ces morceaux de codes à l'emplacement que tu cites. Mais je me pose une question vos deux avatars arrivent bien à s'embrasser (même allonger). Sinon la solution la plus simple serait un tapis qui rez temporairement des balls...
Nous n'avons pas encore eu le loisir de tester ensemble vu que nous faisons des modif sur la décoration en prioritée et je m'occupe de cette histoire de poseball quand je suis tout seul, mais j'ai l'animation qui va avec le script donc en théorie oui, nous devrions bien nous embrasser.

Je test les modifs des que j'ai 5 minutes, merci

Après test j'arrive a ce stade :

Si je copie bêtement le deux fichier (script & animation) de la boule vers mon inventaire et qu'en suite je les copie de l'inventaire à l'objet que je souhaite modifier je m'assoie sur l'objet (donc effectivement dans ce cas même si je ne sais toujours pas pour l'animation je n'ai déjà pas la pose de base).

Si je copie l'animation et que je copie la source du script dans un fichier script créé dans l'objet j'ai enfin la pose (mais toujours pas de réponse a donner pour l'animation) de plus j'ai la pose féminine Oo

J'avance en même temps que j'écris ici je viens de m'appercevoir (et on ne rigole pas !!!) Que les boules etaient liées et qu'en les déliant on avait donc deux boules avec deux fois le même script et deux animations différentes ce qui explique pourquoi j'ai la pose féminine mais dans ce cas comment implémenter les deux poses a un seul prims ? (si tant est que ce soit possible)

Si ce n'est pas possible tant pis, je colle le script et l'animation d'une des boules dans le prims et laisse la deuxieme ça fait quand meme gagné un peu de prims et allège le paysage
seb en utilisant tes modifs je m'assoie sur le prims mais ne prends plus la pose j'ai donc essayer de voir si il fallait modifier quelque chose et suis arrivé au script suivant :

Code:
// position to sit on the ball e.g <0.0, 0.0, 0.43>
// sit  0.5 meter above the ball
vector POSITION=<0.0, 0.0, 0.73>;

//A mettre en dès le début du script
vector var = <0.0, 0.0, 0.0>; // orientation de l'avatar par rapport aux axes du prim ou est le script, les angles sont donnes en degres autour des axes <x, y, z>.
vector getpos;
rotation rX;
rotation rY;
rotation rZ;
rotation r;

// hovertext above ball. "" for none.
// add '\n ' at the end to move text up i.e.
// string HOVERTEXT="Sit Here\n ";
string HOVERTEXT="Sit Here";

// Pie Menu Sit Text. Will only work for the
// main prim but included it anyway. If no text
// is entered between "" it won't be used.
string SIT_TEXT="";


// hovertext color 'r,g,b' e.g. "255,255,255" (white)
string HOVER_RGB="255,255,255";

// LISTEN sets if this ball should listen for voice commands
// or not. You only need to enable this for 1 ball if you
// link several balls to an object. (to reduce lagg).
// Change to TRUE to enable FALSE to disable. 
integer LISTEN=FALSE;

// What channel to listen for hide/show on. If you want to
// listen to normal conversation (hide/show), set channel
// to 0 otherwise the command will be /channel hide, show 
integer CHANNEL=8;

// * * * * * * * STOP MODIFY * * * * * * * *//





set_text()
{
       if (llStringLength(HOVERTEXT)>0)
        {
            rgb=llCSV2List(HOVER_RGB);
            llSetText(HOVERTEXT,<llList2Float(rgb,0)*0.003921568627450980392156862745098,llList2Float(rgb,1)*0.003921568627450980392156862745098,llList2Float(rgb,2)*0.003921568627450980392156862745098>,1.0);
            
        }    
        else
           llSetText("",<0,0,0>,0.0);     
}
start_listen()
{
    llListenRemove(listener);
    if (LISTEN==TRUE)
        listener=llListen(CHANNEL,"","","");
}
hide_me()
{
    llSetAlpha(0.0, ALL_SIDES);
    llSetText("",<0,0,0>,0.0);     
}
show_me()
{
    llSetAlpha(1.0, ALL_SIDES);
    set_text();                
}
list rgb;
string animation;
integer listener;
default 
{
   state_entry() 
    {
        if (llStringLength(SIT_TEXT)>0)
            llSetSitText(SIT_TEXT);
        rX = llAxisAngle2Rot( <1,0,0>, var.x * DEG_TO_RAD);
        rY = llAxisAngle2Rot( <0,1,0>, var.y * DEG_TO_RAD);
        rZ = llAxisAngle2Rot( <0,0,1>, var.z * DEG_TO_RAD);
        r = rX * rY * rZ;
        llSitTarget(POSITION, r); 
        set_text();
        start_listen();
    }

    
    on_rez(integer r)
    {
        start_listen();
    }
    
    listen(integer channel, string name, key id, string msg)  
    {
        if (msg=="hide")
        {
            hide_me();
            llMessageLinked(LINK_SET,0,"hide", NULL_KEY);
        }
        else if (msg=="show")
        {
            show_me();
            llMessageLinked(LINK_SET,0,"show", NULL_KEY);
        }
    }
    
    changed(integer change) 
    { 
        if (change & CHANGED_LINK) 
        {
            
            if (llAvatarOnSitTarget() != NULL_KEY) 
            { 
                llRequestPermissions(llAvatarOnSitTarget(), PERMISSION_TRIGGER_ANIMATION);
            }
            else
            {
                integer perm=llGetPermissions();
                if ((perm & PERMISSION_TRIGGER_ANIMATION) && llStringLength(animation)>0)       
                llStopAnimation(animation);
                llSetAlpha(1.0, ALL_SIDES);
                set_text();
                animation="";
            }
        }
    }
    run_time_permissions(integer perm)
    {
        if (perm & PERMISSION_TRIGGER_ANIMATION)
        {
                llStopAnimation("sit");
                animation=llGetInventoryName(INVENTORY_ANIMATION,0);
                llStartAnimation(animation);
                llSetAlpha(0.0, ALL_SIDES);
                llSetText("",<0,0,0>,0.0);
        }
    }

    link_message(integer sender_num, integer num, string str, key id)
    {
        if (str=="hide")
        {
            hide_me();
        }
        else if (str=="show")
        {
            show_me();
        }
    }
}

Je croyais aussi que pour modifier l'angle il faut "jouer" avec les valeurs <1,0,0> de rX rY rZ de

Code:
state_entry() 
    {
        if (llStringLength(SIT_TEXT)>0)
            llSetSitText(SIT_TEXT);
        rX = llAxisAngle2Rot( <1,0,0>, var.x * DEG_TO_RAD);
        rY = llAxisAngle2Rot( <0,1,0>, var.y * DEG_TO_RAD);
        rZ = llAxisAngle2Rot( <0,0,1>, var.z * DEG_TO_RAD);
        r = rX * rY * rZ;
        llSitTarget(POSITION, r); 
        set_text();
        start_listen();
    }
mais en fait non dans ma grande bêtise je viens de comprendre que c'est : vector var = <0.0, 0.0, 0.0> qui fait tourner l'avatar

Donc je peux maintenant placer l'avatar et le faire pivoté pour une animation.
Reste à trouver pour mettre deux animations si possible.

Et je pose une autre question par la même occasion , sans animation ça ce passe comment ?
par exemple dans le lit nous avons deux boules pour être couchés l'un à côté de l'autre, est-il possible de la même façon que plus haut de faire en sorte que nous soyons toujours allongés côte à côte mais sans les boules, juste en sélectionnant le lit? ou vais-je tombé également devant le même problème qu'au dessus ?
Eh oui c'est bien là ou je me disais qu'il y avait un problème.

Il ne me semble pas qu'il soit possible de faire jouer deux anims pour deux avatars différent pour un prim. La solution serait de refaire un prim de les placer etc... Ou alors se pencher sur la question de faire rezer des balls. Solution economique et pratique, mais il faut avoir les anims...
si on peut.
Mais ça ne passe plus par la fonction sit, mais touch

on ne s'assied plus sur le prim, mais on l'active par touch, et il y a 1 script gérant le touch plus 1 script par avatars animées dedans, le tout dialoguant par link-message.

C'est comme ça que marche la plupart des pistes de danses, et c'est moins intuitif que les pose-balls pour des fonctions particulières, car le touch ne permet pas de positionner l'avatar par rapport au prim.

Dans le cas du paillasson, le script gérant le touch détermine si c'est lui où elle, et lance le script pour lui, ou elle, qui va animer l'avatar, mais y aura pas de positionnement précis, puisqu'on ne peut pas animer un avatar sans utiliser de prim attachée, ou de véhicule (prim sur laquelle on est assis).
Citation :
Publié par master71
si on peut.
Mais ça ne passe plus par la fonction sit, mais touch

on ne s'assied plus sur le prim, mais on l'active par touch, et il y a 1 script gérant le touch plus 1 script par avatars animées dedans, le tout dialoguant par link-message.

C'est comme ça que marche la plupart des pistes de danses, et c'est moins intuitif que les pose-balls pour des fonctions particulières, car le touch ne permet pas de positionner l'avatar par rapport au prim.

Dans le cas du paillasson, le script gérant le touch détermine si c'est lui où elle, et lance le script pour lui, ou elle, qui va animer l'avatar, mais y aura pas de positionnement précis, puisqu'on ne peut pas animer un avatar sans utiliser de prim attachée, ou de véhicule (prim sur laquelle on est assis).
donc si je te suis bien meme si mon script actuel me permet de positionner un avatar il ne permettra pas de mettre en route l'animation? (ou j'ai rater un episode??)
parcque actuellement avec le script modifier j'arrive a bien avoir la pose et a placer l'avatar au bon endroit et avec le bon angle, donc si l'animation ce fait (je saurais ça ce soir normalement) j'aurais déjà réussi a virer une boule. La question restante étant ensuite de savoir comme faire pour que ce même paillasson gère le script & l'animation kiss pour le second avatar...


Et je reviens sur ma question du lit, le lit étant composé de plusieurs prims et si effectivement pour faire deux poses il faut impérativement deux prims différent il serait donc possible de mettre les deux scripts de position allongé dans des prims du lit et ainsi virer les ball? (la j'ai bon au moins ?)
si ton script permet de gérer un avatar, le fait d'utiliser le sit t'empêche d'en gérer un second avec le même prim.

Mais oui, les pose balls peuvent être remplacées par des prims de ton lit. à condition que tu puisse facilement les sélectionner pour t'y asseoir, genre, les oreillers
Merci bien ça va me permettre de grappiller quelques prims, et pas merci aux gens qui font des poseball ou on peut récupérer le script et pas l'animation !!!!
Répondre

Connectés sur ce fil

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