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

NPC Gesior's Bank System for 0.2+

BeniS

Advanced OT User
Senator
Joined
Aug 8, 2009
Messages
1,850
Reaction score
189
Location
New Zealand
Gesior's Bank System for 0.2+


100% working bank NPC system, based off Gesior's bank script for 0.3+. Converted to have 0.2+ compatibility by me.

Info:
  • Deposit (all)
  • Withdraw (all)
  • Transfer
  • Change Gold
  • Balance

bank.lua
Lua:
--[[
	!---------------------------------!
	!----Edited by Teh Maverick-------!
        !------Credits: Gesior.pl---------!
	!-------www.otland.net------------!
	!---------------------------------!
]]

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())

Make sure you have this function in your global.lua file:
Lua:
function numRows(cursor)
	local row = cursor:fetch()
	local rows = 0
	while row do
		rows = rows + 1
		row = cursor:fetch()
	end
	cursor:close()
	return rows
end

Hope its useful to people. Not sure if there are any other stable bank systems for 0.2+ but heres mine! hehe enjoy. Rep++ if you like!

(List any errors in the thread)
 
Last edited:
Back
Top