Avete realizzato uno splendido oggetto che spara palloncini colorati, fuochi d’artificio, produce una pioggia di cuoricini per allietare le vostre feste. Tutti sono entusiasti tranne il LAG (nome confidenziale attribuito al ritardo nei tempi di visualizzazione quando si è connessi in SL). Certo nessuno rinuncerebbe a questi meravigliosi effetti, ma se non c’è nessuno a guardarli non sarebbe il caso di spegnere lo script? In questo articolo vi spiego come aggiungere un sensore a tutti i vostri oggetti minimizzando il peso delle modifiche allo script esistente. A questo scopo utilizzo uno script da aggiungere nell’inventario dell’oggetto che comunica tramite link message con gli altri script.
Iniziamo col definire delle costanti che utilizzeremo nelle comunicazioni:
integer LM_SENSOR_WAKEUP = 90001; integer LM_SENSOR_STANDBY = 90000; integer LM_SENSOR_ON = 80001; integer LM_SENSOR_OFF = 80000;
Impostiamo ora alcuni valori per il sensore: il primo indica il raggio d’azione del sensore, il secondo indica ogni quanti secondi verificare se intorno non c’è più nessuno, il terzo valore indica ogni quanti secondi verificare se è arrivato qualcuno. Aggiungiamo anche una variabile globale per memorizzare lo stato del sensore.
float gRangeMeter = 40.0; // attenzione il massimo è 96.0! float gSecondsON = 60.0; // ogni quanti secondi verificare se non c'è nessuno float gSecondsOFF = 5.0; // ogni quanti secondi verificare se è arrivato qualcuno integer gSensorState = 0; // stato del sensore
Quindi lo script verificherà ogni 60 secondi se in un raggio di 40 metri c’è qualcuno che si gode lo spettacolo. Se non ci fosse più nessuno si metterà in standby verificando ogni 5 secondi se arriva qualche avatar. Utilizzo due intervalli di tempo distinti in quanto il sensore stesso aumenta, seppur di pochissimo, il lag, quindi è inutile verificare se non c’è più nessuno ogni 0.5 secondi; se lo script rimane acceso dopo 60 secondi dall’uscita dell’ultimo avatar non muore nessuno. Può invece servire un tempo di verifica più breve per accendere tutto non appena (qui ho impostato 5 secondi) arriva il primo ospite
Bene ora scriviamo una funzione per gestire il sensore
setSensor( integer _state)
{
llSensorRemove(); // per sicurezza rimuovo eventuale sensore presente
if( _state == LM_SENSOR_ON || _state == LM_SENSOR_WAKEUP )
llSensorRepeat("", "", AGENT, gRangeMeter , PI, gSecondsON );
if( _state == LM_SENSOR_STANDBY )
llSensorRepeat("", "", AGENT, gRangeMeter , PI, gSecondsOFF );
gSensorState = _state;
llMessageLinked(LINK_THIS,_state, "", "");
}
Utilizziamo le stesse costanti di comunicazioni per memorizzare lo stato attuale del sensore. Se chiamiamo setSensor( LM_SENSOR_OFF ) la funzione semplicemente rimuove il sensore e salva lo stato; se accendiamo per la prima volta il sensore o se è arrivato qualcuno dopo uno standby impostiamo il sensore al numero di secondi gSecondsON, altrimenti utiliziamo gSecondsOFF.
L’ultima riga della funzione lancia un messaggio a tutti gli script nella root prim comunicando il cambio di stato. Vediamo lo script completo:
integer LM_SENSOR_WAKEUP = 90001;
integer LM_SENSOR_STANDBY = 90000;
integer LM_SENSOR_ON = 80001;
integer LM_SENSOR_OFF = 80000;
float gRangeMeter = 40.0; // attenzione il massimo è 96.0!
float gSecondsON = 60.0; // ogni quanti secondi verificare se non c'è nessuno
float gSecondsOFF = 5.0; // ogni quanti secondi verificare se è arrivato qualcuno
integer gSensorState = 0; // stato del sensore
setSensor( integer _state)
{
llSensorRemove(); // per sicurezza rimuovo eventuale sensore presente
if( _state == LM_SENSOR_ON || _state == LM_SENSOR_WAKEUP )
llSensorRepeat("", "", AGENT, gRangeMeter , PI, gSecondsON );
if( _state == LM_SENSOR_STANDBY )
llSensorRepeat("", "", AGENT, gRangeMeter , PI, gSecondsOFF );
gSensorState = _state;
llMessageLinked(LINK_THIS,_state, "", "");
}
default
{
state_entry() {
setSensor(LM_SENSOR_ON);
}
link_message(integer sender_num, integer num, string data, key id)
{
// se mi arriva qualche link message con una richiesta ....
// ovvero, se trova num tra i comandi previsti ...
if( llListFindList([LM_SENSOR_WAKEUP,LM_SENSOR_STANDBY,LM_SENSOR_ON,LM_SENSOR_OFF],[num]) != -1 )
setSensor(num); // imposto il sensore
}
no_sensor()
{
if( gSensorState == LM_SENSOR_WAKEUP ) setSensor(LM_SENSOR_STANDBY);
}
sensor(integer num_detected)
{
if( num_detected > 0 && gSensorState == LM_SENSOR_STANDBY ) setSensor(LM_SENSOR_WAKEUP);
}
}
Leave a comment