ECO-SL: disattivare gli script tramite sensore

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);
    }
}

Advertisements
This entry was posted in Uncategorized. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s