Pyramid Rezzer a craft

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();
        }
    }
}
Advertisements
This entry was posted in LSL, Scripting avanzato. 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