Problème sur un script.

Répondre
Partager Rechercher
Bonjour

J'essaie de me faire un petit script de répondeur mais j'ai un petit problème avec la fonction llDetectedName(0).
Code:
 
default
{
 
	state_entry()
	{
		llSetText("Cliquez moi pour laisser un message", <0.8,0.0,0.0>, 1.0);
 
	}
	touch_start(integer num_detected) {
		llSay( 0, llDetectedName(0) + " : Merci de laisser votre message en une seule ligne.");	// M'affiche bien mon nom quand je click dessus
		llListen(0, "", llDetectedName(0), "");
	}
	listen( integer channel, string name, key id, string message )
	{
	 llInstantMessage(llGetOwner(),llDetectedName(0) + message); //La ca ne m'affiches plus mon nom mais une série de 0.
	 llResetScript();		 
	}
 
 
}
Alors pourquoi elle ne m'affiches plus le nom par la suite ?


( j'ai réglé le probleme en mettant detectedname dans une variable par la suite. mais pourquoi ca marche pas comme ça ! )

Merci!
parce que llDetectedName() n'est valable que dans l'événement touch, quand tu sors de cet événement, le tableau auquel accède lldetectedName() est supprimé.

donc effectivement, si tu veux garder le nom, tu dois le mettre dans une variable globale au script.
J'ai un autre petit soucis donc voila mon nouveau code

Code:
 
 
string detected_name;
default
{
 
	state_entry()
	{
		llSetText("Please click me for leave a message! / Merci de me cliquer pour laisser un message!", <0.8,0.0,0.0>, 1.0);
	}
	touch_start(integer num_detected) {
 
		detected_name = llDetectedName(0);
		llSay( 0, detected_name + " : Please leave your message in one line / Merci de laisser votre message en une seule ligne.");	
 
		llListen(0, "", detected_name, "");
 
	}
	listen( integer channel, string name, key id, string message )
	{
	 llInstantMessage(llGetOwner(),detected_name + " : " + message);
	 llSay( 0, detected_name + " : / Votre message est bien enregistre sur le repondeur!");
	 llResetScript();	 
	}
 
}
Alors maintenant ca marche bien sauf que si quelqu'un touche mon objet et qu'une autre personne parle avant celui qui a touché j'ai le message de la personne qui a parlé en premier et non celui de la personne qui a touché l'objet.



Une idée ? merci
normal, remplace llDetectedName() par llDetectedKey()...
et string detected_name par key detecKey...

Le troisième argument de llListen n'est pas un nom, mais une Key.
Tu n'as pas d'erreur de compilation parce qu'une key est une string particulière.

info: >> ici <<

Le bon script serait le suivant:
Citation :
string nomDetect
key keyLaisseur

default {
state_entry() {
llSetText("Please click me to leave a message! / Merci de me cliquer pour laisser un message!", <0.8,0.0,0.0>, 1.0); }

touch_start(integer num_detected) {
nomDetect = llDetectedName(0);
keyLaisseur = llDetectedKey(0);
llSay( 0, nomDetect + " : Please leave your message in one line / Merci de laisser votre message en une seule ligne.");
llListen(0, "", keyLaisseur, ""); }

listen( integer channel, string name, key id, string message ) {
llInstantMessage(llGetOwner(), nomDetect + " : " + message);
llSay( 0, nomDetect + " : Your message has been recorded / Votre message est bien enregistre sur le repondeur!");
llResetScript(); } }
Merci pour ta réponse, alors voila je veux améliorer un peu le script en ayant un historique de mes messages.

Code:
 
 
string detected_name;
list historique;
default
{
 
	state_entry()
	{
		llSetText("Please click me for leave a message! \n Merci de me cliquer pour laisser un message!", <0.8,0.0,0.0>, 1.0);
	}
	touch_start(integer num_detected) {
 
		detected_name = llDetectedName(0);
		llSay( 0, detected_name + " : Please leave your message in one line / Merci de laisser votre message en une seule ligne.");	
 
		llListen(0, "", llDetectedKey(0), "");
 
	}
	listen( integer channel, string name, key id, string message )
	{
 
	 if( id == llGetOwner() )
		{
			if( message == "repondeur help" ){ 
				llSay(0,"Bienvenue sur le repondeur.");
				llSay(0,"repondeur help - Pour voir les intructions.");
				llSay(0,"repondeur historique - Pour consulter les messages.");
				llSay(0,"repondeur delete - Pour supprimer les messages.");
				return;
			}
			else if( message == "repondeur historique" )
			{
				llSay( 0, "Voici les messages :");
				integer len = llGetListLength( historique );
				integer i;
				for( i = 0; i < len; i++ )
				{
					llSay( 0, llList2String(historique, i) );
				}
			}else if(message == "repondeur delete"){
				historique = llDeleteSubList(historique, 0, llGetListLength(historique));
				llSay( 0, "Le repondeur est efface!"); 
				return;		
			}
		 return;
		} 
 
 
	 llInstantMessage(llGetOwner(),detected_name + " : " + message);
	 historique += detected_name + " : " + message;
	 llSay( 0, detected_name + " : / Votre message est bien enregistre sur le repondeur!"); 
	 return; 
	}
 
}
Quand mon script est reset il faut bien clicker sur l'objet pour que mes paroles soit pris en compte comme le "repondeur help", mais une fois que j'ai clické et annoncé une parole j'aimerais que l'objet ne tienne plus compte de mes paroles et attende que je reclick dessus. ( les returns ne me font pas sortir de l'état listen ? ) j'avais bien mi llresetscript mais du coup ca me remet ma variable historique vide.

Merci de l'aide!
bah c'est normal, un llListen() dure tant que tu ne l'arrêtes pas.

Sur ton premier script, tu réinitialisais dès qu'une phrase était tapée, donc pas de soucis, le llListen() était détruit à ce moment là.

Là tu ne peux pas réinitialiser le script, et donc à chaque touch, tu crées un nouveau llListen(), mais tous ceux que tu as fais avant restent

Donc c'est pas propre du tout comme programmation, à la fin de ton événement listen() tu dois retirer ton llListen(), pour cela tu dois stocker le handler retourné par llListen(), et utiliser llListenRemove().

Ou alors utiliser les états pour structurer ton programme, ça t'évite de devoir gérer les handlers des llListen(), puisque le changement d'état détruit les llListen() liés à cet état.
ça t'évite aussi un script qui sait plus où il en est si tu cliques quand il attend un message d'un des utilisateurs (dans ce cas, tu as le message de l'un, avec le pseudo de l'autre, voire encore plus embrouillé)

Les return ne servent à rien si ta programmation est propre. Je te suggère le script suivant, un peu amélioré au niveau fonctionnalités, je te laisse le débugguer complètement, j'ai qu'un seul avatar et je peux pas tout tester

Code:
string nomDetect;
list records;
integer index;
integer len;

default {
    state_entry() {
        records = [];
        state attente; }

    on_rez (integer num) {
        llResetScript(); } }

state attente {
    state_entry() {
        llSetText("Please click-me to leave a message! \n Merci de me cliquer pour laisser un message!", <0.0,0.8,0.0>, 1.0); }

    touch_start(integer num_detected) {
        nomDetect = llDetectedName(0);
        if (nomDetect == llGetOwner()) state consultation;
        else state record; }

    on_rez (integer num) {
        llResetScript(); } }

state consultation {
    state_entry() {
        llSetText("consultation.",  <1,0.0,0.0>, 1.0);
        index = 0;
        len = llGetListLength( records );
        if (len == 0) {
            llOwnerSay("Pas de message.");
            state attente; }
        llOwnerSay("Bienvenu sur le repondeur, les commandes sont:");
        llOwnerSay("p: message precedent.");
        llOwnerSay("N: message suivant.");
        llOwnerSay("L: lecture message courant.");
        llOwnerSay("D: suppression message courant");
        llOwnerSay("F: fin consultation.");
        llOwnerSay("H: aide.");
        llOwnerSay("C: suppression de tous les messages.");
        llListen(0, "", llGetOwner(), ""); }

    listen( integer channel, string name, key id, string message ) {
        if( message == "H" ){
            llOwnerSay("Bienvenu sur le repondeur, les commandes sont:");
            llOwnerSay("p: message precedent.");
            llOwnerSay("N: message suivant.");
            llOwnerSay("L: lecture message courant.");
            llOwnerSay("D: suppression message courant");
            llOwnerSay("F: fin consultation.");
            llOwnerSay("H: aide.");
            llOwnerSay("C: suppression de tous les messages."); }
        else if( message == "P" ) {
            if (index > 0) index--;
            llOwnerSay("message n:" + (string)index + ": ");
            llOwnerSay(llList2String(records, index) ); }
        else if( message == "L" ) {
            llOwnerSay("message n:" + (string)index + ": ");
            llOwnerSay(llList2String(records, index) ); }
        else if( message == "N" ) {
            llOwnerSay("message n:" + (string)index + ": ");
            llOwnerSay(llList2String(records, index) );
            if (index < len - 1) index++; }
        else if( message == "D" ) {
            records = llDeleteSubList(records, index, index);
            len = llGetListLength( records );
            if (len == 0) {
                llOwnerSay("Plus de message.");
                state attente; }
            if (index > 0) index--; }
        else if( message == "F" )
            state attente;
        else if( message == "C" ){
            records = [];
            llOwnerSay("Le repondeur est efface!"); } }
 
    on_rez (integer num) {
        llResetScript(); } }

state record {
    state_entry() {
        llSetText("Recording.",  <1,0.0,0.0>, 1.0);
        llWhisper(0, nomDetect + " : Please leave a one line message / Merci de laisser un message d'une ligne.");
        llWhisper(0, "You have only 30s / vous n'avez que 30s.");
        llListen(0, "", llDetectedKey(0), "");
        llSetTimerEvent(30); }

    timer () {
        llWhisper(0, nomDetect + " Out of time / depassement duree.");
        state attente; }

    listen( integer channel, string name, key id, string message ) {
        llSetTimerEvent(0);
        llInstantMessage(llGetOwner(), nomDetect + " : " + message);
        string temp = llGetTimestamp();
        temp = llGetSubString(temp, 0, 9) + "," + llGetSubString(temp, 11, 15);
        temp += " " + nomDetect + " : " + message;
        records = (records=[]) + records + [temp];
        llWhisper(0, nomDetect + " : bip. your message is recorded / votre message est enregistre.");
        state attente; }
 
    on_rez (integer num) {
        llResetScript(); } }
Répondre

Connectés sur ce fil

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