ECO-SL: disattivare gli script tramite sensore

Published on

in

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


Benvenuto su Salahzar.com

Qui trovi analisi critiche sull’intelligenza artificiale e le sue implicazioni sociali, scritte da chi viene da una impostazione umanistica e ha passato vent’anni a costruire mondi virtuali prima che diventassero “metaverso”.

Niente hype da Silicon Valley o entusiasmi acritici: sul tavolo ci sono le contraddizioni dell’innovazione tecnologica, i suoi miti fondativi, le narrazioni che usiamo per darle senso. Dai diari ucronici (storie alternative come strumento per capire i nostri bias cognitivi) alle newsletter settimanali sugli sviluppi dell’AI che richiedono aggiornamenti continui perché i trimestri sono già preistoria.

Se cerchi guide su come “fare soldi con ChatGPT” o liste di prompt miracolosi, sei nel posto sbagliato. Se invece ti interessa capire cosa sta succedendo davvero – tra hype, opportunità concrete e derive distopiche – sei nel posto giusto.

Umanesimo digitale senza retorica, analisi senza paternalismi, ironia senza cinismo.


Join the Club

Stay updated with our latest tips and other news by joining our newsletter.