• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!
  • 2026 staff recruitment is open! Check it out and consider applying!

Banker NPC - error in customFunctions

Lyky

Well-Known Member
Joined
May 27, 2014
Messages
295
Solutions
8
Reaction score
89
Hi got problem with Banker NPC [TFS 1.2]

Looks like isNumber isn't parsed or storage is missing?
- deposit isNumber gold

Used following npc banker:
@slawkens
NPC - Banker NPC For TFS


Error: (when player states: "depost 'x amount' gold")
Lua Script Error: [Npc interface]
data/npc/scripts/Bank.lua:eek:nCreatureSay
data/lib/customFunctions.lua:3: attempt to call global 'isNumber' (a nil value)
stack traceback:
[C]: in function 'isNumber'
data/lib/customFunctions.lua:3: in function 'isValidMoney'
data/lib/customFunctions.lua:9: in function 'getMoneyCount'
data/npc/scripts/Bank.lua:70: in function 'callback'
data/npc/lib/npcsystem/npchandler.lua:384: in function 'onCreatureSay'
data/npc/scripts/Bank.lua:10: in function <data/npc/scripts/Bank.lua:10>


customFunctions.lua
LUA:
--Basic
function isValidMoney(money)
   return isNumber(money) and money > 0 and money < 4294967296
end

function getMoneyCount(string)
   local b, e = string:find("%d+")
   local money = b and e and tonumber(string:sub(b, e)) or -1
   if isValidMoney(money) then
       return money
   end
   return -1
end

function getMoneyWeight(money)
   local gold = money
   local crystal = math.floor(gold / 10000)
   gold = gold - crystal * 10000
   local platinum = math.floor(gold / 100)
   gold = gold - platinum * 100
   return (ItemType(2160):getWeight() * crystal) + (ItemType(2152):getWeight() * platinum) + (ItemType(2148):getWeight() * gold)
end

function getAccountNumberByPlayerName(name)
   local player = Player(name)
   if player then
       return player:getAccountId()
   end

   local resultId = db.storeQuery("SELECT `account_id` FROM `players` WHERE `name` = " .. db.escapeString(name))
   if resultId ~= false then
       local accountId = result.getDataInt(resultId, "account_id")
       result.free(resultId)
       return accountId
   end

   return 0
end

-- Game --
function Game.getPlayersByIPAddress(ip, mask)
   if not mask then mask = 0xFFFFFFFF end
   local masked = bit.band(ip, mask)
   local result = {}
   for _, player in ipairs(Game.getPlayers()) do
       if bit.band(player:getIp(), mask) == masked then
           result[#result + 1] = player
       end
   end
   return result
end

function Game.getPlayersByAccountNumber(accountNumber)
   local result = {}
   for _, player in ipairs(Game.getPlayers()) do
       if player:getAccountId() == accountNumber then
           result[#result + 1] = player
       end
   end
   return result
end

function Game.getHouseByPlayerGUID(playerGUID)
   for _, house in ipairs(Game.getHouses()) do
       if house:getOwnerGuid() == playerGUID then
           return house
       end
   end
   return nil
end

-- Player --
function Player.withdrawMoney(self, amount)
   local balance = self:getBankBalance()
   if amount > balance or not self:addMoney(amount) then
       return false
   end

   self:setBankBalance(balance - amount)
   return true
end

function Player.depositMoney(self, amount)
   if not self:removeMoney(amount) then
       return false
   end

   self:setBankBalance(self:getBankBalance() + amount)
   return true
end

function Player.transferMoneyTo(self, target, amount)
   local balance = self:getBankBalance()
   if amount > balance then
       return false
   end

   local targetPlayer = Player(target)
   if targetPlayer then
       targetPlayer:setBankBalance(targetPlayer:getBankBalance() + amount)
   else
       if not playerExists(target) then
           return false
       end
       db.query("UPDATE `players` SET `balance` = `balance` + '" .. amount .. "' WHERE `name` = " .. db.escapeString(target))
   end

   self:setBankBalance(self:getBankBalance() - amount)
   return true
end

function Player.getBlessings(self)
   local blessings = 0
   for i = 1, 5 do
       if self:hasBlessing(i) then
           blessings = blessings + 1
       end
   end
   return blessings
end

function Player.isMage(self)
   return isInArray({1, 2, 5, 6}, self:getVocation():getId())
end

function Player.getHighestSkillLevel(self)
   local ret = 0
   local clubLevel = self:getSkillLevel(SKILL_CLUB)
   local swordLevel = self:getSkillLevel(SKILL_SWORD)
   local axeLevel = self:getSkillLevel(SKILL_AXE)
   local distLevel = self:getSkillLevel(SKILL_DISTANCE)

   if clubLevel > swordLevel and clubLevel > axeLevel then
       ret = 1
   elseif swordLevel > clubLevel and swordLevel > axeLevel then
       ret = 2
   elseif axeLevel > clubLevel and axeLevel > swordLevel then
       ret = 3
   elseif distLevel > swordLevel and distLevel > axeLevel and distLevel > clubLevel then
       ret = 10
   end

   return self:getSkillLevel(ret)
end

function Player.isPromoted(self)
   local vocation = self:getVocation()
   if vocation:getId() == 0 or vocation:getPromotion():getId() == 0 then
       return true
   end

   return false
end

function Player.addExperienceStage(self, experience, sendText, useMult)
   if useMult then
       experience = experience * Game.getExperienceStage(self:getLevel())
   end

   return self:addExperience(experience, sendText)
end

-- Tile --
function Tile.relocateTo(self, toPosition)
   if self:getPosition() == toPosition then
       return false
   end

   if not Tile(toPosition) then
       return false
   end

   for i = self:getThingCount() - 1, 0, -1 do
       local thing = self:getThing(i)
       if thing then
           if thing:isItem() then
               if ItemType(thing:getId()):isMovable() then
                   thing:moveTo(toPosition)
               end
           elseif thing:isCreature() then
               thing:teleportTo(toPosition)
           end
       end
   end
   return true
end

function Tile.isPz(self)
   return self:hasFlag(TILESTATE_PROTECTIONZONE)
end

function Tile.isHouse(self)
   local house = self:getHouse()
   return house and true or false
end

-- Vocation --
function Vocation.getBase(self)
   local demotion = self:getDemotion()
   while demotion do
       local tmp = demotion:getDemotion()
       if not tmp then
           return demotion
       end
       demotion = tmp
   end
   return self
end

function Vocation.getPromotionId(self)
   local promotion = self:getPromotion()
   return promotion and promotion:getId() or 0
end

-- Others --
function formatOsTime(time)
   local time = time - os.time()
   local hours = math.floor(time / 3600)
 
   minutes = math.floor((time - (3600 * hours)) / 60)

   return "" .. hours .. " hours and " .. minutes .. " minutes"
end


npc/scripts/bank.lua
LUA:
local config = {
    transferDisabledVocations = {0} -- disable non vocation characters
}
local talkState = {}
local count = {}
local transfer = {}
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
if(not getPlayerBalance) then
    getPlayerBalance = function(cid)
        local result = db.getResult("SELECT `balance` FROM `players` WHERE `id` = " .. getPlayerGUID(cid))
        if(result:getID() == -1) then
            return false
        end
        local value = tonumber(result:getDataString("balance"))
        result:free()
        return value
    end
    doPlayerSetBalance = function(cid, balance)
        db.executeQuery("UPDATE `players` SET `balance` = " .. balance .. " WHERE `id` = " .. getPlayerGUID(cid))
        return true
    end
    doPlayerWithdrawMoney = function(cid, amount)
        local balance = getPlayerBalance(cid)
        if(amount > balance or not doPlayerAddMoney(cid, amount)) then
            return false
        end
        doPlayerSetBalance(cid, balance - amount)
        return true
    end
    doPlayerDepositMoney = function(cid, amount)
        if(not doPlayerRemoveMoney(cid, amount)) then
            return false
        end
        doPlayerSetBalance(cid, getPlayerBalance(cid) + amount)
        return true
    end
    doPlayerTransferMoneyTo = function(cid, target, amount)
        local balance = getPlayerBalance(cid)
        if(amount > balance) then
            return false
        end
        local tid = getPlayerByName(target)
        if(tid > 0) then
            doPlayerSetBalance(tid, getPlayerBalance(tid) + amount)
        else
            if(playerExists(target) == FALSE) then
                return false
            end
            db.executeQuery("UPDATE `player_storage` SET `value` = `value` + '" .. amount .. "' WHERE `player_id` = (SELECT `id` FROM `players` WHERE `name` = '" .. escapeString(player) .. "') AND `key` = '" .. balance_storage .. "'")
        end
        doPlayerSetBalance(cid, getPlayerBalance(cid) - amount)
        return true
    end
end
local function getPlayerVocationByName(name)
    local result = db.getResult("SELECT `vocation` FROM `players` WHERE `name` = " .. db.escapeString(name))
    if(result:getID() == -1) then
        return false
    end
    local value = result:getDataString("vocation")
    result:free()
    return value
end
local function isValidMoney(money)
    return (isNumber(money) and money > 0 and money < 4294967296)
end
local function getCount(string)
    local b, e = string:find("%d+")
    local money = b and e and tonumber(string:sub(b, e)) or -1
    if(isValidMoney(money)) then
        return money
    end
    return -1
end
function greetCallback(cid)
    talkState[cid], count[cid], transfer[cid] = 0, nil, nil
    return true
end
function creatureSayCallback(cid, type, msg)
    if(not npcHandler:isFocused(cid)) then
        return false
    end
---------------------------- help ------------------------
    if msgcontains(msg, 'advanced') then
        if isInArray(config.transferDisabledVocations, getPlayerVocation(cid)) then
            selfSay("Once you are on the Tibian mainland, you can access new functions of your bank account, such as transferring money to other players safely or taking part in house auctions.", cid)
        else
            selfSay("Renting a house has never been this easy. Simply make a bid for an auction. We will check immediately if you have enough money.", cid)
        end
        talkState[cid] = 0
    elseif msgcontains(msg, 'help') or msgcontains(msg, 'functions') then
        selfSay("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.", cid)
        talkState[cid] = 0
    elseif msgcontains(msg, 'bank') then
        npcHandler:say("We can change money for you. You can also access your bank account.", cid)
        talkState[cid] = 0
    elseif msgcontains(msg, 'job') then
        npcHandler:say("I work in this bank. I can change money for you and help you with your bank account.", cid)
        talkState[cid] = 0
---------------------------- balance ---------------------
    elseif msgcontains(msg, 'balance') then
        selfSay("Your account balance is " .. getPlayerBalance(cid) .. " gold.", cid)
        talkState[cid] = 0
---------------------------- deposit ---------------------
    elseif msgcontains(msg, 'deposit all') and getPlayerMoney(cid) > 0 then
        count[cid] = getPlayerMoney(cid)
        if not isValidMoney(count[cid]) then
            selfSay("Sorry, but you can't deposit that much.", cid)
            talkState[cid] = 0
            return false
        end
        if count[cid] < 1 then
            selfSay("You don't have any money to deposit in you inventory..", cid)
            talkState[cid] = 0
        else
            selfSay("Would you really like to deposit " .. count[cid] .. " gold?", cid)
            talkState[cid] = 2
        end
    elseif msgcontains(msg, 'deposit') then
        selfSay("Please tell me how much gold it is you would like to deposit.", cid)
        talkState[cid] = 1
    elseif talkState[cid] == 1 then
        count[cid] = getCount(msg)
        if isValidMoney(count[cid]) then
            selfSay("Would you really like to deposit " .. count[cid] .. " gold?", cid)
            talkState[cid] = 2
        else
            selfSay("Is isnt valid amount of gold to deposit.", cid)
            talkState[cid] = 0
        end
    elseif talkState[cid] == 2 then
        if msgcontains(msg, 'yes') then
            if not doPlayerDepositMoney(cid, count[cid]) then
                selfSay("You don\'t have enough gold.", cid)
            else
                selfSay("Alright, we have added the amount of " .. count[cid] .. " gold to your balance. You can withdraw your money anytime you want to. Your account balance is " .. getPlayerBalance(cid) .. ".", cid)
            end
        elseif msgcontains(msg, 'no') then
            selfSay("As you wish. Is there something else I can do for you?", cid)
        end
        talkState[cid] = 0
---------------------------- withdraw --------------------
    elseif msgcontains(msg, 'withdraw') then
        selfSay("Please tell me how much gold you would like to withdraw.", cid)
        talkState[cid] = 6
    elseif talkState[cid] == 6 then
        count[cid] = getCount(msg)
        if isValidMoney(count[cid]) then
            selfSay("Are you sure you wish to withdraw " .. count[cid] .. " gold from your bank account?", cid)
            talkState[cid] = 7
        else
            selfSay("Is isnt valid amount of gold to withdraw.", cid)
            talkState[cid] = 0
        end
    elseif talkState[cid] == 7 then
        if msgcontains(msg, 'yes') then
            if not doPlayerWithdrawMoney(cid, count[cid]) then
                selfSay("There is not enough gold on your account. Your account balance is " .. getPlayerBalance(cid) .. ". Please tell me the amount of gold coins you would like to withdraw.", cid)
                talkState[cid] = 0
            else
                selfSay("Here you are, " .. count[cid] .. " gold. Please let me know if there is something else I can do for you.", cid)
                talkState[cid] = 0
            end
        elseif msgcontains(msg, 'no') then
            selfSay("As you wish. Is there something else I can do for you?", cid)
            talkState[cid] = 0
        end
---------------------------- transfer --------------------
    elseif msgcontains(msg, 'transfer') then
        selfSay("Please tell me the amount of gold you would like to transfer.", cid)
        talkState[cid] = 11
    elseif talkState[cid] == 11 then
        count[cid] = getCount(msg)
        if getPlayerBalance(cid) < count[cid] then
            selfSay("You dont have enough money on your bank account.", cid)
            talkState[cid] = 0
            return true
        end
        if isValidMoney(count[cid]) then
            selfSay("Who would you like transfer " .. count[cid] .. " gold to?", cid)
            talkState[cid] = 12
        else
            selfSay("Is isnt valid amount of gold to transfer.", cid)
            talkState[cid] = 0
        end
    elseif talkState[cid] == 12 then
        transfer[cid] = msg
        if getCreatureName(cid) == transfer[cid] then
            selfSay("Ekhm, You want transfer money to yourself? Its impossible!", cid)
            talkState[cid] = 0
            return true
        end
        if isInArray(config.transferDisabledVocations, getPlayerVocation(cid)) then
            selfSay("Your vocation cannot transfer money.", cid)
            talkState[cid] = 0
        end
        if playerExists(transfer[cid]) then
            selfSay("So you would like to transfer " .. count[cid] .. " gold to \"" .. transfer[cid] .. "\" ?", cid)
            talkState[cid] = 13
        else
            selfSay("Player with name \"" .. transfer[cid] .. "\" doesnt exist.", cid)
            talkState[cid] = 0
        end
    elseif talkState[cid] == 13 then
        if msgcontains(msg, 'yes') then
            local targetVocation = getPlayerVocationByName(transfer[cid])
            if not targetVocation or isInArray(config.transferDisabledVocations, targetVocation) or not doPlayerTransferMoneyTo(cid, transfer[cid], count[cid]) then
                selfSay("This player does not exist on this world or have no vocation.", cid)
            else
                selfSay("You have transferred " .. count[cid] .. " gold to \"" .. transfer[cid] .."\".", cid)
                transfer[cid] = nil
            end
        elseif msgcontains(msg, 'no') then
            selfSay("As you wish. Is there something else I can do for you?", cid)
        end
        talkState[cid] = 0
---------------------------- money exchange --------------
    elseif msgcontains(msg, 'change gold') then
        npcHandler:say("How many platinum coins would you like to get?", cid)
        talkState[cid] = 14
    elseif talkState[cid] == 14 then
        if getCount(msg) == -1 or getCount(msg) == 0 then
            npcHandler:say("Hmm, can I help you with something else?", cid)
            talkState[cid] = 0
        else
            count[cid] = getCount(msg)
            npcHandler:say("So you would like me to change " .. count[cid] * 100 .. " of your gold coins into " .. count[cid] .. " platinum coins?", cid)
            talkState[cid] = 15
        end
    elseif talkState[cid] == 15 then
        if msgcontains(msg, 'yes') then
            if doPlayerRemoveItem(cid, 2148, count[cid] * 100) then
                doPlayerAddItem(cid, 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
        talkState[cid] = 0
    elseif msgcontains(msg, 'change platinum') then
        npcHandler:say("Would you like to change your platinum coins into gold or crystal?", cid)
        talkState[cid] = 16
    elseif talkState[cid] == 16 then
        if msgcontains(msg, 'gold') then
            npcHandler:say("How many platinum coins would you like to change into gold?", cid)
            talkState[cid] = 17
        elseif msgcontains(msg, 'crystal') then
            npcHandler:say("How many crystal coins would you like to get?", cid)
            talkState[cid] = 19
        else
            npcHandler:say("Well, can I help you with something else?", cid)
            talkState[cid] = 0
        end
    elseif talkState[cid] == 17 then
        if getCount(msg) == -1 or getCount(msg) == 0 then
            npcHandler:say("Hmm, can I help you with something else?", cid)
            talkState[cid] = 0
        else
            count[cid] = 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)
            talkState[cid] = 18
        end
    elseif talkState[cid] == 18 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
        talkState[cid] = 0
    elseif talkState[cid] == 19 then
        if getCount(msg) == -1 or getCount(msg) == 0 then
            npcHandler:say("Hmm, can I help you with something else?", cid)
            talkState[cid] = 0
        else
            count[cid] = 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)
            talkState[cid] = 20
        end
    elseif talkState[cid] == 20 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
        talkState[cid] = 0
    elseif msgcontains(msg, 'change crystal') then
        npcHandler:say("How many crystal coins would you like to change into platinum?", cid)
        talkState[cid] = 21
    elseif talkState[cid] == 21 then
        if getCount(msg) == -1 or getCount(msg) == 0 then
            npcHandler:say("Hmm, can I help you with something else?", cid)
            talkState[cid] = 0
        else
            count[cid] = 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)
            talkState[cid] = 22
        end
    elseif talkState[cid] == 22 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
        talkState[cid] = 0
    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)
        talkState[cid] = 0
    end
    return true
end
npcHandler:setCallback(CALLBACK_GREET, greetCallback)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
 
Solution
Fixed by using following code:

LUA:
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) .. '...
2nd part

npc\npcsystem\npchandler.lua
LUA:
-- 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.
   MESSAGE_PLACEDINQUEUE       = 24 -- When the player has been placed in the costumer queue.

   -- 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|"
   TAG_QUEUESIZE = "|QUEUESIZE|"
   TAG_TIME = "|TIME|"
   TAG_BLESSCOST = "|BLESSCOST|"
   TAG_TRAVELCOST = "|TRAVELCOST|"

   NpcHandler = {
       keywordHandler = nil,
       focuses = nil,
       talkStart = nil,
       idleTime = 120,
       talkRadius = 3,
       talkDelayTime = 100, -- Seconds to delay outgoing messages.
       queue = nil,
       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.",
           [MESSAGE_PLACEDINQUEUE]    = "|PLAYERNAME|, please wait for your turn. There are |QUEUESIZE| customers before you."
       }
   }

   -- Creates a new NpcHandler with an empty callbackFunction stack.
   function NpcHandler:new(keywordHandler)
       local obj = {}
       obj.callbackFunctions = {}
       obj.modules = {}
       obj.queue = Queue:new(obj)
       obj.eventSay = {}
       obj.eventDelayedSay = {}
       obj.topic = {}
       obj.focuses = 0
       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

   -- Attackes 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)
       self.focuses = newFocus
       self.topic[newFocus] = 0
       self.talkStart[newFocus] = os.time()
       local callback = self:getCallback(CALLBACK_ONADDFOCUS)
       if callback == nil or callback(newFocus) then
           self:processModuleCallback(CALLBACK_ONADDFOCUS, newFocus)
       end
       self:updateFocus()
   end
   NpcHandler.changeFocus = NpcHandler.addFocus --"changeFocus" looks better for CONVERSATION_DEFAULT

   -- Function used to verify if npc is focused to certain player
   function NpcHandler:isFocused(focus)
       return self.focuses == focus
   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()
       doNpcSetCreatureFocus(self.focuses)
   end

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

       local callback = self:getCallback(CALLBACK_ONRELEASEFOCUS)
       if callback == nil or callback(focus) then
           self:processModuleCallback(CALLBACK_ONRELEASEFOCUS, focus)
       end
       self:changeFocus(0)
   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 = 1, #self.modules do
           local module = self.modules[i]
           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
       if type(ret) == 'string' then
           for search, replace in pairs(parseInfo) do
               ret = string.gsub(ret, search, replace)
           end
       else
           for i = 1, #ret do
               for search, replace in pairs(parseInfo) do
                   ret[i] = string.gsub(ret[i], search, replace)
               end
           end
       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
               if self.queue == nil or not self.queue:greetNext() then
                   local msg = self:getMessage(MESSAGE_FAREWELL)
                   local parseInfo = { [TAG_PLAYERNAME] = Player(cid):getName() }
                   self:resetNpc(cid)
                   msg = self:parseMessage(msg, parseInfo)
                   selfSay(msg)
                   self:releaseFocus(cid)
               end
           end
       end
   end

   -- Greets a new player.
   function NpcHandler:greet(cid, message)
       if cid ~= 0  then
           local callback = self:getCallback(CALLBACK_GREET)
           if callback == nil or callback(cid, message) then
               if self:processModuleCallback(CALLBACK_GREET, cid) then
                   local msg = self:getMessage(MESSAGE_GREET)
                   local parseInfo = { [TAG_PLAYERNAME] = Player(cid):getName() }
                   msg = self:parseMessage(msg, parseInfo)
                   self:say(msg, cid)
               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.uid
       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) 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 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
               if self.focuses ~= 0 then
                   if not self:isInRange(self.focuses) then
                       self:onWalkAway(self.focuses)
                   elseif self.talkStart[self.focuses] ~= nil and (os.time() - self.talkStart[self.focuses]) > self.idleTime then
                       self:unGreet(self.focuses)
                   else
                       self:updateFocus()
                   end
               end
           end
       end
   end

   -- Tries to greet the player with the given cid.
   function NpcHandler:onGreet(cid, message)
       if self:isInRange(cid) then
           local player = Player(cid)
           if self.focuses == 0 then
               self:greet(cid, message)
           elseif self.focuses == cid then
               local msg = self:getMessage(MESSAGE_ALREADYFOCUSED)
               local parseInfo = { [TAG_PLAYERNAME] = player:getName() }
               msg = self:parseMessage(msg, parseInfo)
               selfSay(msg)
           else
               if not self.queue:isInQueue(cid) then
                   self.queue:push(cid)
               end
               local msg = self:getMessage(MESSAGE_PLACEDINQUEUE)
               local parseInfo = { [TAG_PLAYERNAME] = player:getName(), [TAG_QUEUESIZE] = self.queue:getSize() }
               msg = self:parseMessage(msg, parseInfo)
               selfSay(msg)
           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
                   if self.queue == nil or not self.queue:greetNext() then
                       local msg = self:getMessage(MESSAGE_WALKAWAY)
                       local player = Player(cid)
                       if player then
                           local playerName = player:getName()
                           if not playerName then
                               playerName = -1
                           end
                       else
                           playerName = -1
                       end

                       local parseInfo = { [TAG_PLAYERNAME] = playerName }
                       msg = self:parseMessage(msg, parseInfo)
                       selfSay(msg)
                       self:resetNpc(cid)
                       self:releaseFocus(cid)
                   end
               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_SAY, ((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

       local player = Player(focus)
       if player then
           selfSay(message:gsub('|PLAYERNAME|', player:getName()))
       end
   end
end
 
Fixed by using following code:

LUA:
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())
 
Solution
Thanks but
LUA:
data/npc/scripts/Bank.lua:29: attempt to call field 'getResult' (a nil value)
here we go again 😁
 
Fixed by using following code:

LUA:
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())
That solved my issue too with nothing else requeried to be added, thanks
 
Back
Top