Jump to content
Close
Sign in to follow this  
peterson18

Scripting Erro Script Função getCreatureName

Recommended Posts

Olá galera blz?

 

Então estou com um problema nessa script, estou tentando aprender .lua mas esta tenso, comecei a criar esse NPC e está dando erro interface, provavelmente é o uso errado da função getCreatureName, alguém poderia me dizer o jeito correto de colocar na script.

Obs: Estou a procura de um professor de .lua focado em NPC, se alguém quiser adotar um pupilo chama no PV 
:e3e03d5a3092be979f60f558c1d84f09:
 

Spoiler

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

function creatureSayCallback(cid, type, msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
if getCreatureName(cid) == nome then

	if msgcontains(msg, 'Oi') or msgcontains(msg, 'Ola') and talkState[talkUser] == 1 then
		selfSay("Olá, como está ".. nome ..",faz tempo que não aparece por aqui... Em que posso lhe ajudar?",cid)
		talkState[talkUser] = 1
	  end
end
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 


Desde já Grato!!


Share this post


Link to post
Share on other sites

A função retorna uma string, ou seja, um texto. Para fazer essa comparação corretamente, o nome a ser comparado também tem que ser uma string.

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

function creatureSayCallback(cid, type, msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
local nome = "nome"
if getCreatureName(cid) == nome then

	if msgcontains(msg, 'Oi') or msgcontains(msg, 'Ola') and talkState[talkUser] == 1 then
		selfSay("Olá, como está ".. nome ..",faz tempo que não aparece por aqui... Em que posso lhe ajudar?",cid)
		talkState[talkUser] = 1
	  end
end
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 



 

 

 

Nós somos aquilo que fazemos repetidamente. Excelência, não é um modo de agir, mas um hábito.

                                                                                                                                                                                                                                        Aristóteles 

Share this post


Link to post
Share on other sites
14 minutos atrás, Way20 disse:

A função retorna uma string, ou seja, um texto. Para fazer essa comparação corretamente, o nome a ser comparado também tem que ser uma string.


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

function creatureSayCallback(cid, type, msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
local nome = "nome"
if getCreatureName(cid) == nome then

	if msgcontains(msg, 'Oi') or msgcontains(msg, 'Ola') and talkState[talkUser] == 1 then
		selfSay("Olá, como está ".. nome ..",faz tempo que não aparece por aqui... Em que posso lhe ajudar?",cid)
		talkState[talkUser] = 1
	  end
end
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 


Exato, que vacilo :7943e5822524b7fb194f46d626fb2fb7:
 

Ficou assim:

Spoiler

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



function creatureSayCallback(cid, type, msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
local config = {
	  nome = getCreatureName(cid),
	}
if nome == getCreatureName(cid)  then

	elseif msgcontains(msg, "blz") or msgcontains(msg, "blzz") and talkState[talkUser] == 1 then
		selfSay("Olá, como está ".. config.nome ..", faz tempo que não aparece por aqui... Em que posso lhe ajudar?",cid)
		talkState[talkUser] = 1
		return true
	  end
end


npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

 

Tem alguma dica ou outra forma de funcionar ou assim esta bom?

Desde já grato!


Share this post


Link to post
Share on other sites

E ai cara, tudo certo?

 

Lendo o seu código, percebo que talvez você esteja cometendo um pequeno erro de lógica, e alguns erros de semântica.

1- erros de semântica

Citar

local config = {
	  nome = getCreatureName(cid),
	}

não há necessidade de colocar a sua variável em um objeto.

 

como você está apenas declarando a variável nome, ela pode ser acessada diretamente, ou seja, essas linhas poderiam se resumir em:

local nome = getCreatureName(cid)

 

Citar

if nome == getCreatureName(cid)  then

nesse contexto, a variável nome não existe, pois você criou ela dentro do objeto config, então ficaria config.nome

 

2- erro de lógica

Citar

if nome == getCreatureName(cid)  then

por que você está comparando a variável nome com o nome da criatura? Você já declarou a variável nome com o nome da criatura nas linhas anteriores

dessa forma, acredito que esse if é desnecessário, e você pode remover.

 

 

Citar

elseif msgcontains(msg, "blz") or msgcontains(msg, "blzz") and talkState[talkUser] == 1 then

quando remover o if anterior, altere essa linha removendo o elseif e colocando um if no lugar, dessa forma:

if msgcontains(msg, "blz") or msgcontains(msg, "blzz") and talkState[talkUser] == 1 then

 

Citar

selfSay("Olá, como está ".. config.nome ..", faz tempo que não aparece por aqui... Em que posso lhe ajudar?",cid)

aqui você remove o config.nome e deixa apenas nome

 


Share this post


Link to post
Share on other sites
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



function creatureSayCallback(cid, type, msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
local nome = "nome"

if nome == getCreatureName(cid)  then
	if (msgcontains(msg, "blz") or msgcontains(msg, "blzz")) and (talkState[talkUser]) == 1 then -- Você vai precisar dos () para separar o 'or' do 'and', caso contrário sua condição ia bugar.
		selfSay("Olá, como está ".. nome ..", faz tempo que não aparece por aqui... Em que posso lhe ajudar?",cid)
		talkState[talkUser] = 1 -- Altere aqui, pois a talkState já está 1, de acordo com sua condição.
		end
  	 end
  return true
end


npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())


 


Edited by Skydrowz (see edit history)

Master yourself, master the enemy.

Share this post


Link to post
Share on other sites
50 minutos atrás, edusorcer disse:

E ai cara, tudo certo?

 

Lendo o seu código, percebo que talvez você esteja cometendo um pequeno erro de lógica, e alguns erros de semântica.

1- erros de semântica

não há necessidade de colocar a sua variável em um objeto.

 

como você está apenas declarando a variável nome, ela pode ser acessada diretamente, ou seja, essas linhas poderiam se resumir em:


local nome = getCreatureName(cid)

 

nesse contexto, a variável nome não existe, pois você criou ela dentro do objeto config, então ficaria config.nome

 

2- erro de lógica

por que você está comparando a variável nome com o nome da criatura? Você já declarou a variável nome com o nome da criatura nas linhas anteriores

dessa forma, acredito que esse if é desnecessário, e você pode remover.

 

 

quando remover o if anterior, altere essa linha removendo o elseif e colocando um if no lugar, dessa forma:


if msgcontains(msg, "blz") or msgcontains(msg, "blzz") and talkState[talkUser] == 1 then

 

aqui você remove o config.nome e deixa apenas nome

 

@edusorcer
Muito obrigo!

 

Fui editando e anotando pelo que entendi, veja se seria assim:
 

Spoiler

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



function creatureSayCallback(cid, type, msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
--[[local config = {
	  nome = getCreatureName(cid),
	}]]-- Removido
local nome = getCreatureName(cid) -- Adicionado

if getCreatureName(cid)  then --Removido o 'Nome'

	if msgcontains(msg, "blz") or msgcontains(msg, "blzz") and talkState[talkUser] == 1 then
		selfSay("Olá, como está ".. nome ..", faz tempo que não aparece por aqui... Em que posso lhe ajudar?",cid)
		talkState[talkUser] = 1
		return true
		end
	  end
end


npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 


Se estiver tudo certo, entendi o que quis dizer hehe
Caso tenha algo errado por favor me avise!
(Obs: Teste a script e esta funcionando) 

38 minutos atrás, Skydrowz disse:

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



function creatureSayCallback(cid, type, msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
local nome = "nome"

if nome == getCreatureName(cid)  then
	if (msgcontains(msg, "blz") or msgcontains(msg, "blzz")) and (talkState[talkUser]) == 1 then -- Você vai precisar dos () para separar o 'or' do 'and', caso contrário sua condição ia bugar.
		selfSay("Olá, como está ".. nome ..", faz tempo que não aparece por aqui... Em que posso lhe ajudar?",cid)
		talkState[talkUser] = 1 -- Altere aqui, pois a talkState já está 1, de acordo com sua condição.
		end
  	 end
  return true
end


npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())


 

 

@Skydrowz
Quando digo "Blz" ou "Blzz" o Npc Não responde...


Share this post


Link to post
Share on other sites

@peterson18 está quase, faltou remover o if desnecessário

 

acredito que a versão correta do script seria assim:

 

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



function creatureSayCallback(cid, type, msg)
	local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

	local nome = getCreatureName(cid)

	if msgcontains(msg, "blz") or msgcontains(msg, "blzz") and talkState[talkUser] == 1 then
		selfSay("Olá, como está ".. nome ..", faz tempo que não aparece por aqui... Em que posso lhe ajudar?",cid)
		return true
	end
end


npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

veja se deu certo 😃


Share this post


Link to post
Share on other sites
3 minutos atrás, edusorcer disse:

@peterson18 está quase, faltou remover o if desnecessário

 

acredito que a versão correta do script seria assim:

 


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



function creatureSayCallback(cid, type, msg)
	local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

	local nome = getCreatureName(cid)

	if msgcontains(msg, "blz") or msgcontains(msg, "blzz") and talkState[talkUser] == 1 then
		selfSay("Olá, como está ".. nome ..", faz tempo que não aparece por aqui... Em que posso lhe ajudar?",cid)
		return true
	end
end


npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

veja se deu certo 😃


Exato, esta funcionando! E entendi a logica para essa situação. 
O getCreatureName é uma função global ou seja quando eu chamo ela não preciso defini-la como 'Nome" para depois chama-la de novo... Ou seja eu estava falando a mesma coisa umas 3 vez kkk.

Muito obrigado!

 


Share this post


Link to post
Share on other sites
1 minuto atrás, Skydrowz disse:

O nome da creature é "nome"?

No caso eu estava tentando que o NPC disse o nome do player

Ele teria que buscar o nome

Exemplo: 

Olá, como está Skydrows, faz tempo que não aparece por aqui... Em que posso lhe ajudar?

Share this post


Link to post
Share on other sites
Agora, peterson18 disse:

No caso eu estava tentando que o NPC disse o nome do player

Ele teria que buscar o nome

Exemplo: 


Olá, como está Skydrows, faz tempo que não aparece por aqui... Em que posso lhe ajudar?

 

Por que você não usa o |PLAYERNAME|?



Master yourself, master the enemy.

Share this post


Link to post
Share on other sites
Agora, Skydrowz disse:

 

Por que você não usa o |PLAYERNAME|?

Esse ai só funciona no .xml não é?

Eu estava querendo que funcionasse no .lua do NPC


Share this post


Link to post
Share on other sites

Você pode fazer isso por lua também, basta adicionar um addGreetKeyword ou setMessage(MESSAGE_GREET, text)

Vou te mandar os dois exemplos.

 


-- Greeting 
keywordHandler:addGreetKeyword({'hi'}, {npcHandler = npcHandler, text = 'Hello, |PLAYERNAME|! You are looking really bad. Let me heal your wounds. It\'s my job after all.'},

)

Essa é por keyword

 

local function greetCallback(cid)
	local player = Player(cid)
	
	if player:getVocation():getId() == 1 then
		npcHandler:setMessage(MESSAGE_GREET, "Well, well, a new sorcerer! Want me to bring you somewhere nice?")
	elseif player:getVocation():getId() == 2 then
		npcHandler:setMessage(MESSAGE_GREET, "Well, well, a new druid! Want me to bring you somewhere nice?")
	elseif player:getVocation():getId() == 3 then
		npcHandler:setMessage(MESSAGE_GREET, "Well, well, a new paladin! Want me to bring you somewhere nice?")
	elseif player:getVocation():getId() == 4 then
		npcHandler:setMessage(MESSAGE_GREET, "Well, well, a new knight! Want me to bring you somewhere nice?")
	end
	npcHandler:addFocus(cid)
	return true
end

Essa é por setMessage(nessa aqui é mais fácil de adicionar condições, como no exemplo de vocações mesmo)


Edited by Skydrowz (see edit history)

Master yourself, master the enemy.

Share this post


Link to post
Share on other sites
28 minutos atrás, Skydrowz disse:

Você pode fazer isso por lua também, basta adicionar um addGreetKeyword ou setMessage(MESSAGE_GREET, text)

Vou te mandar os dois exemplos.

 



-- Greeting 
keywordHandler:addGreetKeyword({'hi'}, {npcHandler = npcHandler, text = 'Hello, |PLAYERNAME|! You are looking really bad. Let me heal your wounds. It\'s my job after all.'},

)

Essa é por keyword

 


local function greetCallback(cid)
	local player = Player(cid)
	
	if player:getVocation():getId() == 1 then
		npcHandler:setMessage(MESSAGE_GREET, "Well, well, a new sorcerer! Want me to bring you somewhere nice?")
	elseif player:getVocation():getId() == 2 then
		npcHandler:setMessage(MESSAGE_GREET, "Well, well, a new druid! Want me to bring you somewhere nice?")
	elseif player:getVocation():getId() == 3 then
		npcHandler:setMessage(MESSAGE_GREET, "Well, well, a new paladin! Want me to bring you somewhere nice?")
	elseif player:getVocation():getId() == 4 then
		npcHandler:setMessage(MESSAGE_GREET, "Well, well, a new knight! Want me to bring you somewhere nice?")
	end
	npcHandler:addFocus(cid)
	return true
end

Essa é por setMessage(nessa aqui é mais fácil de adicionar condições, como no exemplo de vocações mesmo)


Legal, não sabia dessas funções!


Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Open Tibia Server

Quer aprender a criar seu próprio servidor de Tibia? Então está no lugar certo, aqui você encontrará milhares de tutorias, scripts, códigos, mapas e utilitários para que você possa fazer o seu próprio servidor de Tibia partindo do zero.

Redes Sociais

Anuncie no Tibia King

Precisa de mais visibilidade em seus projetos? Quer publicidade para o seu servidor? Anuncie no Tibia King e faça sua divulgação, possuímos centenas de acessos simultâneos e milhares diários, com certeza será a sua solução! A publicação do seu anuncio é instantânea!

×
×
  • Create New...