Postado Junho 13, 2017 8 anos Olá novamente. Como vocês sabem, eu sou um completo asno em programação e estou tendo problemas mais uma vez com um script que bolei aqui para ser uma espécie de "oráculo" específico de uma vocação (id = 1). Não há erros no console do servidor, o NPC é invocado normalmente, ele reconhece minha saudação "hi" (referente ao trecho do código: 'Cuidado, |PLAYERNAME|, isto não é lugar para crianças. Apenas um {guerreiro} deveria estar aqui.'), mas nenhuma das outras palavras-chave surtem algum efeito, o que me faz pensar que minha função esteja errada, mas minha ignorância não me permite dizer algo mais do que isso. Segue o script.lua: Obs: Utilizo o TFS 0.4.0 local npcHandler = NpcHandler:new(keywordHandler) local keywordHandler = KeywordHandler:new() NpcSystem.parseParameters(npcHandler) function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end npcHandler:setMessage(MESSAGE_GREET, 'Cuidado, |PLAYERNAME|, isto não é lugar para crianças. Apenas um {guerreiro} deveria estar aqui.') function creatureSayCallback(cid, type, msg) local pos = getCreaturePosition(getNpcCid()) local West = {x=pos.x-1,y=pos.y,z=pos.z} if not npcHandler:isFocused(cid) then return false elseif msgcontains(msg, 'guerreiro') then npcHandler:say('Você está interessado em se tornar um guerreiro? Uma vez iniciado, você não poderá voltar atrás.', cid) if msgcontains(msg, 'sim') then if (getPlayerVocation(cid) == 0) then if getPlayerStorageValue(cid,9500) == -1 then npcHandler:say('Você deve antes provar seu valor de combate. Me mostre se é capaz de destruir isto...', cid) doSummonCreature('Training Target', West) else npcHandler:say('Você parece levar jeito e será iniciado na classe de guerreiro. Veja, há um baú no posto logo acima. Tenho certeza que ali ainda deve haver algum equipamento básico de guerreiro para você.') setPlayerSetVocation(cid,1) setPlayerStorageValue(cid,9500,1) if getPlayerStorageValue(cid,8415,1) then SetPlayerStorageValue(cid,8412,1) SetPlayerStorageValue(cid,8415,0) elseif getPlayerStorageValue(cid,8410,1) then SetPlayerStorageValue(cid,8411,1) SetPlayerStorageValue(cid,8410,0) elseif getPlayerStorageValue(cid,8416,1) then SetPlayerStorageValue(cid,8403,1) SetPlayerStorageValue(cid,8416,0) end end else npcHandler:say('Você já foi iniciado em uma classe.') return true end else npcHandler:say('Então não tome meu tempo, estamos ocupados.', cid) return true end elseif msgcontains(msg, 'mágica') then npcHandler:say('Huh? A habilidade com uma espada ou um machado não se comparam com esses truques baratos.') elseif msgcontains(msg, 'comprar', 'vender') then npcHandler:say('Não estou vendendo ou comprando coisa alguma. Minha função é preparar novos guerreiros.') end return true end npcHandler:addModule(FocusModule:new()) Alguém pode me ajudar? Editado Junho 13, 2017 8 anos por Tadelho (veja o histórico de edições)
Postado Junho 14, 2017 8 anos Solução local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end npcHandler:setMessage(MESSAGE_GREET, 'Cuidado, |PLAYERNAME|, isto não é lugar para crianças. Apenas um {guerreiro} deveria estar aqui.') function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid local msg = msg:lower() local pos = getCreaturePosition(getNpcCid()) local summonPos = {x = pos.x-1,y = pos.y,z = pos.z} if msgcontains(msg, 'guerreiro') then selfSay('Você está interessado em se tornar um guerreiro? Uma vez iniciado, você não poderá voltar atrás.', cid) talkState[talkUser] = 1 elseif msgcontains(msg, 'sim') then if talkState[talkUser] == 1 then if getPlayerVocation(cid) == 0 then if getPlayerStorageValue(cid, 9500) < 0 then selfSay('Você deve antes provar seu valor de combate. Me mostre se é capaz de destruir isto...', cid) doSummonCreature('Training Target', summonPos) talkState[talkUser] = 0 else selfSay('Você parece levar jeito e será iniciado na classe de guerreiro. Veja, há um baú no posto logo acima. Tenho certeza que ali ainda deve haver algum equipamento básico de guerreiro para você.') doPlayerSetVocation(cid, 1) if getPlayerStorageValue(cid, 8415) == 1 then setPlayerStorageValue(cid, 8412, 1) setPlayerStorageValue(cid, 8415, 0) elseif getPlayerStorageValue(cid, 8410) == 1 then setPlayerStorageValue(cid, 8411, 1) setPlayerStorageValue(cid, 8410, 0) elseif getPlayerStorageValue(cid, 8416) == 1 then setPlayerStorageValue(cid, 8403, 1) setPlayerStorageValue(cid, 8416, 0) end talkState[talkUser] = 0 end else selfSay('Você já possui uma classe.', cid) talkState[talkUser] = 0 end end elseif isInArray({'não', 'nao'}, msg) then if talkState[talkUser] == 1 then selfSay('Então não tome nosso tempo. Estamos ocupados!', cid) talkState[talkUser] = 0 end elseif isInArray({'comprar', 'vender'}, msg) then selfSay('Não estou vendendo ou comprando coisa alguma. Minha função é preparar novos guerreiros.', cid) elseif isInArray({'mágica', 'magica'}, msg) then selfSay('Huh? A habilidade com uma espada ou um machado não se comparam com esses truques baratos.', cid) end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) @Tadelho ➥ Regras | Seções OTServ | Seções BOT
Postado Junho 14, 2017 8 anos Autor @Wakon, acho que entendi agora... eu preciso setar um "talkstate" para diferenciar os diferentes estágios da conversa, e também não havia colocado para receber o valor do "msg". Aparentemente está funcionando, obrigado.
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.