<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-677784490173348227</id><updated>2012-02-16T13:48:13.608-08:00</updated><category term='libsecondlife'/><category term='Visual Studio'/><category term='Games In-World'/><category term='TortoiseSVN'/><category term='LSL'/><category term='Exemplos'/><category term='Bots'/><title type='text'>Hello, Avatar!</title><subtitle type='html'>The Vagner Beerbaum's programming experience @ Second Life.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://helloavatar.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://helloavatar.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_YK-I1cKIr2o/SeaBQRopZvI/AAAAAAAAAYc/AzowNGldjQU/S220/SouthVagner.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-677784490173348227.post-1174296430826543346</id><published>2009-03-24T22:25:00.000-07:00</published><updated>2009-03-24T22:33:46.139-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Exemplos'/><title type='text'>Exemplo Hyperlink</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Este script mostra como transformar um objeto num hyperlink (quase) convencional.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="color: rgb(0, 0, 153);"&gt;default&lt;br /&gt;{&lt;br /&gt;   state_entry()&lt;br /&gt;   {&lt;br /&gt;       llSetText("Acessar Hello, Avatar!", ‹1.,1.,1.›, 1.);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   touch_start(integer total_number)&lt;br /&gt;   {&lt;br /&gt;       llLoadURL(llDetectedKey(0), "",&lt;br /&gt;         "http://helloavatar.blogspot.com/");&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;Ao tocar no objeto, um navegador será aberto com o endereço especificado na função llLoadURL().&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/677784490173348227-1174296430826543346?l=helloavatar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helloavatar.blogspot.com/feeds/1174296430826543346/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=677784490173348227&amp;postID=1174296430826543346' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/1174296430826543346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/1174296430826543346'/><link rel='alternate' type='text/html' href='http://helloavatar.blogspot.com/2009/03/exemplo-link-url.html' title='Exemplo Hyperlink'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_YK-I1cKIr2o/SeaBQRopZvI/AAAAAAAAAYc/AzowNGldjQU/S220/SouthVagner.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-677784490173348227.post-6850939083570913157</id><published>2009-03-24T22:21:00.000-07:00</published><updated>2009-03-24T22:31:29.399-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Exemplos'/><title type='text'>Exemplo Sensor</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Este simples script demonstra como utilizar sensores para detectar a presença de agentes num determinado raio, sem a necessidade de contato "físico" com eles.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="color: rgb(0, 0, 153);"&gt;default&lt;br /&gt;{&lt;br /&gt;  state_entry()&lt;br /&gt;  {&lt;br /&gt;      llSetStatus(STATUS_PHANTOM, TRUE);&lt;br /&gt;      llSensorRepeat("", llGetOwner(), AGENT, 96, PI, .01);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  sensor(integer total_number)&lt;br /&gt;  {&lt;br /&gt;      llSetPos(llDetectedPos(0) + ‹-2.0, -1.5, 1.5›);&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Neste exemplo, a posição do objeto é reajustada tão logo ele perceba a presença do avatar, dando a impressão de segui-lo.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/677784490173348227-6850939083570913157?l=helloavatar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helloavatar.blogspot.com/feeds/6850939083570913157/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=677784490173348227&amp;postID=6850939083570913157' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/6850939083570913157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/6850939083570913157'/><link rel='alternate' type='text/html' href='http://helloavatar.blogspot.com/2009/03/exemplo-sensor.html' title='Exemplo Sensor'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_YK-I1cKIr2o/SeaBQRopZvI/AAAAAAAAAYc/AzowNGldjQU/S220/SouthVagner.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-677784490173348227.post-8165652547155136673</id><published>2009-03-24T22:13:00.000-07:00</published><updated>2009-03-24T22:18:56.172-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Exemplos'/><title type='text'>Exemplo Cores</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: arial;"&gt;Este exemplo muda a cor do objeto assim que ele é tocado, variando as intensidades de vermelho, verde e azul, até atingir a cor final.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="color: rgb(0, 0, 153);"&gt;default&lt;br /&gt;{&lt;br /&gt;   state_entry()&lt;br /&gt;   {&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   touch_start(integer total_number)&lt;br /&gt;   {&lt;br /&gt;       llSetTexture(&lt;br /&gt;       "59facb66-4a72-40a2-815c-7d9b42c56f60", ALL_SIDES);&lt;br /&gt;&lt;br /&gt;       float R = 0.; // vermelho&lt;br /&gt;       float G = 0.; // verde&lt;br /&gt;       float B = 0.; // azul&lt;br /&gt;       float inc = 1 / 25.5;&lt;br /&gt;      &lt;br /&gt;       while (R ‹ 1.)&lt;br /&gt;       {&lt;br /&gt;           llSetColor(‹(R += inc), 0., 0.›, ALL_SIDES);&lt;br /&gt;           llSleep(inc);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       while (G ‹ 1.)&lt;br /&gt;       {&lt;br /&gt;           llSetColor(‹0., (G += inc), 0.›, ALL_SIDES);&lt;br /&gt;           llSleep(inc);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       while (B ‹ 1.)&lt;br /&gt;       {&lt;br /&gt;           llSetColor(‹0., 0., (B += inc)›, ALL_SIDES);&lt;br /&gt;           llSleep(inc);&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/677784490173348227-8165652547155136673?l=helloavatar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helloavatar.blogspot.com/feeds/8165652547155136673/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=677784490173348227&amp;postID=8165652547155136673' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/8165652547155136673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/8165652547155136673'/><link rel='alternate' type='text/html' href='http://helloavatar.blogspot.com/2009/03/exemplo-cores.html' title='Exemplo Cores'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_YK-I1cKIr2o/SeaBQRopZvI/AAAAAAAAAYc/AzowNGldjQU/S220/SouthVagner.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-677784490173348227.post-5779616762171732058</id><published>2009-03-24T21:54:00.000-07:00</published><updated>2009-03-24T22:12:42.320-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Exemplos'/><title type='text'>Exemplo Colisão</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Este exemplo mostra como detectar colisões entre objetos.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="color: rgb(0, 0, 153);"&gt;vector pos;&lt;br /&gt;&lt;br /&gt;default&lt;br /&gt;{&lt;br /&gt; state_entry()&lt;br /&gt; {&lt;br /&gt;     pos = llGetPos();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; collision_start(integer total_number)&lt;br /&gt; {&lt;br /&gt;     llSetStatus(STATUS_PHANTOM, TRUE);&lt;br /&gt;&lt;br /&gt;     if (llDetectedType(0) &amp;amp; ACTIVE)&lt;br /&gt;     {&lt;br /&gt;         llSetPos(pos + ‹0, 0, 3›);&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; collision_end(integer total_number)&lt;br /&gt; {&lt;br /&gt;     llSleep(0.5);&lt;br /&gt;     llSetPos(pos);&lt;br /&gt;     llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;a) Inicialmente, a posição atual do objeto é salva para uso posterior.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;b) Quando uma colisão ocorrer, o objeto é definido como phantom (sim, do tipo que atravessa paredes) e movido para um pouco acima de sua posição inicial.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;c) Em seguida, ao não ter mais contato com outros objetos, este retorna para o estado de repouso inicial.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Para ilustrar esse script em ação, tenho um vídeo (bem tosco) de uma pista de corridas que fiz nas horas vagas:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="padding-left: 0px; display: none;" ontop="true"&gt;&lt;/div&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/TO23ydTIV04&amp;amp;hl=pt-br&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/TO23ydTIV04&amp;amp;hl=pt-br&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;O veículo, ao atingir uma estrela, desloca-a para cima e, então, cai novamente.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/677784490173348227-5779616762171732058?l=helloavatar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helloavatar.blogspot.com/feeds/5779616762171732058/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=677784490173348227&amp;postID=5779616762171732058' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/5779616762171732058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/5779616762171732058'/><link rel='alternate' type='text/html' href='http://helloavatar.blogspot.com/2009/03/exemplo-colisao.html' title='Exemplo Colisão'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_YK-I1cKIr2o/SeaBQRopZvI/AAAAAAAAAYc/AzowNGldjQU/S220/SouthVagner.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-677784490173348227.post-7369975482317335609</id><published>2009-03-24T21:44:00.000-07:00</published><updated>2009-03-24T21:52:33.274-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Exemplos'/><title type='text'>Exemplo Touch</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: arial;"&gt;Este é um código muito simples que demonstra como tratar o contato "físico" entre o objeto no qual o script está rodando e o agente.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="color: rgb(0, 0, 153);"&gt;default&lt;br /&gt;{&lt;br /&gt;   state_entry()&lt;br /&gt;   {&lt;br /&gt;       llSay(0, "Toque-me!");&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   touch_start(integer total_number)&lt;br /&gt;   {&lt;br /&gt;       llSay(0, "Tocado por " + llDetectedName(0));&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   touch(integer total_number)&lt;br /&gt;   {&lt;br /&gt;       llSay(0, "Objeto esta sendo tocado.");&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   touch_end(integer total_number)&lt;br /&gt;   {&lt;br /&gt;       llSay(0, "Objeto foi liberado.");&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/677784490173348227-7369975482317335609?l=helloavatar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helloavatar.blogspot.com/feeds/7369975482317335609/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=677784490173348227&amp;postID=7369975482317335609' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/7369975482317335609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/7369975482317335609'/><link rel='alternate' type='text/html' href='http://helloavatar.blogspot.com/2009/03/exemplo-touch.html' title='Exemplo Touch'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_YK-I1cKIr2o/SeaBQRopZvI/AAAAAAAAAYc/AzowNGldjQU/S220/SouthVagner.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-677784490173348227.post-6720433798182197124</id><published>2008-06-23T17:34:00.000-07:00</published><updated>2008-06-23T18:31:42.289-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games In-World'/><title type='text'>Jogo de Lógica em LSL e C#</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Este documento implementa um exemplo citado no livro "Dominando o Visual Studio .NET com C#" do Fábio Câmara. Trata-se de um jogo composto por vários botões sendo que, quando um deles é clicado, o mesmo e mais seus quatro adjacentes ortogonais têm sua cor alterada. O objetivo é deixar todos os botões com a mesma cor.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.linhadecodigo.com.br/artigos/img_artigos/VagnerCandidoSousa/QuebraCabe%C3%A7as/06jogando.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://www.linhadecodigo.com.br/artigos/img_artigos/VagnerCandidoSousa/QuebraCabe%C3%A7as/06jogando.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Para tanto, serão necessárias apenas duas primitivas, cada uma com um script específico, demonstrados a seguir. Uma primitiva representará os botões e deverá ser colocada no inventário da outra primitiva, a principal, que será análoga a um winform.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Hora de pegar na enxada.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Vamos começar criando uma primitiva que será a root. Para isto, basta clicar o botão direito no chão de alguma ilha que permita construção, como por exemplo a &lt;/span&gt;&lt;a style="font-family: arial;" href="http://slurl.com/secondlife/MLBR%20Arealivre/128/128/0" target="_blank"&gt;MLBR Área Livre&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, e clicar em "&lt;/span&gt;&lt;b style="font-family: arial;"&gt;Criar/Create&lt;/b&gt;&lt;span style="font-family:arial;"&gt;".&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Em seguida, na guia "&lt;span style="font-weight: bold;"&gt;Conteúdo/Content&lt;/span&gt;", criamos um novo script e introduzimos o primeiro código-fonte (sim, pode ser Ctrl+C, Ctrl+V). &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.linhadecodigo.com.br/artigos/pags_auxs/VagnerCandidoSousa/QuebraCabe%C3%A7as/scriptRootPrim.txt" target="_blank"&gt;&lt;b&gt;Código-fonte da primitiva principal&lt;/b&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Para facilitar, alguns fragmentos do código foram classificados e aqui estão suas respectivas explicações:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;ol  style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;Na declaração de variáveis, há o número de botões (16 no total, sendo 4 por lado) e as divisões do "formulário" (9, sendo 4 botões e 5 espaços).&lt;/span&gt;&lt;/li&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;Um vetor que será o tamanho dos botões, calculado em função do tamanho da primitiva principal.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-family: arial;font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;Ao iniciar a execução do script, o evento &lt;i style="color: rgb(204, 0, 0);"&gt;state_entry()&lt;/i&gt; ocorre, posicionando o objeto pouco mais acima e dimensionando-o para um tamanho maior.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-family: arial;font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;Neste ponto, quando o avatar tocar o objeto, o script solicitará permissão do usuário para modificar o agrupamento de objetos, já que o resultado final será um conjunto de primitivas e não as queremos "perdidas" por aí. Também há uma verificação que permite apenas ao dono do objeto (você) iniciar as ações.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-family: arial;font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;O evento &lt;i style="color: rgb(204, 0, 0);"&gt;run_time_permissions()&lt;/i&gt; ocorrerá quando a solicitação anterior for concedida. Como podemos ter uma única solicitação para várias permissões simultâneas combinadas pelo símbolo "&lt;span style="color: rgb(204, 0, 0);"&gt;|&lt;/span&gt;" (pipe), uma verificação é feita para nos certificarmos que se trata da desejada (note que a comparação é bit a bit, portanto, emprega-se o operador "&lt;span style="color: rgb(204, 0, 0);"&gt;&amp;amp;&lt;/span&gt;" - ampersand).&lt;/span&gt;&lt;/li&gt;&lt;span style="font-family: arial;font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;A função &lt;span style="color: rgb(0, 153, 0);"&gt;llGetScale()&lt;/span&gt; retorna as dimensões do objeto que contém o script e, daí, calcula-se o tamanho que os botões deverão ter. O cálculo pode tanto ser realizado diretamente no vetor como por suas componentes &lt;x, z=""&gt; isoladas.&lt;/x,&gt;&lt;/span&gt;&lt;/li&gt;&lt;span style="font-family: arial;font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;Não poderia faltar uma gambiarra. Em um form convencional, as propriedades Top e Left são relativas ao canto superior esquerdo da janela. No Second Life, as coordenadas estão localizadas no centro geométrico do objeto, daí a necessidade de "deslocá-lo" para o canto somando metade do seu tamanho menos meio botão.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-family: arial;font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;A posição de cada botão é determinada e o mesmo é criado. Note que as coordenadas y e z são decrementadas para que os botões sejam posicionados de cima para baixo e da esquerda para a direita, conforme o sentido indicado pela &lt;a href="http://pt.wikipedia.org/wiki/Regra_da_m%C3%A3o_direita" target="_blank"&gt;regra da mão direita&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-family: arial;font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;Efetivamente cria cada botão. Um detalhe importante é o número de identificação "i" passado pelo último parâmetro na função &lt;span style="color: rgb(0, 153, 0);"&gt;llRezObject()&lt;/span&gt;. Perceba também que o tamanho dos botões não faz parte dos parâmetros da função. Isto será resolvido (via outra gambiarra) a seguir.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-family: arial;font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;O evento &lt;i style="color: rgb(204, 0, 0);"&gt;object_rez()&lt;/i&gt;&lt;span style="color: rgb(204, 0, 0);"&gt; &lt;/span&gt;ocorre toda vez que um objeto é instanciado pela função &lt;span style="color: rgb(0, 153, 0);"&gt;llRezObject()&lt;/span&gt;. Nele, cada novo botão é incluído no agrupamento e, assim que o grupo estiver completo (após 16 ocorrências), uma mensagem é enviada para o conjunto. Esta mensagem será recebida pelo próximo script e leva o tamanho dos botões. Gambiarra rocks!&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/ol&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Neste momento, uma nova primitiva deve ser criada seguindo os mesmos passos anteriores, porém com o código que segue: &lt;/span&gt;&lt;b style="font-family: arial;"&gt;&lt;a href="http://www.linhadecodigo.com.br/artigos/pags_auxs/VagnerCandidoSousa/QuebraCabe%C3%A7as/scriptBotoes.txt" target="_blank"&gt;Código-fonte da primitiva botão&lt;/a&gt;.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Lembre-se que quando este segundo objeto estiver pronto, ele deverá ser copiado para o inventário do seu avatar (botão direito, "&lt;span style="font-weight: bold;"&gt;Take&lt;/span&gt;" ou "&lt;span style="font-weight: bold;"&gt;Take Copy&lt;/span&gt;") e então dali arrastado para o inventário do primeiro objeto, acessado através da guia "&lt;span style="font-weight: bold;"&gt;Conteúdo&lt;/span&gt;/&lt;span style="font-weight: bold;"&gt;Content&lt;/span&gt;" da janela de propriedades.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Novamente, seguem explicações para o segundo script:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;ol  style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;Conjunto de métodos que retornam números correspondentes aos vizinhos do botão passado como parâmetro.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-family: arial;font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;Método auxiliar que simplesmente comuta a cor do botão especificado entre verde e vermelho.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-family: arial;font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;O evento &lt;i style="color: rgb(204, 0, 0);"&gt;on_rez()&lt;/i&gt; ocorre quando um objeto é instanciado. Para uma instância arrastada diretamente do inventário do avatar, o parâmetro inicial é zero. Para instâncias criadas através da função &lt;span style="color: rgb(0, 153, 0);"&gt;llRezObject()&lt;/span&gt;, o parâmetro start_number corresponde ao "i" passado pelo outro script e nos ajuda a identificar cada botão. Esse número pode ser considerado como o pulo-do-gato deste segundo script.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-family: arial;font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;Define o nome do objeto, que também deve corresponder com o nome especificado na função &lt;span style="color: rgb(0, 153, 0);"&gt;llRezOject()&lt;/span&gt; do primeiro script para que o exemplo execute com perfeição.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-family: arial;font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;O evento &lt;i style="color: rgb(204, 0, 0);"&gt;link_message()&lt;/i&gt; ocorre quando algum objeto do agrupamento envia uma mensagem através da função llMessageLinked().&lt;/span&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;A primeira mensagem esperada é o tamanho dos botões, que foi enviada pelo script da primitiva principal.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;Note que foi usado &lt;span style="color: rgb(0, 153, 0);"&gt;(vector)llList2String()&lt;/span&gt; ao invés de somente &lt;span style="color: rgb(0, 153, 0);"&gt;llList2Vector()&lt;/span&gt;, pois esta última possui um bug conhecido e retorna &lt;span style="color: rgb(0, 153, 0);"&gt;ZERO_VECTOR&lt;/span&gt;. O mesmo ocorre com a função &lt;span style="color: rgb(0, 153, 0);"&gt;llList2Rot()&lt;/span&gt;, porém esta não foi usada neste exemplo.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;O evento &lt;i style="color: rgb(204, 0, 0);"&gt;touch_start()&lt;/i&gt; ocorre toda vez que algum avatar toca o objeto. Neste momento, os vizinhos do botão clicado são determinados e cinco mensagens são enviadas. Estas mensagens transportam a identificação de cada botão que deve ser alterado.&lt;/span&gt;&lt;/li&gt;&lt;span style="font-family: arial;font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;li style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;Ao receber cada mensagem enviada no item anterior, o script verifica se ele possui o mesmo número recebido e, caso afirmativo, chama o método para trocar de cor.&lt;/span&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;Como apenas o próprio botão clicado e seus vizinhos devem ter suas cores alteradas, o teste é necessário, pois este segundo script existirá em cada botão.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;font-family:arial;font-size:85%;"  &gt;Mais uma mensagem é enviada, porém somente ao objeto principal, avisando que um botão foi clicado.&lt;/span&gt;&lt;p style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;Esta mensagem será recebida pelo item onze do primeiro script que, por sua vez, perguntará aos botões se ainda há algum deles com a cor verde.&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;Ao receberem esta nova mensagem (item 9 do segundo script), qualquer botão que fornecer uma respota afirmativa para a primitiva principal anulará o prazo para recebimento de respostas (item 12 do primeiro script).&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:85%;"&gt;Caso o prazo exceda, significa que nenhuma resposta foi recebida, ou seja, todos os botões ficaram vermelhos, logo, o avatar venceu a partida.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Pronto. Agora basta sair do modo de edição, tocar na primitiva principal (levará alguns segundos) e se divertir. Para reiniciar o jogo, basta clicar numa área livre da primitiva.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Para quem preferir, aqui está o &lt;/span&gt;&lt;b style="font-family: arial;"&gt;&lt;a href="http://www.linhadecodigo.com.br/artigos/downloads/VagnerCandidoSousa/FontesJogoLogica.zip" target="_blank"&gt;link para download&lt;/a&gt;&lt;/b&gt;&lt;span style="font-family:arial;"&gt; dos fontes. Também são interessantes o client do Second Life e o &lt;/span&gt;&lt;b style="font-family: arial;"&gt;&lt;a href="http://www.lsleditor.org/" target="_blank"&gt;LSL Editor&lt;/a&gt;&lt;/b&gt;&lt;span style="font-family:arial;"&gt; (este último precisa do .NET Framework 2.0 instalado).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/677784490173348227-6720433798182197124?l=helloavatar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helloavatar.blogspot.com/feeds/6720433798182197124/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=677784490173348227&amp;postID=6720433798182197124' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/6720433798182197124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/6720433798182197124'/><link rel='alternate' type='text/html' href='http://helloavatar.blogspot.com/2008/06/jogo-de-lgica-em-lsl-e-c.html' title='Jogo de Lógica em LSL e C#'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_YK-I1cKIr2o/SeaBQRopZvI/AAAAAAAAAYc/AzowNGldjQU/S220/SouthVagner.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-677784490173348227.post-3542523000365886292</id><published>2008-05-31T23:04:00.000-07:00</published><updated>2008-05-31T23:15:45.472-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TortoiseSVN'/><category scheme='http://www.blogger.com/atom/ns#' term='libsecondlife'/><category scheme='http://www.blogger.com/atom/ns#' term='Bots'/><title type='text'>Criação de Bots Pt.1</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;Bots: Avatares autônomos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Primeiramente, um bot é um avatar, porém controlado por software.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;O termo bot aplica-se quando um avatar efetua login e age de maneira autônoma, sem intervenção do usuário. O mesmo avatar pode ou não ser um bot, dependendo da maneira como ele se conectou ao mundo virtual.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Em termos técnicos, uma aplicação escrita em (por exemplo) C# usa funções da biblioteca libsecondlife para gerenciar o bot, desde o seu login, interação com o ambiente, objetos e outros usuários, até o momento em que efetua o logout.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;A libsecondlife&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;O projeto &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.libsecondlife.org/" target="_blank"&gt;libsecondlife&lt;/a&gt;&lt;span style="font-family:arial;"&gt; foca a compreensão do funcionamento do Second Life sob uma perspectiva técnica, além da sua integração com a web tradicional. &lt;/span&gt;&lt;span style="font-family:arial;"&gt;Para os apressados, a lib pode ser obtida já &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.libsecondlife.org/builds/" target="_blank"&gt;compilada&lt;/a&gt;&lt;span style="font-family:arial;"&gt; (em formato binário), restando apenas a tarefa de referenciá-la no projeto do bot e usar suas classes.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Como estamos tratando de programação, é claro que vamos pelo caminho mais complicado. Afinal, por quê simplesmente usar uma biblioteca se temos acesso ao código-fonte e podemos compilá-lo com as próprias mãos?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;Pré-requisitos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;No entanto, para a criação de bots, há alguns requisitos. É necessário um ambiente de programação e, como estou usando o janelão, sugiro o &lt;/span&gt;&lt;a style="font-family: arial;" href="http://msdn.microsoft.com/pt-br/express/aa975050.aspx" target="_blank"&gt;Visual C# Express&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, que é gratuito e pode ser obtido no site da Microsoft. Certifique-se de ter o framework .NET 2.0 ou superior instalado, além dos service packs.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;No site do projeto há também instruções para os sistemas operacionais &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.libsecondlife.org/wiki/Getting_Started" target="_blank"&gt;Mac OS e Linux&lt;/a&gt;&lt;span style="font-family:arial;"&gt; \o/.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Também será necessário instalar o &lt;/span&gt;&lt;a style="font-family: arial;" href="http://downloads.sourceforge.net/tortoisesvn/TortoiseSVN-1.4.8.12137-win32-svn-1.4.6.msi?download" target="_blank"&gt;TortoiseSVN&lt;/a&gt;&lt;span style="font-family:arial;"&gt; para obtermos o código-fonte diretamente da web. Opcionalmente, há o plug-in para o idioma &lt;/span&gt;&lt;a style="font-family: arial;" href="http://downloads.sourceforge.net/tortoisesvn/LanguagePack-1.4.8.12137-win32-pt_BR.exe?download" target="_blank"&gt;português&lt;/a&gt;&lt;span style="font-family:arial;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Para os não-iniciados, um source-control permite que várias pessoas trabalhem num mesmo código, de maneira organizada. A grosso-modo, temos um projeto compartilhado onde posso, por exemplo, marcar um arquivo para edição. Assim que concluir a modificação, libero-o para os demais usuários. Caso alguém tente acessar o mesmo arquivo a qualquer momento, o fonte obtido será sempre a última versão liberada.&lt;br /&gt;&lt;br /&gt;Vamos para a segunda parte.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/677784490173348227-3542523000365886292?l=helloavatar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helloavatar.blogspot.com/feeds/3542523000365886292/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=677784490173348227&amp;postID=3542523000365886292' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/3542523000365886292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/3542523000365886292'/><link rel='alternate' type='text/html' href='http://helloavatar.blogspot.com/2008/05/criao-de-bots-pt1_31.html' title='Criação de Bots Pt.1'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_YK-I1cKIr2o/SeaBQRopZvI/AAAAAAAAAYc/AzowNGldjQU/S220/SouthVagner.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-677784490173348227.post-1674061938543874998</id><published>2008-05-31T22:54:00.000-07:00</published><updated>2008-05-31T23:02:56.135-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='libsecondlife'/><category scheme='http://www.blogger.com/atom/ns#' term='Bots'/><title type='text'>Criação de Bots Pt.2</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: arial; font-weight: bold;"&gt;Obtendo a lib&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;Instalados o Visual C# e o TortoiseSVN, seguem os &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.libsecondlife.org/wiki/Getting_Started#Windows" target="_blank"&gt;demais passos&lt;/a&gt;&lt;span style="font-family: arial;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;1. Coloque Delicate Sound of Thunder do Pink Floyd para tocar (senão não compila).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;2. Criar uma pasta C:\dev e uma subpasta C:\dev\libsecondlife&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;3. Clicar o botão direito sobre a subpasta libsecondlife e escolher SVN Checkout.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;4. Colocar svn://opensecondlife.org/libsl/trunk no campo URL of Repository.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;5. Clique OK e aguarde o recebimento dos arquivos.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;6. Em dev\libsecondlife\libsecondlife, abra um dos arquivos .sln ou .proj.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;7. No Visual C#, em Solution Explorer, clique direito em Solution 'libsecondlife' e em Build Solution.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;8. Busque uma cerveja (para compilar em modo otimizado).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial; font-weight: bold;"&gt;Criando um projeto&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;Vamos então conceber a criança. Na &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.libsecondlife.org/wiki/Use_libSL_to_login_to_the_SL_grid#Step_One" target="_blank"&gt;documentação oficial&lt;/a&gt;&lt;span style="font-family: arial;"&gt;, é sugerido criar um novo projeto na própria solução libsecondlife. Se alguém preferir criar uma solução nova para os testes, à vontade.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;1. No Visual Studio (ou Visual C#, ou VC# como vou usar adiante), localize o painel Solution Explorer, clique o botão direito e selecione Add -&gt; New Project.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;2. Na caixa New Project, selecione Empty Project, nomeie-o como MyFirstBot e confirme em OK.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;Os próximos passos são os mais importantes em muitos projetos, pois nos permite usar classes e funções disponíveis em bibliotecas externas ao projeto (produtos de terceiros, por exemplo).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;3. No projeto MyFirtsBot criado, clique o direito sobre References e selecione Add Reference.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;4. Na aba Projects, selecione libsecondlife na lista e confirme. Se você optou por criar uma nova solução para o projeto do bot, vá até a aba Browse e localize o arquivo C:\dev\libsecondlife\bin\libsecondlife.dll.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;5. Clique direito no projeto MyFirstBot e vá em Add -&gt; New Item.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;6. Selecione o template Class, nomeie o arquivo como MyFirstBot.cs e confirme clicando em Add.&lt;br /&gt;&lt;br /&gt;Essa parte foi tranqüila. Vamos para a terceira.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/677784490173348227-1674061938543874998?l=helloavatar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helloavatar.blogspot.com/feeds/1674061938543874998/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=677784490173348227&amp;postID=1674061938543874998' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/1674061938543874998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/1674061938543874998'/><link rel='alternate' type='text/html' href='http://helloavatar.blogspot.com/2008/05/criao-de-bots-pt2.html' title='Criação de Bots Pt.2'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_YK-I1cKIr2o/SeaBQRopZvI/AAAAAAAAAYc/AzowNGldjQU/S220/SouthVagner.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-677784490173348227.post-5049403805655856539</id><published>2008-05-31T22:40:00.000-07:00</published><updated>2008-05-31T22:53:56.525-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='libsecondlife'/><category scheme='http://www.blogger.com/atom/ns#' term='Bots'/><title type='text'>Criação de Bots Pt.3</title><content type='html'>&lt;span style=";font-family:arial;font-size:85%;"  &gt;&lt;span style="font-weight: bold;"&gt;Codificando o bot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Embora tenha seguido o how-to até agora, vou simplificar o texto. Qualquer dúvida, os links originais são sempre citados, os comentários estão habilitados e minha disposição é sempre positiva.&lt;br /&gt;&lt;br /&gt;Obviamente, os passos anteriores devem ter sido bem-sucedidos e é necessário conhecer a linguagem de programação C# (outras como VB.NET ou C++ também são possíveis).&lt;br /&gt;&lt;br /&gt;Coloque o álbum A Night At The Opera do Blind Guardian e vamos programar.&lt;br /&gt;&lt;br /&gt;1. Primeiramente, podemos acrescentar o namespace libsecondlife para simplificar a codificação, incluindo no topo do arquivo-fonte:&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;using libsecondlife;&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;2. Em seguida, declarar um objeto membro da classe MyFirstBot que será a própria instância do Second Life em execução e que fará todas as ações.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;static SecondLife client = new SecondLife();&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;3. Precisamos também de um ponto de entrada para nossa aplicação, ou seja, um método capaz de iniciar todas as atividades necessárias.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;public static void Main()&lt;br /&gt;{&lt;br /&gt;}&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;4. Pela sua característica assíncrona, a ocorrência de muitas coisas é tratada através de algum evento correspondente. Podemos, por exemplo, identificar quando algum contato tornou-se on-line, quando o grid caiu ou quando recebemos um pedido de amizade e, então, tomar as providências necessárias.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Em termos de programação, é necessário acrescentar um handler (manipulador) de eventos que aponta para o método a ser executado quando algo previsto ocorrer. Para identificar quando o bot logou, incluímos no código a linha:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;client.Network.OnConnected += new&lt;br /&gt;   NetworkManager.ConnectedCallback(Network_OnConnected);&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;5. Ao digitar o += pressione a tecla TAB duas vezes para gerar o método associado automaticamente. Caso contrário, digite manualmente. Teremos então:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;static void Network_OnConnected(object sender)&lt;br /&gt;{&lt;br /&gt; throw new Exception&lt;br /&gt;   ("The method or operation is not implemented.");&lt;br /&gt;}&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;6. Se usou o TAB, exclua a linha "throw new Exception..."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;7. De volta ao método Main(), abaixo da linha do handler vai o código responsável pelo login do avatar. Substitua os parâmetros nome, sobrenome e senha por valores válidos.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;if (client.Network.Login("nome", "sobrenome",&lt;br /&gt;      "senha", "My First Bot", ""))&lt;br /&gt;{&lt;br /&gt;  Console.WriteLine("Bot logado com sucesso");&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;  Console.WriteLine("Falha no login: "&lt;br /&gt;     + client.Network.LoginMessage);&lt;br /&gt;}&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;8. No método Onconnected() acrescentamos um código para simplesmente dizer um "Olá, mundo" já dentro do Second Life.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;static void Network_OnConnected(object sender)&lt;br /&gt;{&lt;br /&gt;  client.Self.Chat("Ola, mundo", 0, ChatType.Normal);&lt;br /&gt;  client.Network.Logout();&lt;br /&gt;}&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;O bot aparecerá no seu local de nascimento normalmente e, dependendo da sua configuração, poderá ser o último local onde o avatar foi deixado ou um ponto pré-definido.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;9. Ainda no método anterior, o bot é deslogado.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Certifique-se de que o MyFirstBot será o projeto executado dentre os demais da solução clicando o direito sobre o projeto (no Solution Explorer) e selecionando Set As StartUp Project. MyFirstBot deverá ser mostrado em negrito.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;10. Rode o projeto, coloque Apocalyptica para tocar e busque mais cerveja.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Agora é explorar a classe SecondLife e o que ela oferece. Praticamente tudo o que for possível de se fazer in-world. Segue meu código completo:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;using System;&lt;br /&gt;using libsecondlife;&lt;br /&gt;&lt;br /&gt;namespace MyFirtsBot&lt;br /&gt;{&lt;br /&gt;class MyFirstBot&lt;br /&gt;{&lt;br /&gt;  static SecondLife client = new SecondLife();&lt;br /&gt;&lt;br /&gt;  public static void Main()&lt;br /&gt;  {&lt;br /&gt;    client.Network.OnConnected += new&lt;br /&gt;        NetworkManager.ConnectedCallback&lt;br /&gt;        (Network_OnConnected);&lt;br /&gt;&lt;br /&gt;    if (client.Network.Login("nome", "sobrenome",&lt;br /&gt;          "senha", "My First Bot", ""))&lt;br /&gt;    {&lt;br /&gt;      Console.WriteLine("Bot logado com sucesso");&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;      Console.WriteLine("Falha no login: "&lt;br /&gt;          + client.Network.LoginMessage);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  static void Network_OnConnected(object sender)&lt;br /&gt;  {&lt;br /&gt;    client.Self.Chat("Ola, mundo", 0, ChatType.Normal);&lt;br /&gt;    client.Network.Logout();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Simples.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/677784490173348227-5049403805655856539?l=helloavatar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helloavatar.blogspot.com/feeds/5049403805655856539/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=677784490173348227&amp;postID=5049403805655856539' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/5049403805655856539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/5049403805655856539'/><link rel='alternate' type='text/html' href='http://helloavatar.blogspot.com/2008/05/criao-de-bots-pt3.html' title='Criação de Bots Pt.3'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_YK-I1cKIr2o/SeaBQRopZvI/AAAAAAAAAYc/AzowNGldjQU/S220/SouthVagner.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-677784490173348227.post-4282117265232128258</id><published>2008-05-31T20:21:00.001-07:00</published><updated>2008-05-31T20:32:06.868-07:00</updated><title type='text'>O Propósito</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Aqui estamos novamente. Resolvi criar um novo blog para atacar mais a fundo a programação para Second Life e sua integração com a web. Sim, afinal, o metaverso da californiana Linden Labs não está restrito apenas a ele mesmo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Minha birra com as produções atuais são as ilhas do tipo "visite e não volte", que até são bem modeladas, mas pouco oferecem em termos de interação. E interação, entendo eu, não significa uma casa virtual com portas que se abrem quando o avatar as toca.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Vejamos o Second Life como um eliminador de barreiras geográficas de baixo custo. Some a isso as novas tendências da web de se orientar para o Creative Commons, como a Wikipédia, no qual a comunidade participa da criação. Daí, podemos começar a compreender os ambientes virtuais como ferramentas para facilitar a integração humana - ou interação, se preferir.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Interação com simples objetos que sequer existem no mundo real? Não, obrigado. Meu horizonte é um pouco mais infinito que isso e não é por essa direção que pretendo trilhar este blog. Tentarei, conforme possível, propiciar aos interessados um conjunto de ferramentas conceituais capaz de torná-los hábeis a participar desta criação comunitária. Por isso, os tópicos abordados serão predominantemente técnicos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Sigam-me os bons!&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/677784490173348227-4282117265232128258?l=helloavatar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helloavatar.blogspot.com/feeds/4282117265232128258/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=677784490173348227&amp;postID=4282117265232128258' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/4282117265232128258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/677784490173348227/posts/default/4282117265232128258'/><link rel='alternate' type='text/html' href='http://helloavatar.blogspot.com/2008/05/o-propsito_31.html' title='O Propósito'/><author><name>Vagner (Uru)</name><uri>http://www.blogger.com/profile/09464783714190699455</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_YK-I1cKIr2o/SeaBQRopZvI/AAAAAAAAAYc/AzowNGldjQU/S220/SouthVagner.JPG'/></author><thr:total>0</thr:total></entry></feed>
