Ir para conteúdo
  • Cadastre-se

Posts Recomendados

Bom dia pessoal, estou com um problema no meu ot, eu baixei um ot 10.90 e ele não tinha quase nenhum npc, quando fui colocar o npc Bank, apareceu vários erros:

Lua Script Error: [Npc interface]
data/npc/scripts/Eva.lua:onCreatureSay
data/npc/scripts/Eva.lua:64: attempt to call global 'doPlayerDepositMoney' (a nil value)
stack traceback:
        [C]: in function 'doPlayerDepositMoney'
        data/npc/scripts/Eva.lua:64: in function 'callback'
        data/npc/lib/npcsystem/npchandler.lua:411: in function 'onCreatureSay'
        data/npc/scripts/Eva.lua:8: in function <data/npc/scripts/Eva.lua:8>

 

pesquisei um pouco sobre esses erros e vi que era preciso adicionar umas coisas no 050 functions, acabei descobrindo que meu ot não tem o 050 functions... como posso fazer para que funcione o npc bank?

aqui está o script do npc:

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)
if(not npcHandler:isFocused(cid)) then
return false
end

local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

--------------------MESSAGES------------------------------------------------------------------------------
if msgcontains(msg, 'deposit') then
selfSay('Please tell me how much gold it is you would like to deposit.', cid)
talkState[talkUser] = 1

elseif msgcontains(msg, 'withdraw') then
selfSay('Please tell me how much gold you would like to withdraw.', cid)
talkState[talkUser] = 3

elseif msgcontains(msg, 'transfer') then
selfSay('Please tell me the amount of gold coins you would like to transfer.', cid)
talkState[talkUser] = 5

elseif msgcontains(msg, 'change gold') then
selfSay('How many platinum coins do you want to get?', cid)
talkState[talkUser] = 8

elseif msgcontains(msg, 'change platinum') then
selfSay('Do you want to change your platinum coins to gold or crystal?', cid)
talkState[talkUser] = 10

elseif msgcontains(msg, 'change crystal') then
selfSay('How many crystal coins do you want to change to platinum?', cid)
talkState[talkUser] = 15

elseif msgcontains(msg, 'balance') then
n = getPlayerBalance(cid)
selfSay('Your balance are '..n..' golds.', cid)
talkState[talkUser] = 0


----------------------DEPOSIT-------------------------------------------------------
elseif talkState[talkUser] == 1 then
if msgcontains(msg, 'all') then
n = getPlayerMoney(cid)
selfSay('Do you want deposit '..n..' golds ?', cid)
talkState[talkUser] = 2
else
n = getNumber(msg)
selfSay('Do you want deposit '..n..' golds ?', cid)
talkState[talkUser] = 2
end

elseif talkState[talkUser] == 2 then
if msgcontains(msg, 'yes') then
if getPlayerMoney(cid) >= n then
doPlayerDepositMoney(cid,n)
selfSay('Sucessfull. Now your balance account is ' ..getPlayerBalance(cid)..' golds.', cid)
talkState[talkUser] = 0
else
selfSay('You don\'t have money.', cid)
end
else
selfSay('Ok then', cid)
end

----------------------WITHDRAW-------------------------------------------------------------------------------------

elseif talkState[talkUser] == 3 then
if msgcontains(msg, 'all') then
n = getPlayerBalance(cid)
selfSay('Do you want withdraw '..n..' golds ?', cid)
talkState[talkUser] = 4
else
n = getNumber(msg)
selfSay('Do you want withdraw '..n..' golds ?', cid)
talkState[talkUser] = 4
end

elseif talkState[talkUser] == 4 then
if msgcontains(msg, 'yes') then
if getPlayerBalance(cid) >= n then
doPlayerWithdrawMoney(cid, n)
selfSay('Here you are, '..n..' gold. Now your balance account is ' ..getPlayerBalance(cid)..' golds.', cid)
talkState[talkUser] = 0
else
selfSay('There is not enough gold on your account', cid)
end
else
selfSay('Ok then', cid)
end

----------------------TRANSFER----------------------------------------------------------------------------------------

elseif talkState[talkUser] == 5 then
if msgcontains(msg, 'all') then
n = getPlayerBalance(cid)
selfSay('Who would you like transfer '..n..' gold to?', cid)
talkState[talkUser] = 6
else
n = getNumber(msg)
selfSay('Who would you like transfer '..n..' gold to?', cid)
talkState[talkUser] = 6
end

elseif talkState[talkUser] == 6 then
p = msg
selfSay('So you would like to transfer '..n..' gold to '..p..'?', cid)
talkState[talkUser] = 7

elseif talkState[talkUser] == 7 then
if msgcontains(msg, 'yes') then
if getPlayerBalance(cid) >= n then
if doPlayerTransferMoneyTo(cid, p, n) == TRUE then
selfSay('You have transferred '..n..' gold to '..p..' and your account balance is '..getPlayerBalance(cid)..' golds.', cid)
talkState[talkUser] = 0
else
selfSay('This player does not exist. Please tell me a valid name!', cid)
talkState[talkUser] = 0
end
else
selfSay('There is not enough gold on your account', cid)
talkState[talkUser] = 0
end
else
selfSay('Ok then', cid)
talkState[talkUser] = 0
end

----------------------CHANGE GOLD---------------------------------------------------------------------------------
elseif talkState[talkUser] == 8 then
n = getNumber(msg)
b = n * 100
selfSay('So I should change '..b..' of your gold coins to '..n..' platinum coins for you?', cid)
talkState[talkUser] = 9

elseif talkState[talkUser] == 9 then
if msgcontains(msg, 'yes') then
if doPlayerRemoveItem(cid, 2148, b) == TRUE then
doPlayerAddItem(cid, 2152, n)
talkState[talkUser] = 0
else
selfSay('You don\'t have money.', cid)
talkState[talkUser] = 0
end
else
selfSay('Ok. We cancel.', cid)
talkState[talkUser] = 0
end

---------------------CHANGE PLATINUM-------------------------------------------------------------------------
elseif talkState[talkUser] == 10 then
if msgcontains(msg, 'gold') then
selfSay('How many platinum coins do you want to change to gold?', cid)
talkState[talkUser] = 11
elseif msgcontains(msg, 'crystal') then
selfSay('How many crystal coins do you want to get?', cid)
talkState[talkUser] = 13
end


elseif talkState[talkUser] == 11 then
n = getNumber(msg)
b = n * 100
selfSay('So I should change '..n..' of your platinum coins to '..b..' gold coins for you?', cid)
talkState[talkUser] = 12

elseif talkState[talkUser] == 12 then
if msgcontains(msg, 'yes') then
if doPlayerRemoveItem(cid, 2152, n) == TRUE then
doPlayerAddItem(cid, 2148, b)
talkState[talkUser] = 0
else
selfSay('You don\'t have money.', cid)
talkState[talkUser] = 0
end
else
selfSay('Ok. We cancel.', cid)
talkState[talkUser] = 0
end

elseif talkState[talkUser] == 13 then
n = getNumber(msg)
b = n * 100
selfSay('So I should change '..b..' of your platinum coins to '..n..' crystal coins for you?', cid)
talkState[talkUser] = 14

elseif talkState[talkUser] == 14 then
if msgcontains(msg, 'yes') then
if doPlayerRemoveItem(cid, 2152, b) == TRUE then
doPlayerAddItem(cid, 2160, n)
talkState[talkUser] = 0
else
selfSay('You don\'t have money.', cid)
talkState[talkUser] = 0
end
else
selfSay('Ok. We cancel.', cid)
talkState[talkUser] = 0
end

---------------------CHANGE CRYSTAL-------------------------------------------------------------------------------
elseif talkState[talkUser] == 15 then
n = getNumber(msg)
b = n * 100
selfSay('So I should change '..n..' of your crystal coins to '..b..' platinum coins for you?', cid)
talkState[talkUser] = 16

elseif talkState[talkUser] == 16 then
if msgcontains(msg, 'yes') then
if doPlayerRemoveItem(cid, 2160, n) == TRUE then
doPlayerAddItem(cid, 2152, b)
talkState[talkUser] = 0
else
selfSay('You don\'t have money.', cid)
talkState[talkUser] = 0
end
else
selfSay('Ok. We cancel.', cid)
talkState[talkUser] = 0
end
end
end

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

-- function maded by Gesior--
function getNumber(txt) --return number if its number and is > 0, else return 0
x = string.gsub(txt,"%a","")
x = tonumber(x)
if x ~= nill and x > 0 then
return x
else
return 0
end
end

Link para o post
Compartilhar em outros sites

Tenta esse, o que ta usando deve ser para tfs 0.4 e seu tfs acredito que seja versão maior.

 

Spoiler

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)

local count = {}
local transfer = {}

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

local voices = { {text = 'Better deposit your money in the bank where it\'s safe.'} }
npcHandler:addModule(VoiceModule:new(voices))

local function greetCallback(cid)
	count[cid], transfer[cid] = nil, nil
	return true
end

local function creatureSayCallback(cid, type, msg)
	if not npcHandler:isFocused(cid) then
		return false
	end
	local player = Player(cid)
---------------------------- help ------------------------
	if msgcontains(msg, 'bank account') then
		npcHandler:say({
			'Every Tibian has one. The big advantage is that you can access your money in every branch of the Tibian Bank! ...',
			'Would you like to know more about the {basic} functions of your bank account, the {advanced} functions, or are you already bored, perhaps?'
		}, cid)
		npcHandler.topic[cid] = 0
		return true
---------------------------- balance ---------------------
	elseif msgcontains(msg, 'balance') then
		npcHandler.topic[cid] = 0
		if player:getBankBalance() >= 100000000 then
			npcHandler:say('I think you must be one of the richest inhabitants in the world! Your account balance is ' .. player:getBankBalance() .. ' gold.', cid)
			return true
		elseif player:getBankBalance() >= 10000000 then
			npcHandler:say('You have made ten millions and it still grows! Your account balance is ' .. player:getBankBalance() .. ' gold.', cid)
			return true
		elseif player:getBankBalance() >= 1000000 then
			npcHandler:say('Wow, you have reached the magic number of a million gp!!! Your account balance is ' .. player:getBankBalance() .. ' gold!', cid)
			return true
		elseif player:getBankBalance() >= 100000 then
			npcHandler:say('You certainly have made a pretty penny. Your account balance is ' .. player:getBankBalance() .. ' gold.', cid)
			return true
		else
			npcHandler:say('Your account balance is ' .. player:getBankBalance() .. ' gold.', cid)
			return true
		end
---------------------------- deposit ---------------------
	elseif msgcontains(msg, 'deposit') then
		count[cid] = player:getMoney()
		if count[cid] < 1 then
			npcHandler:say('You do not have enough gold.', cid)
			npcHandler.topic[cid] = 0
			return false
		end
		if msgcontains(msg, 'all') then
			count[cid] = player:getMoney()
			npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
			npcHandler.topic[cid] = 2
			return true
		else
			if string.match(msg,'%d+') then
				count[cid] = getMoneyCount(msg)
				if count[cid] < 1 then
					npcHandler:say('You do not have enough gold.', cid)
					npcHandler.topic[cid] = 0
					return false
				end
				npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
				npcHandler.topic[cid] = 2
				return true
			else
				npcHandler:say('Please tell me how much gold it is you would like to deposit.', cid)
				npcHandler.topic[cid] = 1
				return true
			end
		end
		if not isValidMoney(count[cid]) then
			npcHandler:say('Sorry, but you can\'t deposit that much.', cid)
			npcHandler.topic[cid] = 0
			return false
		end
	elseif npcHandler.topic[cid] == 1 then
		count[cid] = getMoneyCount(msg)
		if isValidMoney(count[cid]) then
			npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
			npcHandler.topic[cid] = 2
			return true
		else
			npcHandler:say('You do not have enough gold.', cid)
			npcHandler.topic[cid] = 0
			return true
		end
	elseif npcHandler.topic[cid] == 2 then
		if msgcontains(msg, 'yes') then
			if player:getMoney() >= tonumber(count[cid]) then
				player:depositMoney(count[cid])
				npcHandler:say('Alright, we have added the amount of ' .. count[cid] .. ' gold to your {balance}. You can {withdraw} your money anytime you want to.', cid)
			else
				npcHandler:say('You do not have enough gold.', cid)
			end
		elseif msgcontains(msg, 'no') then
			npcHandler:say('As you wish. Is there something else I can do for you?', cid)
		end
		npcHandler.topic[cid] = 0
		return true
---------------------------- withdraw --------------------
	elseif msgcontains(msg, 'withdraw') then
		if string.match(msg,'%d+') then
			count[cid] = getMoneyCount(msg)
			if isValidMoney(count[cid]) then
				npcHandler:say('Are you sure you wish to withdraw ' .. count[cid] .. ' gold from your bank account?', cid)
				npcHandler.topic[cid] = 7
			else
				npcHandler:say('There is not enough gold on your account.', cid)
				npcHandler.topic[cid] = 0
			end
			return true
		else
			npcHandler:say('Please tell me how much gold you would like to withdraw.', cid)
			npcHandler.topic[cid] = 6
			return true
		end
	elseif npcHandler.topic[cid] == 6 then
		count[cid] = getMoneyCount(msg)
		if isValidMoney(count[cid]) then
			npcHandler:say('Are you sure you wish to withdraw ' .. count[cid] .. ' gold from your bank account?', cid)
			npcHandler.topic[cid] = 7
		else
			npcHandler:say('There is not enough gold on your account.', cid)
			npcHandler.topic[cid] = 0
		end
		return true
	elseif npcHandler.topic[cid] == 7 then
		if msgcontains(msg, 'yes') then
			if player:getFreeCapacity() >= getMoneyWeight(count[cid]) then
				if not player:withdrawMoney(count[cid]) then
					npcHandler:say('There is not enough gold on your account.', cid)
				else
					npcHandler:say('Here you are, ' .. count[cid] .. ' gold. Please let me know if there is something else I can do for you.', cid)
				end
			else
				npcHandler:say('Whoah, hold on, you have no room in your inventory to carry all those coins. I don\'t want you to drop it on the floor, maybe come back with a cart!', cid)
			end
			npcHandler.topic[cid] = 0
		elseif msgcontains(msg, 'no') then
			npcHandler:say('The customer is king! Come back anytime you want to if you wish to {withdraw} your money.', cid)
			npcHandler.topic[cid] = 0
		end
		return true
---------------------------- transfer --------------------
	elseif msgcontains(msg, 'transfer') then
		npcHandler:say('Please tell me the amount of gold you would like to transfer.', cid)
		npcHandler.topic[cid] = 11
	elseif npcHandler.topic[cid] == 11 then
		count[cid] = getMoneyCount(msg)
		if player:getBankBalance() < count[cid] then
			npcHandler:say('There is not enough gold on your account.', cid)
			npcHandler.topic[cid] = 0
			return true
		end
		if isValidMoney(count[cid]) then
			npcHandler:say('Who would you like transfer ' .. count[cid] .. ' gold to?', cid)
			npcHandler.topic[cid] = 12
		else
			npcHandler:say('There is not enough gold on your account.', cid)
			npcHandler.topic[cid] = 0
		end
	elseif npcHandler.topic[cid] == 12 then
		transfer[cid] = msg
		if player:getName() == transfer[cid] then
			npcHandler:say('Fill in this field with person who receives your gold!', cid)
			npcHandler.topic[cid] = 0
			return true
		end
		if playerExists(transfer[cid]) then
			npcHandler:say('So you would like to transfer ' .. count[cid] .. ' gold to ' .. transfer[cid] .. '?', cid)
			npcHandler.topic[cid] = 13
		else
			npcHandler:say('This player does not exist.', cid)
			npcHandler.topic[cid] = 0
		end
	elseif npcHandler.topic[cid] == 13 then
		if msgcontains(msg, 'yes') then
			if not player:transferMoneyTo(transfer[cid], count[cid]) then
				npcHandler:say('You cannot transfer money to this account.', cid)
			else
				npcHandler:say('Very well. You have transferred ' .. count[cid] .. ' gold to ' .. transfer[cid] ..'.', cid)
				transfer[cid] = nil
			end
		elseif msgcontains(msg, 'no') then
			npcHandler:say('Alright, is there something else I can do for you?', cid)
		end
		npcHandler.topic[cid] = 0
---------------------------- money exchange --------------
	elseif msgcontains(msg, 'change gold') then
		npcHandler:say('How many platinum coins would you like to get?', cid)
		npcHandler.topic[cid] = 14
	elseif npcHandler.topic[cid] == 14 then
		if getMoneyCount(msg) < 1 then
			npcHandler:say('Sorry, you do not have enough gold coins.', cid)
			npcHandler.topic[cid] = 0
		else
			count[cid] = getMoneyCount(msg)
			npcHandler:say('So you would like me to change ' .. count[cid] * 100 .. ' of your gold coins into ' .. count[cid] .. ' platinum coins?', cid)
			npcHandler.topic[cid] = 15
		end
	elseif npcHandler.topic[cid] == 15 then
		if msgcontains(msg, 'yes') then
			if player:removeItem(2148, count[cid] * 100) then
				player:addItem(2152, count[cid])
				npcHandler:say('Here you are.', cid)
			else
				npcHandler:say('Sorry, you do not have enough gold coins.', cid)
			end
		else
			npcHandler:say('Well, can I help you with something else?', cid)
		end
		npcHandler.topic[cid] = 0
	elseif msgcontains(msg, 'change platinum') then
		npcHandler:say('Would you like to change your platinum coins into gold or crystal?', cid)
		npcHandler.topic[cid] = 16
	elseif npcHandler.topic[cid] == 16 then
		if msgcontains(msg, 'gold') then
			npcHandler:say('How many platinum coins would you like to change into gold?', cid)
			npcHandler.topic[cid] = 17
		elseif msgcontains(msg, 'crystal') then
			npcHandler:say('How many crystal coins would you like to get?', cid)
			npcHandler.topic[cid] = 19
		else
			npcHandler:say('Well, can I help you with something else?', cid)
			npcHandler.topic[cid] = 0
		end
	elseif npcHandler.topic[cid] == 17 then
		if getMoneyCount(msg) < 1 then
			npcHandler:say('Sorry, you do not have enough platinum coins.', cid)
			npcHandler.topic[cid] = 0
		else
			count[cid] = getMoneyCount(msg)
			npcHandler:say('So you would like me to change ' .. count[cid] .. ' of your platinum coins into ' .. count[cid] * 100 .. ' gold coins for you?', cid)
			npcHandler.topic[cid] = 18
		end
	elseif npcHandler.topic[cid] == 18 then
		if msgcontains(msg, 'yes') then
			if player:removeItem(2152, count[cid]) then
				player:addItem(2148, count[cid] * 100)
				npcHandler:say('Here you are.', cid)
			else
				npcHandler:say('Sorry, you do not have enough platinum coins.', cid)
			end
		else
			npcHandler:say('Well, can I help you with something else?', cid)
		end
		npcHandler.topic[cid] = 0
	elseif npcHandler.topic[cid] == 19 then
		if getMoneyCount(msg) < 1 then
			npcHandler:say('Sorry, you do not have enough platinum coins.', cid)
			npcHandler.topic[cid] = 0
		else
			count[cid] = getMoneyCount(msg)
			npcHandler:say('So you would like me to change ' .. count[cid] * 100 .. ' of your platinum coins into ' .. count[cid] .. ' crystal coins for you?', cid)
			npcHandler.topic[cid] = 20
		end
	elseif npcHandler.topic[cid] == 20 then
		if msgcontains(msg, 'yes') then
			if player:removeItem(2152, count[cid] * 100) then
				player:addItem(2160, count[cid])
				npcHandler:say('Here you are.', cid)
			else
				npcHandler:say('Sorry, you do not have enough platinum coins.', cid)
			end
		else
			npcHandler:say('Well, can I help you with something else?', cid)
		end
		npcHandler.topic[cid] = 0
	elseif msgcontains(msg, 'change crystal') then
		npcHandler:say('How many crystal coins would you like to change into platinum?', cid)
		npcHandler.topic[cid] = 21
	elseif npcHandler.topic[cid] == 21 then
		if getMoneyCount(msg) < 1 then
			npcHandler:say('Sorry, you do not have enough crystal coins.', cid)
			npcHandler.topic[cid] = 0
		else
			count[cid] = getMoneyCount(msg)
			npcHandler:say('So you would like me to change ' .. count[cid] .. ' of your crystal coins into ' .. count[cid] * 100 .. ' platinum coins for you?', cid)
			npcHandler.topic[cid] = 22
		end
	elseif npcHandler.topic[cid] == 22 then
		if msgcontains(msg, 'yes') then
			if player:removeItem(2160, count[cid])  then
				player:addItem(2152, count[cid] * 100)
				npcHandler:say('Here you are.', cid)
			else
				npcHandler:say('Sorry, you do not have enough crystal coins.', cid)
			end
		else
			npcHandler:say('Well, can I help you with something else?', cid)
		end
		npcHandler.topic[cid] = 0
	end
	return true
end

keywordHandler:addKeyword({'money'}, StdModule.say, {npcHandler = npcHandler, text = 'We can {change} money for you. You can also access your {bank account}.'})
keywordHandler:addKeyword({'change'}, StdModule.say, {npcHandler = npcHandler, text = 'There are three different coin types in Tibia: 100 gold coins equal 1 platinum coin, 100 platinum coins equal 1 crystal coin. So if you\'d like to change 100 gold into 1 platinum, simply say \'{change gold}\' and then \'1 platinum\'.'})
keywordHandler:addKeyword({'bank'}, StdModule.say, {npcHandler = npcHandler, text = 'We can {change} money for you. You can also access your {bank account}.'})
keywordHandler:addKeyword({'advanced'}, StdModule.say, {npcHandler = npcHandler, text = 'Your bank account will be used automatically when you want to {rent} a house or place an offer on an item on the {market}. Let me know if you want to know about how either one works.'})
keywordHandler:addKeyword({'help'}, StdModule.say, {npcHandler = npcHandler, text = 'You can check the {balance} of your bank account, {deposit} money or {withdraw} it. You can also {transfer} money to other characters, provided that they have a vocation.'})
keywordHandler:addKeyword({'functions'}, StdModule.say, {npcHandler = npcHandler, text = 'You can check the {balance} of your bank account, {deposit} money or {withdraw} it. You can also {transfer} money to other characters, provided that they have a vocation.'})
keywordHandler:addKeyword({'basic'}, StdModule.say, {npcHandler = npcHandler, text = 'You can check the {balance} of your bank account, {deposit} money or {withdraw} it. You can also {transfer} money to other characters, provided that they have a vocation.'})
keywordHandler:addKeyword({'job'}, StdModule.say, {npcHandler = npcHandler, text = 'I work in this bank. I can change money for you and help you with your bank account.'})

npcHandler:setCallback(CALLBACK_GREET, greetCallback)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:setMessage(MESSAGE_GREET, "Welcome |PLAYERNAME|! What business do you have in the Tibian bank today?")
npcHandler:setMessage(MESSAGE_FAREWELL, "Good bye, |PLAYERNAME|.")
npcHandler:setMessage(MESSAGE_WALKAWAY, "Good bye, |PLAYERNAME|.")
npcHandler:addModule(FocusModule:new())

 

 

Discord: Naze#3578

 

Ter Linux Dentro de Windows com Acesso 'localhost' para testes e +

AutoLoot Otimizado Direto na Source (tfs 0.4/otx)

 

// Pirataria é crime, original é roubo, compartilhar é legal.

 

tumblr_muk78tEwDQ1qah4nko1_500.gif

Link para o post
Compartilhar em outros sites
4 minutos atrás, Naze disse:

Tenta esse, o que ta usando deve ser para tfs 0.4 e seu tfs acredito que seja versão maior.

 

  Ocultar conteúdo


local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)

local count = {}
local transfer = {}

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

local voices = { {text = 'Better deposit your money in the bank where it\'s safe.'} }
npcHandler:addModule(VoiceModule:new(voices))

local function greetCallback(cid)
	count[cid], transfer[cid] = nil, nil
	return true
end

local function creatureSayCallback(cid, type, msg)
	if not npcHandler:isFocused(cid) then
		return false
	end
	local player = Player(cid)
---------------------------- help ------------------------
	if msgcontains(msg, 'bank account') then
		npcHandler:say({
			'Every Tibian has one. The big advantage is that you can access your money in every branch of the Tibian Bank! ...',
			'Would you like to know more about the {basic} functions of your bank account, the {advanced} functions, or are you already bored, perhaps?'
		}, cid)
		npcHandler.topic[cid] = 0
		return true
---------------------------- balance ---------------------
	elseif msgcontains(msg, 'balance') then
		npcHandler.topic[cid] = 0
		if player:getBankBalance() >= 100000000 then
			npcHandler:say('I think you must be one of the richest inhabitants in the world! Your account balance is ' .. player:getBankBalance() .. ' gold.', cid)
			return true
		elseif player:getBankBalance() >= 10000000 then
			npcHandler:say('You have made ten millions and it still grows! Your account balance is ' .. player:getBankBalance() .. ' gold.', cid)
			return true
		elseif player:getBankBalance() >= 1000000 then
			npcHandler:say('Wow, you have reached the magic number of a million gp!!! Your account balance is ' .. player:getBankBalance() .. ' gold!', cid)
			return true
		elseif player:getBankBalance() >= 100000 then
			npcHandler:say('You certainly have made a pretty penny. Your account balance is ' .. player:getBankBalance() .. ' gold.', cid)
			return true
		else
			npcHandler:say('Your account balance is ' .. player:getBankBalance() .. ' gold.', cid)
			return true
		end
---------------------------- deposit ---------------------
	elseif msgcontains(msg, 'deposit') then
		count[cid] = player:getMoney()
		if count[cid] < 1 then
			npcHandler:say('You do not have enough gold.', cid)
			npcHandler.topic[cid] = 0
			return false
		end
		if msgcontains(msg, 'all') then
			count[cid] = player:getMoney()
			npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
			npcHandler.topic[cid] = 2
			return true
		else
			if string.match(msg,'%d+') then
				count[cid] = getMoneyCount(msg)
				if count[cid] < 1 then
					npcHandler:say('You do not have enough gold.', cid)
					npcHandler.topic[cid] = 0
					return false
				end
				npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
				npcHandler.topic[cid] = 2
				return true
			else
				npcHandler:say('Please tell me how much gold it is you would like to deposit.', cid)
				npcHandler.topic[cid] = 1
				return true
			end
		end
		if not isValidMoney(count[cid]) then
			npcHandler:say('Sorry, but you can\'t deposit that much.', cid)
			npcHandler.topic[cid] = 0
			return false
		end
	elseif npcHandler.topic[cid] == 1 then
		count[cid] = getMoneyCount(msg)
		if isValidMoney(count[cid]) then
			npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
			npcHandler.topic[cid] = 2
			return true
		else
			npcHandler:say('You do not have enough gold.', cid)
			npcHandler.topic[cid] = 0
			return true
		end
	elseif npcHandler.topic[cid] == 2 then
		if msgcontains(msg, 'yes') then
			if player:getMoney() >= tonumber(count[cid]) then
				player:depositMoney(count[cid])
				npcHandler:say('Alright, we have added the amount of ' .. count[cid] .. ' gold to your {balance}. You can {withdraw} your money anytime you want to.', cid)
			else
				npcHandler:say('You do not have enough gold.', cid)
			end
		elseif msgcontains(msg, 'no') then
			npcHandler:say('As you wish. Is there something else I can do for you?', cid)
		end
		npcHandler.topic[cid] = 0
		return true
---------------------------- withdraw --------------------
	elseif msgcontains(msg, 'withdraw') then
		if string.match(msg,'%d+') then
			count[cid] = getMoneyCount(msg)
			if isValidMoney(count[cid]) then
				npcHandler:say('Are you sure you wish to withdraw ' .. count[cid] .. ' gold from your bank account?', cid)
				npcHandler.topic[cid] = 7
			else
				npcHandler:say('There is not enough gold on your account.', cid)
				npcHandler.topic[cid] = 0
			end
			return true
		else
			npcHandler:say('Please tell me how much gold you would like to withdraw.', cid)
			npcHandler.topic[cid] = 6
			return true
		end
	elseif npcHandler.topic[cid] == 6 then
		count[cid] = getMoneyCount(msg)
		if isValidMoney(count[cid]) then
			npcHandler:say('Are you sure you wish to withdraw ' .. count[cid] .. ' gold from your bank account?', cid)
			npcHandler.topic[cid] = 7
		else
			npcHandler:say('There is not enough gold on your account.', cid)
			npcHandler.topic[cid] = 0
		end
		return true
	elseif npcHandler.topic[cid] == 7 then
		if msgcontains(msg, 'yes') then
			if player:getFreeCapacity() >= getMoneyWeight(count[cid]) then
				if not player:withdrawMoney(count[cid]) then
					npcHandler:say('There is not enough gold on your account.', cid)
				else
					npcHandler:say('Here you are, ' .. count[cid] .. ' gold. Please let me know if there is something else I can do for you.', cid)
				end
			else
				npcHandler:say('Whoah, hold on, you have no room in your inventory to carry all those coins. I don\'t want you to drop it on the floor, maybe come back with a cart!', cid)
			end
			npcHandler.topic[cid] = 0
		elseif msgcontains(msg, 'no') then
			npcHandler:say('The customer is king! Come back anytime you want to if you wish to {withdraw} your money.', cid)
			npcHandler.topic[cid] = 0
		end
		return true
---------------------------- transfer --------------------
	elseif msgcontains(msg, 'transfer') then
		npcHandler:say('Please tell me the amount of gold you would like to transfer.', cid)
		npcHandler.topic[cid] = 11
	elseif npcHandler.topic[cid] == 11 then
		count[cid] = getMoneyCount(msg)
		if player:getBankBalance() < count[cid] then
			npcHandler:say('There is not enough gold on your account.', cid)
			npcHandler.topic[cid] = 0
			return true
		end
		if isValidMoney(count[cid]) then
			npcHandler:say('Who would you like transfer ' .. count[cid] .. ' gold to?', cid)
			npcHandler.topic[cid] = 12
		else
			npcHandler:say('There is not enough gold on your account.', cid)
			npcHandler.topic[cid] = 0
		end
	elseif npcHandler.topic[cid] == 12 then
		transfer[cid] = msg
		if player:getName() == transfer[cid] then
			npcHandler:say('Fill in this field with person who receives your gold!', cid)
			npcHandler.topic[cid] = 0
			return true
		end
		if playerExists(transfer[cid]) then
			npcHandler:say('So you would like to transfer ' .. count[cid] .. ' gold to ' .. transfer[cid] .. '?', cid)
			npcHandler.topic[cid] = 13
		else
			npcHandler:say('This player does not exist.', cid)
			npcHandler.topic[cid] = 0
		end
	elseif npcHandler.topic[cid] == 13 then
		if msgcontains(msg, 'yes') then
			if not player:transferMoneyTo(transfer[cid], count[cid]) then
				npcHandler:say('You cannot transfer money to this account.', cid)
			else
				npcHandler:say('Very well. You have transferred ' .. count[cid] .. ' gold to ' .. transfer[cid] ..'.', cid)
				transfer[cid] = nil
			end
		elseif msgcontains(msg, 'no') then
			npcHandler:say('Alright, is there something else I can do for you?', cid)
		end
		npcHandler.topic[cid] = 0
---------------------------- money exchange --------------
	elseif msgcontains(msg, 'change gold') then
		npcHandler:say('How many platinum coins would you like to get?', cid)
		npcHandler.topic[cid] = 14
	elseif npcHandler.topic[cid] == 14 then
		if getMoneyCount(msg) < 1 then
			npcHandler:say('Sorry, you do not have enough gold coins.', cid)
			npcHandler.topic[cid] = 0
		else
			count[cid] = getMoneyCount(msg)
			npcHandler:say('So you would like me to change ' .. count[cid] * 100 .. ' of your gold coins into ' .. count[cid] .. ' platinum coins?', cid)
			npcHandler.topic[cid] = 15
		end
	elseif npcHandler.topic[cid] == 15 then
		if msgcontains(msg, 'yes') then
			if player:removeItem(2148, count[cid] * 100) then
				player:addItem(2152, count[cid])
				npcHandler:say('Here you are.', cid)
			else
				npcHandler:say('Sorry, you do not have enough gold coins.', cid)
			end
		else
			npcHandler:say('Well, can I help you with something else?', cid)
		end
		npcHandler.topic[cid] = 0
	elseif msgcontains(msg, 'change platinum') then
		npcHandler:say('Would you like to change your platinum coins into gold or crystal?', cid)
		npcHandler.topic[cid] = 16
	elseif npcHandler.topic[cid] == 16 then
		if msgcontains(msg, 'gold') then
			npcHandler:say('How many platinum coins would you like to change into gold?', cid)
			npcHandler.topic[cid] = 17
		elseif msgcontains(msg, 'crystal') then
			npcHandler:say('How many crystal coins would you like to get?', cid)
			npcHandler.topic[cid] = 19
		else
			npcHandler:say('Well, can I help you with something else?', cid)
			npcHandler.topic[cid] = 0
		end
	elseif npcHandler.topic[cid] == 17 then
		if getMoneyCount(msg) < 1 then
			npcHandler:say('Sorry, you do not have enough platinum coins.', cid)
			npcHandler.topic[cid] = 0
		else
			count[cid] = getMoneyCount(msg)
			npcHandler:say('So you would like me to change ' .. count[cid] .. ' of your platinum coins into ' .. count[cid] * 100 .. ' gold coins for you?', cid)
			npcHandler.topic[cid] = 18
		end
	elseif npcHandler.topic[cid] == 18 then
		if msgcontains(msg, 'yes') then
			if player:removeItem(2152, count[cid]) then
				player:addItem(2148, count[cid] * 100)
				npcHandler:say('Here you are.', cid)
			else
				npcHandler:say('Sorry, you do not have enough platinum coins.', cid)
			end
		else
			npcHandler:say('Well, can I help you with something else?', cid)
		end
		npcHandler.topic[cid] = 0
	elseif npcHandler.topic[cid] == 19 then
		if getMoneyCount(msg) < 1 then
			npcHandler:say('Sorry, you do not have enough platinum coins.', cid)
			npcHandler.topic[cid] = 0
		else
			count[cid] = getMoneyCount(msg)
			npcHandler:say('So you would like me to change ' .. count[cid] * 100 .. ' of your platinum coins into ' .. count[cid] .. ' crystal coins for you?', cid)
			npcHandler.topic[cid] = 20
		end
	elseif npcHandler.topic[cid] == 20 then
		if msgcontains(msg, 'yes') then
			if player:removeItem(2152, count[cid] * 100) then
				player:addItem(2160, count[cid])
				npcHandler:say('Here you are.', cid)
			else
				npcHandler:say('Sorry, you do not have enough platinum coins.', cid)
			end
		else
			npcHandler:say('Well, can I help you with something else?', cid)
		end
		npcHandler.topic[cid] = 0
	elseif msgcontains(msg, 'change crystal') then
		npcHandler:say('How many crystal coins would you like to change into platinum?', cid)
		npcHandler.topic[cid] = 21
	elseif npcHandler.topic[cid] == 21 then
		if getMoneyCount(msg) < 1 then
			npcHandler:say('Sorry, you do not have enough crystal coins.', cid)
			npcHandler.topic[cid] = 0
		else
			count[cid] = getMoneyCount(msg)
			npcHandler:say('So you would like me to change ' .. count[cid] .. ' of your crystal coins into ' .. count[cid] * 100 .. ' platinum coins for you?', cid)
			npcHandler.topic[cid] = 22
		end
	elseif npcHandler.topic[cid] == 22 then
		if msgcontains(msg, 'yes') then
			if player:removeItem(2160, count[cid])  then
				player:addItem(2152, count[cid] * 100)
				npcHandler:say('Here you are.', cid)
			else
				npcHandler:say('Sorry, you do not have enough crystal coins.', cid)
			end
		else
			npcHandler:say('Well, can I help you with something else?', cid)
		end
		npcHandler.topic[cid] = 0
	end
	return true
end

keywordHandler:addKeyword({'money'}, StdModule.say, {npcHandler = npcHandler, text = 'We can {change} money for you. You can also access your {bank account}.'})
keywordHandler:addKeyword({'change'}, StdModule.say, {npcHandler = npcHandler, text = 'There are three different coin types in Tibia: 100 gold coins equal 1 platinum coin, 100 platinum coins equal 1 crystal coin. So if you\'d like to change 100 gold into 1 platinum, simply say \'{change gold}\' and then \'1 platinum\'.'})
keywordHandler:addKeyword({'bank'}, StdModule.say, {npcHandler = npcHandler, text = 'We can {change} money for you. You can also access your {bank account}.'})
keywordHandler:addKeyword({'advanced'}, StdModule.say, {npcHandler = npcHandler, text = 'Your bank account will be used automatically when you want to {rent} a house or place an offer on an item on the {market}. Let me know if you want to know about how either one works.'})
keywordHandler:addKeyword({'help'}, StdModule.say, {npcHandler = npcHandler, text = 'You can check the {balance} of your bank account, {deposit} money or {withdraw} it. You can also {transfer} money to other characters, provided that they have a vocation.'})
keywordHandler:addKeyword({'functions'}, StdModule.say, {npcHandler = npcHandler, text = 'You can check the {balance} of your bank account, {deposit} money or {withdraw} it. You can also {transfer} money to other characters, provided that they have a vocation.'})
keywordHandler:addKeyword({'basic'}, StdModule.say, {npcHandler = npcHandler, text = 'You can check the {balance} of your bank account, {deposit} money or {withdraw} it. You can also {transfer} money to other characters, provided that they have a vocation.'})
keywordHandler:addKeyword({'job'}, StdModule.say, {npcHandler = npcHandler, text = 'I work in this bank. I can change money for you and help you with your bank account.'})

npcHandler:setCallback(CALLBACK_GREET, greetCallback)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:setMessage(MESSAGE_GREET, "Welcome |PLAYERNAME|! What business do you have in the Tibian bank today?")
npcHandler:setMessage(MESSAGE_FAREWELL, "Good bye, |PLAYERNAME|.")
npcHandler:setMessage(MESSAGE_WALKAWAY, "Good bye, |PLAYERNAME|.")
npcHandler:addModule(FocusModule:new())

 

 

 

Deu isso aqui oh

 Lua Script Error: [Npc interface]
data/npc/scripts/Eva.lua
data/npc/scripts/Eva.lua:14: attempt to index global 'VoiceModule' (a nil value)
stack traceback:
        [C]: in function '__index'
        data/npc/scripts/Eva.lua:14: in main chunk
        [C]: in function 'createNpc'
        data/talkactions/scripts/place_npc.lua:11: in function <data/talkactions/scripts/place_npc.lua:1>
[Warning - NpcScript::NpcScript] Can not load script: Eva.lua

Link para o post
Compartilhar em outros sites
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
 
local Topic, count, transfer = {}, {}, {}
 
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
 
local function getCount(s)
        local b, e = s:find('%d+')
        return b and e and math.min(4294967295, tonumber(s:sub(b, e))) or -1
end
 
local function findPlayer(name)
        local q = db.getResult('SELECT name FROM players WHERE name=' .. db.escapeString(name) .. ' LIMIT 1'), nil
        if q:getID() == -1 then
                return
        end
        local r = q:getDataString('name')
        q:free()
        return r
end
 
function greet(cid)
        Topic[cid], count[cid], transfer[cid] = nil, nil, nil
        return true
end
 
function creatureSayCallback(cid, type, msg)
        if not npcHandler:isFocused(cid) then
                return false
        elseif msgcontains(msg, 'balance') then
                npcHandler:say('Your account balance is ' .. getPlayerBalance(cid) .. ' gold.', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'deposit') and msgcontains(msg, 'all') then
                if getPlayerMoney(cid) == 0 then
                        npcHandler:say('You don\'t have any gold with you.', cid)
                        Topic[cid] = nil
                else
                        count[cid] = getPlayerMoney(cid)
                        npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
                        Topic[cid] = 2
                end
        elseif msgcontains(msg, 'deposit') then
                if getCount(msg) == 0 then
                        npcHandler:say('You are joking, aren\'t you??', cid)
                        Topic[cid] = nil
                elseif getCount(msg) ~= -1 then
                        if getPlayerMoney(cid) >= getCount(msg) then
                                count[cid] = getCount(msg)
                                npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
                                Topic[cid] = 2
                        else
                                npcHandler:say('You do not have enough gold.', cid)
                                Topic[cid] = nil
                        end
                elseif getPlayerMoney(cid) == 0 then
                        npcHandler:say('You don\'t have any gold with you.', cid)
                        Topic[cid] = nil
                else
                        npcHandler:say('Please tell me how much gold it is you would like to deposit.', cid)
                        Topic[cid] = 1
                end
        elseif Topic[cid] == 1 then
                if getCount(msg) == -1 then
                        npcHandler:say('Please tell me how much gold it is you would like to deposit.', cid)
                        Topic[cid] = 1
                elseif getPlayerMoney(cid) >= getCount(msg) then
                        count[cid] = getCount(msg)
                        npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
                        Topic[cid] = 2
                else
                        npcHandler:say('You do not have enough gold.', cid)
                        Topic[cid] = nil
                end
        elseif msgcontains(msg, 'yes') and Topic[cid] == 2 then
                if doPlayerRemoveMoney(cid, count[cid]) then
                        doPlayerSetBalance(cid, getPlayerBalance(cid) + count[cid])
                        npcHandler:say('Alright, we have added the amount of ' .. count[cid] .. ' gold to your balance. You can withdraw your money anytime you want to.', cid)
                else
                        npcHandler:say('I am inconsolable, but it seems you have lost your gold. I hope you get it back.', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'no') and Topic[cid] == 2 then
                npcHandler:say('As you wish. Is there something else I can do for you?', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'withdraw') then
                if getCount(msg) == 0 then
                        npcHandler:say('Sure, you want nothing you get nothing!', cid)
                        Topic[cid] = nil
                elseif getCount(msg) ~= -1 then
                        if getPlayerBalance(cid) >= getCount(msg) then
                                count[cid] = getCount(msg)
                                npcHandler:say('Are you sure you wish to withdraw ' .. count[cid] .. ' gold from your bank account?', cid)
                                Topic[cid] = 4
                        else
                                npcHandler:say('There is not enough gold on your account.', cid)
                                Topic[cid] = nil
                        end
                elseif getPlayerBalance(cid) == 0 then
                        npcHandler:say('You don\'t have any money on your bank account.', cid)
                        Topic[cid] = nil
                else
                        npcHandler:say('Please tell me how much gold you would like to withdraw.', cid)
                        Topic[cid] = 3
                end
        elseif Topic[cid] == 3 then
                if getCount(msg) == -1 then
                        npcHandler:say('Please tell me how much gold you would like to withdraw.', cid)
                        Topic[cid] = 3
                elseif getPlayerBalance(cid) >= getCount(msg) then
                        count[cid] = getCount(msg)
                        npcHandler:say('Are you sure you wish to withdraw ' .. count[cid] .. ' gold from your bank account?', cid)
                        Topic[cid] = 4
                else
                        npcHandler:say('There is not enough gold on your account.', cid)
                        Topic[cid] = nil
                end
        elseif msgcontains(msg, 'yes') and Topic[cid] == 4 then
                if getPlayerBalance(cid) >= count[cid] then
                        doPlayerAddMoney(cid, count[cid])
                        doPlayerSetBalance(cid, getPlayerBalance(cid) - count[cid])
                        npcHandler:say('Here you are, ' .. count[cid] .. ' gold. Please let me know if there is something else I can do for you.', cid)
                else
                        npcHandler:say('There is not enough gold on your account.', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'no') and Topic[cid] == 4 then
                npcHandler:say('The customer is king! Come back anytime you want to if you wish to withdraw your money.', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'transfer') then
                if getCount(msg) == 0 then
                        npcHandler:say('Please think about it. Okay?', cid)
                        Topic[cid] = nil
                elseif getCount(msg) ~= -1 then
                        count[cid] = getCount(msg)
                        if getPlayerBalance(cid) >= count[cid] then
                                npcHandler:say('Who would you like to transfer ' .. count[cid] .. ' gold to?', cid)
                                Topic[cid] = 6
                        else
                                npcHandler:say('There is not enough gold on your account.', cid)
                                Topic[cid] = nil
                        end
                else
                        npcHandler:say('Please tell me the amount of gold you would like to transfer.', cid)
                        Topic[cid] = 5
                end
        elseif Topic[cid] == 5 then
                if getCount(msg) == -1 then
                        npcHandler:say('Please tell me the amount of gold you would like to transfer.', cid)
                        Topic[cid] = 5
                else
                        count[cid] = getCount(msg)
                        if getPlayerBalance(cid) >= count[cid] then
                                npcHandler:say('Who would you like to transfer ' .. count[cid] .. ' gold to?', cid)
                                Topic[cid] = 6
                        else
                                npcHandler:say('There is not enough gold on your account.', cid)
                                Topic[cid] = nil
                        end
                end
        elseif Topic[cid] == 6 then
                local v = getPlayerByName(msg)
                if getPlayerBalance(cid) >= count[cid] then
                        if v then
                                transfer[cid] = msg
                                npcHandler:say('Would you really like to transfer ' .. count[cid] .. ' gold to ' .. getPlayerName(v) .. '?', cid)
                                Topic[cid] = 7
                        elseif findPlayer(msg):lower() == msg:lower() then
                                transfer[cid] = msg
                                npcHandler:say('Would you really like to transfer ' .. count[cid] .. ' gold to ' .. findPlayer(msg) .. '?', cid)
                                Topic[cid] = 7
                        else
                                npcHandler:say('This player does not exist.', cid)
                                Topic[cid] = nil
                        end
                else
                        npcHandler:say('There is not enough gold on your account.', cid)
                        Topic[cid] = nil
                end
        elseif Topic[cid] == 7 and msgcontains(msg, 'yes') then
                if getPlayerBalance(cid) >= count[cid] then
                        local v = getPlayerByName(transfer[cid])
                        if v then
                                doPlayerSetBalance(cid, getPlayerBalance(cid) - count[cid])
                                doPlayerSetBalance(v, getPlayerBalance(v) + count[cid])
                                npcHandler:say('Very well. You have transferred ' .. count[cid] .. ' gold to ' .. getPlayerName(v) .. '.', cid)
                        elseif findPlayer(transfer[cid]):lower() == transfer[cid]:lower() then
                                doPlayerSetBalance(cid, getPlayerBalance(cid) - count[cid])
                                db.executeQuery('UPDATE players SET balance=balance+' .. count[cid] .. ' WHERE name=' .. db.escapeString(transfer[cid]) .. ' LIMIT 1')
                                npcHandler:say('Very well. You have transferred ' .. count[cid] .. ' gold to ' .. findPlayer(transfer[cid]) .. '.', cid)
                        else
                                npcHandler:say('This player does not exist.', cid)
                        end
                else
                        npcHandler:say('There is not enough gold on your account.', cid)
                end
                Topic[cid] = nil
        elseif Topic[cid] == 7 and msgcontains(msg, 'no') then
                npcHandler:say('Alright, is there something else I can do for you?', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'change gold') then
                npcHandler:say('How many platinum coins would you like to get?', cid)
                Topic[cid] = 8
        elseif Topic[cid] == 8 then
                if getCount(msg) < 1 then
                        npcHandler:say('Hmm, can I help you with something else?', cid)
                        Topic[cid] = nil
                else
                        count[cid] = math.min(500, getCount(msg))
                        npcHandler:say('So you would like me to change ' .. count[cid] * 100 .. ' of your gold coins into ' .. count[cid] .. ' platinum coins?', cid)
                        Topic[cid] = 9
                end
        elseif Topic[cid] == 9 then
                if msgcontains(msg, 'yes') then
                        if doPlayerRemoveItem(cid, 2148, count[cid] * 100) then
                                npcHandler:say('Here you are.', cid)
                                doPlayerAddItem(cid, 2152, count[cid])
                        else
                                npcHandler:say('Sorry, you do not have enough gold coins.', cid)
                        end
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'change platinum') then
                npcHandler:say('Would you like to change your platinum coins into gold or crystal?', cid)
                Topic[cid] = 10
        elseif Topic[cid] == 10 then
                if msgcontains(msg, 'gold') then
                        npcHandler:say('How many platinum coins would you like to change into gold?', cid)
                        Topic[cid] = 11
                elseif msgcontains(msg, 'crystal') then
                        npcHandler:say('How many crystal coins would you like to get?', cid)
                        Topic[cid] = 13
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                        Topic[cid] = nil
                end
        elseif Topic[cid] == 11 then
                if getCount(msg) < 1 then
                        npcHandler:say('Hmm, can I help you with something else?', cid)
                        Topic[cid] = nil
                else
                        count[cid] = math.min(500, getCount(msg))
                        npcHandler:say('So you would like me to change ' .. count[cid] .. ' of your platinum coins into ' .. count[cid] * 100 .. ' gold coins for you?', cid)
                        Topic[cid] = 12
                end
        elseif Topic[cid] == 12 then
                if msgcontains(msg, 'yes') then
                        if doPlayerRemoveItem(cid, 2152, count[cid]) then
                                npcHandler:say('Here you are.', cid)
                                doPlayerAddItem(cid, 2148, count[cid] * 100)
                        else
                                npcHandler:say('Sorry, you do not have enough platinum coins.', cid)
                        end
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                end
                Topic[cid] = nil
        elseif Topic[cid] == 13 then
                if getCount(msg) < 1 then
                        npcHandler:say('Hmm, can I help you with something else?', cid)
                        Topic[cid] = nil
                else
                        count[cid] = math.min(500, getCount(msg))
                        npcHandler:say('So you would like me to change ' .. count[cid] * 100 .. ' of your platinum coins into ' .. count[cid] .. ' crystal coins for you?', cid)
                        Topic[cid] = 14
                end
        elseif Topic[cid] == 14 then
                if msgcontains(msg, 'yes') then
                        if doPlayerRemoveItem(cid, 2152, count[cid] * 100) then
                                npcHandler:say('Here you are.', cid)
                                doPlayerAddItem(cid, 2160, count[cid])
                        else
                                npcHandler:say('Sorry, you do not have enough platinum coins.', cid)
                        end
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'change crystal') then
                npcHandler:say('How many crystal coins would you like to change into platinum?', cid)
                Topic[cid] = 15
        elseif Topic[cid] == 15 then
                if getCount(msg) == -1 or getCount(msg) == 0 then
                        npcHandler:say('Hmm, can I help you with something else?', cid)
                        Topic[cid] = nil
                else
                        count[cid] = math.min(500, getCount(msg))
                        npcHandler:say('So you would like me to change ' .. count[cid] .. ' of your crystal coins into ' .. count[cid] * 100 .. ' platinum coins for you?', cid)
                        Topic[cid] = 16
                end
        elseif Topic[cid] == 16 then
                if msgcontains(msg, 'yes') then
                        if doPlayerRemoveItem(cid, 2160, count[cid]) then
                                npcHandler:say('Here you are.', cid)
                                doPlayerAddItem(cid, 2152, count[cid] * 100)
                        else
                                npcHandler:say('Sorry, you do not have enough crystal coins.', cid)
                        end
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'change') then
                npcHandler:say('There are three different coin types in Tibia: 100 gold coins equal 1 platinum coin, 100 platinum coins equal 1 crystal coin. So if you\'d like to change 100 gold into 1 platinum, simply say \'{change gold}\' and then \'1 platinum\'.', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'bank') then
                npcHandler:say('We can change money for you. You can also access your bank account.', cid)
                Topic[cid] = nil
        end
        return true
end
 
npcHandler:setCallback(CALLBACK_GREET, greet)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

-- function maded by Gesior--
function getNumber(txt) --return number if its number and is > 0, else return 0
x = string.gsub(txt,"%a","")
x = tonumber(x)
if x ~= nill and x > 0 then
return x
else
return 0
end
end

 

Link para o post
Compartilhar em outros sites
1 minuto atrás, ikaroangelo21 disse:

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
 
local Topic, count, transfer = {}, {}, {}
 
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
 
local function getCount(s)
        local b, e = s:find('%d+')
        return b and e and math.min(4294967295, tonumber(s:sub(b, e))) or -1
end
 
local function findPlayer(name)
        local q = db.getResult('SELECT name FROM players WHERE name=' .. db.escapeString(name) .. ' LIMIT 1'), nil
        if q:getID() == -1 then
                return
        end
        local r = q:getDataString('name')
        q:free()
        return r
end
 
function greet(cid)
        Topic[cid], count[cid], transfer[cid] = nil, nil, nil
        return true
end
 
function creatureSayCallback(cid, type, msg)
        if not npcHandler:isFocused(cid) then
                return false
        elseif msgcontains(msg, 'balance') then
                npcHandler:say('Your account balance is ' .. getPlayerBalance(cid) .. ' gold.', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'deposit') and msgcontains(msg, 'all') then
                if getPlayerMoney(cid) == 0 then
                        npcHandler:say('You don\'t have any gold with you.', cid)
                        Topic[cid] = nil
                else
                        count[cid] = getPlayerMoney(cid)
                        npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
                        Topic[cid] = 2
                end
        elseif msgcontains(msg, 'deposit') then
                if getCount(msg) == 0 then
                        npcHandler:say('You are joking, aren\'t you??', cid)
                        Topic[cid] = nil
                elseif getCount(msg) ~= -1 then
                        if getPlayerMoney(cid) >= getCount(msg) then
                                count[cid] = getCount(msg)
                                npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
                                Topic[cid] = 2
                        else
                                npcHandler:say('You do not have enough gold.', cid)
                                Topic[cid] = nil
                        end
                elseif getPlayerMoney(cid) == 0 then
                        npcHandler:say('You don\'t have any gold with you.', cid)
                        Topic[cid] = nil
                else
                        npcHandler:say('Please tell me how much gold it is you would like to deposit.', cid)
                        Topic[cid] = 1
                end
        elseif Topic[cid] == 1 then
                if getCount(msg) == -1 then
                        npcHandler:say('Please tell me how much gold it is you would like to deposit.', cid)
                        Topic[cid] = 1
                elseif getPlayerMoney(cid) >= getCount(msg) then
                        count[cid] = getCount(msg)
                        npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
                        Topic[cid] = 2
                else
                        npcHandler:say('You do not have enough gold.', cid)
                        Topic[cid] = nil
                end
        elseif msgcontains(msg, 'yes') and Topic[cid] == 2 then
                if doPlayerRemoveMoney(cid, count[cid]) then
                        doPlayerSetBalance(cid, getPlayerBalance(cid) + count[cid])
                        npcHandler:say('Alright, we have added the amount of ' .. count[cid] .. ' gold to your balance. You can withdraw your money anytime you want to.', cid)
                else
                        npcHandler:say('I am inconsolable, but it seems you have lost your gold. I hope you get it back.', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'no') and Topic[cid] == 2 then
                npcHandler:say('As you wish. Is there something else I can do for you?', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'withdraw') then
                if getCount(msg) == 0 then
                        npcHandler:say('Sure, you want nothing you get nothing!', cid)
                        Topic[cid] = nil
                elseif getCount(msg) ~= -1 then
                        if getPlayerBalance(cid) >= getCount(msg) then
                                count[cid] = getCount(msg)
                                npcHandler:say('Are you sure you wish to withdraw ' .. count[cid] .. ' gold from your bank account?', cid)
                                Topic[cid] = 4
                        else
                                npcHandler:say('There is not enough gold on your account.', cid)
                                Topic[cid] = nil
                        end
                elseif getPlayerBalance(cid) == 0 then
                        npcHandler:say('You don\'t have any money on your bank account.', cid)
                        Topic[cid] = nil
                else
                        npcHandler:say('Please tell me how much gold you would like to withdraw.', cid)
                        Topic[cid] = 3
                end
        elseif Topic[cid] == 3 then
                if getCount(msg) == -1 then
                        npcHandler:say('Please tell me how much gold you would like to withdraw.', cid)
                        Topic[cid] = 3
                elseif getPlayerBalance(cid) >= getCount(msg) then
                        count[cid] = getCount(msg)
                        npcHandler:say('Are you sure you wish to withdraw ' .. count[cid] .. ' gold from your bank account?', cid)
                        Topic[cid] = 4
                else
                        npcHandler:say('There is not enough gold on your account.', cid)
                        Topic[cid] = nil
                end
        elseif msgcontains(msg, 'yes') and Topic[cid] == 4 then
                if getPlayerBalance(cid) >= count[cid] then
                        doPlayerAddMoney(cid, count[cid])
                        doPlayerSetBalance(cid, getPlayerBalance(cid) - count[cid])
                        npcHandler:say('Here you are, ' .. count[cid] .. ' gold. Please let me know if there is something else I can do for you.', cid)
                else
                        npcHandler:say('There is not enough gold on your account.', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'no') and Topic[cid] == 4 then
                npcHandler:say('The customer is king! Come back anytime you want to if you wish to withdraw your money.', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'transfer') then
                if getCount(msg) == 0 then
                        npcHandler:say('Please think about it. Okay?', cid)
                        Topic[cid] = nil
                elseif getCount(msg) ~= -1 then
                        count[cid] = getCount(msg)
                        if getPlayerBalance(cid) >= count[cid] then
                                npcHandler:say('Who would you like to transfer ' .. count[cid] .. ' gold to?', cid)
                                Topic[cid] = 6
                        else
                                npcHandler:say('There is not enough gold on your account.', cid)
                                Topic[cid] = nil
                        end
                else
                        npcHandler:say('Please tell me the amount of gold you would like to transfer.', cid)
                        Topic[cid] = 5
                end
        elseif Topic[cid] == 5 then
                if getCount(msg) == -1 then
                        npcHandler:say('Please tell me the amount of gold you would like to transfer.', cid)
                        Topic[cid] = 5
                else
                        count[cid] = getCount(msg)
                        if getPlayerBalance(cid) >= count[cid] then
                                npcHandler:say('Who would you like to transfer ' .. count[cid] .. ' gold to?', cid)
                                Topic[cid] = 6
                        else
                                npcHandler:say('There is not enough gold on your account.', cid)
                                Topic[cid] = nil
                        end
                end
        elseif Topic[cid] == 6 then
                local v = getPlayerByName(msg)
                if getPlayerBalance(cid) >= count[cid] then
                        if v then
                                transfer[cid] = msg
                                npcHandler:say('Would you really like to transfer ' .. count[cid] .. ' gold to ' .. getPlayerName(v) .. '?', cid)
                                Topic[cid] = 7
                        elseif findPlayer(msg):lower() == msg:lower() then
                                transfer[cid] = msg
                                npcHandler:say('Would you really like to transfer ' .. count[cid] .. ' gold to ' .. findPlayer(msg) .. '?', cid)
                                Topic[cid] = 7
                        else
                                npcHandler:say('This player does not exist.', cid)
                                Topic[cid] = nil
                        end
                else
                        npcHandler:say('There is not enough gold on your account.', cid)
                        Topic[cid] = nil
                end
        elseif Topic[cid] == 7 and msgcontains(msg, 'yes') then
                if getPlayerBalance(cid) >= count[cid] then
                        local v = getPlayerByName(transfer[cid])
                        if v then
                                doPlayerSetBalance(cid, getPlayerBalance(cid) - count[cid])
                                doPlayerSetBalance(v, getPlayerBalance(v) + count[cid])
                                npcHandler:say('Very well. You have transferred ' .. count[cid] .. ' gold to ' .. getPlayerName(v) .. '.', cid)
                        elseif findPlayer(transfer[cid]):lower() == transfer[cid]:lower() then
                                doPlayerSetBalance(cid, getPlayerBalance(cid) - count[cid])
                                db.executeQuery('UPDATE players SET balance=balance+' .. count[cid] .. ' WHERE name=' .. db.escapeString(transfer[cid]) .. ' LIMIT 1')
                                npcHandler:say('Very well. You have transferred ' .. count[cid] .. ' gold to ' .. findPlayer(transfer[cid]) .. '.', cid)
                        else
                                npcHandler:say('This player does not exist.', cid)
                        end
                else
                        npcHandler:say('There is not enough gold on your account.', cid)
                end
                Topic[cid] = nil
        elseif Topic[cid] == 7 and msgcontains(msg, 'no') then
                npcHandler:say('Alright, is there something else I can do for you?', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'change gold') then
                npcHandler:say('How many platinum coins would you like to get?', cid)
                Topic[cid] = 8
        elseif Topic[cid] == 8 then
                if getCount(msg) < 1 then
                        npcHandler:say('Hmm, can I help you with something else?', cid)
                        Topic[cid] = nil
                else
                        count[cid] = math.min(500, getCount(msg))
                        npcHandler:say('So you would like me to change ' .. count[cid] * 100 .. ' of your gold coins into ' .. count[cid] .. ' platinum coins?', cid)
                        Topic[cid] = 9
                end
        elseif Topic[cid] == 9 then
                if msgcontains(msg, 'yes') then
                        if doPlayerRemoveItem(cid, 2148, count[cid] * 100) then
                                npcHandler:say('Here you are.', cid)
                                doPlayerAddItem(cid, 2152, count[cid])
                        else
                                npcHandler:say('Sorry, you do not have enough gold coins.', cid)
                        end
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'change platinum') then
                npcHandler:say('Would you like to change your platinum coins into gold or crystal?', cid)
                Topic[cid] = 10
        elseif Topic[cid] == 10 then
                if msgcontains(msg, 'gold') then
                        npcHandler:say('How many platinum coins would you like to change into gold?', cid)
                        Topic[cid] = 11
                elseif msgcontains(msg, 'crystal') then
                        npcHandler:say('How many crystal coins would you like to get?', cid)
                        Topic[cid] = 13
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                        Topic[cid] = nil
                end
        elseif Topic[cid] == 11 then
                if getCount(msg) < 1 then
                        npcHandler:say('Hmm, can I help you with something else?', cid)
                        Topic[cid] = nil
                else
                        count[cid] = math.min(500, getCount(msg))
                        npcHandler:say('So you would like me to change ' .. count[cid] .. ' of your platinum coins into ' .. count[cid] * 100 .. ' gold coins for you?', cid)
                        Topic[cid] = 12
                end
        elseif Topic[cid] == 12 then
                if msgcontains(msg, 'yes') then
                        if doPlayerRemoveItem(cid, 2152, count[cid]) then
                                npcHandler:say('Here you are.', cid)
                                doPlayerAddItem(cid, 2148, count[cid] * 100)
                        else
                                npcHandler:say('Sorry, you do not have enough platinum coins.', cid)
                        end
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                end
                Topic[cid] = nil
        elseif Topic[cid] == 13 then
                if getCount(msg) < 1 then
                        npcHandler:say('Hmm, can I help you with something else?', cid)
                        Topic[cid] = nil
                else
                        count[cid] = math.min(500, getCount(msg))
                        npcHandler:say('So you would like me to change ' .. count[cid] * 100 .. ' of your platinum coins into ' .. count[cid] .. ' crystal coins for you?', cid)
                        Topic[cid] = 14
                end
        elseif Topic[cid] == 14 then
                if msgcontains(msg, 'yes') then
                        if doPlayerRemoveItem(cid, 2152, count[cid] * 100) then
                                npcHandler:say('Here you are.', cid)
                                doPlayerAddItem(cid, 2160, count[cid])
                        else
                                npcHandler:say('Sorry, you do not have enough platinum coins.', cid)
                        end
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'change crystal') then
                npcHandler:say('How many crystal coins would you like to change into platinum?', cid)
                Topic[cid] = 15
        elseif Topic[cid] == 15 then
                if getCount(msg) == -1 or getCount(msg) == 0 then
                        npcHandler:say('Hmm, can I help you with something else?', cid)
                        Topic[cid] = nil
                else
                        count[cid] = math.min(500, getCount(msg))
                        npcHandler:say('So you would like me to change ' .. count[cid] .. ' of your crystal coins into ' .. count[cid] * 100 .. ' platinum coins for you?', cid)
                        Topic[cid] = 16
                end
        elseif Topic[cid] == 16 then
                if msgcontains(msg, 'yes') then
                        if doPlayerRemoveItem(cid, 2160, count[cid]) then
                                npcHandler:say('Here you are.', cid)
                                doPlayerAddItem(cid, 2152, count[cid] * 100)
                        else
                                npcHandler:say('Sorry, you do not have enough crystal coins.', cid)
                        end
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'change') then
                npcHandler:say('There are three different coin types in Tibia: 100 gold coins equal 1 platinum coin, 100 platinum coins equal 1 crystal coin. So if you\'d like to change 100 gold into 1 platinum, simply say \'{change gold}\' and then \'1 platinum\'.', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'bank') then
                npcHandler:say('We can change money for you. You can also access your bank account.', cid)
                Topic[cid] = nil
        end
        return true
end
 
npcHandler:setCallback(CALLBACK_GREET, greet)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

-- function maded by Gesior--
function getNumber(txt) --return number if its number and is > 0, else return 0
x = string.gsub(txt,"%a","")
x = tonumber(x)
if x ~= nill and x > 0 then
return x
else
return 0
end
end

 

 

funcionou!!! mt obrigado! +rep

2 minutos atrás, kinomoto disse:

funcionou!!! mt obrigado! +rep

 

tentei usar o transfer e apareceu um erro 

Lua Script Error: [Npc interface]
data/npc/scripts/Eva.lua:onCreatureSay
data/npc/scripts/Eva.lua:18: attempt to call field 'getResult' (a nil value)
stack traceback:
        [C]: in function 'getResult'
        data/npc/scripts/Eva.lua:18: in function 'findPlayer'
        data/npc/scripts/Eva.lua:172: in function 'callback'
        data/npc/lib/npcsystem/npchandler.lua:411: in function 'onCreatureSay'
        data/npc/scripts/Eva.lua:9: in function <data/npc/scripts/Eva.lua:9>

Lua Script Error: [Npc interface]
data/npc/scripts/Eva.lua:onCreatureSay
data/npc/scripts/Eva.lua:18: attempt to call field 'getResult' (a nil value)
stack traceback:
        [C]: in function 'getResult'
        data/npc/scripts/Eva.lua:18: in function 'findPlayer'
        data/npc/scripts/Eva.lua:172: in function 'callback'
        data/npc/lib/npcsystem/npchandler.lua:411: in function 'onCreatureSay'
        data/npc/scripts/Eva.lua:9: in function <data/npc/scripts/Eva.lua:9>

Link para o post
Compartilhar em outros sites
3 horas atrás, kinomoto disse:

funcionou!!! mt obrigado! +rep

tentei usar o transfer e apareceu um erro 

Lua Script Error: [Npc interface]
data/npc/scripts/Eva.lua:onCreatureSay
data/npc/scripts/Eva.lua:18: attempt to call field 'getResult' (a nil value)
stack traceback:
        [C]: in function 'getResult'
        data/npc/scripts/Eva.lua:18: in function 'findPlayer'
        data/npc/scripts/Eva.lua:172: in function 'callback'
        data/npc/lib/npcsystem/npchandler.lua:411: in function 'onCreatureSay'
        data/npc/scripts/Eva.lua:9: in function <data/npc/scripts/Eva.lua:9>

Lua Script Error: [Npc interface]
data/npc/scripts/Eva.lua:onCreatureSay
data/npc/scripts/Eva.lua:18: attempt to call field 'getResult' (a nil value)
stack traceback:
        [C]: in function 'getResult'
        data/npc/scripts/Eva.lua:18: in function 'findPlayer'
        data/npc/scripts/Eva.lua:172: in function 'callback'
        data/npc/lib/npcsystem/npchandler.lua:411: in function 'onCreatureSay'
        data/npc/scripts/Eva.lua:9: in function <data/npc/scripts/Eva.lua:9>

 

data/npc/lib/npcsystem/npchandler.lua (coloque o abaixo).

Citar

-- Advanced NPC System by Jiddo

if NpcHandler == nil then
    -- Constant talkdelay behaviors.
    TALKDELAY_NONE = 0 -- No talkdelay. Npc will reply immedeatly.
    TALKDELAY_ONTHINK = 1 -- Talkdelay handled through the onThink callback function. (Default)
    TALKDELAY_EVENT = 2 -- Not yet implemented

    -- Currently applied talkdelay behavior. TALKDELAY_ONTHINK is default.
    NPCHANDLER_TALKDELAY = TALKDELAY_ONTHINK

    -- Constant indexes for defining default messages.
    MESSAGE_GREET = 1 -- When the player greets the npc.
    MESSAGE_FAREWELL = 2 -- When the player unGreets the npc.
    MESSAGE_BUY = 3 -- When the npc asks the player if he wants to buy something.
    MESSAGE_ONBUY = 4 -- When the player successfully buys something via talk.
    MESSAGE_BOUGHT = 5 -- When the player bought something through the shop window.
    MESSAGE_SELL = 6 -- When the npc asks the player if he wants to sell something.
    MESSAGE_ONSELL = 7 -- When the player successfully sells something via talk.
    MESSAGE_SOLD = 8 -- When the player sold something through the shop window.
    MESSAGE_MISSINGMONEY = 9 -- When the player does not have enough money.
    MESSAGE_NEEDMONEY = 10 -- Same as above, used for shop window.
    MESSAGE_MISSINGITEM = 11 -- When the player is trying to sell an item he does not have.
    MESSAGE_NEEDITEM = 12 -- Same as above, used for shop window.
    MESSAGE_NEEDSPACE = 13 -- When the player don't have any space to buy an item
    MESSAGE_NEEDMORESPACE = 14 -- When the player has some space to buy an item, but not enough space
    MESSAGE_IDLETIMEOUT = 15 -- When the player has been idle for longer then idleTime allows.
    MESSAGE_WALKAWAY = 16 -- When the player walks out of the talkRadius of the npc.
    MESSAGE_DECLINE = 17 -- When the player says no to something.
    MESSAGE_SENDTRADE = 18 -- When the npc sends the trade window to the player
    MESSAGE_NOSHOP = 19 -- When the npc's shop is requested but he doesn't have any
    MESSAGE_ONCLOSESHOP = 20 -- When the player closes the npc's shop window
    MESSAGE_ALREADYFOCUSED = 21 -- When the player already has the focus of this npc.
    MESSAGE_WALKAWAY_MALE = 22 -- When a male player walks out of the talkRadius of the npc.
    MESSAGE_WALKAWAY_FEMALE = 23 -- When a female player walks out of the talkRadius of the npc.

    -- Constant indexes for callback functions. These are also used for module callback ids.
    CALLBACK_CREATURE_APPEAR = 1
    CALLBACK_CREATURE_DISAPPEAR    = 2
    CALLBACK_CREATURE_SAY = 3
    CALLBACK_ONTHINK = 4
    CALLBACK_GREET = 5
    CALLBACK_FAREWELL = 6
    CALLBACK_MESSAGE_DEFAULT = 7
    CALLBACK_PLAYER_ENDTRADE = 8
    CALLBACK_PLAYER_CLOSECHANNEL = 9
    CALLBACK_ONBUY = 10
    CALLBACK_ONSELL = 11
    CALLBACK_ONADDFOCUS = 18
    CALLBACK_ONRELEASEFOCUS = 19
    CALLBACK_ONTRADEREQUEST = 20

    -- Addidional module callback ids
    CALLBACK_MODULE_INIT = 12
    CALLBACK_MODULE_RESET = 13

    -- Constant strings defining the keywords to replace in the default messages.
    TAG_PLAYERNAME = "|PLAYERNAME|"
    TAG_ITEMCOUNT = "|ITEMCOUNT|"
    TAG_TOTALCOST = "|TOTALCOST|"
    TAG_ITEMNAME = "|ITEMNAME|"

    NpcHandler = {
        keywordHandler = nil,
        focuses = nil,
        talkStart = nil,
        idleTime = 120,
        talkRadius = 3,
        talkDelayTime = 1, -- Seconds to delay outgoing messages.
        talkDelay = nil,
        callbackFunctions = nil,
        modules = nil,
        shopItems = nil, -- They must be here since ShopModule uses 'static' functions
        eventSay = nil,
        eventDelayedSay = nil,
        topic = nil,
        messages = {
            -- These are the default replies of all npcs. They can/should be changed individually for each npc.
            [MESSAGE_GREET] = "Greetings, |PLAYERNAME|.",
            [MESSAGE_FAREWELL] = "Good bye, |PLAYERNAME|.",
            [MESSAGE_BUY] = "Do you want to buy |ITEMCOUNT| |ITEMNAME| for |TOTALCOST| gold coins?",
            [MESSAGE_ONBUY] = "Here you are.",
            [MESSAGE_BOUGHT] = "Bought |ITEMCOUNT|x |ITEMNAME| for |TOTALCOST| gold.",
            [MESSAGE_SELL] = "Do you want to sell |ITEMCOUNT| |ITEMNAME| for |TOTALCOST| gold coins?",
            [MESSAGE_ONSELL] = "Here you are, |TOTALCOST| gold.",
            [MESSAGE_SOLD] = "Sold |ITEMCOUNT|x |ITEMNAME| for |TOTALCOST| gold.",
            [MESSAGE_MISSINGMONEY] = "You don't have enough money.",
            [MESSAGE_NEEDMONEY] = "You don't have enough money.",
            [MESSAGE_MISSINGITEM] = "You don't have so many.",
            [MESSAGE_NEEDITEM] = "You do not have this object.",
            [MESSAGE_NEEDSPACE] = "You do not have enough capacity.",
            [MESSAGE_NEEDMORESPACE] = "You do not have enough capacity for all items.",
            [MESSAGE_IDLETIMEOUT] = "Good bye.",
            [MESSAGE_WALKAWAY] = "Good bye.",
            [MESSAGE_DECLINE] = "Then not.",
            [MESSAGE_SENDTRADE] = "Of course, just browse through my wares.",
            [MESSAGE_NOSHOP] = "Sorry, I'm not offering anything.",
            [MESSAGE_ONCLOSESHOP] = "Thank you, come back whenever you're in need of something else.",
            [MESSAGE_ALREADYFOCUSED] = "|PLAYERNAME|, I am already talking to you.",
            [MESSAGE_WALKAWAY_MALE] = "Good bye.",
            [MESSAGE_WALKAWAY_FEMALE] = "Good bye."
        }
    }

    -- Creates a new NpcHandler with an empty callbackFunction stack.
    function NpcHandler:new(keywordHandler)
        local obj = {}
        obj.callbackFunctions = {}
        obj.modules = {}
        obj.eventSay = {}
        obj.eventDelayedSay = {}
        obj.topic = {}
        obj.focuses = {}
        obj.talkStart = {}
        obj.talkDelay = {}
        obj.keywordHandler = keywordHandler
        obj.messages = {}
        obj.shopItems = {}

        setmetatable(obj.messages, self.messages)
        self.messages.__index = self.messages

        setmetatable(obj, self)
        self.__index = self
        return obj
    end

    -- Re-defines the maximum idle time allowed for a player when talking to this npc.
    function NpcHandler:setMaxIdleTime(newTime)
        self.idleTime = newTime
    end

    -- Attaches a new keyword handler to this npchandler
    function NpcHandler:setKeywordHandler(newHandler)
        self.keywordHandler = newHandler
    end

    -- Function used to change the focus of this npc.
    function NpcHandler:addFocus(newFocus)
        if self:isFocused(newFocus) then
            return
        end

        self.focuses[#self.focuses + 1] = newFocus
        self.topic[newFocus] = 0
        local callback = self:getCallback(CALLBACK_ONADDFOCUS)
        if callback == nil or callback(newFocus) then
            self:processModuleCallback(CALLBACK_ONADDFOCUS, newFocus)
        end
        self:updateFocus()
    end

    -- Function used to verify if npc is focused to certain player
    function NpcHandler:isFocused(focus)
        for k,v in pairs(self.focuses) do
            if v == focus then
                return true
            end
        end
        return false
    end

    -- This function should be called on each onThink and makes sure the npc faces the player it is talking to.
    --    Should also be called whenever a new player is focused.
    function NpcHandler:updateFocus()
        for pos, focus in pairs(self.focuses) do
            if focus ~= nil then
                doNpcSetCreatureFocus(focus)
                return
            end
        end
        doNpcSetCreatureFocus(0)
    end

    -- Used when the npc should un-focus the player.
    function NpcHandler:releaseFocus(focus)
        if shop_cost[focus] ~= nil then
            shop_amount[focus] = nil
            shop_cost[focus] = nil
            shop_rlname[focus] = nil
            shop_itemid[focus] = nil
            shop_container[focus] = nil
            shop_npcuid[focus] = nil
            shop_eventtype[focus] = nil
            shop_subtype[focus] = nil
            shop_destination[focus] = nil
            shop_premium[focus] = nil
        end

        if self.eventDelayedSay[focus] then
            self:cancelNPCTalk(self.eventDelayedSay[focus])
        end

        if not self:isFocused(focus) then
            return
        end

        local pos = nil
        for k,v in pairs(self.focuses) do
            if v == focus then
                pos = k
            end
        end
        self.focuses[pos] = nil

        self.eventSay[focus] = nil
        self.eventDelayedSay[focus] = nil
        self.talkStart[focus] = nil
        self.topic[focus] = nil

        local callback = self:getCallback(CALLBACK_ONRELEASEFOCUS)
        if callback == nil or callback(focus) then
            self:processModuleCallback(CALLBACK_ONRELEASEFOCUS, focus)
        end

        if Player(focus) ~= nil then
            closeShopWindow(focus) --Even if it can not exist, we need to prevent it.
            self:updateFocus()
        end
    end

    -- Returns the callback function with the specified id or nil if no such callback function exists.
    function NpcHandler:getCallback(id)
        local ret = nil
        if self.callbackFunctions ~= nil then
            ret = self.callbackFunctions[id]
        end
        return ret
    end

    -- Changes the callback function for the given id to callback.
    function NpcHandler:setCallback(id, callback)
        if self.callbackFunctions ~= nil then
            self.callbackFunctions[id] = callback
        end
    end

    -- Adds a module to this npchandler and inits it.
    function NpcHandler:addModule(module)
        if self.modules ~= nil then
            self.modules[#self.modules + 1] = module
            module:init(self)
        end
    end

    -- Calls the callback function represented by id for all modules added to this npchandler with the given arguments.
    function NpcHandler:processModuleCallback(id, ...)
        local ret = true
        for i, module in pairs(self.modules) do
            local tmpRet = true
            if id == CALLBACK_CREATURE_APPEAR and module.callbackOnCreatureAppear ~= nil then
                tmpRet = module:callbackOnCreatureAppear(...)
            elseif id == CALLBACK_CREATURE_DISAPPEAR and module.callbackOnCreatureDisappear ~= nil then
                tmpRet = module:callbackOnCreatureDisappear(...)
            elseif id == CALLBACK_CREATURE_SAY and module.callbackOnCreatureSay ~= nil then
                tmpRet = module:callbackOnCreatureSay(...)
            elseif id == CALLBACK_PLAYER_ENDTRADE and module.callbackOnPlayerEndTrade ~= nil then
                tmpRet = module:callbackOnPlayerEndTrade(...)
            elseif id == CALLBACK_PLAYER_CLOSECHANNEL and module.callbackOnPlayerCloseChannel ~= nil then
                tmpRet = module:callbackOnPlayerCloseChannel(...)
            elseif id == CALLBACK_ONBUY and module.callbackOnBuy ~= nil then
                tmpRet = module:callbackOnBuy(...)
            elseif id == CALLBACK_ONSELL and module.callbackOnSell ~= nil then
                tmpRet = module:callbackOnSell(...)
            elseif id == CALLBACK_ONTRADEREQUEST and module.callbackOnTradeRequest ~= nil then
                tmpRet = module:callbackOnTradeRequest(...)
            elseif id == CALLBACK_ONADDFOCUS and module.callbackOnAddFocus ~= nil then
                tmpRet = module:callbackOnAddFocus(...)
            elseif id == CALLBACK_ONRELEASEFOCUS and module.callbackOnReleaseFocus ~= nil then
                tmpRet = module:callbackOnReleaseFocus(...)
            elseif id == CALLBACK_ONTHINK and module.callbackOnThink ~= nil then
                tmpRet = module:callbackOnThink(...)
            elseif id == CALLBACK_GREET and module.callbackOnGreet ~= nil then
                tmpRet = module:callbackOnGreet(...)
            elseif id == CALLBACK_FAREWELL and module.callbackOnFarewell ~= nil then
                tmpRet = module:callbackOnFarewell(...)
            elseif id == CALLBACK_MESSAGE_DEFAULT and module.callbackOnMessageDefault ~= nil then
                tmpRet = module:callbackOnMessageDefault(...)
            elseif id == CALLBACK_MODULE_RESET and module.callbackOnModuleReset ~= nil then
                tmpRet = module:callbackOnModuleReset(...)
            end
            if not tmpRet then
                ret = false
                break
            end
        end
        return ret
    end

    -- Returns the message represented by id.
    function NpcHandler:getMessage(id)
        local ret = nil
        if self.messages ~= nil then
            ret = self.messages[id]
        end
        return ret
    end

    -- Changes the default response message with the specified id to newMessage.
    function NpcHandler:setMessage(id, newMessage)
        if self.messages ~= nil then
            self.messages[id] = newMessage
        end
    end

    -- Translates all message tags found in msg using parseInfo
    function NpcHandler:parseMessage(msg, parseInfo)
        local ret = msg
        for search, replace in pairs(parseInfo) do
            ret = string.gsub(ret, search, replace)
        end
        return ret
    end

    -- Makes sure the npc un-focuses the currently focused player
    function NpcHandler:unGreet(cid)
        if not self:isFocused(cid) then
            return
        end

        local callback = self:getCallback(CALLBACK_FAREWELL)
        if callback == nil or callback() then
            if self:processModuleCallback(CALLBACK_FAREWELL) then
                local msg = self:getMessage(MESSAGE_FAREWELL)
                local player = Player(cid)
                local playerName = player and player:getName() or -1
                local parseInfo = { [TAG_PLAYERNAME] = playerName }
                self:resetNpc(cid)
                msg = self:parseMessage(msg, parseInfo)
                self:say(msg, cid, true)
                self:releaseFocus(cid)
            end
        end
    end

    -- Greets a new player.
    function NpcHandler:greet(cid)
        if cid ~= 0 then
            local callback = self:getCallback(CALLBACK_GREET)
            if callback == nil or callback(cid) then
                if self:processModuleCallback(CALLBACK_GREET, cid) then
                    local msg = self:getMessage(MESSAGE_GREET)
                    local player = Player(cid)
                    local playerName = player and player:getName() or -1
                    local parseInfo = { [TAG_PLAYERNAME] = playerName }
                    msg = self:parseMessage(msg, parseInfo)
                    self:say(msg, cid, true)
                else
                    return
                end
            else
                return
            end
        end
        self:addFocus(cid)
    end

    -- Handles onCreatureAppear events. If you with to handle this yourself, please use the CALLBACK_CREATURE_APPEAR callback.
    function NpcHandler:onCreatureAppear(creature)
        local cid = creature:getId()
        if cid == getNpcCid() and next(self.shopItems) ~= nil then
            local npc = Npc()
            local speechBubble = npc:getSpeechBubble()
            if speechBubble == 3 then
                npc:setSpeechBubble(4)
            else
                npc:setSpeechBubble(2)
            end
        end

        local callback = self:getCallback(CALLBACK_CREATURE_APPEAR)
        if callback == nil or callback(cid) then
            if self:processModuleCallback(CALLBACK_CREATURE_APPEAR, cid) then
                --
            end
        end
    end

    -- Handles onCreatureDisappear events. If you with to handle this yourself, please use the CALLBACK_CREATURE_DISAPPEAR callback.
    function NpcHandler:onCreatureDisappear(creature)
        local cid = creature:getId()
        if getNpcCid() == cid then
            return
        end

        local callback = self:getCallback(CALLBACK_CREATURE_DISAPPEAR)
        if callback == nil or callback(cid) then
            if self:processModuleCallback(CALLBACK_CREATURE_DISAPPEAR, cid) then
                if self:isFocused(cid) then
                    self:unGreet(cid)
                end
            end
        end
    end

    -- Handles onCreatureSay events. If you with to handle this yourself, please use the CALLBACK_CREATURE_SAY callback.
    function NpcHandler:onCreatureSay(creature, msgtype, msg)
        local cid = creature:getId()
        local callback = self:getCallback(CALLBACK_CREATURE_SAY)
        if callback == nil or callback(cid, msgtype, msg) then
            if self:processModuleCallback(CALLBACK_CREATURE_SAY, cid, msgtype, msg) then
                if not self:isInRange(cid) then
                    return
                end

                if self.keywordHandler ~= nil then
                    if self:isFocused(cid) and msgtype == TALKTYPE_PRIVATE_PN or not self:isFocused(cid) then
                        local ret = self.keywordHandler:processMessage(cid, msg)
                        if not ret then
                            local callback = self:getCallback(CALLBACK_MESSAGE_DEFAULT)
                            if callback ~= nil and callback(cid, msgtype, msg) then
                                self.talkStart[cid] = os.time()
                            end
                        else
                            self.talkStart[cid] = os.time()
                        end
                    end
                end
            end
        end
    end

    -- Handles onPlayerEndTrade events. If you wish to handle this yourself, use the CALLBACK_PLAYER_ENDTRADE callback.
    function NpcHandler:onPlayerEndTrade(creature)
        local cid = creature:getId()
        local callback = self:getCallback(CALLBACK_PLAYER_ENDTRADE)
        if callback == nil or callback(cid) then
            if self:processModuleCallback(CALLBACK_PLAYER_ENDTRADE, cid, msgtype, msg) then
                if self:isFocused(cid) then
                    local player = Player(cid)
                    local playerName = player and player:getName() or -1
                    local parseInfo = { [TAG_PLAYERNAME] = playerName }
                    local msg = self:parseMessage(self:getMessage(MESSAGE_ONCLOSESHOP), parseInfo)
                    self:say(msg, cid)
                end
            end
        end
    end

    -- Handles onPlayerCloseChannel events. If you wish to handle this yourself, use the CALLBACK_PLAYER_CLOSECHANNEL callback.
    function NpcHandler:onPlayerCloseChannel(creature)
        local cid = creature:getId()
        local callback = self:getCallback(CALLBACK_PLAYER_CLOSECHANNEL)
        if callback == nil or callback(cid) then
            if self:processModuleCallback(CALLBACK_PLAYER_CLOSECHANNEL, cid, msgtype, msg) then
                if self:isFocused(cid) then
                    self:unGreet(cid)
                end
            end
        end
    end

    -- Handles onBuy events. If you wish to handle this yourself, use the CALLBACK_ONBUY callback.
    function NpcHandler:onBuy(creature, itemid, subType, amount, ignoreCap, inBackpacks)
        local cid = creature:getId()
        local callback = self:getCallback(CALLBACK_ONBUY)
        if callback == nil or callback(cid, itemid, subType, amount, ignoreCap, inBackpacks) then
            if self:processModuleCallback(CALLBACK_ONBUY, cid, itemid, subType, amount, ignoreCap, inBackpacks) then
                --
            end
        end
    end

    -- Handles onSell events. If you wish to handle this yourself, use the CALLBACK_ONSELL callback.
    function NpcHandler:onSell(creature, itemid, subType, amount, ignoreCap, inBackpacks)
        local cid = creature:getId()
        local callback = self:getCallback(CALLBACK_ONSELL)
        if callback == nil or callback(cid, itemid, subType, amount, ignoreCap, inBackpacks) then
            if self:processModuleCallback(CALLBACK_ONSELL, cid, itemid, subType, amount, ignoreCap, inBackpacks) then
                --
            end
        end
    end

    -- Handles onTradeRequest events. If you wish to handle this yourself, use the CALLBACK_ONTRADEREQUEST callback.
    function NpcHandler:onTradeRequest(cid)
        local callback = self:getCallback(CALLBACK_ONTRADEREQUEST)
        if callback == nil or callback(cid) then
            if self:processModuleCallback(CALLBACK_ONTRADEREQUEST, cid) then
                return true
            end
        end
        return false
    end

    -- Handles onThink events. If you wish to handle this yourself, please use the CALLBACK_ONTHINK callback.
    function NpcHandler:onThink()
        local callback = self:getCallback(CALLBACK_ONTHINK)
        if callback == nil or callback() then
            if NPCHANDLER_TALKDELAY == TALKDELAY_ONTHINK then
                for cid, talkDelay in pairs(self.talkDelay) do
                    if talkDelay.time ~= nil and talkDelay.message ~= nil and os.time() >= talkDelay.time then
                        selfSay(talkDelay.message, cid, talkDelay.publicize and true or false)
                        self.talkDelay[cid] = nil
                    end
                end
            end

            if self:processModuleCallback(CALLBACK_ONTHINK) then
                for pos, focus in pairs(self.focuses) do
                    if focus ~= nil then
                        if not self:isInRange(focus) then
                            self:onWalkAway(focus)
                        elseif self.talkStart[focus] ~= nil and (os.time() - self.talkStart[focus]) > self.idleTime then
                            self:unGreet(focus)
                        else
                            self:updateFocus()
                        end
                    end
                end
            end
        end
    end

    -- Tries to greet the player with the given cid.
    function NpcHandler:onGreet(cid)
        if self:isInRange(cid) then
            if not self:isFocused(cid) then
                self:greet(cid)
                return
            end
        end
    end

    -- Simply calls the underlying unGreet function.
    function NpcHandler:onFarewell(cid)
        self:unGreet(cid)
    end

    -- Should be called on this npc's focus if the distance to focus is greater then talkRadius.
    function NpcHandler:onWalkAway(cid)
        if self:isFocused(cid) then
            local callback = self:getCallback(CALLBACK_CREATURE_DISAPPEAR)
            if callback == nil or callback() then
                if self:processModuleCallback(CALLBACK_CREATURE_DISAPPEAR, cid) then
                    local msg = self:getMessage(MESSAGE_WALKAWAY)

                    local player = Player(cid)
                    local playerName = player and player:getName() or -1
                    local playerSex = player and player:getSex() or 0

                    local parseInfo = { [TAG_PLAYERNAME] = playerName }
                    local message = self:parseMessage(msg, parseInfo)

                    local msg_male = self:getMessage(MESSAGE_WALKAWAY_MALE)
                    local message_male = self:parseMessage(msg_male, parseInfo)
                    local msg_female = self:getMessage(MESSAGE_WALKAWAY_FEMALE)
                    local message_female = self:parseMessage(msg_female, parseInfo)
                    if message_female ~= message_male then
                        if playerSex == PLAYERSEX_FEMALE then
                            selfSay(message_female)
                        else
                            selfSay(message_male)
                        end
                    elseif message ~= "" then
                        selfSay(message)
                    end
                    self:resetNpc(cid)
                    self:releaseFocus(cid)
                end
            end
        end
    end

    -- Returns true if cid is within the talkRadius of this npc.
    function NpcHandler:isInRange(cid)
        local distance = Player(cid) ~= nil and getDistanceTo(cid) or -1
        if distance == -1 then
            return false
        end

        return distance <= self.talkRadius
    end

    -- Resets the npc into its initial state (in regard of the keywordhandler).
    --    All modules are also receiving a reset call through their callbackOnModuleReset function.
    function NpcHandler:resetNpc(cid)
        if self:processModuleCallback(CALLBACK_MODULE_RESET) then
            self.keywordHandler:reset(cid)
        end
    end

    function NpcHandler:cancelNPCTalk(events)
        for aux = 1, #events do
            stopEvent(events[aux].event)
        end
        events = nil
    end

    function NpcHandler:doNPCTalkALot(msgs, interval, pcid)
        if self.eventDelayedSay[pcid] then
            self:cancelNPCTalk(self.eventDelayedSay[pcid])
        end

        self.eventDelayedSay[pcid] = {}
        local ret = {}
        for aux = 1, #msgs do
            self.eventDelayedSay[pcid][aux] = {}
            doCreatureSayWithDelay(getNpcCid(), msgs[aux], TALKTYPE_PRIVATE_NP, ((aux-1) * (interval or 4000)) + 700, self.eventDelayedSay[pcid][aux], pcid)
            ret[#ret + 1] = self.eventDelayedSay[pcid][aux]
        end
        return(ret)
    end

    -- Makes the npc represented by this instance of NpcHandler say something.
    --    This implements the currently set type of talkdelay.
    --    shallDelay is a boolean value. If it is false, the message is not delayed. Default value is true.
    function NpcHandler:say(message, focus, publicize, shallDelay, delay)
        if type(message) == "table" then
            return self:doNPCTalkALot(message, delay or 6000, focus)
        end

        if self.eventDelayedSay[focus] then
            self:cancelNPCTalk(self.eventDelayedSay[focus])
        end

        local shallDelay = not shallDelay and true or shallDelay
        if NPCHANDLER_TALKDELAY == TALKDELAY_NONE or shallDelay == false then
            selfSay(message, focus, publicize and true or false)
            return
        end

        stopEvent(self.eventSay[focus])
        self.eventSay[focus] = addEvent(function(npcId, message, focusId)
            local npc = Npc(npcId)
            if npc == nil then
                return
            end
            local player = Player(focusId)
            if player then
                npc:say(message, TALKTYPE_PRIVATE_NP, false, player, npc:getPosition())
            end
        end, self.talkDelayTime * 1000, Npc():getId(), message, focus)
    end
end
 

 

Link para o post
Compartilhar em outros sites
12 horas atrás, Nightowl disse:

function doPlayerDepositMoney(cid, amount) 
    if(not doPlayerRemoveMoney(cid, amount)) then
        return false
    end
    doPlayerSetBalance(cid, getPlayerBalance(cid) + amount)
return true
end

Adiciona essa função no seu global.lua

 

 

13 horas atrás, ikaroangelo21 disse:

data/npc/lib/npcsystem/npchandler.lua (coloque o abaixo).

 

 

fiz certinho mas ainda não funciona o transfer :( (acho que vou tirar a opção de transfer do npc)

Link para o post
Compartilhar em outros sites
1 hora atrás, ikaroangelo21 disse:

@kinomoto posta o script do npc EVA por favor.

 

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
 
local Topic, count, transfer = {}, {}, {}
 
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
 
local function getCount(s)
        local b, e = s:find('%d+')
        return b and e and math.min(4294967295, tonumber(s:sub(b, e))) or -1
end
 
local function findPlayer(name)
        local q = db.getResult('SELECT name FROM players WHERE name=' .. db.escapeString(name) .. ' LIMIT 1'), nil
        if q:getID() == -1 then
                return
        end
        local r = q:getDataString('name')
        q:free()
        return r
end
 
function greet(cid)
        Topic[cid], count[cid], transfer[cid] = nil, nil, nil
        return true
end
 
function creatureSayCallback(cid, type, msg)
        if not npcHandler:isFocused(cid) then
                return false
        elseif msgcontains(msg, 'balance') then
                npcHandler:say('Your account balance is ' .. getPlayerBalance(cid) .. ' gold.', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'deposit') and msgcontains(msg, 'all') then
                if getPlayerMoney(cid) == 0 then
                        npcHandler:say('You don\'t have any gold with you.', cid)
                        Topic[cid] = nil
                else
                        count[cid] = getPlayerMoney(cid)
                        npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
                        Topic[cid] = 2
                end
        elseif msgcontains(msg, 'deposit') then
                if getCount(msg) == 0 then
                        npcHandler:say('You are joking, aren\'t you??', cid)
                        Topic[cid] = nil
                elseif getCount(msg) ~= -1 then
                        if getPlayerMoney(cid) >= getCount(msg) then
                                count[cid] = getCount(msg)
                                npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
                                Topic[cid] = 2
                        else
                                npcHandler:say('You do not have enough gold.', cid)
                                Topic[cid] = nil
                        end
                elseif getPlayerMoney(cid) == 0 then
                        npcHandler:say('You don\'t have any gold with you.', cid)
                        Topic[cid] = nil
                else
                        npcHandler:say('Please tell me how much gold it is you would like to deposit.', cid)
                        Topic[cid] = 1
                end
        elseif Topic[cid] == 1 then
                if getCount(msg) == -1 then
                        npcHandler:say('Please tell me how much gold it is you would like to deposit.', cid)
                        Topic[cid] = 1
                elseif getPlayerMoney(cid) >= getCount(msg) then
                        count[cid] = getCount(msg)
                        npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
                        Topic[cid] = 2
                else
                        npcHandler:say('You do not have enough gold.', cid)
                        Topic[cid] = nil
                end
        elseif msgcontains(msg, 'yes') and Topic[cid] == 2 then
                if doPlayerRemoveMoney(cid, count[cid]) then
                        doPlayerSetBalance(cid, getPlayerBalance(cid) + count[cid])
                        npcHandler:say('Alright, we have added the amount of ' .. count[cid] .. ' gold to your balance. You can withdraw your money anytime you want to.', cid)
                else
                        npcHandler:say('I am inconsolable, but it seems you have lost your gold. I hope you get it back.', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'no') and Topic[cid] == 2 then
                npcHandler:say('As you wish. Is there something else I can do for you?', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'withdraw') then
                if getCount(msg) == 0 then
                        npcHandler:say('Sure, you want nothing you get nothing!', cid)
                        Topic[cid] = nil
                elseif getCount(msg) ~= -1 then
                        if getPlayerBalance(cid) >= getCount(msg) then
                                count[cid] = getCount(msg)
                                npcHandler:say('Are you sure you wish to withdraw ' .. count[cid] .. ' gold from your bank account?', cid)
                                Topic[cid] = 4
                        else
                                npcHandler:say('There is not enough gold on your account.', cid)
                                Topic[cid] = nil
                        end
                elseif getPlayerBalance(cid) == 0 then
                        npcHandler:say('You don\'t have any money on your bank account.', cid)
                        Topic[cid] = nil
                else
                        npcHandler:say('Please tell me how much gold you would like to withdraw.', cid)
                        Topic[cid] = 3
                end
        elseif Topic[cid] == 3 then
                if getCount(msg) == -1 then
                        npcHandler:say('Please tell me how much gold you would like to withdraw.', cid)
                        Topic[cid] = 3
                elseif getPlayerBalance(cid) >= getCount(msg) then
                        count[cid] = getCount(msg)
                        npcHandler:say('Are you sure you wish to withdraw ' .. count[cid] .. ' gold from your bank account?', cid)
                        Topic[cid] = 4
                else
                        npcHandler:say('There is not enough gold on your account.', cid)
                        Topic[cid] = nil
                end
        elseif msgcontains(msg, 'yes') and Topic[cid] == 4 then
                if getPlayerBalance(cid) >= count[cid] then
                        doPlayerAddMoney(cid, count[cid])
                        doPlayerSetBalance(cid, getPlayerBalance(cid) - count[cid])
                        npcHandler:say('Here you are, ' .. count[cid] .. ' gold. Please let me know if there is something else I can do for you.', cid)
                else
                        npcHandler:say('There is not enough gold on your account.', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'no') and Topic[cid] == 4 then
                npcHandler:say('The customer is king! Come back anytime you want to if you wish to withdraw your money.', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'transfer') then
                if getCount(msg) == 0 then
                        npcHandler:say('Please think about it. Okay?', cid)
                        Topic[cid] = nil
                elseif getCount(msg) ~= -1 then
                        count[cid] = getCount(msg)
                        if getPlayerBalance(cid) >= count[cid] then
                                npcHandler:say('Who would you like to transfer ' .. count[cid] .. ' gold to?', cid)
                                Topic[cid] = 6
                        else
                                npcHandler:say('There is not enough gold on your account.', cid)
                                Topic[cid] = nil
                        end
                else
                        npcHandler:say('Please tell me the amount of gold you would like to transfer.', cid)
                        Topic[cid] = 5
                end
        elseif Topic[cid] == 5 then
                if getCount(msg) == -1 then
                        npcHandler:say('Please tell me the amount of gold you would like to transfer.', cid)
                        Topic[cid] = 5
                else
                        count[cid] = getCount(msg)
                        if getPlayerBalance(cid) >= count[cid] then
                                npcHandler:say('Who would you like to transfer ' .. count[cid] .. ' gold to?', cid)
                                Topic[cid] = 6
                        else
                                npcHandler:say('There is not enough gold on your account.', cid)
                                Topic[cid] = nil
                        end
                end
        elseif Topic[cid] == 6 then
                local v = getPlayerByName(msg)
                if getPlayerBalance(cid) >= count[cid] then
                        if v then
                                transfer[cid] = msg
                                npcHandler:say('Would you really like to transfer ' .. count[cid] .. ' gold to ' .. getPlayerName(v) .. '?', cid)
                                Topic[cid] = 7
                        elseif findPlayer(msg):lower() == msg:lower() then
                                transfer[cid] = msg
                                npcHandler:say('Would you really like to transfer ' .. count[cid] .. ' gold to ' .. findPlayer(msg) .. '?', cid)
                                Topic[cid] = 7
                        else
                                npcHandler:say('This player does not exist.', cid)
                                Topic[cid] = nil
                        end
                else
                        npcHandler:say('There is not enough gold on your account.', cid)
                        Topic[cid] = nil
                end
        elseif Topic[cid] == 7 and msgcontains(msg, 'yes') then
                if getPlayerBalance(cid) >= count[cid] then
                        local v = getPlayerByName(transfer[cid])
                        if v then
                                doPlayerSetBalance(cid, getPlayerBalance(cid) - count[cid])
                                doPlayerSetBalance(v, getPlayerBalance(v) + count[cid])
                                npcHandler:say('Very well. You have transferred ' .. count[cid] .. ' gold to ' .. getPlayerName(v) .. '.', cid)
                        elseif findPlayer(transfer[cid]):lower() == transfer[cid]:lower() then
                                doPlayerSetBalance(cid, getPlayerBalance(cid) - count[cid])
                                db.executeQuery('UPDATE players SET balance=balance+' .. count[cid] .. ' WHERE name=' .. db.escapeString(transfer[cid]) .. ' LIMIT 1')
                                npcHandler:say('Very well. You have transferred ' .. count[cid] .. ' gold to ' .. findPlayer(transfer[cid]) .. '.', cid)
                        else
                                npcHandler:say('This player does not exist.', cid)
                        end
                else
                        npcHandler:say('There is not enough gold on your account.', cid)
                end
                Topic[cid] = nil
        elseif Topic[cid] == 7 and msgcontains(msg, 'no') then
                npcHandler:say('Alright, is there something else I can do for you?', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'change gold') then
                npcHandler:say('How many platinum coins would you like to get?', cid)
                Topic[cid] = 8
        elseif Topic[cid] == 8 then
                if getCount(msg) < 1 then
                        npcHandler:say('Hmm, can I help you with something else?', cid)
                        Topic[cid] = nil
                else
                        count[cid] = math.min(500, getCount(msg))
                        npcHandler:say('So you would like me to change ' .. count[cid] * 100 .. ' of your gold coins into ' .. count[cid] .. ' platinum coins?', cid)
                        Topic[cid] = 9
                end
        elseif Topic[cid] == 9 then
                if msgcontains(msg, 'yes') then
                        if doPlayerRemoveItem(cid, 2148, count[cid] * 100) then
                                npcHandler:say('Here you are.', cid)
                                doPlayerAddItem(cid, 2152, count[cid])
                        else
                                npcHandler:say('Sorry, you do not have enough gold coins.', cid)
                        end
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'change platinum') then
                npcHandler:say('Would you like to change your platinum coins into gold or crystal?', cid)
                Topic[cid] = 10
        elseif Topic[cid] == 10 then
                if msgcontains(msg, 'gold') then
                        npcHandler:say('How many platinum coins would you like to change into gold?', cid)
                        Topic[cid] = 11
                elseif msgcontains(msg, 'crystal') then
                        npcHandler:say('How many crystal coins would you like to get?', cid)
                        Topic[cid] = 13
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                        Topic[cid] = nil
                end
        elseif Topic[cid] == 11 then
                if getCount(msg) < 1 then
                        npcHandler:say('Hmm, can I help you with something else?', cid)
                        Topic[cid] = nil
                else
                        count[cid] = math.min(500, getCount(msg))
                        npcHandler:say('So you would like me to change ' .. count[cid] .. ' of your platinum coins into ' .. count[cid] * 100 .. ' gold coins for you?', cid)
                        Topic[cid] = 12
                end
        elseif Topic[cid] == 12 then
                if msgcontains(msg, 'yes') then
                        if doPlayerRemoveItem(cid, 2152, count[cid]) then
                                npcHandler:say('Here you are.', cid)
                                doPlayerAddItem(cid, 2148, count[cid] * 100)
                        else
                                npcHandler:say('Sorry, you do not have enough platinum coins.', cid)
                        end
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                end
                Topic[cid] = nil
        elseif Topic[cid] == 13 then
                if getCount(msg) < 1 then
                        npcHandler:say('Hmm, can I help you with something else?', cid)
                        Topic[cid] = nil
                else
                        count[cid] = math.min(500, getCount(msg))
                        npcHandler:say('So you would like me to change ' .. count[cid] * 100 .. ' of your platinum coins into ' .. count[cid] .. ' crystal coins for you?', cid)
                        Topic[cid] = 14
                end
        elseif Topic[cid] == 14 then
                if msgcontains(msg, 'yes') then
                        if doPlayerRemoveItem(cid, 2152, count[cid] * 100) then
                                npcHandler:say('Here you are.', cid)
                                doPlayerAddItem(cid, 2160, count[cid])
                        else
                                npcHandler:say('Sorry, you do not have enough platinum coins.', cid)
                        end
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'change crystal') then
                npcHandler:say('How many crystal coins would you like to change into platinum?', cid)
                Topic[cid] = 15
        elseif Topic[cid] == 15 then
                if getCount(msg) == -1 or getCount(msg) == 0 then
                        npcHandler:say('Hmm, can I help you with something else?', cid)
                        Topic[cid] = nil
                else
                        count[cid] = math.min(500, getCount(msg))
                        npcHandler:say('So you would like me to change ' .. count[cid] .. ' of your crystal coins into ' .. count[cid] * 100 .. ' platinum coins for you?', cid)
                        Topic[cid] = 16
                end
        elseif Topic[cid] == 16 then
                if msgcontains(msg, 'yes') then
                        if doPlayerRemoveItem(cid, 2160, count[cid]) then
                                npcHandler:say('Here you are.', cid)
                                doPlayerAddItem(cid, 2152, count[cid] * 100)
                        else
                                npcHandler:say('Sorry, you do not have enough crystal coins.', cid)
                        end
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'change') then
                npcHandler:say('There are three different coin types in Tibia: 100 gold coins equal 1 platinum coin, 100 platinum coins equal 1 crystal coin. So if you\'d like to change 100 gold into 1 platinum, simply say \'{change gold}\' and then \'1 platinum\'.', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'bank') then
                npcHandler:say('We can change money for you. You can also access your bank account.', cid)
                Topic[cid] = nil
        end
        return true
end
 
npcHandler:setCallback(CALLBACK_GREET, greet)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

-- function maded by Gesior--
function getNumber(txt) --return number if its number and is > 0, else return 0
x = string.gsub(txt,"%a","")
x = tonumber(x)
if x ~= nill and x > 0 then
return x
else
return 0
end
end

Link para o post
Compartilhar em outros sites

adicione isso em default.lua 

 

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
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:addModule(FocusModule:new())
Link para o post
Compartilhar em outros sites
10 minutos atrás, ikaroangelo21 disse:

adicione isso em default.lua 

 


local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
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:addModule(FocusModule:new())

 

mudei aqui e deu isso

Lua Script Error: [Npc interface]
data/npc/scripts/Eva.lua:onCreatureSay
data/npc/scripts/Eva.lua:18: attempt to call field 'getResult' (a nil value)
stack traceback:
        [C]: in function 'getResult'
        data/npc/scripts/Eva.lua:18: in function 'findPlayer'
        data/npc/scripts/Eva.lua:172: in function 'callback'
        data/npc/lib/npcsystem/npchandler.lua:411: in function 'onCreatureSay'
        data/npc/scripts/Eva.lua:9: in function <data/npc/scripts/Eva.lua:9>

Link para o post
Compartilhar em outros sites

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.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.


  • Conteúdo Similar

    • Por Budrox
      ola! venho apresentar meu protejo e ouvir a opinião de
      vocês estou trabalhando a alguns meses nessas sprites,
      jogariam um protejo assim, penso em fazer o jogo em
      outras engines mas faria mais sentido se fosse um
      protejo online.

    • Por GamerGoiano
      Provavelmente funciona com os outros jogos do quilante, basta substituir a pasta data na pasta do servidor e substituir os arquivos do cliente na pasta otclient/data/things/860
      Eu não tenho créditos sobre o projeto, estou apenas postando aqui porque ja é de dominio público porém em todos os tópicos na internet o projeto está muito desatualizado
      Este aqui está configurado pra por online no pc.
       

      Download: (TFS 04 860 + OTCLIENT "Ultima versão x64", Htdocs "O site" e o Banco de dados Compativel.
      https://www.mediafire.com/file/bmponjci62txbxd/TIBIA+GTA+ARRUMADO.rar/file

      Scan:
      https://www.virustotal.com/gui/file/b6236579ad11201f3c01899a218f6ca8ef8e645cf3881f5de2af46a04837085d?nocache=1
    • Por Tyren
      Fala galera, tranquilos?
      Recentemente comecei a desenvolver um servidor de Pokémon (famoso poketibia) porém ai me veio a duvida, ainda existe "players" interessados nisso?
      Pois eu vejo vários projetos bons morrerem na praia ou nem saírem do papel e isso meio que da uma desanimada.
      Na concepção de vocês, o que falta para um bom poketibia? Mapa? Sistemas? Voltar as antigas e lançar um servidor Old School?
    • Por TestAccount
      Bem vindos a SwampSoldiers, um ot alternativo único de sapos e minhocas! Achou estranho? Eu também, mas comecei a jogar e viciei ?

      Website
      SwampSoldier - Play to earn (https://www.swampsoldiers.com/index)

      Social Media
      Twitter: https://twitter.com/SoldiersSwamp
      Discord: Join the SwampSoldiers | ? Vs ? Discord Server! (https://discord.gg/qc9wfMQ8vK)
      Youtube: https://www.youtube.com/c/SwampSoldiers
      Facebook: SwampSoldier (https://www.facebook.com/profile.php?id=100087871800250)
      Instagram: Swamp Soldiers (@swampsoldiers) • Instagram photos and videos (https://www.instagram.com/swampsoldiers/)

      =================================================================================================
      SwampSoldiers é um jogo blockchain gratuito, onde você é o verdadeiro dono de seus ativos e pode vendê-los facilmente a outros jogadores por dinheiro real.

      Características:
      Músicas de fundo e efeitos de som; Mapa unico e original; 6 diferentes classes e 2 facções; NPCs animados; Spells unicos com som; Mercado p2p; Quests únicas; 0% de perda de exp até o lvl 5; Sistema de crafting; Sistema de casas e ilhas particulares; Sistema de pet e autoloot; World boss; Tower defense mini-game; Battle royale sendo desenvolvido;  

       

       

       

       

       

    • Por MatteusDeli
      Nesse tópico você irá aprender a diferença entre ItemID, ActionID e UniqueID na criação de scripts.
       
      Primeiramente vamos começar com o ItemID, imagine que você está criando um simples script que o player pode ter acesso a uma área VIP, só que para ele entrar, primeiro precisará passar por um tile especial que possui o ID 471, até aqui tudo bem, só que qualquer player do servidor irá ter acesso também, já que não possui nenhuma restrição.
       
      Como poderíamos resolver isso?
       
      É aqui que entra a função da ActionID, com ela podemos dizer que os tiles que tiverem o valor 1000 no atributo ActionID, serão os tiles referentes a área VIP. Agora temos uma maneira de diferenciar os tiles comuns dos que são VIPs, veja como ficaria:
       

      (tiles sem as ActionIDs no valor de 1000)
       
      Repare que os 3 tiles tem apenas o atributo ItemID: [471]. Todos os players poderiam passar sem problemas… Caso você use apenas esse tipo de tile para as suas áreas VIPs então não tem problema, agora se você usa esses mesmos tiles para outras finalidades, então você precisará recorrer a ActionID, para que assim consiga diferenciá-los.
       
      Vamos adicionar as ActionIDs então:
       

      (tiles com as ActionIDs adicionados no valor de 1000)
       
      Pronto, agora apenas esse tiles terão a função de controlar a entrada para a área VIP!
       
      Bom, então você deve estar se perguntando, aonde que o UniqueID entra nessa história?
       
      O UniqueID é parecido com a ActionID com apenas uma diferença. O valor que você define para ele deve ser único para o servidor inteiro, caso ele se repita aparecerá um aviso na sua distro, mais ou menos como este…
       

       
      Repare quantos UniqueIDs duplicados existem, isso é ruim porque quanto mais tiver mais tempo demorará para o servidor iniciar, entre outras coisas como conflitos de scripts.
       
      Concluindo…
       
      O ItemID é usado quando você quer que todos os itens com esse ID façam uma ação, por exemplo a fishing rod, qualquer player pode comprar uma no NPC e começar a pescar.
       
      A ActionID é usado geralmente quando você quer diferenciar os mesmos itens um dos outros. Eu tenho 2 crystal rings só que apenas um deles vai me curar 500 de vida quando usá-lo.
       
      O UniqueID é quando você quer definir um ID único para um determinado item e só terá apenas um dele no servidor, um exemplo seria uma estátua que vai dar ao player um determinado item e só existirá somente uma dela no jogo.
       
      Tentei ser o mais breve e direto sobre esse assunto, espero que tenha ficado claro… Agora é só praticar!
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo