Tutorial de NPCs!
Conhecendo a verdadeira origem dos NPCs!
Índice:
Explicaremos:
focus
talk_start
following
atacking
Variáveis
Variáveis que indicam a conversa
Storage Value em NPCs
Algumas funções
focus
O focus está presente em vários lugares do NPC:
No início:
focus = 0
Nas conversas:
if msgcontains(msg, 'spear') and focus == cid then
Na função de andar:
if focus == 0 then
O focus indica quando estamos(ou se estamos) interagindo com o NPC.
focus = 0
Quando o focus for 0 quer dizer que não estamos interagindo com o NPC.
focus = cid
Quando o focus for cid quer dizer que estamos interagindo com o NPC.
Quer um exemplo?
Dêem uma olhada no início de conversa de algum NPC(hi).
if ((string.find(msg, '(%a*)hi(%a*)')) and (focus == 0)) and getDistanceToCreature(cid) < 3 then
selfSay('Welcome to the finest weaponshop in the land, ' .. creatureGetName(cid) .. '!')
focus = cid
talk_start = os.clock()
end
O if(olhar tutorial "Explicando os 'if's") está indicando que se o player falar hi e o focus for 0(não está falando com ninguem) o NPC fará as seguintes funções acimas inclusive transformar o focus em cid(indica que está falando com alguem).
talk_start
O talk_start também está presente em várias partes do NPC.
Vejam o exemplo lá em cima(explicando o focus)
talk_start = os.clock()
Ele também está presente em todas as funções de conversa.
if msgcontains(msg, 'offers') and focus == cid then
selfSay('My offers are weapons, only.')
talk_start = os.clock()
end
O talk_start indica se estamos conversando com o NPC.
Então quando o player diz "hi" e o focus for 0, o NPC transforma o talk_start em os.clock
E quando o player diz "bye" e o focus for cid, o NPC transforma o talk_start em 0.
(Mas se o talk_start é 0, como vou falar "hi" com o NPC?)
Simples. É que quando o player fala "hi" há uma excessão.
Perceba no início de interação com o NPC(hi)
if ((string.find(msg, '(%a*)hi(%a*)'))
Quando há esse string.find quer dizer que o NPC responderá independentemente do talk_start.
Quando o talk_start for os.clock geralmente usa-se o:
if msgcontains(msg, 'mensagem dã')
Following
Você geralmente só encontra o "following" no início do script.
following = false
O following indica se o NPC vai seguir o player que está falando com ele(focus = cid).
Atacking
Você geralmente só encontra o "atacking" no início do script.
atacking = false
O atacking indica se o NPC vai atacar o player que está falando com ele(focus = cid).
Variáveis
Todo mundo já ouviu falar em variáveis na matemática(suponho) que geralmente são a ##### dos x e y.
Cada uma das letras indica um número, pois com os NPCs é semelhante ou quase igual.
As variáveis geralmente indicam funções.
Vamos pegar um exemplo de variável:
randmove = math.random(1,20)
A variável é o randmove que significa math.random(1,20)(sortiar um número de 1 a 20).
Então toda vez que aparecer a palavra randmove(variável) no script, o NPC irá sortiar um número de 1 a 20.
As variáveis não servem só para indicar funções, também servem para indicar números e palavras.
Exemplo:
if msgcontains(msg, 'carlin sword') and focus == cid then
item = 2395
price = 473
selfSay('Do you want to buy one of the excellent carlin swords for ' .. price .. ' gold?')
talk_start = os.clock()
end
if string.find(msg, '(%a*)yes(%a*)') and focus == cid then
buy(cid,item,1,price)
talk_star = os.clock()
end
Viu as variáveis aparecendo aí como números? ^^
Obs.: Para usar as variáveis de números/palavras em falas do NPC você tem que fazer assim:
SelfSay(' ' .. variável .. ' ')
Variáveis que indicam conversa
Variáveis vocês já sabem o que são, então.
Vamos aprender a usar as variáveis que indicam a conversa.
Geralmente as variáveis de conversa são denominadas: talk_count, talk_state, settalk
Claro, não é obrigatório possuir esses nomes.
Então vamos a um exemplo:
if msgcontains(msg, 'crystal') and focus == cid then
talkset = 1
selfSay('Do you want to change 100 platinum coins for 1 crystal coin?')
talk_start = os.clock()
end
if talkset == 1 then
if msgcontains(msg, 'yes') and focus == cid then
talkset = 0
itemstatus = sell(cid,2148,100,0)
if itemstatus == -1 then
selfSay('You don\'t have enough money!')
else
buy(cid,2152,1,0)
talk_start = os.clock()
end
end
end
Quando o player falar "crystal" o NPC vai indicar que o talkset é 1.
O if embaixo(ler tutorial "Explicando os 'if's") indica que se o talkset for 1 e a fala do player for yes o NPC fará as seguintes funções.
Obs.: Lembrem, mais 1 "if", mais um "end".
Storage Value em NPCs
Muita gente conhece o Storage Value de actions para quests, eles indicam dentro do script do player se ele já fez a quest com o Storage Value determinado.
Nos NPCs é semelhante, ou melhor, igual.
Um exemplo:
if msgcontains(msg, 'quest') and focus == cid then
queststatus = getPlayerStorageValue(cid,1234)
if queststatus == -1 then
buy(cid,1452,1,0)
setPlayerStorageValue(cid,1234,1)
else
selfSay('Você já fez a quest')
talk_start = os.clock()
end
end
(se você ainda não leu a ##### do tutorial "Explicando os 'if's", sugiro ler agora)
queststatus é uma variável que determina a função de verificar o Storage Value no player.
Então essa funçao significa que se o player não tiver feito a quest(queststatus == -1) o NPC fará as seguintes funções e se o player já tiver feito a quest o NPC falará "Você já fez a quest".
Algumas funções
Ao decorrer do tópico eu expliquei algumas funções, então esse sub-título era desnecessário ^^.
Creditos:
- maxmachado
- Luis Furioso
Abraços.