LSL - Linden Scripting Language Trabalhando com Scripts Parte 2 Monitora: Cintia Caetano Mestrado UFF – IC 2009/011 1 Eventos de toque touch_start(integer c) {} - ocorre sempre que um usuário clica no objeto que tem o script anexado. Touch(integer c){} – refere-se ao momento entre o pressionar o botão do mouse e liberalo. Touch_end(){} – é disparado no momento da liberação do botão do mouse. 2 2 Eventos de toque default { touch_start(integer c) { llSay(0, "Inicio de Toque"); } touch(integer c) { llSay(0,"Sendo Tocado"); } touch_end(integer c) { llSay(0,"Fim de Toque"); } } 3 3 llGetOwner llGetOwner() Retorna o valor de uma variável do tipo key que representa o UUID do proprietário. Exemplo: Key dono=llGetOwner(); 4 4 llDetectedKey llDetectedKey(numero); Função onde obtém-se a UUID de quem esta tocando nosso objeto. Ela recebe como parâmetro um valor inteiro, representando o número de pessoas ou objetos a qual queremos detectar a chave. Nota: somos obrigados a declarar uma variável do tipo integer nos eventos touches. Uma das funções da variável declarada é armazenar o número de pessoas que estão tocando o objeto. 5 5 llDetectedKey Nota: A variável declara no touch deve ser passada com parâmetro na função llDetectedKey. Apresenta o problema de adequação de índices, pois a variável declarada no touch começa sua contagem em 1 (nunca menor que isso). Se eu sou o primeiro a tocar serei o número 1, mas como a variável declarada no touch começar em 1, ele me comparará com o número 2. 6 6 llDetectedKey Exemplo sem adequação de índices : default { touch_start(integer c) { llSay(0, "O proprietário é: " + (string)llGetOwner()); llSay(0, "Tocado por: " + (string)llDetectedKey(c)); } } 7 7 Exercício 3 Scriptar os dois exemplos e verificar a diferença. default { touch_start() { llSay(0, "O proprietário é: " + (string)llGetOwner()); llSay(0, "Tocado por: " + (string)llDetectedKey(c-1)); } } 8 8 llDetectedKey Outro exemplo: default { touch_start(integer c) { integer number = 0; do llOwnerSay("A chave de quem me tocou é: " + (string) llDetectedKey(number)); while(c > ++number); } } 9 9 Exercício 4 default { touch_start(integer c) { key dono=llGetOwner(); key quem_toca=llDetectedKey((c - 1)); if (dono==quem_toca) { llSay(0,"Você é o dono do objeto"); } else { llSay(0,"Você não é o dono do objeto"); } } } 10 10 llSetTouchText A função llSetTouchText(string) serve para adequarmos o nome “touch” ou “tocar” com a função que realiza. Ao invés de clicar em tocar para abrir uma porta, você clica em “Abrir Porta”, isso com certeza é mais intuitivo. Atente que somente o nome da opção é alterado, codificamos os eventos touchs normalmente. 11 11 llSetTouchText default { state_entry() { llSetTouchText("Abre Porta"); } touch_start(integer c) { llSetTouchText("Fecha Porta"); } } Quando o objeto é iniciado, altera o nome “touch” para “Abrir”. Quando “abrimos nossa Porta”, o evento é alterado touch para alterar a opção para “Fechar”. 12 12 llSetText llSetText(string, cor, transparência); Coloca uma etiqueta acima do objeto, com o nome ou informações adicionais. Exemplo: llSetText(“Teste”, <0.0, 1.0, 0.0>, 1.0); 13 13 Cores em SL Representada por um vetor de floats. Proporção máxima, <255,255,255>, é a cor branca. A ausência de todas elas, <0,0,0>, é a cor preta. Nota: Se você multiplicar 255*255*255, vai chegar a um resultado de 16.581.375. Esse numero gigantesco, é o numero de tonalidades diferentes que você pode obter utilizando RGB. 14 14 Cores em SL No SL alterou a escala padrão RGB, que ao invés de ir de 0 á 255, vai 0.0 á 1.0. Então, temos que o branco em SL será representado por <1.0,1.0,1.0> e o preto por <0.0,0.0,0.0>. A transparência varia também de: 0.0 (transparente total) 1.0 (nenhuma transparência). 15 15 llGetRegionName / RegionFPS llGetRegionName(); Esta função retorna uma string contendo o nome da região onde você se encontra. llGetRegionFPS(); Retorna um valor do tipo float contendo o FPS (frames por segundo) da região. No SL, como a qualidade depende da conexão, FPS é útil para analisar a quantas andas a conexão com o servidor da Linden. 16 16 llGetScriptName / llSetObjectName / llGetObjectName llGetScriptName(); Retorna uma string contendo o nome do script. llSetObjectName(string); Esta função altera o nome do objeto, a qual o script esta inserido, para o nome passado como argumento. llGetObjectName(); Simplesmente retorna uma string contendo o nome do objeto a qual o script esta anexado. 17 17 llDie llDie(); Quando chamada, simplesmente “mata” o objeto a qual está anexada. É como se deletasse o objeto, porém o objeto não retorna ao inventario, é literalmente destruído. Nota: Esta é uma função que pode ser utilizada quando se planeja construir armas. 18 18 llSleep llSleep(segundos) Faz o script “dormir” (ou atrasar) pelo tempo em segundos passado como parâmetro. É como inserir um delay em nosso script. 19 19 Evento Timer Timer(){...} Esse é um evento que é ativado e ajustado por llSetTimerEvent(segundos). Este evento é disparado periodicamente, e então executa o código entre as chaves. 20 20 llSetTimerEvent llSetTimerEvent(segundos); Assim como llListen, o llSetTimerEvent ativa e configura um evento timer Ele respondera em um intervalo de tempo dado pelo valor passado como argumento da função. O tempo informado é em segundos, e um argumento de 0.0 segundos significa desativar o evento timer. 21 21 Exercício 5 default { state_entry() { llOwnerSay("Primeira Mensagem"); llSetTimerEvent(2.0); } timer() { llOwnerSay("2 Segundos se passaram desde a ultima mensagem"); } } 22 22 llResetTimer / llGetTime / llGetAndResetTime llResetTime() Reinicia o relógio do Script. llGetTime(); Retorna um float contendo o tempo em segundos desde o início do script, ou desde a última chamada da função llResetTime. llGetAndResetTime(); Esta função reúne as funcionalidades das duas anteriores. Retorna um float contendo o tempo decorrido e reinicia o relógio. 23 23 llResetScript / llRound llResetScript(); Em algumas situações, pode ser necessário que o script volte a seu estado inicial, como se estivéssemos voltando nosso objeto para o inventario e então utilizando-o novamente. llRound(valor); Esta função arredonda o valor passado. Seguindo a regra matemática de arredondamento, transforma o tipo float para inteiro. 24 24 llFrand llFrand(valor); Esta função retorna um valor do tipo float, ”aleatório”, no intervalo de 0 ao valor passado como argumento. Por exemplo: llFrand(10.0); //retorna um float que estará entre 0 e 10. llFrand(3.5); //retorna um float que estará entre 0 e 3.5. 25 25 llFrand default { state_entry() { llSetTimerEvent(2.0); } timer() { llSetColor(<llFrand(1.0),llFrand(1.0),llFrand(1.0)>, ALL_SIDES); } } 26 26 llDialog llDialog(pessoa, mensagem, botões, canal); Esta função abre uma janela de diálogo na tela da pessoa. Primeiro parâmetro – Key Segundo parâmetro – mensagem exibida Terceiro parâmetro – botões para a pessoa escolher. São passados na forma de uma lista de strings. Quarto parâmetro – quando a pessoa escolhe e clica em uma das opções, o nome do botão é dito através do canal. 27 27 llDialog Vantagens e desvantagens: Esta função é muito prática, pois evita que a própria pessoa tenha que dizer, em um determinado canal, o comando necessário para que o objeto execute alguma função. Quem utiliza a caixa de diálogo não precisa ter a mínima idéia de canal, comandos, etc. A desvantagem do llDialog() é que possui um delay de 1.0 segundo. 28 28 llDialog Observações Podemos ter, no máximo, 12 botões. O texto de cada botão deve ser do tipo string. O texto de cada botão esta limitado a 8 caracteres. Há a opção de ignorar a janela de diálogo, mas não temos controle sobre esta opção. 29 29 Exercício 6 key dono; //variável tipo key default { state_entry() { llSetText("Toque-me para Informacoes",<1.0,0.0,0.0>,1.0); llListen(-301,"","",""); //configura canal -301 dono=llGetOwner(); //dono recebe o key do dono do objeto } touch_start(integer c) { llDialog(dono, "Informacoes", ["FPS","RegionName", "ScriptName", "NomeObjeto", "MegaSena", "Comparar", "Destruir"], -301); //cria a caixa de diálogo } 30 30 Exercício 6 listen(integer canal,string nome,key id,string msg) { if(msg=="FPS") llOwnerSay((string)llGetRegionFPS()); //FPS da região if(msg=="RegionName") llOwnerSay(llGetRegionName()); //Nome da região if(msg=="ScriptName") llOwnerSay(llGetScriptName()); //Nome do Script if(msg=="NomeObjeto") llOwnerSay(llGetObjectName()); //Nome do Objeto 31 31 Exercício 6 //Se selecionar a opção gera palpites da MegaSena if(msg=="MegaSena") { integer c; string p=""; for(c=0;c<6;c++) //varia até 6, pois são 6 números da MegaSena { float x; integer i; x=llFrand(6.0); //retorna um valor aleatório entre 0 e 6 x*=10; //tira a vírgula do float i=llRound(x); //arredonda o valor p=p + "\t\t" + (string)i; //coloca em p cada valor encontrado } llOwnerSay(p); //qdo termina imprime os valores no canal público } 32 32 Exercício 6 llResetTime(); //Reinicia o relógio do script e executa o FOR com i++ for(i=0; i<999; i++) { } t=llGetTime(); //Coloca em t o tempo desde o ResetTime até agora p=p +"\t\ti++\t" + (string)t + "\n\t\t\t"; //coloca o tempo em p llResetTime(); //Reinicia o relógio do script e executa o FOR com i=i+1 for(i=0; i<999; i=i + 1) { } t=llGetTime(); //Coloca em t o tempo desde o ResetTime até agora p=p +"\t\ti=i+1\t" + (string)t + "\n\t\t\t"; //coloca o tempo em p 33 33 Exercício 6 llResetTime(); //Reinicia o relógio do script e executa o FOR com i=i+1 for(i=0; i<999; i=i + 1) { } t=llGetTime(); //Coloca em t o tempo desde o ResetTime até agora p=p +"\t\ti=i+1\t" + (string)t + "\n\t\t\t"; //coloca o tempo em p llResetTime(); //Reinicia o relógio do script e executa o FOR com i+=1 for(i=0; i<999; i+=1) { } t=llGetTime(); //Coloca em t o tempo desde o ResetTime até agora p=p +"\t\ti+=1\t" + (string)t + "\n\t\t\t"; //coloca o tempo em p llOwnerSay(p); //Imprime o tempo na tela } 34 34 Exercício 6 if(msg=="Destruir") llSetTimerEvent(3.0); //Ativa e configura o evento timer (3 segundos) } //Evento Timer timer() { llOwnerSay("Objeto " + llGetObjectName() + “Destruido"); //Comunica que o objeto será destruído llDie(); //Destrói o objeto } } 35 35 Para Casa A opção “MegaSena”, poderá ocorrer números repetidos no palpite. Implementar uma verificação, caso algum número estivesse repetido, chamar novamente llFrand afim de obter outro numero e, então, realizar nova verificação. 36 36 Bibliográfia Guia de Script no Second Life. By Valdinei Rodrigues dos Reis Creating Your World: The Official Guide to Advanced Content Creation for Second Life. by Aimee Weber, Kimberly Rufer-Bach and Richard Platel. Wiley Publishing, Inc. ISBN: 978-0-470-17114-1 Second Life For Dummies. By Sarah Robbins, Mark Bell. Wiley Publishing, Inc. ISBN: 978-0-470-18025-9. Second Life: o Guia Oficial. By A P Watt Ltd. Editora: Ediouro. Ano: 2007. Edição: 1. ISBN: 9788500019616. LSL Guide http://wiki.secondlife.com/wiki 37 37