• 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!

Bank NPC - After some hours got bugs

Gabriel Tibiano

New Member
Joined
Nov 21, 2009
Messages
420
Reaction score
4
Hi guys, this NPC script returns some errors after a few hours of online server.​

something in the function:

LUA:
creatureSayCallback function (cid, type, msg)

and i getting erros with that function
Should I put them in 050-functions.lua?
LUA:
doPlayerExist(msg)


LUA:
function getCount(msg) 
    local ret = -1 
    local b, e = string.find(msg, "%d+") 
    if b ~= nil and e ~= nil then 
       ret = tonumber(string.sub(msg, b, e)) 
    end 
    if ret > 10000000 then 
        return 10000000 
    end 
    return ret 
end 

function msgcontains(message, keyword) 
    local a, b = string.find(message, keyword) 
    if a == nil or b == nil then 
        return false 
    end 
    return true 
end 

function doPlayerAddCash(cid, itemid, count) 
    if count > 100 then 
        while(count > 100) do 
            cash = doCreateItemEx(itemid, 100) 
            doPlayerAddItemEx(cid, cash, 1) 
            count = count - 100 
        end 
    end 
    if count > 0 then 
        cash = doCreateItemEx(itemid, count) 
        doPlayerAddItemEx(cid, cash, 1) 
    end 
end 

function doPlayerExist(name) 
        dofile("./config.lua") 
        env = assert(luasql.mysql()) 
        con = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) 
        local cursor = assert(con:execute("SELECT `name` FROM `players` WHERE `name` = '".. name .."';")) 
         
  local gotChar = numRows(cursor) 
  if gotChar >= 1 then 
    local value = TRUE 
        return value 
  else 
   local value = FALSE 
   return value 
  end 
end 

function isBankPlayerOnline(name) --only used as a backup 
        dofile("./config.lua") 
        env = assert(luasql.mysql()) 
        con = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) 
        local cursor = assert(con:execute("SELECT `name` FROM `players` WHERE `name` = '".. name .."' AND `online` = '1';")) 
         
  local gotChar = numRows(cursor) 
  if gotChar == 1 then 
    local value = TRUE 
        return value 
  else 
   local value = FALSE 
   return value 
  end 
end 

function getPlayerBalance(cid) 
   if getPlayerStorageValue(cid, 50505) == -1 then 
        setPlayerStorageValue(cid, 50505, 0) 
   end 
 local result = getPlayerStorageValue(cid, 50505) 
  getbalance = result 
 return getbalance 
end 

function setTransferStorageValue(name, amount) 
local player = getPlayerByName(name) 
local playerGUID = getPlayerGUIDByName(name) 
local bankKey = 50505 
local bankStartValue = 0 
print(name) 
print(playerGUID) 
 if isBankPlayerOnline(name) == TRUE then 
  local transferBalance = getPlayerStorageValue(player, 50505) 
    if transferBalance == -1 then 
      setPlayerStorageValue(player, 50505, 0) 
      print('Bank account created.') 
          setPlayerStorageValue(player, 50505, transferBalance+amount) 
          print('Money transfered.')     
    else 
      setPlayerStorageValue(player, 50505, transferBalance+amount) 
          print('Money transfered.')     
        end 
 else 
        dofile("./config.lua") 
        env = assert(luasql.mysql()) 
        con = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) 
        local charBankSelect = assert(con:execute("SELECT * FROM `player_storage` WHERE `player_id` = '".. playerGUID .."' AND `key` = '50505';")) 
        local gotBankChar = numRows(charBankSelect) 
        if gotBankChar <= 0 then 
          assert(con:execute("INSERT INTO `player_storage` (`player_id`, `key`, `value`) VALUES (" .. playerGUID .. ", " .. bankKey .. ", " .. bankStartValue .. ")")) 
          print('Bank account created to offline player.') 
          assert(con:execute("UPDATE `player_storage` SET `value` = `value` + " .. amount .. " WHERE `player_id` = '" .. playerGUID .. "' AND `key` = '50505';")) 
          print('Money transfered to offline player.') 
        end 
        if gotBankChar == 1 then 
          assert(con:execute("UPDATE `player_storage` SET `value` = `value` + " .. amount .. " WHERE `player_id` = '" .. playerGUID .. "' AND `key` = '50505';")) 
          print('Money transfered to offline player.') 
        end 
  end 
end 

GOLD_COIN = 2148 
PLATINUM_COIN = 2152 
CRYSTAL_COIN = 2160 


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


function onCreatureAppear(cid)                npcHandler:onCreatureAppear(cid)             end 
function onCreatureDisappear(cid) 
    talk_state[cid] = 0 
    npcHandler:onCreatureDisappear(cid) 
end 
function onCreatureSay(cid, type, msg)         npcHandler:onCreatureSay(cid, type, msg)     end 
function onThink()                             npcHandler:onThink()                         end 

talk_state = {} 
last_count = {} 
last_name = {} 
function creatureSayCallback(cid, type, msg) 
    orginal_msg = msg 
    msg = string.lower(msg) 
    if(not npcHandler:isFocused(cid)) then 
        talk_state[cid] = 0 
        return false 
    end 
    local sayText = "" 
    if talk_state[cid] == nil then 
        talk_state[cid] = 0 
        last_count[cid] = 0 
        last_name[cid] = "" 
    end 
         
    -- select action 
    if msgcontains(msg, 'change') and talk_state[cid] ~= 41 then 
        talk_state[cid] = 10 
        sayText = 'We exchange gold, platinum and crystal coins.' 
    elseif msgcontains(msg, 'balance') and talk_state[cid] ~= 41 then 
        talk_state[cid] = 0 
        local balance = getPlayerBalance(cid) 
        if balance == 0 then 
            sayText = 'Your bank account is empty.' 
        elseif balance >= 100000 and balance < 100000 then 
            sayText = 'You\'ve made a pretty peny haven\'t you! Your account balance is ' .. balance .. ' gold coins.' 
        elseif balance >= 1000000 then 
            sayText = 'You must be one of the richest people in the all of the Starfire lands! Your account balance is ' .. balance .. ' gold coins.' 
        else  
            sayText = 'Your account balance is ' .. balance .. ' gold coins.' 
        end 
    elseif msgcontains(msg, 'deposit') and talk_state[cid] ~= 41 then 
        talk_state[cid] = 20 
        sayText = 'How much gold you would like to deposit?' 
    elseif msgcontains(msg, 'withdraw') and talk_state[cid] ~= 41 then 
        talk_state[cid] = 30 
        sayText = 'How much gold you would like to withdraw?' 
    elseif msgcontains(msg, 'transfer') and talk_state[cid] ~= 41 then 
        talk_state[cid] = 40 
        sayText = 'How much gold you would like to transfer?' 
    end 
         
    --change 
    if talk_state[cid] == 10 then 
        if msgcontains(msg, 'platinum') then 
            talk_state[cid] = 12 
            sayText = 'Do you want to change your platinum coins to gold or crystal?' 
        elseif msgcontains(msg, 'gold') then 
            talk_state[cid] = 11 
            sayText = 'How many platinum coins do you want to get?' 
        elseif msgcontains(msg, 'crystal') then 
            talk_state[cid] = 13 
            sayText = 'How many crystal coins do you want to change to platinum?' 
        end 
    end 
    if talk_state[cid] >= 11 and talk_state[cid] <= 13 then 
        if talk_state[cid] == 11 and getCount(msg) > 0 then 
            talk_state[cid] = 14 
            last_count[cid] = getCount(msg) 
            sayText = 'So I should change ' .. getCount(msg) * 100 .. ' of your gold coins to ' .. getCount(msg) .. ' platinum coins for you?' 
        elseif talk_state[cid] == 12 then 
            if msgcontains(msg, 'gold') then 
                talk_state[cid] = 15 
                sayText = 'How many platinum coins do you want to change to gold?' 
            elseif msgcontains(msg, 'crystal') then 
                talk_state[cid] = 16 
                sayText = 'How many crystal coins do you want to get?' 
            end 
        elseif talk_state[cid] == 13 and getCount(msg) > 0 then 
            talk_state[cid] = 17 
            last_count[cid] = getCount(msg) 
            sayText = 'So I should change ' .. getCount(msg) .. ' of your crystal coins to ' .. getCount(msg)*100 .. ' platinum coins for you?' 
        end 
    end 
    if talk_state[cid] >= 14 and talk_state[cid] <= 17 then 
        if talk_state[cid] == 14 and getCount(msg) <= 0 then 
            if msgcontains(msg, 'yes') then 
                if math.floor(getPlayerItemCount(cid, GOLD_COIN) / 100) >= last_count[cid] then 
                    doPlayerRemoveItem(cid, GOLD_COIN, last_count[cid] * 100) 
                    doPlayerAddCash(cid, PLATINUM_COIN, last_count[cid]) 
                    sayText = 'Here you are.' 
                else 
                    sayText = 'You don\'t have ' .. last_count[cid] * 100 .. ' gold coins.' 
                end 
            else 
                sayText = 'Well, can I help you with something else?' 
            end 
            talk_state[cid] = 0 
        elseif talk_state[cid] == 15 and getCount(msg) > 0 then 
            talk_state[cid] = 18 
            last_count[cid] = getCount(msg) 
            sayText = 'So I should change ' .. getCount(msg) .. ' of your platinum coins to ' .. getCount(msg) * 100 .. ' gold coins for you?' 
        elseif talk_state[cid] == 16 and getCount(msg) > 0 then 
            talk_state[cid] = 19 
            last_count[cid] = getCount(msg) 
            sayText = 'So I should change ' .. getCount(msg) * 100 .. ' of your platinum coins to ' .. getCount(msg) .. ' crystal coins for you?' 
        elseif talk_state[cid] == 17 and getCount(msg) <= 0 then 
            if msgcontains(msg, 'yes') then 
                if getPlayerItemCount(cid, CRYSTAL_COIN) >= last_count[cid] then 
                    doPlayerRemoveItem(cid, CRYSTAL_COIN, last_count[cid]) 
                    doPlayerAddCash(cid, PLATINUM_COIN, last_count[cid] * 100) 
                    sayText = 'Here you are.' 
                else 
                    sayText = 'You don\'t have ' .. last_count[cid] .. ' crystal coins.' 
                end 
            else 
                sayText = 'Well, can I help you with something else?' 
            end 
            talk_state[cid] = 0 
        end 
    end 
    if talk_state[cid] >= 18 and talk_state[cid] <= 19 then 
        if talk_state[cid] == 18 and getCount(msg) <= 0 then 
            if msgcontains(msg, 'yes') then 
                print(2) 
                if getPlayerItemCount(cid, PLATINUM_COIN) >= last_count[cid] then 
                    doPlayerRemoveItem(cid, PLATINUM_COIN, last_count[cid]) 
                    doPlayerAddCash(cid, GOLD_COIN, last_count[cid] * 100) 
                    sayText = 'Here you are.' 
                else 
                    sayText = 'You don\'t have ' .. last_count[cid] .. ' platinum coins.' 
                end 
            else 
                sayText = 'Well, can I help you with something else?' 
            end 
            talk_state[cid] = 0 
        elseif talk_state[cid] == 19 and getCount(msg) <= 0 then 
            if msgcontains(msg, 'yes') then 
                if math.floor(getPlayerItemCount(cid, PLATINUM_COIN) / 100) >= last_count[cid] then 
                    doPlayerRemoveItem(cid, PLATINUM_COIN, last_count[cid] * 100) 
                    doPlayerAddCash(cid, CRYSTAL_COIN, last_count[cid]) 
                    sayText = 'Here you are.' 
                else 
                    sayText = 'You don\'t have ' .. last_count[cid] * 100 .. ' platinum coins.' 
                end 
            else 
                sayText = 'Well, can I help you with something else?' 
            end 
            talk_state[cid] = 0 
        end 
    end 
         
    --deposit 
    if talk_state[cid] == 20 and getCount(msg) > 0 then 
        talk_state[cid] = 21 
        last_count[cid] = getCount(msg) 
        sayText = 'Would you really like to deposit ' .. last_count[cid] .. ' gold coins?' 
    elseif talk_state[cid] == 20 and msgcontains(msg, 'all') then 
        if getPlayerMoney(cid) <= 0 then 
            talk_state[cid] = 0 
            sayText = 'You don\'t have any money.' 
        else 
            talk_state[cid] = 21 
            last_count[cid] = getPlayerMoney(cid) 
            sayText = 'Would you really like to deposit your all money, ' .. last_count[cid] .. ' gold coins?' 
        end 
    elseif talk_state[cid] == 21 and getCount(msg) <= 0 then 
        if msgcontains(msg, 'yes') then 
                 local balance = getPlayerBalance(cid) 
            if doPlayerRemoveMoney(cid,last_count[cid]) == TRUE then 
                            setPlayerStorageValue(cid, 50505, balance+last_count[cid]) 
                sayText = 'You deposited ' .. last_count[cid] .. ' gold coins. Now your account balance is ' .. getPlayerBalance(cid) .. ' gold coins.' 
            else 
                sayText = 'You don\'t have ' .. last_count[cid] .. ' gold coins.' 
            end 
        else 
            sayText = 'Well, can I help you with something else?' 
        end 
        talk_state[cid] = 0 
    end 
         
    --withdraw 
    if talk_state[cid] == 30 and getCount(msg) > 0 then 
        talk_state[cid] = 31 
        last_count[cid] = getCount(msg) 
        sayText = 'Would you really like to withdraw ' .. last_count[cid] .. ' gold coins?' 
    elseif talk_state[cid] == 30 and msgcontains(msg, 'all') then 
            talk_state[cid] = 31 
            last_count[cid] = getPlayerBalance(cid) 
            sayText = 'Would you really like to withdraw your all money, ' .. last_count[cid] .. ' gold coins?' 
    elseif talk_state[cid] == 31 and getCount(msg) <= 0 then 
        if msgcontains(msg, 'yes') then 
                  local balance = getPlayerBalance(cid) 
                        if balance >= last_count[cid] then 
                                setPlayerStorageValue(cid, 50505, balance-last_count[cid]) 
                                doPlayerAddMoney(cid,last_count[cid]) 
                sayText = 'You withdrew ' .. last_count[cid] .. ' gold coins. Now your account balance is ' .. getPlayerBalance(cid) .. ' gold coins.' 
            else 
                sayText = 'You don\'t have ' .. last_count[cid] .. ' gold coins on your account. Your account balance is ' .. getPlayerBalance(cid) .. '.' 
            end 
            talk_state[cid] = 0 
        else 
            sayText = 'Well, can I help you with something else?' 
        end 
        talk_state[cid] = 0 
    end 
         
    -- transfer 
    if talk_state[cid] == 40 and getCount(msg) > 0 then 
        if getPlayerBalance(cid) >= getCount(msg) then 
            talk_state[cid] = 41 
            last_count[cid] = getCount(msg) 
            sayText = 'To who would you like transfer ' .. last_count[cid] .. ' gold coins from your account? Tell me his or her name.' 
        else 
            talk_state[cid] = 0 
            sayText = 'You don\'t have ' .. getCount(msg) .. ' gold coins on your account.' 
        end 
    elseif talk_state[cid] == 41 then 
           playerTo = doPlayerExist(msg) 
        if playerTo == TRUE then 
            last_name[cid] = msg 
            talk_state[cid] = 42 
            sayText = 'So you would like to transfer ' .. last_count[cid] .. ' gold coins to ' .. last_name[cid] .. '?' 
        else 
            talk_state[cid] = 0 
            sayText = 'The player ' .. orginal_msg .. ' does not exsist.' 
        end 
    elseif talk_state[cid] == 42 then 
        if msgcontains(msg, 'yes') then 
                 local balance = getPlayerBalance(cid) 
            if balance >= last_count[cid] then 
                                setTransferStorageValue(last_name[cid], last_count[cid]) 
                                setPlayerStorageValue(cid, 50505, balance-last_count[cid]) 
                sayText = 'You have transfered ' .. last_count[cid] .. ' gold coins to bank account of player ' .. last_name[cid] .. '. Now your account balance is ' .. getPlayerBalance(cid) .. '.' 
            else 
                sayText = 'You don\'t have ' .. last_count[cid] .. ' gold coins on your bank account.' 
                last_name[cid] = "" 
            end 
        else 
            sayText = 'Well, can I help you with something else?' 
        end 
        talk_state[cid] = 0 
    end 
    if sayText ~= "" then 
        npcHandler:say(sayText, cid) 
    end 
    return true 
end 

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


When I can post a picture I'll post the error, but anyway, anyone know anything about this?​
 
Last edited:
Back
Top