llListen - Recupere un seul mot...

Répondre
Partager Rechercher
Bonjour a tous, voila j'aimerais savoir si il est possible de faire que llListen écoute un mot précis, même au milieu d'une phrase...

Exemple: je dit " le soleil est la ce matin" heureusement lol

J'aimerais donc que le script réagisse au mot "matin" par exemple, situé dans un phrase et non tout seul...

Citation :
default
{
state_entry()
{
llListen(0, "", NULL_KEY, "");
}

listen(integer channel, string name, key id, string mes)
{
if (mes == "matin")
{
llOwnerSay(mes);
}
}
}
Biensur ce script ne réagis qu'au mot "matin" mais serait ils donc possible que le script réagisse a ce même mot contenu dans une phrase...

J'espere que vous avez suivi ^^

Merci d'avance, et bonne journée a tout le monde
Il y a peut-etre plus simple, mais en transformant la string en liste, puis en utilisant la fonction Find dans la liste, ça doit fonctionner, comme ça:
Code:
default
{
   state_entry()
   {
      llListen(0, "", NULL_KEY, "");
   }

   listen(integer channel, string name, key id, string mes)
   {
      list mots = llParseString2List(mes, [" "], []);  // transforme 'mes' en une liste de 'mots' en utilisant l'espace comme séparateur.
      
      if (llListFindList(mots, ["matin"]) != -1) // retourne -1 si la liste ["matin"] n'est pas contenue dans 'mots'.
      {
         llOwnerSay(mes);
      }
   }
}
Salut et merci de m'aider Nibb, mais ton script ne réagis pas a mes mots ^^

Peut être que je me trompe quelque part, car ton script deviens trop compliqué pour moi

Citation :
default
{
state_entry()
{
llListen(0, "", NULL_KEY, "");
}
listen(integer channel, string name, key id, string mes)
{
list mots = llParseString2List(mes, [" "], []); // transforme 'mes' en une liste de 'mots' en utilisant l'espace comme séparateur.

if (llListFindList(mots, ["oui","non","ok","test"]) != -1) // retourne -1 si la liste ["matin"] n'est pas contenue dans 'mots'.
{
llOwnerSay(mes);
}
}
}
Donc a partir de ce script si je dit l'un de ces mots seuls ou dans une phrase, le script devrait m'envoyer cette phrase?

Merci d'avance, j'ai du mal ^^
Ah ben oui, mais tu as dit 1 mot !

Dans ton exemple, il faudra que tu dise "oui non ok test" pour que ça réagisse. La fonction llListFindList cherche la 2eme liste à l'intérieur de la 1ere.

Si tu veux plusieurs mots, mets plutôt plusieurs tests dans le code, comme ça:

Code:
default
{
   state_entry()
   {
      llListen(0, "", NULL_KEY, "");
   }

   listen(integer channel, string name, key id, string mes)
   {
      list mots = llParseString2List(mes, [" "], []);  // transforme 'mes' en une liste de 'mots' en utilisant l'espace comme séparateur.
      
      if (llListFindList(mots, ["matin"]) != -1) // retourne -1 si la liste ["matin"] n'est pas contenue dans 'mots'.
      {
         llOwnerSay("Tu as dit matin");
      } else if (llListFindList(mots, ["oui"]) != -1) // retourne -1 si la liste ["matin"] n'est pas contenue dans 'mots'.
      {
         llOwnerSay("Tu as dit oui");
      } else if (llListFindList(mots, ["non"]) != -1) // retourne -1 si la liste ["matin"] n'est pas contenue dans 'mots'.
      {
         llOwnerSay("Tu as dit non");
      }
   }
}
Le script n'est pas compliqué. Ce sont des fonctions que tu ne connais pas. Si c'est le cas, regarde leur définition sur www.lslwiki.net.
Euh, dites...

Au lieu d'utiliser des transformations en liste, ce qui est coûteux en ressources mémoires et processeurs...
y a llSubStringIndex( string source, string patern)

Donc si on veut ne pas se soucier de la casse des caractères, ça donne:

llSubStringIndex(llToUpper(message), llToUpper(clef))

Qui renvoie -1 si clef n'est pas dans message, et la position de clef dans message sinon

donc pour plusieurs mots, si tous les mots doivent appartenir au message, c'est un test par clef en et logique, si c'est un mot parmi d'autres, un ou logique, et ça ne prend pas en compte l'ordre des mots...
Répondre

Connectés sur ce fil

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