kury Posted October 30, 2011 Share Posted October 30, 2011 Estou tentando adaptar o script de um radar para colocar em um alarme que pertence ao grupo. O radar funciona perfeitamente mas quando doado ao grupo para de funcionar e não me da mais acesso. Podem me ajudar a concertar ?O script alarme é o seguinte:list visitor_list;float range = 96.0;float rate = 1.0; 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;}default{state_entry(){llSay(0, "Lista Ativada...");llSay(0, "Tecle 'help' para instruções.");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 == "help" ){llSay( 0, "O alarme registra o nome de todos os visitantes" );llSay( 0, "comes within "+ (string)range + " meters." );llSay( 0, "Comandos disponiveis:" );llSay( 0, "'help' - Mostra instruções." );llSay( 0, "Lista' - Mostra o nome dos visitantes identificados.");llSay( 0, "'Reset" - Apaga a lista de visitantes." );}elseif( message == "Lista" ){llSay( 0, "Visitantes:" );integer len = llGetListLength( visitor_list );integer i;for( i = 0; i < len; i++ ){llSay( 0, llList2String(visitor_list, i) );}llSay( 0, "Total = " + (string)len );}elseif( message == "Reset" ){visitor_list = llDeleteSubList(visitor_list, 0, llGetListLength(visitor_list));llSay( 0, "Lista apagada.");}}} Link to comment Share on other sites More sharing options...
Damian Zhaoying Posted October 31, 2011 Share Posted October 31, 2011 El problema está en el listen(). Esta función solo puede leer mensajes de objetos o de avatares, no de un grupo. Entonces, como el radar está cedido a un grupo, el owner del radar es el grupo, el cual no puede enviarle mensajes al objeto. Como solución, o bien dejas que el radar sea manejado por un solo avatar, dueño del mismo para no tocar el código del script o bien, modificas el script para que el listen tome a cualquier avatar y luego controlas si ese avatar pertenece al grupo que quieras. También, puedes agregarle una función en la cual indiques quienes pueden acceder a las funciones del radar. SaludOS/2 Link to comment Share on other sites More sharing options...
Catwise Yoshikawa Posted October 31, 2011 Share Posted October 31, 2011 Madre mia. Necesito un chisme de dar kudos aquí, porque te los mereces... Ni siquiera se cómo has entendido algo de la pregunta ^^' Link to comment Share on other sites More sharing options...
kury Posted November 1, 2011 Author Share Posted November 1, 2011 Obrigado por sua atenção. Vou fazer como ensinou mas vou continuar a procurar uma forma de fazer o objeto "ouvir" o grupo e responder a seus integrantes. Abraços! Link to comment Share on other sites More sharing options...
Damian Zhaoying Posted November 1, 2011 Share Posted November 1, 2011 Kury: Estuve aprovechando un momento libre y estudié el script y lo que quieres hacer, hice algunos pequeños cambios rápidos, asi que creo que se puede mejorar. Pero la idea es que el radar responda a los miembros de un grupo específico y no solamente al owner. Antes de pegar el código, valen algunas aclaraciones: 1) Agregue varias variables para parametrizar un poco mas el script, como ser, "Channel" para definir en que canal se enviarán los comandos al radar, Listen_Handle para controlar el evento del listen y cambié el valor de "rate" incrementándolo a 5. ¿Los motivos? Aquí van: a) Usar el canal por defecto (cero) hace que el listener este activo constantemente realizando una escucha en el canal público, por lo cual, cuando haya avatares dentro del rango de chat (20 metros) el script estará constantemente evaluando lo que cada avatar escriba en el canal público (chat general). Esto, obviamente, genera un considerable carga en el sistema con el consiguiente lag. b) Est viene junto con el punto 2), asi que lo explico ahí. c) Un valor bajo en la tasa de escaneo de avatares provoca mayor lag, estar escaneando los 360 grados alrededor del objeto cada segundo puede convertirse en una fuente de lag muy importante. Por ese motivo, lo ideal es jugar con valores mas altos pero sin perder el tiempo en que puede ser detectado un avatar. 5 segundos es un valor intermedio, muchos usan 10 seg como intervalo entre cada barrido. 2) Como dije antes, en el punto 1.c., un listener activo en forma constante, aunque no haya nadie cerca, genera lag, máxime que está acompañado de un escaner. Por este motivo, lo mejor que se puede hacer para minimizar el lag es genera un evento de toque (touch_start) para activar el listener solamente cuando un avatar toque el radar. Aquí juega la variable Listen_Handle que almacenará el orden del listener activo para luego, al final del evento listen, borrarlo. Con esto ahorramos recursos del servidor del sim. 3) Notarás que quité todos los controles en los cuales se pregunta si quién da la orden es el owner del objeto y lo reemplace por la función "llSameGroup". De esta manera, todo avatar que tenga activado el mismo grupo al que pertenece el objeto puede administrarlo. Lo importante aquí es que NO hace falta ceder el objeto al grupo. 4) Un aclaración IMPORTANTE. Este script NO es un radar, sino un visitor List. Es decir, un script que almacena una lista de todos aquellos avatares detectados en el rango de alcance del objeto (Máximo 96 mts). Esto hace que el script almacene los datos en la memoria del sistema, dentro de una lista. Por este motivo, lo mejor es que, al guardar el script, marques la casilla de ejecutarlo como "mono" lo cual te dará una cantidad mayor de memoria para almacenar información. Ten presente que una vez saturada la memoria, el script deja de funcionar, por lo cual, lo ideal es que reinicies el script periódicamente en función de la cantidad de visitas que tengas. Creo que no me olvido nada, cualquier duda, pregunta e intentaré respondertela, asi que vamos al script: ----------------------------------------------------------------------------------------------------------------------------------------- list visitor_list; float range = 96.0; float rate = 1.0; // sugiero un valor de 5 para no generar tanto lag integer channel = 65535; // Para no crear lag. integer Listen_Handle; 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; } default { state_entry() { llSay(0, "Lista Ativada..."); llSay(0, "Tecle 'help' para instruções."); llSensorRepeat( "", "", AGENT_BY_LEGACY_NAME, range, TWO_PI, rate ); // Modificado AGENT } touch_start( integer num) { // Para minimizar el lag, activamos el listener sólo cuando cuando un usuario del mismo grupo toca el objeto integer i = 0; for(; i < num; ++i) { if( llSameGroup(llDetectedKey( i )) ) Listen_Handle = llListen( channel, "", llDetectedKey( i ), "" ); } } 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( message == "help" ) { llSay( 0, "O alarme registra o nome de todos os visitantes" ); llSay( 0, "comes within "+ (string)range + " meters." ); llSay( 0, "Comandos disponiveis:" ); llSay( 0, "'help' - Mostra instruções." ); llSay( 0, "Lista' - Mostra o nome dos visitantes identificados."); llSay( 0, "'Reset' - Apaga a lista de visitantes." ); } else if( message == "Lista" ) { llSay( 0, "Visitantes:" ); 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 == "Reset" ) { visitor_list = llDeleteSubList(visitor_list, 0, llGetListLength(visitor_list)); llSay( 0, "Lista apagada."); } llListenRemove( Listen_Handle); } } ------------------------------------------------------------------------------------------------------------------------------------------ Si quieres evitar que cualquiera de los avatares autorizados de tu grupo reinicien la lista, borrando sus datos, puedes reemplazar, sobre el final del script, la siguiente línea: if( message == "Reset") por esta línea: if( message == "Reset" && id == llGetOwner() ) Y, con esto, el único que puede reiniciar la lista sería el owner del radar. SaludOS/2 Link to comment Share on other sites More sharing options...
kury Posted November 1, 2011 Author Share Posted November 1, 2011 Obrigado mais uma vez e desculpe pelo trabalho. Vou utilizar o script como voce recomendou. Abraços Link to comment Share on other sites More sharing options...
Recommended Posts
Please take a moment to consider if this thread is worth bumping.
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now