[Aide] script visiteur

Répondre
Partager Rechercher
bonsoir ,
je viens d'installer ce script dans un objet chez nous de façon à visualiser qui nous rend visite, mais il ne fonctionne pas...ou alors je ne sais pas m'en servir ... qqu peut il nous aider merci ^^
( on doit bien taper en chat :" commande", "aide" ou "donner liste" ...? )


default
{
list visitor_list;
float range = 10.0; // en metres
float rate = 1.0; // en secondes

integer isNameOnList( string name )
{


je crois que je me suis planté d'endroit pour poster cette discussion ...
integer len = llGetListLength( visitor_list );
integer i;
for( i = 0; i < len; i++ )
{
if( llList2String(visitor_list, i) == name )
{
return TRUE;
}
}
return FALSE;
}

default
{
state_entry()
{
llSay(0, "Demarrage de l'enregistrement...");
llSay(0, "Le proprietaire peut dire 'aide' pour avoir les raccourcis.");
llSensorRepeat( "", "", AGENT, range, TWO_PI, rate );
llListen(0, "", llGetOwner(), "");
}
sensor( integer number_detected )
{
integer i;
for( i = 0; i < number_detected; i++ )
{
if( llDetectedKey( i ) != llGetOwner() )
{
string detected_name = llDetectedName( i );
if( isNameOnList( detected_name ) == FALSE )
{
visitor_list += detected_name;
}
}
}
}

listen( integer channel, string name, key id, string message )
{
if( id != llGetOwner() )
{
return;
}

if( message == "aide" )
{
llOwnerSay( "Cet objet enregistre les noms de chaque personne qui passe dans un rayon de "+ (string)range + " meters." );
llOwnerSay( "Commandes du proprietaire:" );
llOwnerSay( "'aide' - Donne les raccourcis." );
llOwnerSay( "'donner liste' - Donne la liste complete des visiteurs.");
llOwnerSay( "'effacer' - Efface tous les noms de la liste." );
}
else
if( message == "donner liste" )
{
llSay( 0, "Liste des visiteurs:" );
integer len = llGetListLength( visitor_list );
integer i;
for( i = 0; i < len; i++ )
{
llSay( 0, llList2String(visitor_list, i) );
}
llSay( 0, "Total = " + (string)len );
}
else
if( message == "effacer" )
{
visitor_list = llDeleteSubList(visitor_list, 0, llGetListLength(visitor_list));
llSay( 0, "Reinitialisation");
}
}
Tente celui-ci:
les codes sont:
/3say list ; pour avoir la liste
/3 reset ; pour la vider

Bon c'est un vieux script que j'avais trouvé en freebee, mais normalement il marche

Code:
// remove this number for the script to work.


// Global variables
list visitor_list;
  float range = 10.0; // in meters
float rate = 1.0; // in seconds
 
 
// Functions
integer isNameOnList( string name )
{
    integer len = llGetListLength( visitor_list );
      integer i;
    for( i = 0; i < len; i++ )
    {
        if( llList2String(visitor_list, i) == name )
        {
            return TRUE;
        }
      }
    return FALSE;
}
 
// States
default
{
    state_entry()
    {
        llInstantMessage(llGetOwner(), "Visitor List Maker started...");
          llInstantMessage(llGetOwner(), "The owner can say 'help' for instructions."); 
        llSensorRepeat( "", "", AGENT, range, TWO_PI, rate );
        llListen(3, "", llGetOwner(), "");
      }
      
                
    sensor( integer number_detected )
    {
        integer i;
        for( i = 0; i < number_detected; i++ )
        {
              if( llDetectedKey( i ) != llGetOwner() )
            {
                string detected_name = llDetectedName( i );
                if( isNameOnList( detected_name ) == FALSE )
                  {
                    visitor_list += detected_name;
                }
            }
        }    
    }
    
    listen( integer channel, string name, key id, string message )
      {
        if( id != llGetOwner() )
        {
            return;
        }
        
        if( message == "help" )
        {
              llInstantMessage(llGetOwner(), "This object records the names of everyone who" );
            llInstantMessage(llGetOwner(), "comes within "+ (string)range + " meters." );
              llInstantMessage(llGetOwner(), "Commands the owner can say:" );
            llInstantMessage(llGetOwner(), "'help'  - Shows these instructions." );
            llInstantMessage(llGetOwner(), "'say list'   - Says the names of all visitors on the list.");
              llInstantMessage(llGetOwner(), "'reset list' - Removes all the names from the list." );
        }
        else
        if( message == "say list" )
          {
            llInstantMessage(llGetOwner(), "Visitor List:" );
            integer len = llGetListLength( visitor_list );
            integer i;
            for( i = 0; i < len; i++ )
              {
                llInstantMessage(llGetOwner(), llList2String(visitor_list, i) );
            }
            llInstantMessage(llGetOwner(), "Total = " + (string)len ); 
          }
        else
        if( message == "reset list" )
        {
            visitor_list = llDeleteSubList(visitor_list, 0, llGetListLength(visitor_list));
              llInstantMessage(llGetOwner(), "Done resetting.");
        }
    }        
}
Déterrage, mais la modération va trouver ça économe...

Bonsoir à tous... Je cherche ce même type de script, mais qui n'autoriserait que deux utilisateurs. Si en plus le script ne génère que peu de lag et est rapide, cela m'intéresse particulièrement.

Merci beaucoup beaucoup par avance
Le script qu'a déniché Biouby est une horreur. Je l'ai repris, presque totalement transformé (en particulier j'ai viré le sensor trop laggy pour un volume detect):

Code PHP:

// Paramètres
list OWNERS = ["Bestmomo Lagan, Jean Nemar"];

// Variables
list visitor_list;
integer i_max;

// States
default
{
    
state_entry() {
        
llWhisper(0"Visitor List Maker started...");
        
llWhisper(0"Owners can say '/3help' for instructions.");
        
// Passage en volume detect et donc fantôme
        
llVolumeDetect(TRUE);
        
// Enlève la détection de l'owner
        
llCollisionFilter(""llGetOwner(), FALSE);
        
// Ecoute du tchat
        
integer n llGetListLength(OWNERS);
        while(
n--) llListen(3llList2String(OWNERSn), NULL_KEY"");
    }


    
collision_start(integer total_number) {
        if(!
i_max) {
            while(
total_number--) {
                
string detected_name llDetectedName(total_number);
                if(
llListFindList(OWNERS, [detected_name]) == -&& llListFindList(visitor_list, [detected_name]) == -1)
                    
visitor_list += detected_name;
            }
            
i_max llGetFreeMemory() < 1000;
        }
    }

    
listeninteger channelstring namekey idstring message )
    {
        if( 
message == "help" ) {
            
llInstantMessage(id"\nThis object records the names of everyone who collide with it."
                
"\nCommands the owner can say:"
                
"\n'/3help'  - Shows these instructions."
                
"\n'/3say list'   - Says the names of all visitors on the list."
                
"\n'/3reset list' - Removes all the names from the list." );
        }
        else
            if( 
message == "say list" ) {
                
llInstantMessage(id"Visitor List:" );
                
integer len llGetListLength(visitor_list);
                
integer i;
                for(; 
len; ++i)
                    
llInstantMessage(idllList2String(visitor_listi));
                
llInstantMessage(id"Total = " + (string)len );
                if(
i_maxllInstantMessage(id"Cant get more visitor, memory is full !");
            }
        else
            if( 
message == "reset list" ) {
                
visitor_list = [];
                
i_max FALSE;
                
llInstantMessage(id"Done resetting.");
            }
    }

Ce n'est pas encore merveilleux mais au moins c'est plus correct .
mmm...pour éviter le lag , c est plutot douteux ...

Si , par exemple , je fais aller et venir vicieusement mon sac plein de billes ( évidemment en physique ) en dehors et en dedans la prim ...
Evidemment on pourrait éventuellement rajouter un llgetobjectdetails dans le collision_start pour savoir si c est un objet et rajouter l objet dans la liste des collisions filtrées gérées par la sim . Mais même dans ce cas là , je ne se suis pas certain de l impact que cela aurait au bout de plusieurs jours avec des listes très grandes de collisionfilter . Je suppose que cela ferait accroître la statistique "durée de la simulation" ou "durée des physiques" mais pas "durée des scripts" .
Et puis pourquoi laisser des listeners actifs quand les owners ne sont pas sur la sim ? C est du temps bouffé inutilement que vont subir les personnes qui sont sur la sim alors qu il ne sert à rien puisque les owners ne sont pas là.
Et enfin , pourquoi subir des délais de 2 secondes a chaque llinstantmessage . Si le owner a tapé la commande dans le chat , alors il est forcément dans la sim et donc on peut lui répondre par llregionsayto-PUBLIC_CHANNEL . 2 secondes d affichage par visiteur , c est supportable quand y en a qu un seul visiteur, mais au bout de 50 visiteurs , on pète un plomb .

Dernière modification par redpurple ; 08/12/2011 à 17h25.
Citation :
Publié par redpurple
mmm...pour éviter le lag , c est plutot douteux ...

Si , par exemple , je fais aller et venir vicieusement mon sac plein de billes ( évidemment en physique ) en dehors et en dedans la prim ...
Evidemment on pourrait éventuellement rajouter un llgetobjectdetails dans le collision_start pour savoir si c est un objet et rajouter l objet dans la liste des collisions filtrées gérées par la sim . Mais même dans ce cas là , je ne se suis pas certain de l impact que cela aurait au bout de plusieurs jours avec des listes très grandes de collisionfilter . Je suppose que cela ferait accroître la statistique "durée de la simulation" ou "durée des physiques" mais pas "durée des scripts" .
Et puis pourquoi laisser des listeners actifs quand les owners ne sont pas sur la sim ? C est du temps bouffé inutilement que vont subir les personnes qui sont sur la sim alors qu il ne sert à rien puisque tu n es pas là.
Et enfin , pourquoi subir des délais de 2 secondes a chaque llinstantmessage . Si le owner a tapé la commande dans le chat , alors il est forécément dans la sim et donc on peut lui répondre par llregionsayto . 2 secondes d affichage par visiteur , c est supportable quand y en a qu un seul , mais au bout de 50 visiteurs , on pète un plomb .
J'aime les démonstrations par le scénario du pire Bon en tous cas, moi je favoriserai toujours les techniques passives aux techniques actives. Avoir un sensor qui tourne en boucle quand il y a personne (technique active) alors qu'on peut avoir une détection chaque fois que nécessaire quand "cela arrive" (technique passive) c'est juste ridicule. Alors peut etre que pendant la tempête d'un éventuel abus de collisions on aurait une tendance accrue au lag sur la méthode passive mais cela ne serait que ce qu'on attend du script. Pour protéger contre cela on peut rajouter un filtre sur llDetectedType à la collision permettant à l'évènement de se libérer très vite évitant ainsi l'empilement des appels successifs du spam. Ensuite pourquoi pas un état anti-crise qui désactive le volumdetect temporairement ou pour un avatar particulier.
tu charries , là

Quel est le problème d avoir un sensor qui tourne en boucle quand y a personne ? Si il y a personne , personne ne va se plaindre du lag puisque personne ne le subit ... Ce qui est à optimiser , c est quand il y a du monde , pas quand il y a personne .
C est un peu comme si tu demandais d éteindre les sims quand y a pas de traffic ..

Et puis parlons chiffres :
un collide va quand même faire prendre du temps à la sim . A vide , cela va faire 0.6-0.7 nano secondes par frame .
un sensor qui fonctionne a vide va prendre 0.7-0.8 nano secondes par frame .

Déjà , la valeur en absolue est dérisoire , mais la différence entre les deux est ridicule .
A titre de comparaison le listen , à vide, lui , va prendre 1.5-2 nano secondes . Heureusement , cela ne s additionne pas quand c est dans le même script

Même en tournant et étant déclenché , ( avec un timer raisonnable , pas un truc de guignol à 0.0001 ms ) , le sensor va monter à 1 nano seconde ?
Cela reste toujours bien inférieur au listener.
Et le listener , lui , il ne sert vraiment à rien et fait chier quand l owner n est pas là mais qu il ya du monde

En revanche , un volumedetect a un volume plus retreint . Et si tu travailles avec des prims 64*64*64 , tu seras obligé de répéter le script dans chacune des prims ..
Même en te restreignant a un volume inférieur a celui du balayage d un sensor par exemple un volume de 128*128*128, cela va te faire 8 scripts à 0.6 = 5 nano seconses .. Donc un temps bien supérieur à vide qu un sensor en action ..
Pour info , le volume d un sensor c est 14 fois celui d un cube maxi de 64

Mais même se battre pour 5 nano secondes par frames est futile . Le problème principal c est de connaitre son terrain , de connaitre les autres objets ou autres scripts qui interagissent, bref d avoir une connaissance parfaite de ce qui s y s exécute .
Des VolumeDetect sans collisionfilter dans une sim où il y a plein d objets physiques temporaires qui se rezzent et dérezzent ( par exemple une sim RP de combat, ou une sandbox , ou l exemple d une petite fontaine ) , ce n est pas vraiment très adapté
L avantage avec un sensor , ce st que cela ne peut pas partir en sucette aussi facilement qu avec des volumedetect .

Dernière modification par redpurple ; 09/12/2011 à 09h46.
Forcément si tu sors les chiffres

Oui ça se tient, je l'admet. Cependant, tu oublis un détail : l'environnement scripté. En effet, si tu places ce script sur ta propre sim, j'imagine que tu fais gaffe à ce que tu écris et donc à la& qualité des scripts en exécution. Cependant tout le monde ne fait pas cela et on se retrouve avec un environnement plutôt désastreux. Le principe du lag c'est d'empiler les tâches à effectuer et bien qu'il n'y ait personne sur la sim, ton script peut contribuer à cet empilement. Si l'environnement scripté est trop important, ton timer (caché dans le repeat du sensor) contribue à empiler les tâches (cela se voit très bien lorsqu'on affiche les time-lapse à chaque "top", ils sont plus ou moins écartés). Si maintenant on prend ton principe et que tout le monde se dit la meme chose que toi ... on multiplie par d'autant de scripts qui "ne pèsent pas sur la timeline", sauf que si, ils s'empilent tous sur la timeline. Il en résulte une espèce de symphonie de triggers inutiles ... Alors oui on joue sur la nanoseconde mais quand l'environnement est chargé on observe des accumulations et des retards non négligeables provoquant des gros écarts quand on monte en charge sur la sim (arrivée d'un avatar bourré de gros scripts sur lui par exemple).

J'en arrive finalement à la même conclusion que toi, tout dépend du contexte. Je garde cependant un petit faible pour les méthodes passives car elles ont cette caractéristique séduisante de savoir attendre le bon moment pour s'exprimer ce qui correspond totalement à l'esprit de programmation évènementielle mise en avant par LL.
Je ne suis pas sur de bien saisir ton point de vue .

Certes , je comprends bien que le timer va accumuler du temps sur la performance de la sim . Mais le volumedetect aussi même quand il n y a pas de collisions .
Je n ai pas approfondi mais j ai fait un test rapide de 2000 prims sur une sim avec peu d activité dont le script time était a peu pres a 1.5 ms par frame .
Avec 2000 prims et un sensor avec un timer de 30 secondes, et en sortant du sensor rapidement , le script time montait entre 5 et 6 ms .
Mais avec 2000 prims et un volumedetect , et sans collisions, le script time montait exactement au même temps entre 5 et 6 ms .
Pour ce test , je n ai pas regardé individuellement chaque script évidemment , mais je me suis référé au temps affiché dans les statistiques par contrl+shift1

Donc montée en charge ou non , l effet me semble le même .

Et en réfléchissant avec du recul , cela semble logique . Dans un des cas , pour chaque frame , la sim doit parcourir sa liste d objets de collisions pour vérifier si il doit déclencher le script . Dans l autre cas , pour chaque frame , la sim doit parcourir les scripts pour vérifier si il doit déclencher le timer Le fonctionnement est un peu différent qu un timer en C puisque le temps est slicé et que la sim ne veut pas déclencher deux fois le timer dans la même frame.

Donc ce temps bouffé est le parcours des listes . L equivalent du temps bouffé dans un poll ou dans un select en C

J ai testé avec un sensor et un timer pas un sensorrepeat , mais je suppose que cela ne doit pas changer grand chose

Mieux , j ai le pressentiment que si je faisais le test avec 2000 objets avec un evenement on_touch , j aurais le même résultat .

Dernière modification par redpurple ; 09/12/2011 à 12h43.
Bon je pensais pas déclencher une telle discussion sur le lag .

Du coup j'ai repris ma copie un peu trop rapide pour l'affiner avec vos réflexions :

Code PHP:

// Paramètres
list OWNERS = ["Bestmomo Lagan","Jean Nemar"];

// Variables
list visitor_list;
integer i_max;
float range 10.0// en mètres
float rate 1.0// en secondes
list l_listen;

// States
default
{
    
state_entry() {
        
llWhisper(0"Visitor List Maker started...");
        
llWhisper(0"Owners can say '/3help' for instructions.");
        
// Mise en route du sensor
        
llSensorRepeat""""AGENTrangeTWO_PIrate );
        
// Mise en place écoute du tchat pour les owners et désactivation
        
integer n llGetListLength(OWNERS);
        
integer i;
        for(; 
n; ++i) {
            
l_listen += llListen(3llList2String(OWNERSi), NULL_KEY"");
            
llListenControl(llList2Integer(l_listeni), FALSE);
        }
    }

    
sensorinteger number_detected )
    {
        while(
number_detected--) {
            
string detected_name llDetectedName(number_detected);
            
// Détection des owners pour activation du listen
            
integer i llListFindList(OWNERS, [detected_name]);
            if(~
i) {
                
llSetTimerEvent(60.0);
                
llListenControl(llList2Integer(l_listeni), TRUE);
            }
            
// Ajout visiteur que si place en mémoire
            
else if(!i_max) {
                if(
llListFindList(visitor_list, [detected_name]) == -1) {
                    
visitor_list += detected_name;
                    
i_max llGetFreeMemory() < 1000;
                }
            }
        }
    }

    
timer() {
        
llSetTimerEvent(.0);
        
integer n llGetListLength(OWNERS);
        while(
n--) llListenControl(llList2Integer(l_listenn), FALSE);
    }

    
listeninteger channelstring namekey idstring message )
    {
        if( 
message == "help" ) {
            
llRegionSayTo(id0"\nThis object records the names of everyone who collide with it."
                
"\nCommands the owner can say:"
                
"\n'/3help'  - Shows these instructions."
                
"\n'/3say list'   - Says the names of all visitors on the list."
                
"\n'/3reset list' - Removes all the names from the list." );
        }
        else
            if( 
message == "say list" ) {
                
llRegionSayTo(id0"Visitor List:" );
                
integer len llGetListLength(visitor_list);
                
integer i;
                for(; 
len; ++illRegionSayTo(id0llList2String(visitor_listi));
                
llRegionSayTo(id0"Total = " + (string)len );
                if(
i_maxllRegionSayTo(id0"Cant get more visitor, memory is full !");
            }
        else
            if( 
message == "reset list" ) {
                
visitor_list = [];
                
i_max FALSE;
                
llRegionSayTo(id0"Done resetting.");
            }
    }

J'ai remis un sensor puisqu'il semble que son impact n'est pas plus grand qu'une détection de volume. J'en ai profité pour activer les listen si un owner est là. Et j'ai changé la fonction pour le tchat.

Cette fois j'espère que ça vous plaît. J'ai pas eu l'occasion de tester, je vais plus trop dans SL.
Répondre

Connectés sur ce fil

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