- Joined
- Aug 1, 2009
- Messages
- 118
- Solutions
- 1
- Reaction score
- 21
[0.3.1] - Fully working Banker NPC script
Notice: This script was made for TFS 0.2, for a 0.3 version see my other post
Release history:
Supported bank functions:
Report any bugs (ex. duplicating money) in this thread!
Notice: This script was made for TFS 0.2, for a 0.3 version see my other post
Code:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local Topic, count, transferTo = {}, {}, {}
local balance_storage = 8996
dofile("./config.lua")
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 tonumber(s:sub(b, e)) or -1
end
local function getPlayerBalance(cid)
return math.max(0, getPlayerStorageValue(cid, balance_storage))
end
local function depositMoney(cid, n)
return setPlayerStorageValue(cid, balance_storage, getPlayerBalance(cid) + n)
end
local function playerExists(name)
local env, con
if sqlType == "mysql" then
env = assert(luasql.mysql())
con = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort))
else
env = assert(luasql.sqlite3())
con = assert(env:connect(sqliteDatabase))
end
local cur = assert(con:execute("SELECT `name`, `id` FROM `players` WHERE `name` = '" .. escapeString(name) .. "' LIMIT 1;"))
local row = cur:fetch({}, "a")
cur:close()
con:close()
env:close()
return row.name or 0
end
local function transferGold(player, amount)
local env, con
if sqlType == 'mysql' then
env = assert(luasql.mysql())
con = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort))
else
env = assert(luasql.sqlite3())
con = assert(env:connect(sqliteDatabase))
end
assert(con:execute("UPDATE `player_storage` SET `value` = `value` + " .. amount .. " WHERE `player_id` = (SELECT `id` FROM `players` WHERE `name` = '" .. escapeString(player) .. "' LIMIT 1) AND `key` = '" .. balance_storage .. "' LIMIT 1"))
con:close()
env:close()
end
function greetCallback(cid)
Topic[cid], count[cid], transferTo[cid] = 0
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] = 0
elseif msgcontains(msg, 'deposit') and msgcontains(msg, 'all') then
local n = getPlayerMoney(cid)
if n > 0 then
count[cid] = n
npcHandler:say('Would you really like to deposit ' .. n .. ' gold?', cid)
Topic[cid] = 2
else
npcHandler:say('Please tell me how much gold it is you would like to deposit.', cid)
Topic[cid] = 1
end
elseif msgcontains(msg, 'deposit') then
local n = getCount(msg)
if n == 0 then
npcHandler:say('You are joking, aren\'t you??', cid)
Topic[cid] = 0
elseif n ~= -1 then
if getPlayerMoney(cid) >= n then
count[cid] = n
npcHandler:say('Would you really like to deposit ' .. n .. ' gold?', cid)
Topic[cid] = 2
else
npcHandler:say('You do not have enough gold.', cid)
Topic[cid] = 0
end
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
local n = getCount(msg)
if n == -1 then
npcHandler:say('Please tell me how much gold it is you would like to deposit.', cid)
else
if getPlayerMoney(cid) >= n then
count[cid] = n
npcHandler:say('Would you really like to deposit ' .. n .. ' gold?', cid)
Topic[cid] = 2
else
npcHandler:say('You do not have enough gold.', cid)
Topic[cid] = 0
end
end
elseif msgcontains(msg, 'yes') and Topic[cid] == 2 then
if doPlayerRemoveMoney(cid, count[cid]) == TRUE then
depositMoney(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] = 0
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] = 0
elseif msgcontains(msg, 'withdraw') then
local n = getCount(msg)
if n == 0 then
npcHandler:say('Sure, you want nothing you get nothing!', cid)
Topic[cid] = 0
elseif n ~= -1 then
if getPlayerBalance(cid) >= n then
count[cid] = n
npcHandler:say('Are you sure you wish to withdraw ' .. n .. ' gold from your bank account?', cid)
Topic[cid] = 4
else
npcHandler:say('There is not enough gold on your account.', cid)
Topic[cid] = 0
end
else
npcHandler:say('Please tell me how much gold you would like to withdraw.', cid)
Topic[cid] = 3
end
elseif Topic[cid] == 3 then
local n = getCount(msg)
if n == -1 then
npcHandler:say('Please tell me how much gold you would like to withdraw.', cid)
else
if getPlayerBalance(cid) >= n then
count[cid] = n
npcHandler:say('Are you sure you wish to withdraw ' .. n .. ' gold from your bank account?', cid)
Topic[cid] = 4
else
npcHandler:say('There is not enough gold on your account.', cid)
Topic[cid] = 0
end
end
elseif msgcontains(msg, 'yes') and Topic[cid] == 4 then
if getPlayerBalance(cid) >= count[cid] then
doPlayerAddMoney(cid, count[cid])
depositMoney(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] = 0
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] = 0
elseif msgcontains(msg, 'transfer') then
local n = getCount(msg)
if n == 0 then
npcHandler:say('Please think about it. Okay?', cid)
Topic[cid] = 0
elseif n ~= -1 then
count[cid] = n
if getPlayerBalance(cid) >= count[cid] then
if msg:find(' to(%s*)') then
local b,e = msg:find(' to(%s*)')
transferTo[cid] = msg:sub(e+1)
local tmp = getPlayerByName(transferTo[cid])
if tmp then
npcHandler:say('Would you really like to transfer ' .. count[cid] .. ' gold to ' .. getCreatureName(tmp) .. '?', cid)
Topic[cid] = 7
elseif playerExists(transferTo[cid]):lower() == transferTo[cid]:lower() then
npcHandler:say('Would you really like to transfer ' .. count[cid] .. ' gold to ' .. playerExists(transferTo[cid]) .. '?', cid)
Topic[cid] = 7
else
npcHandler:say('This player does not exist.', cid)
Topic[cid] = 0
end
else
npcHandler:say('Who would you like to transfer ' .. transferTo[cid] .. ' gold to?', cid)
Topic[cid] = 6
end
else
npcHandler:say('There is not enough gold on your account.', cid)
Topic[cid] = 0
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
local n = getCount(msg)
if n == -1 then
npcHandler:say('Please tell me the amount of gold you would like to transfer.', cid)
elseif n == 0 then
npcHandler:say('Please think about it. Okay?', cid)
Topic[cid] = 0
else
count[cid] = n
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] = 0
end
end
elseif Topic[cid] == 6 then
local tmp = getPlayerByName(msg)
if tmp == TRUE then
if getPlayerBalance(cid) >= count[cid] then
transferTo[cid] = msg
npcHandler:say('Would you really like to transfer ' .. count[cid] .. ' gold to ' .. getCreatureName(tmp) .. '?', cid)
Topic[cid] = 7
else
npcHandler:say('There is not enough gold on your account.', cid)
Topic[cid] = 0
end
elseif playerExists(msg):lower() == msg:lower() then
if getPlayerBalance(cid) >= count[cid] then
transferTo[cid] = msg
npcHandler:say('Would you really like to transfer ' .. count[cid] .. ' gold to ' .. playerExists(msg) .. '?', cid)
Topic[cid] = 7
else
npcHandler:say('There is not enough gold on your account.', cid)
Topic[cid] = 0
end
else
npcHandler:say('This player does not exist.', cid)
Topic[cid] = 0
end
elseif Topic[cid] == 7 and msgcontains(msg, 'yes') then
if getPlayerBalance(cid) >= count[cid] then
local tmp, state = getPlayerByName(transferTo[cid]), 0
if not tmp then
tmp = playerExists(transferTo[cid])
if tmp:lower() == transferTo[cid]:lower() then
transferGold(transferTo[cid], count[cid])
state = 2
end
else
doPlayerAddBalance(tmp, count[cid])
state = 1
end
if state ~= 0 then
depositMoney(cid, - count[cid])
npcHandler:say('Very well. You have transferred ' .. count[cid] .. ' gold to ' .. state == 1 and getCreatureName(tmp) or tmp .. '.', 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] = 0
elseif Topic[cid] == 7 and msgcontains(msg, 'no') then
npcHandler:say('Alright, is there something else I can do for you?', cid)
Topic[cid] = 0
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
local n = getCount(msg)
if n < 1 then
npcHandler:say('Hmm, can I help you with something else?', cid)
Topic[cid] = 0
else
count[cid] = n
npcHandler:say('So you would like me to change ' .. n * 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, ITEM_GOLD_COIN, count[cid] * 100) == TRUE then
npcHandler:say('Here you are.', cid)
doPlayerAddItem(cid, ITEM_PLATINUM_COIN, 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] = 0
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] = 0
end
elseif Topic[cid] == 11 then
local n = getCount(msg)
if n < 1 then
npcHandler:say('Hmm, can I help you with something else?', cid)
Topic[cid] = 0
else
count[cid] = n
npcHandler:say('So you would like me to change ' .. n .. ' of your platinum coins into ' .. n * 100 .. ' gold coins for you?', cid)
Topic[cid] = 12
end
elseif Topic[cid] == 12 then
if msgcontains(msg, 'yes') then
if doPlayerRemoveItem(cid, ITEM_PLATINUM_COIN, n) == TRUE then
npcHandler:say('Here you are.', cid)
doPlayerAddItem(cid, ITEM_GOLD_COIN, 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] = 0
elseif Topic[cid] == 13 then
local n = getCount(msg)
if n < 1 then
npcHandler:say('Hmm, can I help you with something else?', cid)
Topic[cid] = 0
else
count[cid] = n
npcHandler:say('So you would like me to change ' .. n * 100 .. ' of your platinum coins into ' .. n .. ' crystal coins for you?', cid)
Topic[cid] = 14
end
elseif Topic[cid] == 14 then
if msgcontains(msg, 'yes') then
if doPlayerRemoveItem(cid, ITEM_PLATINUM_COIN, count[cid] * 100) == TRUE then
npcHandler:say('Here you are.', cid)
doPlayerAddItem(cid, ITEM_CRYSTAL_COIN, 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] = 0
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
local n = getCount(msg)
if n < 1 then
npcHandler:say('Hmm, can I help you with something else?', cid)
Topic[cid] = 0
else
count[cid] = n
npcHandler:say('So you would like me to change ' .. n .. ' of your crystal coins into ' .. n * 100 .. ' platinum coins for you?', cid)
Topic[cid] = 16
end
elseif Topic[cid] == 16 then
if msgcontains(msg, 'yes') then
if doPlayerRemoveItem(cid, ITEM_CRYSTAL_COIN, count[cid]) == TRUE then
npcHandler:say('Here you are.', cid)
doPlayerAddItem(cid, ITEM_PLATINUM_COIN, 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] = 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)
Topic[cid] = 0
elseif msgcontains(msg, 'bank') then
npcHandler:say('We can change money for you. You can also access your bank account.', cid)
Topic[cid] = 0
end
return TRUE
end
npcHandler:setCallback(CALLBACK_GREET, greetCallback)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
Code:
[B][COLOR="Blue"]0.3.1[/COLOR] [COLOR="Red"]-[/COLOR] [COLOR="green"]September/29/2010 1:33 GMT+1[/COLOR][/B]
* More small improvements
[B][COLOR="Blue"]0.3[/COLOR] [COLOR="Red"]-[/COLOR] [COLOR="green"]December/3/2009 4:33 GMT+1[/COLOR][/B]
* Shortened the script
[B][COLOR="Blue"]0.2[/COLOR] [COLOR="Red"]-[/COLOR] [COLOR="green"]August/25/2009 22:03 GMT+2[/COLOR][/B]
* Added functions for [B]changing gold/platinum/crystal coins[/B]
* Added missing [B]function 'getCount(string)'[/B]
[B][COLOR="Blue"]0.1[/COLOR] [COLOR="red"]-[/COLOR] [COLOR="green"]August/25/2009 16:51 GMT+2[/COLOR][/B]
* Initial release
- balance
- deposit all
- deposit
- withdraw
- transfer (amount (, to <name))
Report any bugs (ex. duplicating money) in this thread!
Last edited: