Apparemment, tu veux autoriser l'accès au dispositif au propriétaire (qui doit toucher l'objet), et à tout autre avatar, qui doit au préalable saisir un mot de passe.
touch_end(integer total_number) {
if(llDetectedKey(0))
state mess;
Lorsque tu utilises
, le test est VRAI dès que "condition" est différent de zéro.
Or, tu utilises llDetectedKey( 0) comme condition, c'est à dire la clé de l'avatar qui a touché, qui n'est jamais égale à 0.
En d'autres termes, tu ne vérifies rien, n'importe quel avatar qui touche l'objet peut envoyer un message. Si c'est le but, autant enlever le test. Dans le cas contraire, garde le test du script de Best :
if(llDetectedKey(0) == llGetOwner())
Ce qui se traduit en bon Français par :
"si la clé de celui qui a touché l'objet est la même que la clé du propriétaire"
Il peut-être intéressant de mémoriser la clé de chaque personne qui s'identifie par un mot de passe, pour lui éviter de retaper le mot de passe à chaque message.
Tu déclares une list "autorises", puis :
listen(integer channel, string name, key id, string text)
{
if (text=="a") // texte a changer pour le mot de passe de la commande
{
if (llListFindList(autorises,[id]) != -1) autorises += [id];
state mess;
}
}
la clé
id est la valeur transmis par : listen(integer channel, string name, key
id, string text)
if (llListFindList(autorises,[id]) != -1) autorises += [id];
"si la clé de l'avatar qui a parlé (et prononcé le mot de passe) n'est pas dans la liste
autorisés, ajouter cette clé à la liste"
Pour que, par la suite, cet avatar puisse utiliser le téléphone par un simple click, il faut modifer le test dans le touch_end :
touch_end(integer total_number) {
if((llDetectedKey(0)==llGetOwner()) || (llListFindList(autorises,[llDetectedKey(0)]) != -1))
state mess;
Autre solution : au démarrage du script, ajouter la clé du propriétaire à la liste des autorisés :
default
{
state_entry()
{
autorises = [llGetOwner()];
state attente;
}
}
state attente
{
(...)
listen(integer channel, string name, key id, string text)
{
if (text=="a") // texte a changer pour le mot de passe de la commande
{
orateur = id;
if (llListFindList(autorises,[id]) != -1) autorises += [id];
state mess;
}
}
(...)
Dans la deuxième partie de ton script :
touch_end(integer total_number) {
if(llDetectedKey(0)) {
llSay(0, "Requête annulée..." );
state default;
}
Comme dit plus haut, avec if(llDetectedKey( 0)) tu ne vérifies rien.
Si tu utilises
if (llDetectedKey(0) == llGetOwner())
, c'est uniquement le propriétaire de l'objet qui peut annuler la requête. Un autre utilisateur, qui se serait identifié par mot de passe, ne le pourrait pas.
Pour que l'annulation puisse être faite par celui qui a initié la requête, il faut mémoriser sa clé par une variable
orateur dans le
listen et le
touch_end de
state default.
Et tant qu'à faire, tu peux alors en profiter pour limiter l'écoute à celui qui a décroché le téléphone, de manière à éviter que quelqu'un d'autre qui se trouve à proximité n'envoie "prout bidule" à ton groupe, lorsque tu viens de toucher l'objet.
llListen(0, "", orateur, "");
Ton test
n'a aucun effet. Si le message est vide, c'est qu'il n'y a pas de message, et l'événement
listen n'est pas déclenché.
Autant supprimer le test.
Une dernière astuce :
Le message reçu commence toujours par le nom de l'objet émetteur, suivi d'un double point.
Si ton objet s'appelle telephone V1.0, et que l'avatar Jean Leterrible dit "je mangerais bien un troupeau de moutons", le destinataire reçoit :
telephone V1.0 : Jean le Terrible : je mangerais bien un troupeau de moutons
L'astuce souvent utilisée consiste à renommer temporairement l'objet par la fonction llSetObjectName(name); , en lui donnant le nom de l'avatar qui parle.
Le destinataire verra alors s'afficher :
Jean le Terrible : je mangerais bien un troupeau de moutons
Ce qui a tout de même une autre gueule
Au final, ça donnerait :
list cles=[""]; // ecrire les Keys des différents destinataires entre "" espacer d'une virgule/ exemple : "","","","","","",""
string password;
list autorises;
key orateur;
default
{
state_entry()
{
autorises = [llGetOwner()];
state attente;
}
}
state attente
{
state_entry()
{
llSay( 0,"Touchez moi si vous désirez envoyer un message" );
llListen(87, "", NULL_KEY, ""); // channel a changer si vous souhaiter une commande d'activation par chat local
}
listen(integer channel, string name, key id, string text)
{
if (text=="a") // texte a changer pour le mot de passe de la commande
{
orateur = id;
if (llListFindList(autorises,[id]) != -1) autorises += [id];
state mess;
}
}
touch_end(integer total_number) {
if(llListFindList(autorises,[llDetectedKey(0)]) != -1)
{
orateur = llDetectedKey(0);
state mess;
}
}
}
state mess
{
state_entry() {
llSetTimerEvent(60.0);
llListen(0, "", orateur, "");
llSay( 0,"Vous décrocher le combiné telephonique" );
}
touch_end(integer total_number) {
if(llDetectedKey(0) == orateur) {
llSay(0, "Requête annulée..." );
state attente;
}
}
listen(integer channel, string name, key id, string message) {
llSetTimerEvent(.0);
llSay(0, "Envoi du message au groupe..." );
string oldname = llGetObjectName();
llSetObjectName(name);
integer n = llGetListLength(cles);
while(n--) {
key k = llList2Key(cles, n);
llInstantMessage(k,message);
}
llSetObjectName(oldname);
state attente;
}
timer() {
llSay(0, "Délai écoulé !" );
state attente;
}
state_exit() {
llSetTimerEvent(.0);
}
}