LSL: Envoi d'un IM vers l'owner en fonction d'un évènement

Répondre
Partager Rechercher
Bonjour,

Je suis tout nouveau ici, alors soyez indulgent Merci

Je cherche à faire un truc sûrement tout bête : envoyer un IM à l'owner quand, par exemple, quelqu'un touche le prim. Auriez-vous une idée pour faire ça simplement ?

Merci à toutes vos suggestions
Citation :
Publié par Nexus763
pourquoi pas ça directement ?

Code:
llOwnerSay("message");
C'est plus rapide que le llInstantMessage (veille de 0.2 secondes du script avec celle ci je crois).
En fait avec llOwnerSay l'owner doit être sur la region pour recevoir les messages donc sa dépend si la fonction est lancée sur un event on rez , ou si c'est un objet porté sa peut être utiliser mais si c'est sensé envoyer un message à n'importe quel moment il faut utiliser llInstantMessage
Bonjour,

Je vous donne le code de mon petit script où j'avais besoin justement de llInstantMessage. Il permet de "guetter" si un AV est connecté ou pas et ainsi de ne pas le rater. Si vous avez des commentaires pour optimiser ce code, je suis preneur !


Code:
key keyAvatar = "xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxx"; // à remplacer par la key de l'AV
string nomAvatar;
integer switch; // 0: offline ; 1: online

default {
    state_entry() {
        llRequestAgentData(keyAvatar, DATA_NAME); 
        }

    dataserver(key queryid, string data) {
        nomAvatar = data;
        state run; } }


state run {
    state_entry() {
        llSetTimerEvent(60); // scan toutes les 60 secondes
        }

    timer() {
        llRequestAgentData(keyAvatar, DATA_ONLINE); 
        }

    dataserver(key queryid, string data) {
        integer connection = (integer)data;

        if ((switch == 0) && (connection)) // passage de offline à online
        {
            switch = 1;
            llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <0.0,0.5,0.0>, 0.75]);
            llSetText(nomAvatar + "\nconnectée", <0.0, 1.0, 0.0>, 1.0); 
            //llOwnerSay(nomAvatar + " est connectée");
            llInstantMessage(llGetOwner(),nomAvatar + " est connectée");
            llSound("alarme", 1.0, 0, 0); // mettre un son "alarme" ou commenter cette ligne
            }
        if ((switch == 1) && (!connection)) // passage de online à offline
        {
            switch = 0;
            llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <0.5,0.0,0.0>, 0.75]);
            llSetText(nomAvatar + "\ndéconnectée", <1.0, 0.0, 0.0>, 1.0); 
            //llOwnerSay(nomAvatar + " est déconnectée");
            llInstantMessage(llGetOwner(),nomAvatar + " est déconnectée");
            } 

        } 
}
alors, deux remarques :
_a quoi sert l'initialisation dans l'état défaut ? Tu ne peux pas faire directement le SetTimerEvent ?

_la variable switch est vraiment nécessaire ? Je ne pense pas, essaie sans.
la variable switch est nécessaire oui. cela permet de ne faire qu'une seule fois les opérations. sinon, elles se feraient tout le temps…

quand aux déclarations au début, je ne comprend pas trop ce que tu veux dire
Bonjour

il est tres bien, la partie d'initialisation permet a la requete de prendre le temps nécessaire pour obtenir l'information et de passer au mode run une fois l'élément obtenu.
sinon le timer risque de ce déclencher avant d'avoir l'information.

comme toujours en developpement, toujours etre sur d'avoir les infos, cela evite les bug inconnu
__________________
Paris 1900
http://www.paris1900.net
J'avoue ne pas avoir été aussi méthodique
J'étais aussi ennuyé par les dataserver (j'aime pas ces bêtes là) car il faut déjà récupérer le nom en clair puis son statut. Pour le nom, je pense qu'on pourrait soit le renseigner à la main (après tout…) ou utiliser llKey2Name (pourquoi je n'y ai pas pensé avant ?) ce qui permettrai peut-être de ce débarrasser du state run et tout mettre dans le default… je vais essayer ça.
Bon, j'ai essayé… et ça ne fonctionne pas très bien. Le status est bien pris, par contre pour reprendre le nom sans le mettre en dur dans le code… je n'y suis pas arrivé. Comme si la variable keyAvatar était vidée de son contenu

Je vous met le code par curiosité, mais ça n'a pas l'air de fonctionner (seulement pour la phase "devient offline") :

Code:
key owner = NULL_KEY;
key keyAvatar = "xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxx"; // à remplacer par la key de l'AV
string nomAvatar;
integer switch; // 0: offline ; 1: online

default {
    state_entry() {
        nomAvatar = llKey2Name(keyAvatar);
        llSetTimerEvent(60); // scan toutes les 60 secondes
        }

    timer() {
        llRequestAgentData(keyAvatar, DATA_ONLINE); 
        }

    dataserver(key queryid, string data) {
        integer connection = (integer)data;

        if ((switch == 0) && (connection)) // passage de offline à online
        {
            switch = 1;
            nomAvatar = llKey2Name(keyAvatar);
            llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <0.0,0.5,0.0>, 0.75]);
            llSetText(nomAvatar + "\nconnectée", <0.0, 1.0, 0.0>, 1.0); 
            //llOwnerSay(nomAvatar + " est connectée");
            llInstantMessage(llGetOwner(),nomAvatar + " est connectée");
            //llSound("alarme", 1.0, 0, 0); // mettre un son "alarme" ou commenter cette ligne
            }
        if ((switch == 1) && (!connection)) // passage de online à offline
        {
            switch = 0;
            nomAvatar = llKey2Name(keyAvatar);
            llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <0.5,0.0,0.0>, 0.75]);
            llSetText(nomAvatar + "\ndéconnectée", <1.0, 0.0, 0.0>, 1.0); 
            //llOwnerSay(nomAvatar + " est déconnectée");
            llInstantMessage(llGetOwner(),nomAvatar + " est déconnectée");
            } 

        } 
}
J'ai deja rencontré cela, le script qui garde en mémoire un ancien key alors que je lui demande la renouveler : passe la key dans la description de ton objet pour voir.

Code:
state_entry()
{
keyAvatar = (key)llGetObjectDesc();
llOwnerSay(llGetObjectDesc()+" est "+llKey2Name(keyAvatar));  //test
//...suite
Je conseillerai de rajouter un state_exit dans l'etat run:

Code:
state_exit()
{
   llSetTimerEvent(0);
}
Ca permet d'eviter qques soucis si jamais le nouvel etat dans lequel on va a un evenement de type timer. En effet, et je pense qu'il s'agit d'un bug LSL, le changement d'etat supprime les listen par ex, mais garde les timers...
Répondre

Connectés sur ce fil

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