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:
bank.lua
Make sure you have this function in your global.lua file:
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)
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: