//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 } } }
|