On rez
Da Second Life Italia Wiki.
Indice |
[modifica] Evento on_rez
[modifica] Descrizione
Evento sollevato in un oggetto quando questo viene rezzato dall'inventario o da un altro oggetto o da un attachment quando il suo proprietario logga avendolo addosso, o viene indossato dall'inventario. on_rez non viene richiamato quando un oggetto viene rezzato dopo un teleport. In quest'ultimo caso viene richiamato l'evento changed().
[modifica] Sintassi
on_rez(integer start_param)
[modifica] Parametri
- start_param
- è il numero intero che viene passato alla funzione llRezObject e llRezAtRoot nello script che rezza il nuovo oggetto. Quando un oggetto viene rezzato da un avatar questo assume sempre valore zero.
Il valore di start_param può essere ottenuto in qualunque punto di uno script usando llGetStartParameter.
[modifica] Esempio
// questo esempio puo' essere usato per un proiettile di pistola // se rezzato da una pistola passare un valore diverso da zero 0 a llRezObject default { on_rez(integer start_param) { // se rezzato dalla pistola if (start_param != 0) { // setta il timer per il die fra 5 secondi llSetTimerEvent(5.0); } // altrimenti non muore dopo un timeout, ed e' possibile rezzarlo per l'editing } timer() { // cancella questo oggetto llDie(); } }
[modifica] Note
on_rez considera lo stato dell'oggetto. Bisogna ricordare che gli script in esecuzione salvano il loro stato quando l'oggetto in cui sono contenuti viene preso in inventario, e che quando un oggetto viene rimesso nel mondo questo non resetta lo script; esso semplicemente riparte da dove era rimasto. In altre parole, per fare in modo che uno script esegua una funzione specifica al rez a prescindere dallo stato, è necessario avere l'evento on_rez presente nella dichiarazione di tutti gli stati.
Se si usano sia on_rez che attach, on_rez sarà sempre richiamato prima. Pertanto, se è necessario fare un detach prima di procedere con un nuovo evento attach si deve dare tempo sufficiente per eseguire tutto the "detaching" che verrà richiamato nell'on_rez:
default{ on_rez(integer start_param) { llSay(0, "on_rez"); } attach(key id) { llSleep(10.0); llSay(0, "attach"); } }
Non va confuzo on_rez con object_rez, che viene richiamato quando viene rezzato un oggetto usando la funzione llRezObject.
D: L'evento on_rez garantisce di essere completato prima che qualunque interazione con l'oggetto avvenga in-world? Per esempio, se uno script ha diverse chiamate all'interno di on_rez, è possibile che altri eventi vengano richiamati, come un evento fisico, che influenzi l'oggetto prima che l'evento on_rez sia completato? I proiettili che cambiano il loro stato fisico al rez paiono essere forzati dalla forza alla funzione llRezObject. Ciò sempre indicare che la fisica dell'oggetto venga attivata nell'evento on_rez del proiettile prima che l'impulso venga applicato dallo script dell'arma.
R: Probabilmente ciò che accade è che la forza applicata è dotata di un time-to-live, un tempo massimo di vita, e che quando questo tempo viene superato, l'effetto della forza viene fermato. Se un evento è già in esecuzione quando l'oggetto viene rezzatol'evento on_rez viene messo in coda.
D: L'evento on_rez viene sollegato quando un oggetto viene duplicato manualmente con lo shift-copy? Ricordo di averlo usato, ma non fa niente. Per esempio il seguente codice non viene eseguito allo shift-copy:
on_rez(integer bla){ llOwnerSay("I've been rezzed"); }
R: Ciò succede perché quando viene fatto uno shift-copy lo script viene resettato. È un nuovo oggetto che viene rezzato per la prima volta, quindi lo script contenuto all'interno viene fatto partire. Viene chiamato state_entry, perché l'oggetto già esisteva quando lo script è partito. Se un oggetto viene preso e l'owner ha il diritto di copia, e poi rezza l'oggetto via script o dall'inventario, esso avrà lo stesso stato di quando lo oggetto è stato preso, inclusi i permessi dello script.
D: C'è un evento che viene richiamato quando un oggetto viene cancellato o preso nell'inventario?
R: No. L'evento attach() verrà sollevato al detach di un oggetto attaccato, ma questo è tutto. Se c'è bisogno di creare una funzione di cleanup o disabilitare l'oggetto dopo l'uso, usa l'on_rez() e un qualche tipo di contatore.
D: c'è un modo per prendere la key di un oggetto o dell'avatar che ha rezzato questo oggetto?
R: No, non direttamente. Il modo più semplice è avere il rezzer che dice qualcosa, ad esempio una parola chiave, dopo aver eseguito la llRezObject, e avere una listen nello script dell'oggetto rezzato. La chiave uuid del rezzer sarà gestita dalla listen dell'oggetto rezzato. Puoi generare un piccolo pausa con llSleep nell'oggetto rezzer se non riesce ad ascoltare il canale.
D: Come posso conservare tutti i lavori delle mie variabili e richimare la funzione llGetOwner escludendo un richiamo diretti de llResetScript?
R: Creare una nuova funzione che richiame la llListen con llGetOwner richiamando questa funzione negli eventi rispettivi state_entry e on_rez. Ciò assegna un nuovo owner ma non rimuove nessun dato. A differenza di llResetScript che resetta completamente lo script.
[modifica] Vedere anche
Categorie: LSL | LSL:Eventi | LSL:Esempi | LSL:FAQ
