Ho realizzato in craft la trasposizione del rezzer di pyramidCafè. Qui gli script.
L’oggetto è composto da una pedana linkata assieme ad un telecomando per un totale di 8 prim:
* La base
* Il telecomando
* Il tasto +
* Il tasto –
* Il tasto OK
* Il tasto RESET
* Il tasto BLOCCA
* Un altro tasto neutro
La teoria è la seguente (ricordatevi di sapere usare le Parti Unite, linked set bene).
Inserite gli script nei vari pezzi (pedana + vari tasti del telecomando).
Poi potete inserire N ambientazioni nella pedana. Ogni ambientazione deve essere un LINKSET che contiene l’ultimo script “cancella”.
Cliccando sui tasti + e – si scelgono le varie ambientazioni. Con OK si fa il rez. Il tasto reset cancella l’ultima ambientazione.
Il tasto blocca consente di evitare che qualcuno inavvertitamente cambi scena.
Auguri.. Sal..
Ecco i vari script: TASTO +
default
{
touch_start(integer total_number){
llMessageLinked(LINK_ALL_OTHERS,0,"PIU",llDetectedKey(0));
}
}
Tasto MENO
default
{
touch_start(integer total_number){
llMessageLinked(LINK_ALL_OTHERS,0,"MENO",llDetectedKey(0));
}
}
Tasto OK:
// elenco canali usati
integer CHANNEL_CAMBIA=0;
integer CHANNEL_TEXT=1;
integer CHANNEL_REZZA=2;
integer CHANNEL_BLOCCA=3;
// stato unlock
integer UNLOCK=TRUE;
// scrive scritta fluttuante
scrivi(string s){
llSetText(s,,1);
}
default
{
// se toccato ed è UNLOCK allora manda messaggio di rez
touch_start(integer total_number){
if(UNLOCK>0)
llMessageLinked(LINK_ALL_OTHERS,CHANNEL_REZZA,"",NULL_KEY);
else
// altrimenti segnala che è bloccato
llInstantMessage(llDetectedKey(0),"Una persona del guppo Pyramid Cafe' ha bloccato lo scorrimento degli scenari");
}
// se chiamato sul canale testo scrive il testo
link_message(integer sender_num,integer num,string str,key id){
if(num==CHANNEL_TEXT){
scrivi(str);
}
else if(num==CHANNEL_BLOCCA){
UNLOCK=~UNLOCK;
}
}
}
Tasto reset:
integer CHANNEL=-1;
default
{
state_entry()
{
CHANNEL=-(integer)("0x"+(string)llGetOwner());
}
touch_start(integer num)
{
llSay(CHANNEL, "CANCELLA");
}
}
Tasto Blocca
integer CHANNEL_CAMBIA=0;
integer CHANNEL_TEXT=1;
integer CHANNEL_REZZA=2;
integer CHANNEL_BLOCCA=3;
integer UNLOCK=TRUE;
string msg;
// scrive lo stato (locked/unlocked)
scrivi(){
if(UNLOCK>0)
msg="Unlocked";
else
msg="Locked";
llSetText(msg,,1);
}
default
{
// non appena entrato scrive lo stato
state_entry(){
scrivi();
}
// se toccato ed è dello stesso gruppo allora inverte lo stato
touch_start(integer total_number){
key avatar=llDetectedKey(0);
if(llSameGroup(avatar)){
//if(~llListFindList(members,[llKey2Name(avatar)])){
UNLOCK=~UNLOCK;
scrivi();
llMessageLinked(LINK_ALL_OTHERS,CHANNEL_BLOCCA,"",NULL_KEY);
}
}
}
script dentro la base:
// i 4 canali usati questi NON devono essere modificati solo CANCELLA
integer CHANNEL_CAMBIA=0; // risponde a "+" o "-"
integer CHANNEL_TEXT=1;
integer CHANNEL_REZZA=2;
integer CHANNEL_BLOCCA=3;
// stato di lock
integer UNLOCK=TRUE;
// quanti scenari sono contenuti
integer total_number=0;
// lista di tutti gli scenari
list nomi_scenari;
// indice attuale di scorrimento
integer index=0;
// canale di cancellazione (da ricalcolarsi!!!)
integer cancella=-1010;
// posizione di rez (da ricalcolarsi!!!!)
vector posizione=;
// funzione che torna un intero univoco per ogni avatar
integer OwnerKey()
{
return -(integer)("0x"+(string)llGetOwner());
}
aggiorna(){
// cancella cambia a seconda dell'owner (non è perfetto, possono ancora comparire
// sovrapposizioni
cancella=OwnerKey();
// aggiunto da salahzar, imposta la posizione corrente del linked set
posizione=llGetPos();
// trova tutti gli scenari
nomi_scenari=[];
total_number=llGetInventoryNumber(INVENTORY_OBJECT);
integer i;
for(i=0;i if(str=="PIU"){
if(index==total_number-1)
index=0;
else
index++;
// manda sul canale di visualizzazione il nome della scena
llMessageLinked(LINK_ALL_OTHERS,CHANNEL_TEXT,llList2String(nomi_scenari,index),NULL_KEY);
}
// se MENO e siamo all'inizio riparte dal fondo, altrimenti decrementa
else if(str=="MENO"){
if(index==0)
index=total_number-1;
else
index--;
// manda sul canale di visualizzazione il nome della scena
llMessageLinked(LINK_ALL_OTHERS,CHANNEL_TEXT,llList2String(nomi_scenari,index),NULL_KEY);
}
}
// risponde al canale REZZA
else if(num==CHANNEL_REZZA){
// prima cancella l'oggetto precedente
//llSay(0,"saying cancella on channel: "+(string)cancella);
llSay(cancella,"CANCELLA");
// rezza l'oggetto alla posizione specificata con velocità nulla e ruotato di 90 gradi
llRezAtRoot(llList2String(nomi_scenari,index),posizione-,ZERO_VECTOR,llEuler2Rot(),0);
}
// risponde al canale blocca invertendo lo stato del
else if(num==CHANNEL_BLOCCA){
UNLOCK=~UNLOCK;
}
}
}
Script da inserire nelle “ambientazioni”
// canale su cui ascolta (ownerkey()-1)
integer cancella;
// funzione che torna un intero univoco per ogni avatar
integer OwnerKey()
{
return -(integer)("0x"+llGetOwner());
}
default
{
// al reset calcola il canale e ascolta
state_entry(){
cancella=OwnerKey();
//llSay(0,"Ascolto sul canale "+(string)cancella);
llListen(cancella,"",NULL_KEY,"CANCELLA");
}
// al rez calcola il canale e ascolta
on_rez(integer start_param){
cancella=OwnerKey();
//llSay(0,"Ascolto sul canale "+(string)cancella);
llListen(cancella,"",NULL_KEY,"CANCELLA");
}
// ascolta e muore
listen(integer channel,string name,key id,string message){
if(channel==cancella)
{
//llSay(0,"ricevuto comando di sparire");
llDie();
}
}
}
Leave a comment