• 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!
  • New resources must be posted under Resources tab. A discussion thread will be created automatically, you can't open threads manually anymore.

NPC Banker NPC (transfer!, deposit, withdraw, balance)

Gesior.pl

Mega Noob&LOL 2012
Senator
Joined
Sep 18, 2007
Messages
2,979
Solutions
100
Reaction score
3,423
Location
Poland
GitHub
gesior
Last NPC update (5): 9 March 2008 13:52 AM
Changes:
-(up 1)more inteligent dialogs with NPC (like RL tibia, but BETTER;))
-(up 2)fixed one bug in dialog
-(up 3)added many comments for newbies who want learn LUA from ready scripts
-(up 4)NPC doesn't move when you talk with him, balance like in RL tibia
-(up 5)Deposit bug fixed! Download new version!
----------------------------------------------
I made NPC Banker script. Functions:
-withdraw
-deposit
-balance
-transfer (also to offline players!) - use server SQL database [table: players_storage, key: 300]
Script based on "Sizaro" NPC banker.
Credits:

-Gesior
-Sizaro?
Gesior Banker.xml file:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<npc name="Gesior Banker" script="data/npc/scripts/gesiorbank.lua" autowalk="25" floorchange="0" access="5" level="1" maglevel="1">
	<health now="150" max="150"/>
	<look type="129" head="114" body="119" legs="114" feet="114" corpse="2212"/>
	<parameters>
	</parameters>
</npc>
gesiorbank.lua file:
Code:
focus = 0
talk_start = 0
target = 0
dep = 0
wit = 0
trans = 0
following = false
attacking = false

gold_id = 2148
plat_id = 2152
crys_id = 2160

function onThingMove(creature, thing, oldpos, oldstackpos)

end

function onCreatureAppear(creature)

end

function onCreatureDisappear(cid, pos)
  	if focus == cid then
          selfSay('Good bye.')
          focus = 0
          talk_start = 0
		  doNpcSetCreatureFocus(0)
  	end
end

function onCreatureTurn(creature)

end


function onCreatureSay(cid, type, msg)
	msg_org = msg
  	msg = string.lower(msg)
        nome = getCreatureName(cid)

--------------------------------------Begin----------------------------------------------

  	if (msgcontains(msg, 'hi') or msgcontains(msg, 'hello')) and (focus == 0) and getDistanceToCreature(cid) < 4 then
		doNpcSetCreatureFocus(cid)
        dep = 0
        wit = 0
		trans = 0
  		selfSay('Hello ' .. nome .. '! What can I do for you? Deposit, withdraw, check balance or transfer?')
  		focus = cid
        talk_start = os.clock()  		
  	elseif msgcontains(msg, 'hi') and (focus ~= cid) and getDistanceToCreature(cid) < 4 then --NPC is talking with other player
  		selfSay('Sorry '..nome..', I am already talking to a customer. Take a seat, please..')
    end

--------------------------------------Deposit----------------------------------------------


	if dep == 0 then
		if (msgcontains(msg, 'deposit')) and (focus == cid) and getDistanceToCreature(cid) < 4 then
			selfSay('Please tell me how much gold it is you would like to deposit.')
			dep = 1
			wit = 0
			trans = 0
	        talk_start = os.clock()
        end
	end
	

  	if dep == 1 then
		if (focus == cid) and getDistanceToCreature(cid) < 4 then
			n = getNumber(msg)
			if n ~= 0 then --player told valid number, higher than 0
				talk_start = os.clock()
				selfSay('Would you really like to deposit  '..n..' gold?')
				dep = 2
			end
		end
	end    

      
	if dep == 2 and (focus == cid) and getDistanceToCreature(cid) < 4 then
		if (msgcontains(msg, 'yes'))  then --player want deposit
			dep = 0
			talk_start = os.clock()
			if doPlayerRemoveMoney(cid, n) == TRUE then --get cash from player backpack
				setBA(nome,getBA(nome)+n)
				selfSay('Alright, we have added the amount of '..n..' gold to your balance. You can withdraw your money anytime you want to. Your account balance is '..getBA(nome)..'.')
			else --player doesn't have enought cash in backpack
				selfSay('You do not have enough gold.')
			end
		end
		if (msgcontains(msg, 'no')) then --player doesn't want deposit
			selfSay('As you wish. Is there something else I can do for you?')
			dep = 0
			talk_start = os.clock()
		end
	end

-------------------------------------------Withdraw---------------------------------------

	if wit == 0 then
		if (msgcontains(msg, 'withdraw')) and (focus == cid) and getDistanceToCreature(cid) < 4 then
			selfSay('Please tell me how much gold you would like to withdraw.')
			dep = 0
			trans = 0
			wit = 1
		    talk_start = os.clock()
	    end
	end

	
	if wit == 1 then
		if (focus == cid) and getDistanceToCreature(cid) < 4 then
			n = getNumber(msg)
			if n ~= 0 then --player told valid number, higher than 0
				talk_start = os.clock()
				selfSay('Are you sure you wish to withdraw '..n..' gold from your bank account?')
				wit = 2
			end
		end
	end 

	
	if wit == 2 and (focus == cid) and getDistanceToCreature(cid) < 4 then
		if (msgcontains(msg, 'yes'))  then --player want withdraw
			wit = 0
			talk_start = os.clock()
			if n <= getBA(nome) then --player has enought cash on account
				setBA(nome,getBA(nome)-n) --get cash from player account

				gold = n
				plat = 0
				crys = {}
				crys[1] = 0
				i = 1
				--start counting how many crystal, platinum and gold coins NPC should givve
				repeat
					if gold >= 100 then
						plat = plat + 1
						gold = gold - 100
					end
				until gold < 100
				
				repeat
					if plat >= 100 then
						if crys[i] == 100 then
							i = i + 1
							crys[i] = 0
						end
						crys[i] = crys[i] + 1
						plat = plat - 100
					end
				until plat < 100
				--now script give crytal, platinum and gold coins to player (BP/hands if free)
				if crys[1] > 0 then
					repeat
						doPlayerAddItem(cid, crys_id, crys[i])
						i = i-1
					until i == 0
				end

				if plat > 0 then
					doPlayerAddItem(cid, plat_id, plat)
				end

				if gold > 0 then
					doPlayerAddItem(cid, gold_id, gold)
				end

				selfSay('Here you are, '..n..' gold. Please let me know if there is something else I can do for you. Your account balance is '..getBA(nome)..'.')
			else --player doesn't have enought cash on this bank account, can't withdraw that much
				selfSay('There is not enough gold on your account.')
			end
		end
		if (msgcontains(msg, 'no')) then --player doesn't want to withdraw
			selfSay('The customer is king! Come back anytime you want to if you wish to withdraw your money.')
			wit = 0
			talk_start = os.clock()
		end
	end

-------------------------------------------Balance---------------------------------------

    if (msgcontains(msg, 'balance')) and (focus == cid) and getDistanceToCreature(cid) < 4 then --player who is talking with NPC want to know his account balance
		selfSay('Your account balance is '..getBA(nome)..' gold.')
		dep = 0
		wit = 0
		trans = 0
		talk_start = os.clock()
	end

-------------------------------------------Transfer---------------------------------------
	
	if trans == 3 and (focus == cid) and getDistanceToCreature(cid) < 4 then
		if (msgcontains(msg, 'yes')) then --if he want to tranfer
			playerbalance = getBA(nome) --get balance value of player
			if setBA(rec, getBA(rec)+quant) > 0 then -- if script set new balance get cash from transfering player account
				playerbalance = playerbalance - quant
				setBA(nome, playerbalance)
				selfSay('You have transferred '..quant..' gold to '..rec_org..'. Your account balance is '..playerbalance..' gold.')
				trans = 0
				talk_start = os.clock()
			else --problem with database? dont lose money..
				selfSay('Problem with transfer. Sorry.')
				trans = 0
				talk_start = os.clock()
			end
		elseif (msgcontains(msg, 'no')) then -- if he dont want to tranfer
			selfSay('Ok. What is next?')
			trans = 0
			talk_start = os.clock()  
		end
	end

	if trans == 2 and (focus == cid) and getDistanceToCreature(cid) < 4 then
		if getBA(msg) >= 0 then --player with this name exist
			rec = msg
			rec_org = msg_org
			selfSay('So you would like to transfer '..quant..' gold to '..rec_org..'?')
			trans = 3
			talk_start = os.clock()  
        else --player with this name doesn't exist
			selfSay('This player does not exist. Please tell me other name.')
			trans = 2
			talk_start = os.clock()  
		end
	end

	if trans == 1 and (focus == cid) and getDistanceToCreature(cid) < 4 then
		quant = getNumber(msg)
		if quant > 0 then -- its number and is higher than 0
			if getBA(nome) >= quant then -- player who want to transfer has enought cash on account
				selfSay('Who would you like transfer '..quant..' gold to?')
				trans = 2
				talk_start = os.clock()  
			else -- player who want to transfer has not enought cash on account
				selfSay('There is not enough gold on your account. Your account balance is '..getBA(nome)..'. Please tell me the amount of gold coins you would like to transfer.')
				trans = 1
				talk_start = os.clock()  
			end
		else --player told 0 or lower number or word like "asd" (its not a number)
			selfSay('Please tell me the amount of gold coins you would like to transfer.')
			talk_start = os.clock()  
			trans = 1
		end
	end

	if trans == 0 then
	if (msgcontains(msg, 'transfer')) and (focus == cid) and getDistanceToCreature(cid) < 4 then 
		selfSay('Please tell me the amount of gold coins you would like to transfer.')
		dep = 0
		wit = 0
		trans = 1
		talk_start = os.clock()
	end
	end

-------------------------------------------End--------------------------------------------
  
    if (msgcontains(msg, 'bye')) and (focus == cid) and getDistanceToCreature(cid) < 4 then --player say "bye" - npc answer
		doNpcSetCreatureFocus(0)
	    selfSay('Good bye.')
	    focus = 0
		dep = 0
		wit = 0
		trans = 0
    end
end

function onCreatureChangeOutfit(creature)

end


function onThink()
  	if (os.clock() - talk_start) > 30 then --if player did not say anything from 30 seconds say "next please" and wait for another customer
  		if focus > 0 then
			doNpcSetCreatureFocus(0)
  			selfSay('Next please...')
  		end
		focus = 0
        dep = 0
		wit = 0
		trans = 0
  	end
 	if focus ~= 0 then
 		if getDistanceToCreature(focus) > 5 then --if distance to player is higher than 5 say bye
			doNpcSetCreatureFocus(0)
 			selfSay('Good bye.')
 			focus = 0
            dep = 0
		    wit = 0
			trans = 0
 		end
 	end
end


function getNumber(txt) --return number if its number and is > 0, else return 0
x = string.gsub(txt,"%a","")
x = tonumber(x)
if x ~= nill and x > 0 then
return x
else
return 0
end
end

function msgcontains(txt, str)
  	return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)'))
end

function setBA(name, nvalue) --save bank account value for online and offline players
	local cid = getPlayerByName(name)
	set_status = -1
	if isPlayer(cid) == TRUE then
		--player is online 
		setPlayerStorageValue(cid,300,nvalue)
		set_status = 1
		return 1
	else
		--player is offline, load DB connection info and connect
		dofile("./config.lua")
	    if sqlType == "mysql" then 
	         env = assert(luasql.mysql()) 
	         con = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) 
	    else -- sqlite 
	         env = assert(luasql.sqlite3()) 
	         con = assert(env:connect(sqliteDatabase)) 
	    end 
		--check is player exist
		local nametodb = escapeString(name)
		result_plr = assert(con:execute("SELECT `id` FROM `players` WHERE `name` = '" .. nametodb .. "';"))
		player = result_plr:fetch({}, "a")
		local players = 0
		local guid = 0
		while player do
			players = players + 1
			guid = tonumber(player.id)
			player = result_plr:fetch (player, "a")
		end
		if players > 0 then
			if guid > 0 then
			--player exist, check his account status
				storageqry = assert(con:execute("SELECT `value` FROM `player_storage` WHERE `player_id` = '" .. guid .. "' AND `key` = 300;"))
				storage = storageqry:fetch({}, "a")
				local whiles = 0
				while storage do
					whiles = whiles + 1
					storage = storageqry:fetch (storage, "a")
				end
				if whiles < 1 then
					--if player hasn't account, create account and set account balance value 'nvalue'
					assert(con:execute("INSERT INTO `player_storage` (`player_id` ,`key` ,`value`) VALUES ('" .. guid .. "', '300', '" .. nvalue .. "');"))
					set_status = 1
				else
					assert(con:execute("UPDATE `player_storage` SET `value` = '" .. nvalue .. "' WHERE `player_id` = '" .. guid .. "' AND `key` = 300;"))
					set_status = 1
				end
			end
		else
			--player with this name doesn't exist
			set_status = -1
		end
		con:close()
		env:close()
	end
	--if player not exist return -1
	--if player exist return his bank account value
	return set_status
end

function getBA(name) -- check account balance for offline and online players
    local cid = getPlayerByName(name)
    if isPlayer(cid) == TRUE then
        --player is online 
        local player_cash_str = getPlayerStorageValue(cid, 300)
        --create bank account if not exist
        if player_cash_str < 0 then
            setPlayerStorageValue(cid,300,0)
            player_cash = 0
        else
            player_cash = player_cash_str
        end
    else
        --player is offline, load DB connection info and connect
        dofile("./config.lua")
        if sqlType == "mysql" then 
             env = assert(luasql.mysql()) 
             con = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) 
        else -- sqlite 
             env = assert(luasql.sqlite3()) 
             con = assert(env:connect(sqliteDatabase)) 
        end 
        --check is player exist
        local nametodb = escapeString(name)
        result_plr = assert(con:execute("SELECT `id` FROM `players` WHERE `name` = '" .. nametodb .. "';"))
        player = result_plr:fetch({}, "a")
        local players = 0
        local guid = 0
        while player do
            players = players + 1
            guid = tonumber(player.id)
            player = result_plr:fetch (player, "a")
        end
        if players > 0 then
            if guid > 0 then
            --player exist, check his account status
                storageqry = assert(con:execute("SELECT `value` FROM `player_storage` WHERE `player_id` = '" .. guid .. "' AND `key` = 300;"))
                storage = storageqry:fetch({}, "a")
                local whiles = 0
                while storage do
                    whiles = whiles + 1
                    player_cash = tonumber(storage.value)
                    storage = storageqry:fetch (storage, "a")
                end
                if whiles < 1 then
                    --if player hasn't account, create account and set account balance value to 0
                    assert(con:execute("INSERT INTO `player_storage` (`player_id` ,`key` ,`value`) VALUES ('" .. guid .. "', '300', '0');"))
                    player_cash = 0
                end
            end
        else
            --player with this name doesn't exist
            player_cash = -1
        end
        con:close()
        env:close()
    end
    --if player not exist return -1
    --if player exist return his bank account value
    return player_cash
end
NPC tested (TFS 0.2.10): withdraw, deposit, balance, transfer to offline player
Scripts are in file below (.rar)
Report bugs in this thread.
 

Attachments

  • gesiorbankerscript.rar
    3.7 KB · Views: 345 · VirusTotal
Last edited:
Btw, before transfering cash to anybody you have to deposite incase people doesnt know
 
I checked how it work in RL tibia carlin banker. I modified script and texts a bit. Now dialog with npc is more "inteligent":
NORMAL:
17:40 Sorcerer Sample [150]: hi
17:40 Gesior Banker: Hello Sorcerer Sample! What can I do for you? Deposit, withdraw, check balance or transfer?
17:40 Sorcerer Sample [150]: balance
17:40 Gesior Banker: Your account balance is 9093 gold.
17:40 Sorcerer Sample [150]: transfer
17:40 Gesior Banker: Please tell me the amount of gold coins you would like to transfer.
17:40 Sorcerer Sample [150]: sdf
17:40 Gesior Banker: Please tell me the amount of gold coins you would like to transfer.
17:40 Sorcerer Sample [150]: sdf
17:40 Gesior Banker: Please tell me the amount of gold coins you would like to transfer.
17:40 Sorcerer Sample [150]: 123
17:40 Gesior Banker: Who would you like transfer 123 gold to?
17:40 Sorcerer Sample [150]: sdf
17:40 Gesior Banker: This player does not exist. Please tell me other name.
17:40 Sorcerer Sample [150]: Rook Sample
17:40 Gesior Banker: So you would like to transfer 123 gold to rook sample?
17:40 Sorcerer Sample [150]: yes
17:40 Gesior Banker: You have transferred 123 gold to rook sample. Your account balance is 8970 gold.
NOT ENOUGHT CASH:
17:43 Sorcerer Sample [150]: transfer
17:43 Gesior Banker: Please tell me the amount of gold coins you would like to transfer.
17:43 Sorcerer Sample [150]: 123456789
17:43 Gesior Banker: There is not enough gold on your account. Your account balance is 8970. Please tell me the amount of gold coins you would like to transfer.
17:43 Sorcerer Sample [150]: 123
17:43 Gesior Banker: Who would you like transfer 123 gold to?
I'll test rest of options in new NPC and edit first post.
EDIT:
Code in first post and attached file actualized to newest version. Now players should understand they need cash on bank account to transfer.
Added comments to "if" and functions for newbies who want learn LUA from ready scripts
I know only one bug in this NPC. He is moving when you are talking with him. Is here any NPC pro scripter who can help me with it? :)
 
Last edited:
Code:
<?xml version="1.0"?>
<npc name="Dwayne" script="data/npc/scripts/distance.lua" [B]autowalk="0" [/B]floorchange="0" access="3">
 	<look type="129" head="0" body="131" legs="114" feet="114" addons="3" />
</npc>
 
Nice job, I already did mine, you this may help other people :D

By the way, this is not that important, but you may want to add it:
In RL tibia, depending on the money you have on your bank account, the npc will say a different message when you ask for your balance.
TibiaWiki said:
When you have less than 100k, they simply say "Your account balance is x gold."
When you have between 100k and 1kk they say "You certainly have made a pretty penny. Your account balance is x gold."
When you have between 1kk and 10kk they say "Wow, you've reached the magic number of one million gp! Your account balance is x gold."
When you have over 10kk they say "I think you must be one of the richest inhabitants of Tibia! Your account balance is x gold."

About the walking thing, why don't you do it with Jiddo's NPC system?
 
Last edited:
Nice job, I already did mine, you this may help other people :D
By the way, this is not that important, but you may want to add it:
In RL tibia, depending on the money you have on your bank account, the npc will say a different message when you ask for your balance.
About the walking thing, why don't you do it with Jiddo's NPC system?
I tried to use Jiddo system, but it block my script (don't answer after "hi,answer,withdraw,answer,123,silence..."). I found in Jiddo NPC system needed command :)
doNpcSetCreatureFocus(cid) - npc doesn't move
doNpcSetCreatureFocus(0) - npc move again
I'll add balance status like in RL tibia and post new version tommorow (3 am now, at 8 am I must be in school).
 
My bank script worked perfectly on Jiddo's npc system, and it's basically(sp?) the same.
 
Code in first post updated.
-balance like in RL tibia
-NPC doesn't move when you talk with him
Not tested yet. In file is old version of NPC.
 
Bugggggggggggg

HEI MAN if money is in hand the npc no take the money and deposit the volue to player

very very bug

is do what the player have 1 kkkkkk of money
 
BUG Removed

You need add " == TRUE" in bank.lua.


if dep == 2 and (focus == cid) and getDistanceToCreature(cid) < 4 then
if (msgcontains(msg, 'yes')) then --player want deposit
dep = 0
talk_start = os.clock()
if doPlayerRemoveMoney(cid, n) == TRUE then --get cash from player backpack
setBA(nome,getBA(nome)+n)
selfSay('Alright, we have added the amount of '..n..' gold to your balance. You can withdraw your money anytime you want to. Your account balance is '..getBA(nome)..'.')
else --player doesn't have enought cash in backpack
selfSay('You do not have enough gold.')
end
end
 
-.- u can deposit as much as u like without even having that money on u. unless uv changed that many people are gona have some problems!
 
You need add " == TRUE" in bank.lua.


if dep == 2 and (focus == cid) and getDistanceToCreature(cid) < 4 then
if (msgcontains(msg, 'yes')) then --player want deposit
dep = 0
talk_start = os.clock()
if doPlayerRemoveMoney(cid, n) == TRUE then --get cash from player backpack
setBA(nome,getBA(nome)+n)
selfSay('Alright, we have added the amount of '..n..' gold to your balance. You can withdraw your money anytime you want to. Your account balance is '..getBA(nome)..'.')
else --player doesn't have enought cash in backpack
selfSay('You do not have enough gold.')
end
end
Thank you for report :>
 
Gesior, the npc is bugged now. You can say Hi as many times as you want and he will keep saying:
Code:
Hello Jester! What can I do for you? Deposit, withdraw, check balance or transfer?

Also you can't use any of those commands, deposit/withdraw/balance or transfer.
 
Gesior, the npc is bugged now. You can say Hi as many times as you want and he will keep saying:
Code:
Hello Jester! What can I do for you? Deposit, withdraw, check balance or transfer?

Also you can't use any of those commands, deposit/withdraw/balance or transfer.
What version of code do you use? What version of TFS? Download newest version of banker (in file was old version!). For me all work fine.
00:00 Sorcerer Sample [150]: hi
00:00 Gesior Banker: Hello Sorcerer Sample! What can I do for you? Deposit, withdraw, check balance or transfer?
00:00 Sorcerer Sample [150]: hi
00:00 Sorcerer Sample [150]: hi
00:00 Sorcerer Sample [150]: hello
00:00 Sorcerer Sample [150]: transfer
00:00 Gesior Banker: Please tell me the amount of gold coins you would like to transfer.
00:00 Sorcerer Sample [150]: balance
00:00 Gesior Banker: Your account balance is 218455 gold.
00:00 Gesior Banker: Next please...
------------------------------------------
Today I wrote "item shop" LUA script. Now I only need script for page and I'll post first system to sell items from page (for offline and online players!).
 
Last edited:
Back
Top