Advertisement
salahzar

SLVEC Intermedio 3 Giugno 2008: greeter

Feb 16th, 2020
413
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.00 KB | None | 0 0
  1. Salahzar Stenvaag
  2. SL Mentori Italiani
  3. 3 Giugno 2008
  4.  
  5.  
  6. Costruire un greeter. (uso di llSensorRepeat, llDialog elementari, llGiveInventory, funzioni di lista)
  7.  
  8. Un greeter è una sorta di "maggiordomo" un robottino automatico che:
  9.  
  10. - tiene nota delle persone che sono venute sulla tua land
  11. - consegna ad ogni persona una notecard con le "istruzioni" della land
  12. - evita di consegnare la notecard più di una volta alla stessa persona
  13. - è in grado di dire al proprietario chi è venuto e di cancellare la lista
  14.  
  15. E' molto utile nelle terre per dare le indicazioni delle condizioni di uso della terra etc.
  16.  
  17. Può essere qualunque cosa, nel nostro esempio sarà una sfera. Ne metterò una all'inizio che consegna la notecard con il contenuto di questo corso.
  18.  
  19. Per costruire un greeter faremo vari oggetti intermedi:
  20.  
  21. 1. greeter stupido che sente le persone e dà la notecard
  22. 2. aggiungiamo il vincolo della NON ripetizione
  23. 3. aggiungiamo istruzioni per interrogare il greeter e resettarlo.
  24.  
  25.  
  26. Parte 1. Greeter elementare.
  27.  
  28. fate una sfera e metteteci dentro questo script:
  29.  
  30. float range =40.0; // in metri
  31. float rate = 30.0; // ogni quanti secondi fare la scansione
  32. string GREETINGS="Benvenuto su questa terra\n Leggi la notecard per dettagli"; // può anche essere più lunga
  33. default
  34. {
  35. state_entry()
  36. {
  37. llSensorRepeat( "", "", AGENT, range, TWO_PI, rate ); //
  38. }
  39.  
  40.  
  41. sensor( integer number_detected )
  42. {
  43. integer i;
  44.  
  45. for( i = 0; i < number_detected; i++ )
  46. {
  47. // (1) non da la notecard al proprietario!!!
  48. if( llDetectedKey( i ) != llGetOwner() )
  49. {
  50. string detected_name = llDetectedName( i );
  51.  
  52. llDialog(llDetectedKey(i), GREETINGS, ["Ok"], -1);
  53. llGiveInventory(llDetectedKey(i),"Benvenuti a XXXXX"); // mettere il nome della notecard da dare
  54.  
  55. }
  56. // (1) end
  57. }
  58. }
  59. }
  60.  
  61. Per ogni persona che tocca l'oggetto se NON è l'owner dell'oggetto viene fatto un dialogo blu con il benvenuto e di conseguenza giveInventory della notecard.
  62. Questo script funziona benissimo ma ha il difetto di dare ripetutamente gli oggetti agli avatar che ritornano o semplicemente che si muovono all'interno della land. E' molto intrusivo e può generare spam e disagio agli avatar circostanti.
  63. Fate take il più presto possibile altrimenti darete un sacco di fastidio agli altri!!!
  64. O rendete inoffensivo l'oggetto mettendolo not running!!!
  65.  
  66.  
  67. 2. Facciamo un primo miglioramento tenendo una lista degli avatar evitando di dare più di una volta la notecard e il messaggio se l'avatar l'abbiamo già visto.
  68.  
  69. aggiungiamo le seguenti:
  70.  
  71. list visitor_list; // per tenere nota dei visitatori
  72.  
  73. integer isNameOnList( string name )
  74. {
  75. integer len = llGetListLength( visitor_list );
  76. integer i;
  77. for( i = 0; i < len; i++ )
  78. {
  79. if( llList2String(visitor_list, i) == name )
  80. {
  81. return TRUE;
  82. }
  83. }
  84. return FALSE;
  85. }
  86.  
  87. Questa funzione è importante. Prende il numero di elementi nella lista e scorre la lista per vedere se l'elemento i-esicom coincide con il nome fornito. Se almeno uno coincide torna TRUE (vero) altrimenti FALSE.
  88.  
  89. La funzione sensor viene modificata nel punto (1):
  90.  
  91. if( llDetectedKey( i ) != llGetOwner() )
  92. {
  93. string detected_name = llDetectedName( i );
  94.  
  95. if( isNameOnList( detected_name ) == FALSE )
  96. {
  97. visitor_list += detected_name;
  98. llDialog(llDetectedKey(i), GREETINGS, ["Ok"], -1);
  99. llGiveInventory(llDetectedKey(i),"Benvenuti a XXXXX");
  100. }
  101. }
  102. }
  103.  
  104. Come vedete la llDialog e la llGiveInventory vengono eseguite SOLO se isNameOnList torna FALSE. In questo modo siamo meno intrusivi!!!
  105. Adesso vedete che va molto meglio se volete potete anche ridurre l'intervallo di tempo prima di fare una nuova scansione mettendola ad 1 al secondo. Tenete conto che produce un po' di lag.
  106.  
  107. 3. Se vogliamo anche aggiungere un modo di controllare il greeter da parte dell'owner, permettendogli di fare
  108. - mostra lista (per l'elenco delle persone)
  109. - riparti (per ripulire l'oggetto e ripartire dacapo)
  110. - aiuto per un help
  111.  
  112. dobbiamo aggiungere le seguenti parti:
  113.  
  114. a) in state_entry()
  115.  
  116. llSay(0, "Il greeter sta partendo...");
  117. llSay(0, "Il proprietario può dire 'aiuto' per istruzioni");
  118.  
  119. llListen(0, "", llGetOwner(), ""); // per ascoltare SOLO il proprietario
  120.  
  121. b) aggiungere la listen per eseguire i comandi:
  122.  
  123. listen( integer channel, string name, key id, string message )
  124. {
  125. if( id != llGetOwner() ) // ignora i comandi non del proprietario
  126. {
  127. return;
  128. }
  129.  
  130. if( message == "aiuto" )
  131. {
  132. llSay( 0, "Questo oggetto registra i nomi di chiunque " );
  133. llSay( 0, "si avvicina entro "+ (string)range + " metri." );
  134. llSay( 0, "Comandi che il proprietario può dire nella chat:" );
  135. llSay( 0, "'aiuto' - mostra queste istruzioni." );
  136. llSay( 0, "'mostra lista' - Verifica i nomi nella lista.");
  137. llSay( 0, "'cancella lista' - Cancella tutti i nomi dalla lista." );
  138. }
  139. else
  140. if( message == "mostra lista" )
  141. {
  142. llSay( 0, "Visitatori:" );
  143. integer len = llGetListLength( visitor_list );
  144. integer i;
  145. for( i = 0; i < len; i++ )
  146. {
  147. llSay( 0, llList2String(visitor_list, i) );
  148. }
  149. llSay( 0, "Numero Totale = " + (string)len );
  150. }
  151. else
  152. if( message == "cancella lista" )
  153. {
  154. visitor_list = llDeleteSubList(visitor_list, 0, llGetListLength(visitor_list));
  155. llSay( 0, "Lista cancellata.");
  156. }
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement