[Aide] Dataserver et llRequestAgentData

Répondre
Partager Rechercher
Bonjour a tous et a toutes, je suis nouveau ici. Et je trouve ce forum très interessant.

Mon problème est le suivant : j'apprends a scripter et j'en ai fait deux, un qui affiche les avatars et leurs distance comme un radar et l'autre qui affiche leurs infos de paiement via llRequestAgent Data et Dataserver. Ils fonctionnent mais je n'arrive pas a en faire un seul qui fait tout. Quelqu'un peut me conseiller ?

Merci d'avance !!

Je l'ai posté dans le forum technique, je crois que c'est mieux ici !!
Evidemment il n'existe pas de fonction merge pour faire coller deux scripts. Il faut réfléchir sur comment le faire, c'est presque du cas par cas lorsque le script commence à peser.

Il faut donc que tu réfléchisses à comment fonctionne l'un et l'autre, et seulement tu pourras les fusionner. Si les scripts utilisent qu'un seul état 'default' ca va etre facil. EN GROS, tout ce qui est dans state entry d'un coté ira dans state entry dans l'autre etc... Pour t'apporter une reponse claire il faudrait un exemple, pourquoi pas ton code en exemple..

Pour finir, tu peux faire communiquer tes scripts si tu le souhaites sans devoir les fusionner la communication peut s'effectuer en linkmessage ou en say/listen à toi de voir encore une fois c'est a apres cette petite analyse que tu pourras voir ce qui est le mieux ..
Merci pour ta réponse voici les deux codes, ils sont courts :

1.

key a;
key b;
key c;

string info = "";
string name = "";
string born = "";


default
{
touch_start(integer num_detected)
{

a = llRequestAgentData(llDetectedKey(0), DATA_NAME);
b = llRequestAgentData(llDetectedKey(0), DATA_BORN);
c = llRequestAgentData(llDetectedKey(0), DATA_PAYINFO);
}

dataserver(key queryid, string data)

{
if(a == queryid) name = data;

if(b == queryid) born = data;

if(c == queryid) info = data;


if (info == "3") info = "Utilisé";



llSetText(name + " " + born + " " + info, <1.0, 1.0, 1.0>, 1.0);

}
}



et 2.

float portee = 96.0;
float frequence = 2.0;
vector couleur = <1.0,1.0,1.0>;
string msg;

ecrireMessage(string msg)
{
llSetText(msg,couleur,1.0);
}

default
{
state_entry()
{
llSensorRepeat("",NULL_KEY, AGENT, portee, TWO_PI, frequence );
}

sensor (integer numberDetected)
{
integer i;
integer distance;
string msg = "";
for(i = 0; i < numberDetected; i++)
{
distance = (integer)llVecDist(llGetPos(), llDetectedPos(i));
msg += llDetectedName(i) + " ("+ (string)distance + " m)\n";
}
ecrireMessage(msg);

}
no_sensor()

{
msg = "Personne de détecté";
ecrireMessage(msg);
}

}


Je voudrais essayer de faire un seul script qui affiche le tout.

Merci encore
Voila ton code regroupé, je pense qu'en regardant ca suffira pour voir ce que j'ai fais... Je n'ai pas touché au contenu je ne sais pas si c'est cohérent ce que tu avais fait j'ai fais un travail de copier coller c'est tout.

Code:
floatportee=96.0;
floatfrequence=2.0;
vectorcouleur=<1.0,1.0,1.0>;
stringmsg;
keya;
keyb;
keyc;
stringinfo="";
stringname="";
stringborn="";
ecrireMessage(stringmsg)
{
llSetText(msg,couleur,1.0);
}
default
{
state_entry()
{
llSensorRepeat("",NULL_KEY,AGENT,portee,TWO_PI,frequence);
}
touch_start(integernum_detected)
{
a = llRequestAgentData(llDetectedKey, DATA_NAME);
b = llRequestAgentData(llDetectedKey, DATA_BORN);
c = llRequestAgentData(llDetectedKey,DATA_PAYINFO); 
}
 
sensor (integernumberDetected)
{
integer i;
integer distance;
string msg="";
for(i=0;i<numberDetected;i++)
{
distance = (integer)llVecDist(llGetPos(), llDetectedPos(i));
msg +=llDetectedName(i) + " ("+ (string)distance + " m)\n";
}
ecrireMessage(msg);
}
no_sensor()
{
msg = "Personne de détecté";
ecrireMessage(msg);
}
dataserver(keyqueryid,stringdata)
{
if(a==queryid)name=data;
 
if(b==queryid)born=data;
 
if(c==queryid)info=data;
if(info=="3")info="Utilisé";
llSetText(name+" "+born+" "+info,<1.0,1.0,1.0>,1.0);
}
}
Oui il y a 2 difficultés avec le dataserver :
1) il peut retourner plusieurs informations, et pas forcément dans l'ordre où on les demande. Donc bien identifier les requétes comme là fait Ahuri.
2) dans la même prim, tout les event dataserver sont simultanément déclenchés dans tous les scripts même sans requéte dans le script. Donc attention à ça mais peut être pratique si on veut que tous les scripts reçoivent la même data en même temps.
Citation :
Donc bien identifier les requétes comme là fait Ahuri.
Eheh j'ai rien fait, c'est Warteck ^^

En effet tes remarques sont justes, personnellement je fais prendre l'habitude aux gens de toujours verifier les requetes qu'ils recoivent/envoient. C'est important pour la sécurité, la cohérence, les performances des fois, .....
Salut,
Je remonte le sujet, même si un peu vieux.

J'essaye d'avoir les infos de paiements et la date de naissance de l'avatar via le sensor.

J'ai essayé de plusieurs manières, j'ai même utilisé ce bout de script qui est dans le même esprit que ce que j'ai fait, mais j'arrive toujours au même résultat, j'arrive avoir ou le premier avatar détecté ou le dernier avec les infos de paiement et la date de naissance, tous les autres détectés ont cette même info et date.

Le "dataserver" n'est exécuté qu'une seule fois ?

Je mets mon bout de code qui vient de celui au dessus ici si quelqu'un peut m'aider, ou m'aiguiller.

Merci

Code PHP:

float portee=96.0;
float frequence=2.0;
vector couleur=<1.0,1.0,1.0>;
string msg;
key a;
key b;
key c;
string info="";
string name="";
string born="";
integer i;


ecrireMessage(string msg)
{
   
llSetText(msg,couleur,1.0);
}
default
{
state_entry()
{
   
llSensorRepeat("",NULL_KEY,AGENT,portee,TWO_PI,frequence);
}
 
sensor (integer numberDetected)
{
   
integer distance;
   
string msg="";

   
//a = llRequestAgentData(llDetectedKey(i), DATA_NAME);
   //b = llRequestAgentData(llDetectedKey(i), DATA_BORN);
   //c = llRequestAgentData(llDetectedKey(i),DATA_PAYINFO);

   
for(i=0;i<numberDetected;i++)
   {  
      
llRequestAgentData(llDetectedKey(i), DATA_NAME);
      
llRequestAgentData(llDetectedKey(i), DATA_BORN);
      
llRequestAgentData(llDetectedKey(i),DATA_PAYINFO);
      
distance = (integer)llVecDist(llGetPos(), llDetectedPos(i));
      
msg +=llDetectedName(i) + " " born " " info " ("+ (string)distance " m)\n";
      
//msg +=llDetectedName(i) + " " + (string)b + " " + (string)c+ " ("+ (string)distance + " m)\n";
      
ecrireMessage(msg);
   }
   
//ecrireMessage(msg);
}
no_sensor()
{
   
//msg = "Personne de détecté";
   //ecrireMessage(msg);
}
dataserver(key queryid,string data)
{

   if(
a==queryid)name=data;
 
   if(
b==queryid)born=data;
 
   if(
c==queryid)info=data;
   if(
info=="3")info="Utilisé";
   if(
info=="0")info="NON Utilisé";

}

Il faut bien comprendre comment fonctionnent les scripts lsl pour comprendre ton problème: les événements s'entassent dans une file d'attente et ne seront exécutés l'un après l'autre qu'une fois que l'événement en cours sera fini (c'est à dire arrivera à sa parenthése fermante.
Alors dans ton cas, tu fait bien 3xnbre d'avatars appels au dataserveur, ils seront tous exécuter (et le dataserver répondra quand il voudra: l'ordre des réponses n'est pas garanti) , mais les valeurs finales de a, b et c seront celles du dernier avatar (la boucle for s'exécutera jusqu'au bout avant que les événement dataserveur soient traités) et ce sont celles qui seront les seules prise en compte quand les réponses dataserveur correspondantes arriveront.
Alors ce qu'il faut faire, c'est mémoriser la détection dans une liste, et traiter après cette liste. Et pas dans une boucle for car tu retrouveras le même problème.
Code:
float portee=96.0;
float frequence=2.0;
vector couleur=<1.0,1.0,1.0>;
string msg;
key a;
key b;
key c;
string info="";
string name="";
string born="";
integer i;

list avs;
list dists;
integer cpt;
key av;
integer flags;

ecrireMessage()
{
   string msg =llKey2Name(av) + " " + born + " " + info + " ("+ (string)llList2Integer(dists, cpt) + " m)\n";
llSetText(msg,couleur,1.0);
}

demande(){
    flags = 0;
    av = llList2Key(avs, cpt);
a = llRequestAgentData(av, DATA_NAME);
      b = llRequestAgentData(av, DATA_BORN);
      c = llRequestAgentData(av, DATA_PAYINFO);
}

default
{
state_entry()
{
   llSensorRepeat("",NULL_KEY,AGENT,portee,TWO_PI,frequence);
}
 
sensor (integer numberDetected)
{
   integer distance;
   avs = dists = [];
   for(i=0;i<numberDetected;i++)
   {  
distance = (integer)llVecDist(llGetPos(), llDetectedPos(i));
      avs += [llDetectedKey(i)];
      dists += [distance];
   }
   state interro;
}
no_sensor()
{
   //msg = "Personne de détecté";
   //ecrireMessage(msg);
}
}

state interro{
state_entry(){
    cpt = 0;
    demande();
}

dataserver(key queryid,string data)
{

   if(a==queryid){ name=data; flags += 1;}
 
   else if(b==queryid){ born=data; flags += 2; }
 
   else if(c==queryid){info=data;
        if(info=="3")info="Utilisé";
        else if(info=="0")info="NON Utilisé";
       flags += 4;
   }
   if(flags == 7){
       ecrireMessage();
       cpt++;
       if(cpt == llGetListLength(avs)) state default;
       else demande();
   }
}
}
 


Voilà je sais pas si ça tourne mais le principe est là. Et ce script est très mal foutu à la base.
Répondre

Connectés sur ce fil

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