Script pour rez un objet

Répondre
Partager Rechercher
Bonjour à tous.

Je vous expose mon problème;
J'ai crée un yacht et j'aimerai pouvoir le vendre mais là où il y a un prob c que le yacht est en 5 parties et j'aimerai que la personne qui achète le bateau puisse faire rezzer tous le bateau en un simple clic et pouvoir le déplacer en entier.

Je sais que ce genre de script est utilisé notamment pour les maisons et des amis me disent qu'il faudrait faire un script sur mesure... A votre avis est ce vrai ou est ce que je peux acheter ce type de script quelque part?
ha vi... je me disais aussi.

bon, pas compliqué à faire, on va faire une jolie boite en forme de bateau de papier tient, et comme il va falloir déplacer la boîte rezeuse...

Par contre, il va falloir trouver une grande SandBox pour vérifier que ça marche, et avoir les positions relatives des prims 0.
Il est terrible master71, il est à Sl ce que je suis au Kinder's.

"Tex jette l'oeuf en l'air, l'attrape dans la bouche et avale le chocolat tout en recrachant l'emballage et le bidule tout monté"
mouais master il assure, ça fait plaisir de savoir qu'on a "presque" toujours une réponse ici et en partie grâce à lui, c'est pas pour rien qu'il s'appelle master



moi je voulais te demander une fois que tu as scripté ta box pour mettre en place plusieurs éléments linked, t'es pas un peu emmerdé pour mettre à jour ton objet ? ce que je veux dire par là c'est que si sur ton yacht tu veux rajouter des prims après tu dois tout réassembler le tout dans ta box de placement

en gros faire une box de placement quand l'objet est définitif

tu vois ce que je veux dire ?
bon, j'ai donc un script utilisable, qui gère autant de morceaux que vous voulez, pour des bateaux, des maisons, et tout ce que vous pouvez imaginer comme usage.

Le seul problème de ce code est qu'il faut un objet rezzeur correct, et que si un morceau doit être rezzé en dessous du sol, ça s'arrête.
Le script utilisant les propriétés de cet objet en orientation pour savoir dans quelle direction rezzer les morceaux.
Ce qui est pratique en soi, puisque, si vous créer un bateau orienté du sud au nord, l'objet rezzeur, en l'orientant, vous permet de l'orienter d'est en ouest, voir... de haut en bas, vous voyez le principe.

Vous en faites ce que vous voulez, vous pouvez me contacter sous Humpf DeCuir pour avoir un bateau en papier avec scripts, notice, et compléments.

alors le script:
Code:
key iQuer = NULL_KEY;
integer numM = 0;
integer iLine = 0;
list posM = [];
list rotM = [];
list nomM = [];
vector posR = ZERO_VECTOR;
vector res = ZERO_VECTOR;
vector dep = ZERO_VECTOR;
vector tmp = ZERO_VECTOR;
rotation rotR = ZERO_ROTATION;
rotation rot = ZERO_ROTATION;
rotation rx = ZERO_ROTATION;
rotation ry = ZERO_ROTATION;
rotation rz = ZERO_ROTATION;
string nom = "";    

default {
    state_entry () {
        llOwnerSay("On duty, ready to rez."); }

    on_rez (integer num) {
        llResetScript(); }

    dataserver(key query_id, string data) {
        if (query_id == iQuer) {
            if (data == EOF) state rezzing;
            else {
                if (data == "") iQuer = llGetNotecardLine("config", ++iLine);
                else {
                    string sTmp = llGetSubString(data, 0, 1);
                     if (sTmp == "//") iQuer = llGetNotecardLine("config", ++iLine);
                     else {
                        list lsTmp = llCSV2List(data);
                        if (llGetListLength(lsTmp) != 7) {
                            llOwnerSay("Line " + (string)iLine + " of file config is badly formed.");
                            iQuer = llGetNotecardLine("config", ++iLine); }
                        else {
                            nomM = (nomM=[]) + nomM + [llList2String(lsTmp, 0)];
                            tmp = <llList2Float(lsTmp, 1), llList2Float(lsTmp, 2), llList2Float(lsTmp, 3)>;
                            posM = (posM=[]) + posM + [tmp];
                            tmp = <llList2Float(lsTmp, 4), llList2Float(lsTmp, 5), llList2Float(lsTmp, 6)>;
                            rotM = (rotM=[]) + rotM + [tmp];
                            iQuer = llGetNotecardLine("config", ++iLine); } } } } } }

    touch (integer num) {
        key cliqueur = llDetectedKey(0);
        iLine = 0;
        if (cliqueur != llGetOwner()) llInstantMessage(cliqueur,"you're not allowed to use this object.");
        else {
            llOwnerSay ("Initialisation in progress.");
            iQuer = llGetNotecardLine("config", iLine); } } }

state rezzing {
    state_entry() {
        posR = llGetPos();
        numM = llGetListLength(nomM);
        rotR = llGetRot();
        res = llList2Vector(posM, 0);
        llOwnerSay("Initialisation done, Rezzing in progress.");
        integer i = 0;
        for (i = 0; i < numM; i++) {
            tmp = llList2Vector(rotM, i);
            rx = llAxisAngle2Rot( <1,0,0>, tmp.x * DEG_TO_RAD);
            ry = llAxisAngle2Rot( <0,1,0>, tmp.y * DEG_TO_RAD);
            rz = llAxisAngle2Rot( <0,0,1>, tmp.z * DEG_TO_RAD);
            rot = rx * ry * rz;
            rot = rot * rotR;
            tmp = llList2Vector(posM,i) - res;
            dep = <0.0, 0.0, 1.0> + posR + tmp * rotR;
            nom = llList2String(nomM, i);
            llOwnerSay("Rezzing " + nom + " at: " + (string)dep);
            while ( llVecDist(llGetPos(), dep) > 0.001 ) llSetPos(dep);
            llRezAtRoot(nom, dep + <0.0, 0.0, -1.0>, ZERO_VECTOR, rot, 1); }
        llResetScript(); } }
Pour qu'il fonctionne vous avez besoin d'une notecard appelé config dans l'objet rezzeur, qui doit ressembler à ça:
Code:
// pieces of the final object:
Morceau,0.0,0.0,0.0,0.0,0.0,0.0
Morceau,0.0,5.0,0.0,0.0,0.0,0.0
Morceau1,5.0,5.0,0.0,0.0,0.0,0.0
Morceau,5.0,0.0,0.0,0.0,0.0,0.0
Morceau5,0.0,0.0,5.0,0.0,0.0,0.0
Alors, les lignes vides ou commençant par // sont ignorées.
les lignes définissant les morceaux sont de la forme:
nom,x1,y1,z1,x2,y2,z2
où nom est le nom du morceau dans l'inventaire.
le premier x1,y1,z1 est la position x, y, z donnée par l'onglet objet des propriétés de votre morceau.
le second x2,y2,z2 est, dans ce même onglet, l'orientation x, y, z, sous la partie rotation.
Vous n'avez rien à calculer, vous mettez exactement ce que vous lisez dans l'onglet propriété, le script est fait en conséquence.

Amusez-vous bien.

[Edit:] clarté de la notecard.
PS: Si vous voulez que l'objet rezzeur se détruise après usage, à la place de llResetScript(); à la fin du script, vous mettez llDie();
PS2: l'objet rezzeur peut rezzer X fois le même objet sans pb, saut si le morceau est no-copy. ça peut être utilisé pour créer une barrière à partir des poteaux et des barreaux, par exemple.

[re Edit:]
gros bug, j'ai remplacé llRezObject() par llRezAtRoot().
pour la plupart des objets dont le prim 0 est au centre géométrique, le script d'avant fonctionnait, pour les autres décalages garantis.
Citation :
Publié par ubersoldat
moi je voulais te demander une fois que tu as scripté ta box pour mettre en place plusieurs éléments linked, t'es pas un peu emmerdé pour mettre à jour ton objet ? ce que je veux dire par là c'est que si sur ton yacht tu veux rajouter des prims après tu dois tout réassembler le tout dans ta box de placement

en gros faire une box de placement quand l'objet est définitif
Dans le cadre de mon script, si le morceau que tu modifie ne change pas de prim 0, et que la position de celui-ci ne change pas, tu as juste à remplacer le morceau dans l'objet rezzeur sans rien changer.

et si le positionnement du prim 0 et/ou son orientation change, tu as juste à changer la ligne qui lui correspond dans le fichier config.
Lorsque l'on sélectionne plusieurs objets et qu'on les prend en 1 seul objet dans l'inventaire, on peut ensuite placer cet objet unique dans l'inventaire du rezzer, qui prend l'objet unique pour le rezzer en les différents objets d'origine, à leur place.
Donc je ne vois pas l'utilité d'un tel script.
Il en va de même lorsque que l'on rez l'objet unique depuis l'inventaire de l'avatar.
Donc je ne vos pas non plus l'utilité du rezzer.
Tout cela à moins que quelque chose ne m'ait échappé.

Citation :
Publié par master71
et si le positionnement du prim 0 et/ou son orientation change, tu as juste à changer la ligne qui lui correspond dans le fichier config.
Tu écris souvent prim 0, parles tu d'un objet (plus exactement d'un linkset) ou d'une pim seule ?
__________________
UnConWTech - Flo(144,84,224) - Livres SL
Services : traduction et assurance qualité
Citation :
Publié par Simil Miles
Donc je ne vois pas l'utilité d'un tel script.
tes objets multiples en 1, tu ne les orientes pas comme tu veux, ils restent limités par les contraintes du link, c'est à dire moins de 30m dans la plus grande dimension et moins de 256 prims.
Donc là, le bâtiment fait 45*10 tu ne le manipules pas comme ça.
et pour avoir régulièrement utilisé ce truc de prendre un ensemble dans ton inventaire, le placement au sol n'est pas garanti, et tu peux perdre facilement les positions relatives.

Et puis ce scripts peut être utilisé pour rezzer un, ou plusieurs, prim plusieurs fois, et faire des trucs assez sympatoches si on gère bien le fichier de config.
Par exemple, hier j l'ai utilisé pour monter un ensemble de boucliers en zone PVP, vu qu'il y avait des furieux, et que des objets balistiques arrivaient à passer avec un bouclier simple...

Citation :
Tu écris souvent prim 0, parles tu d'un objet (plus exactement d'un linkset) ou d'une pim seule ?
Quand tu as un objet en un seul prim, la prim 0, ou l'objet c'est pareil.
Quand tu as un objet composé de plusieurs prims linkés, tu as un prim spécial dans le link, en jaune, alors que tous les autres sont bleus.
c'est le dernier que tu as sélectionné, et qui devient le prim 0 (0 parce que c'est son numéro de linkset), ou prim parent.
c'est lui qui recevra par défaut l'inventaire de l'objet, c'est lui qui donnera le nom de l'objet, sa description, son UUID (key).

c'est LE prim qu'il faut manipuler pour déplacer / orienter l'objet.
c'est lui qui va donner l'origine et les axes servant de références pour déplacer et orienter les autres prims.

Bref savoir choisir son prim 0, c'est le B-A-BA du scripting d'objet.
Citation :
Publié par master71
Donc là, le bâtiment fait 45*10 tu ne le manipules pas comme ça.
Ah bon ? ça m'étonne, si t'as quelque chose de similaire à m'envoyer je veux bien vérifier cela.

Citation :
Publié par master71
c'est le dernier que tu as sélectionné, et qui devient le prim 0 (0 parce que c'est son numéro de linkset), ou prim parent.
et qui devient le prim 1
Une prim non liée a un numéro de lien équivalant à 0, une prim parent/root a un numéro de lien équivalant à 1, il n'y a pas de lien numéro 0 dans un linkset.
Je pense que tu ne fais pas cette erreur dans tes scriptes, mais j'ai bien fait de demander

llGetLinkNumber()
et qui devient aussi le prim 1 dans le cadre de prim unique, si on s'assoit dessus.
Je sais.

ça reste le prim 0, comme Origine, puisque c'est aussi le point O du link, le 0 des distances internes au link, le 0 de llSetPos() et llSetLocalRot() pour les prims internes, c'est bien plus mnémotechnique que parent ou 1.

Bref, de toute façon, je n'utilise jamais le numéro de link, puisqu'il varie en fonction des link/delink/relink, et que mes scripts internes aux objets linkés ne sont jamais dépendants du numéro de link.
Je crois que ça apporte plus de confusion que d'aide.
Si tu dis prim 0 on va inévitablement penser à prim dont le numéro de lien est 0, ce qui est faux dans un linkset.
Je fais la remarque pour ceux qui te lise.
C'est une idée à toi ou ça vient de quelque part ?
Pas vraiment de moi, mais c'est un usage généralisé en mathématique et en physique, l'origine, c'est 0, pas 1.
et les distances partent de 0, pas de 1 encore une fois.

Alors on peut ne pas utiliser les habitudes mathématiques et physique, mais c'est source de confusion.

Le prim en jaune, dit parent dans les textes, dont le numéro change suivant qu'il est seul ou non, assis ou non, dont les axes, le 0, sont l'origine des distances relatives à l'intérieur, et bah conventionnellement, c'est l'origine, le O, le 0.
Donc si tu veux utiliser le vocables LSL tu l'appelles parent.
Mais l'appeler Prim 0 à le mérite de bien signifier son status de prim origine, son status de point 0 des dimensions internes à toute personne ayant fait des mathématiques.

bref.
Tu veux pas de ce script, tu ne lui trouves aucun intérêt, inutile d"épiloguer.
Citation :
Publié par master71
Mais l'appeler Prim 0 à le mérite de bien signifier son status de prim origine, son status de point 0 des dimensions internes à toute personne ayant fait des mathématiques.
Si tu l'appelais prim origine (oui c'est plus long) il n'y aurait plus de confusion, et ça se rapproche plus de root que de parent.
Enfin bon, on fait comme on veut.

Citation :
Publié par master71
bref.
Tu veux pas de ce script, tu ne lui trouves aucun intérêt, inutile d"épiloguer.
Hm oui, tant que je n'aurais pas pu vérifier son utilité, encore une fois si t'as un équivalent du yatch...
J'aurais dit la même chose si tu n'avais pas répondu, mais tu a confirmé ce qu'elle disait ce qui m'a étonné alors voilà...
Franchement un script bien fait pour rezzer un objet complexe c'est indispensable si tu compte le vendre. Sinon les rares qui risquent d'arriver à le monter comme ils veulent et dans le bon sens ont une grande chance d'être capables de refaire l'objet eux même

Merci Master !
A mon avis je dois etre plus truffe que les autres.Je m explique je rentre bien les coordonnees de ma prim 0 de chaque morceau et quand je rez le tout j'ai un morceau d un coté et le reste de l autre (il s agit d'un bureau et d une porte en verre scriptee)

voila ce que j ai marqué sur ma note config:

// pieces of the final object:
p1,86.587,156.567,299.750,0,0,0
p2,83.954,157.354,299.741,0,0,270

est ce que je fais une erreur quelque part?
Non, si on regarde tes coordonnées, il place le premier bout, puis à une distance de 3.5m environ (j'ai la flemme de faire le calcul exact du déplacement à la main) sur l'axe X il place le second.

si les 2 morceaux sont plus ou moins superposés, y a des chances que ce soit 86 et non 83 sur la seconde ligne
question complementaire ....
Bonjour a tous, et désolé de "réveiller" cette discution profondément engloutis.

Voila, j'utilise le script de master qui marche a merveille. Je voudrais juste savoir si une fois les différentes partis posées au sol..... il était possible de les réintégrer a l'objet rezzer ? Ais je été claire sur ce coup la ?

Et si ce n'est pas possible, comment s'y prendre alors ?

Dans l'attente de vous lire!!

Je vous remercies par avance !
Répondre

Connectés sur ce fil

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