Voici le script qui va vous permettre de créer un objet (genre instrument de musique), d'y ranger plusieurs sons et une animation et de permettre à un avatar de démarrer l'animation, de choisir un son et d'en changer de temps en temps.
Construisez votre objet en prenant bien soin à ce que le racine soit toujours orientée <0.0, 0.0, 0.0>. Dans la racine de l'objet placez tous le sons sélectionnés, l'animation choisie et le script ci-dessous.
Si soit le script, soit un des sons, soit l'animation a une permission refusée (modifier, copier ou transmettre) cette non-permission sera transmise à l'ensemble de l'objet et prendra effet quand vous donnerez l'objet à une autre personne.
Si l'avatar n'est pas à la bonne place lorsque l'animation est "jouée", modifiez sa position grâce à la donnée vPosition en tête de script. Si ce placement est compliqué (problème de position plus problème d'orientation) utilisez un script du genre Magic sit pour affiner la position de l'avatar.

 

//Ce script a été trouvé dans la librairie scripts de http://www.avatars-3d.com
// Script à placer dans un objet pour jouer plusieurs sons
// Dans le même contenu que le script, ajoutez les sons à jouer (au moins un son :) ) et une animation

// Position assise par rapport à l'objet ; permet de corriger la position en fonction de l'animation
vector vPosition = <0.0, 0.30, .92>;

// Texte flottant au dessus de l'objet.
// "" pour ne pas avoir de texte
// Ajouter un ou plusieurs \n pour
// remonter le texte par rapport à l'objet
// exemple : string sHoverText = "Sit Here\n to play\n";
string sHoverText = "Jouez de l'instrument";
// Couleur du texte flottant 'r,g,b' exemple "1.0, 1.0, 1.0" (blanc)
vector vHoverColor = <1.0, 1.0, 1.0>;

// Text qui apparaît dans le menu du click droit
// "" pour garder le texte officiel de SL
string sSitText="Jouez!";

// Ce message apparaîtra dans le menu pour changer de son
string sMessage = "Choisir un son pour Changer ou Annuler pour garder le son qui se joue actuellement.";

// Ce message apparaîtra si le menu est annulé
string sAnnuleMessage = "Votre demande a été annulée!";

// Ce message sera dans le chat local pour vous dire de vous dépêcher de répondre où le menu sera annulé
string sToucheMessage = "Vous avez 30 secondes pour choisir un son";

// * * * * * * * Fin de la partie modifiable * * * * * * * *

string sAnimation; // Contiendra le nom de l'animation qui se trouve dans l'inventaire de l'objet
integer iNbSons; // Contiendra le nombre de sons contenus dans l'inventaire de l'objet
integer i; // Simple itérateur (dans une liste par exemple)
integer bAssis = FALSE; // FALSE personne ne joue ; TRUE qq1 joue
integer bTouche = FALSE; // Evènement TOUCH en cours de traitement
integer iChannel; // Contiendra un numéro interne pour dialoguer
integer iHandle; // Contiendra le numéro du listen en cours
list lNomdeSons; // Contiendra la liste des noms de sons contenus dans l'inventaire
list lNameBut = []; // Contiendra la liste des boutons de la boîte de dialogue
key kAvatar; // Contiendra la clé de l'avatar qui joue

// ***************** Fonctions utilisateurs ***************
// Fonction qui remet les boutons du dialogue dans le bon ordre, d'après la Script Library
list order_buttons(list buttons)
{
return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4)
+ llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);
}

integer iPtrList = 0; // Attention /Remettre à 0 avant le 1er appel (voir l'event Touch)
key kAgentTouch; //Attention Y copier la clé du 1er appelant (voir l'event Touch)

// Fonction pour découper la liste des sons en segment de 11 éléments et ajouter le bouton "suivant", d'après la Script Library
list cut_list(list lBut)
{
list lSubList;
integer iLsub = 11;
if(iPtrList + 11 < llGetListLength(lBut))
{
lSubList = llList2List(lBut, iPtrList, iPtrList + 9);
lSubList = (lSubList=[]) + lSubList + ["Annuler"];
lSubList = (lSubList=[]) + lSubList + ["Suiv/Next"];
iPtrList += 10;
}
else
{
lSubList = llList2List(lBut, iPtrList, llGetListLength(lBut) - 1);
lSubList = (lSubList=[]) + lSubList + ["Annuler"];
}
return lSubList;
}

default
{
state_entry()
{
llSetText("Attendez!\nInitialisation en cours!\n \n \n \n ", <1.0, 0.0, 0.0>, 1.0); // Mise en place du texte flottant
llSetSitText(sSitText); //Mise en place du texte pour le menu du click droit
llSitTarget(vPosition, ZERO_ROTATION); //Mise en place de la position de l'avatar qui "joue" l'anim
iNbSons = llGetInventoryNumber(INVENTORY_SOUND); // Cette fonction permet de compter le nombre de sons placés dans le contenu de l'objet
for(i = 0; i < iNbSons; i++) // Pour chaque son
{
lNomdeSons = (lNomdeSons=[]) + lNomdeSons + [llGetInventoryName(INVENTORY_SOUND, i)]; // On place le nom du son dans la liste
llPreloadSound(llGetInventoryName(INVENTORY_SOUND, i)); // Et on transfert le fichier son de la base d'asset vers le cache de l'ordinateur
}
llSay(0, "/me est prêt!"); //On signale que l'initialisation est terminée
llSetText(sHoverText, vHoverColor, 1.0); // Mise en place du texte flottant
}

touch_start(integer total_number) // un click gauche sur l'objet
{
if(!bAssis)return; //si personne ne joue on laisse tomber
if(bTouche)return; //il y a déjà un TOUCH en cours de traitement
kAgentTouch = llDetectedKey(0);
if(kAgentTouch != kAvatar)return; //si celui qui a touché n'est pas le joueur
bTouche = TRUE; //Verrouillage pour éviter le TOUCH multiple
llSay(0, sToucheMessage); //On prévient que le dialogue affiché n'est valable que pour un temps limité
iChannel = (25000 + (integer)llFrand(99000.0 - 25000.0 + 1.0)) * -1; //calcul d'un canal aléatoire pour écouter la réponse du dialogue
//llOwnerSay((string)iChannel);
iHandle = llListen(iChannel, "", NULL_KEY, ""); // on se met en écoute de la réponse du dialogue
iPtrList = 0; // Remise à zéro du pointeur de liste pour le dialogue
llDialog(kAgentTouch, sMessage, order_buttons(cut_list(lNomdeSons)), iChannel); //Cette fonction affiche un dialogue sur l'écran de celui qui a touché l'objet
llSetTimerEvent(30.0); //On met en route un minuteur de 30 secondes (voir event timer)
}

on_rez(integer iPNumb)
{
llResetScript(); //Si l'objet vient juste de sortir de l'inventaire de son propriétaire, on réinitialise le script
}

listen(integer chan, string name, key id, string option) //Le dialogue a répondu
{
llSetTimerEvent(0.0); //on désamorce le minuteur
//llOwnerSay(name + " (" + (string)id + ") picked option " + option);
if(option == "Suiv/Next") //On a cliqué sur la touche "Suiv/Next"
{
llDialog(kAgentTouch, sMessage, order_buttons(cut_list(lNomdeSons)), iChannel); // Les llDialog suivants sont comme le 1er
return; // Abandon du traitement du listen event
}

//Si on en arrive là, c'est qu'il y a une demande suite au dialogue
llListenRemove(iHandle); //Annulation du listen
if(option == "Annuler") //La demande est d'annuler la demande :))
{
bTouche = FALSE; //Annulation de TOUCH
return; // Abandon du traitement du listen event
}
llStopSound(); //on arrête l'ancien son
llLoopSound(option, 1.0); //on joue le nouveau son
bTouche = FALSE; //Annulation de TOUCH
}

timer() //L'avatar n'a pas répondu au bout de 30 secondes, on annule sa demande
{
llSay(0, sAnnuleMessage); //On affiche le message d'annulation dans le chat local
bTouche = FALSE; //Annulation de TOUCH
llListenRemove(iHandle); //Annulation du listen
}

changed(integer change) //Event déclenché quant on a cliqué sur "Jouez" du menu suite à un click droit sur l'objet
{
if (change & CHANGED_LINK) // il s'agit bien de la demande de jouer ou d'arrêter
{
if (llAvatarOnSitTarget() != NULL_KEY) //Si il y a une vraie clé d'avatar, c'est une demande de jouer
{
kAvatar = llAvatarOnSitTarget(); // On mémorise la clé de l'avatar qui a fait la demande
llRequestPermissions(kAvatar, PERMISSION_TRIGGER_ANIMATION); // On vérifie que l'avatar autorise les animations venant de l'objet
}
else // il n'y a pas de clé, c'est une demande d'arrêter
{
llStopAnimation(sAnimation); // on arrête l'animation
sAnimation="";
llStopSound(); // On arrête le son en cours
bAssis = FALSE; // On annule l'indication qu'il y a qq1 qui joue
llSleep(0.5); // On fait une petite pause
llResetScript(); // Et on réinitialise le tout
}
}
}

run_time_permissions(integer perm) // Une réponse à la demande d'autorisation d'animer l'avatar
{
if (perm & PERMISSION_TRIGGER_ANIMATION) // Si la réponse est positive
{
llStopAnimation("sit"); // On arrête l'animation standard de l'avatar assis
sAnimation=llGetInventoryName(INVENTORY_ANIMATION,0); //On va chercher le nom de l'animation pour faire en sorte que l'avatar aie l'air de jouer de cet instrument
llStartAnimation(sAnimation); // On démarre l'animation
bAssis = TRUE; // On signale qu'il y a un avatar qui joue
llSetText("", ZERO_VECTOR, 0.0); // On enlève le texte flottant
llLoopSound(llList2String(lNomdeSons, 0), 1.0); // On lance le premier son de la liste
}
}
}

 

 


Voilà encore un script de valeur ; vous pouvez donner le lien de cette page à vos amis ; voupovez faire des copies de ce script pour vos amis ; évitez de le vendre tel quel! Mais si vous l'utilisez dans un objet de votre fabrication, alors vous pouvez le vendre mais par simple politesse n'enlevez pas la première ligne du script. Merc