Aprofundamento em Aurora Toolset #3 - Listen Patterns Escrito por Tripa.Seca. Introdução Antes que me perguntem "Mas Tripa pra que diabos serve isso?" vou responder já. É com as Listen Patterns que você pode fazer inúmeros tipos de situações que envolvem reações provocadas através de 'falas'. Como assim??? É com este tipo de script que podemos criar portas que se destravem mediante uma senha dita pelo player, fazer com que um NPC alerte um guarda, etc. Apesar do exemplo simples que utilizarei aqui esta ferramenta é muito poderosa e ampla, basta botar sua mente pra funcionar. Antes preciso dar uma pequena explicação sobre o evento OnUserDefined. 1. Um Pouco Sobre OnUserDefined O evento OnUserDefined é um evento padrão para todos os objetos dentro de um módulo (criaturas, áreas, placeables, triggers, etc), mas vou tratar apenas deste evento em criaturas. Este evento serve para que você defina ações que a criatura irá tomar em determinado acontecimento, sem ter que alterar os outros scripts da criatura. Estes 'acontecimentos' são definidos no script de OnSpawn da criatura. Abra o script nw_c2_default9 e procure pelas linhas abaixo: //SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT); //SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT); //SetSpawnInCondition(NW_FLAG_ATTACK_EVENT); //SetSpawnInCondition(NW_FLAG_DAMAGED_EVENT); //SetSpawnInCondition(NW_FLAG_DISTURBED_EVENT); //SetSpawnInCondition(NW_FLAG_END_COMBAT_ROUND_EVENT); //SetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT); //SetSpawnInCondition(NW_FLAG_DEATH_EVENT); São estas linhas que definem a quais eventos a criatura reagirá e quais ela não reagirá. Assim se você quiser que a criatura faça uma ação quando ela for atacada, basta dar um 'uncomment' (tirar as \\) na linha //SetSpawnInCondition(NW_FLAG_ATTACK_EVENT). Você também pode criar seus próprios eventos, como veremos adiante. Com os exemplos que seguirão essa parte irá ficar mais clara. 2. Usando Listten Patterns Voltamos ao assunto de nosso artigo. Para ilustrar este artigo criei um exemplo em que acontece o seguinte: . Existem cidadãos e guardas em uma mesma área; . Se o player atacar um cidadão, este irá chamar por guardas; . Se um guarda estiver próximo o suficiente para ouvir o pedido do cidadão, o guarda virá até o local em que o cidadão se encontra; . Se o player chamar por guardas (escrevendo GUARDAS!!!) e o guarda ouvir, o guarda se dirigirá até o local em que o player se encontra. Como eu disse é um exemplo simples, mas você pode criar inúmeras utilidades para as Listen Patterns. Este exemplo foi a base da construção do meu Sistema Anti-Thief. O papo tá bom, mas você ainda não disse como eu faço tudo isso... Vamos lá, vou fazer um passo-a-passo, então abra o Toolset e mãos a obra. 01. Crie uma área vazia 4x4 em qualquer tileset que desejar. 02. Vá na palheta de criaturas: NPCs > Humam > Commoner, Male. Clique com o botão direito e escolha Edit Copy 03. Primeira coisa a se fazer: vá na tab Advanced e clique em Immortal. Assim você via poder bater a vontade no NPC que ele não vai morrer. 04. Agora a parte legal, vá na tab Scripts e edite o script que estiver no evento OnSpawn. 05. Como explicado anteriormente, 'uncomment' as linhas: SetSpawnInCondition(NW_FLAG_DAMAGED_EVENT); SetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT); Isto fará com que possamos criar ações para os eventos OnDamaged e OnDialog dentro do OnUserDefined. 06. Acione na ultima linha o comando ActionRandomWalk(); (isto serve para que o NPC fique andando aleatoriamente pelo cenário). 07. Salve o script com o nome sp_cidadao 08. Feche o editor de script. Volte a tab de scripts do NPC e edite o script que estiver em OnUserDefined. 09. Se o script estiver apenas com 'void main()' escrito dentro dele, apague tudo. Agora procure o botão Templates no canto superior direito do editor. Dê um duplo clique em 'user defined events'. Se tudo correr bem, você terá o 'esqueleto' do script agora, com os eventos já demarcados. 10. Procure a linha do evento DAMAGED. Escreva a seguinte linha dentro deste evento: else if(nUser == 1006) // DAMAGED { SpeakString("GUARDAS!!!"); } 11. Salve o script com o nome ud_cidadao. 12. Feche a edição do NPC, e adicione uns 3 ou 4 deles na área. O Que Fizemos Com o Cidadão? O que fizemos foi basicamente o seguinte: o NPC irá reagir a qualquer dano que alguém cause nele (não importa de onde provenha o dano) falando a frase 'GUARDAS!!!'. Se quiser salvar o módulo e testá-lo agora pode fazê-lo. Abra o módulo no NwN, golpeie um NPC e veja ele falar a frase 'GUARDAS!!!'. 13. Repita os passos 02, 03 e 04, editando a criatura Neverwintan Militia. 14. DETALHE IMPORTANTE: Vá até a tab Advanced. Ao lado do botão edit factions ficam listadas as facções. Troque a facção do guarda para Merchant. Não deixe Comonner, Hostile e nem Defender, se não o script não funcionará corretamente. 15. Repita os passos 05 com o guarda, mas dê 'uncomment' apenas na linha: SetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT); 16. Repita o passo 06. 17. Adicione também a seguinte linha ao script: SetListenPattern(OBJECT_SELF, "GUARDAS!!!", 1000); 18. Salve o script como sp_guarda. 19. Repita os passos 08 e 09. 20. Procure a linha DIALOGUE. Insira as linhas a seguir: else if(nUser == 1004) // ON DIALOGUE { object oPC = GetLastSpeaker(); if(GetListenPatternNumber()==1000 && GetObjectHeard(oPC)){ SpeakString("Estou indo!"); ClearAllActions(); ActionForceMoveToObject(oPC, TRUE); ActionWait(5.0); ActionRandomWalk(); } } 21. Salve o script com o nome ud_guarda. 22. Feche a edição do NPC, e adicione 2 ou 3 deles na área. O Que Fizemos Com o Guarda? O que fizemos foi: fizemos com que o guarda dispare o evento OnDialogue, o que o faz reagir a qualquer coisa que ele ouça. Mas não queremos que ele reaja a qualquer coisa, queremos que ele reaja mediante a frase 'GUARDAS!!!'. Para isso criamos uma Listen Pattern dentro do OnSpawn do guarda. Esta Listen Pattern associa a fala 'GUARDAS!!!' ao número 1000. Atente agora ao script do OnUserDefined. O que ele faz? Faz com que o guarda somente reaja à frase 'GUARDAS!!!' (GetListenPatternNumber()==1000), e se ele for capaz de ouvir quem pronunciou-a (GetObjectHeard(oPC)). Se estas duas condições forem atendidas, o guarda se move até o local de quem pronunciou a frase, aguarda 5 segundos e começa a andar aleatoriamente novamente. Nosso trabalho está finalizado! Agora você já pode salvar o módulo e testá-lo. Dúvidas e sugestões, procurem o fórum de Neverwinter Nights em nossa comunidade. |