alisonjf 2 #1 Postado 18 Novembro, 2008 (editado) Nome: Banker não igual ao Tibia RL, mas melhor Versão: 8.31 Tipo de Script: NPC Servidor Testado: TFS 0.3 Créditos (Autor): Gesior e Sizaro ------------------------------------------------------------- Bom, já existem muitos bankers bons, mas SEMPRE existe um bug em um deles. Com esse banker novo, bem melhor que o tibia.com, tenho certeza de que os membros do OTNet irão adorar esse grande trabalho do Gesior. Mudanças: -diálogo mais inteligente com o npc (tipo tibia rl, só que, MELHOR -fixado um bug do diálogo -NPC não se move enquanto está falando com você, balance igual tibia rl -bug de depositar fixado! baixe a nova versão! ------------------------------------------------------------------------- Funções: -withdraw -balance -deposit -transfer (também para players offline) - use o database SQL [table: players_storage, key: 300] Crie um arquivo chamado Gesior Banker.xml na pasta data/npc e adicione: <?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> Agora na pasta data/npc/scripts, crie um arquivo chamado gesiorbank.lua e adicione: 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 E pronto, use e abuse do seu banker! ------------------------------------------------------------------------- Gostaram: Doem OT$ Reclamações/Dúvidas: Postem Editado 24 Janeiro, 2011 por Mickfern Compartilhar este post Link para o post
Nord 2 #2 Postado 20 Novembro, 2008 Opa, sempre gostei de atualizações e aquele troço de transferir dinheiro só pra quem estava online era chatinho hein. Aprovado Compartilhar este post Link para o post
mendez 0 #3 Postado 23 Novembro, 2008 Po cara aki deu o seguinte erro Lua Script Error: [NPC interface]data/npc/scripts/bank.lua:onCreatureSay data/npc/lib/npc,lua:43 attempt to perform arithmetic on global 'cx' <a table value> stack traceback: data/npc/lib/npc.lua:43: in function 'getDistancetoCreature' data/npc/scripts/bank.lua:43: in function <data/npc/scripts/bank.lua:36> Compartilhar este post Link para o post
Le588 0 #4 Postado 24 Novembro, 2008 Funciona no Edin Word 8.31? Parece legal, vou testar! Compartilhar este post Link para o post
texzz 0 #5 Postado 25 Novembro, 2008 Muito bom mas ja que vc desenvolveu este npc vc poderia arrumar um de recarga de soft? Desde Já grato! Compartilhar este post Link para o post
B. Noah 0 #6 Postado 30 Novembro, 2008 (editado) aaqui ta bugando no ongetDistance ou algo assim, to ocm esse problema tbm nos script d npc de 3° vocação q vejo aki, ja muitas pessoas ocm essa duvida e nenhuma resposta, tme cmo vc da uma luz? aquem sabe ateh ajuda pro outro npc tbm =) vou tentar arrumar, c der certo eu edito mas por favor tenta da um help ae brigado =) PD: não consegui olha o erro que aparece [30/11/2008 18:52:25] Lua Script Error: [Npc interface] [30/11/2008 18:52:25] data/npc/scripts/gesiorbank.lua:onCreatureSay [30/11/2008 18:52:25] data/npc/lib/npc.lua:43: attempt to perform arithmetic on global 'cx' (a table value) [30/11/2008 18:52:25] stack traceback: [30/11/2008 18:52:25] data/npc/lib/npc.lua:43: in function 'getDistanceToCreature' [30/11/2008 18:52:25] data/npc/scripts/gesiorbank.lua:43: in function <data/npc/scripts/gesiorbank.lua:36> será que tem algo q pode ser feito? Edit: Encontrei o problema, aqui é script em jiddo system, tem como vc passar esse banker pra jiddo? =/ vou ficar muito feliz se isso aocntecer =) dae só vai faltar aprender como tira aquqle sistema de clikar com o dfireito na moeda e ela transforma em outra xD Ty brooooow Editado 3 Dezembro, 2008 por B. Noah Compartilhar este post Link para o post
Bi_gch 0 #7 Postado 15 Dezembro, 2008 aki até funfo mais qdo eu pus otro npc desse msm mudando o arquivo.lua, tudo nao deu, nao pego=p paro de funfa=/ pena, qdo tava um soh dava certinho, mto bom mais da esse bug ae se alguem souber cm eu arruma me avisa ae plx =D vlw __________ Fx | B ii | mALUCO bELEZA Compartilhar este post Link para o post
gnr 0 #8 Postado 22 Dezembro, 2008 Estava proucurando um banker faz tempo. Eu também queria saber como que faz para ativar o "aluguel" da casa, que precisa do dinheiro depositado no bank, se alguem souber ou tiver um post sobre isso posta ae (Y) Muito bom esse NPC ^^ Aprovado. Compartilhar este post Link para o post
Palmares_ 0 #10 Postado 20 Março, 2009 Que script noob, lerdo. processa milhoes de coisa atoa nah nah Compartilhar este post Link para o post
gamberlay 0 #11 Postado 21 Março, 2009 Nossa é o primeiro npc de banco que funfo no meu ot,mas tem um problema ele não fala no npc channel ele fala pelo default como boto pra ele fala pelo npc channel pra ele fica perfeito? Compartilhar este post Link para o post
Collins 0 #12 Postado 21 Março, 2009 Funcionou comigo brigado ae Compartilhar este post Link para o post
aleff02 0 #13 Postado 24 Março, 2009 Cara deu hum erro aqui... jaja posto ss Compartilhar este post Link para o post
Fantom 1 #14 Postado 24 Março, 2009 Aleff02 Leia as regras antes de postar Topic Meu rl precisava disto, ja ia fazer um pedido na area vip. funciono aqui Compartilhar este post Link para o post
m4rr3co 0 #16 Postado 1 Setembro, 2009 Como eu ponho esse npc pra funcionar em server 8.5?? tem q mudar alguma coisa? abracs Compartilhar este post Link para o post
Malerow 0 #17 Postado 16 Dezembro, 2010 Tem deposit all e withdraw all ?? Compartilhar este post Link para o post