soulblaster 0 Postado Janeiro 10, 2007 Share Postado Janeiro 10, 2007 Hiho! primeiramente, os devidos creditos de quem criou esse funçao: Creditos a: rob101 do otfans. (por faser toda funçao) Zorzin do xtibia. (pra faser funcionar tambem em xml) eu só estou aqui para mostrar para vcs mesmo =] Funçoes: deposit, withdraw, balance, transfer e pagamento das houses pelo bank Testado em: Forgotten Otserver SQL notas: -o que tiver *** é a parte que o zorzin fez -se você usa server SQL, siga nos titulos (para xml e sql) ou (para sql) -se você usa server XML, siga nos titulos (para xml e sql) ou (para xml) começando: luascript.cpp (para xml e sql) depois de: lua_register(m_luaState, "getPlayerPremiumDays", LuaScriptInterface::luaGetPlayerPremiumDays); adicione: //doPlayerDeposit(cid, cash) lua_register(m_luaState, "doPlayerDeposit", LuaScriptInterface::luaDoPlayerDeposit); //doPlayerWithdraw(cid, cash) lua_register(m_luaState, "doPlayerWithdraw", LuaScriptInterface::luaDoPlayerWithdraw); //getPlayerBalance(cid) lua_register(m_luaState, "getPlayerBalance", LuaScriptInterface::luaGetPlayerBalance); //doPlayerDepositTrans(name, cash) lua_register(m_luaState, "doPlayerDepositTrans", LuaScriptInterface::luaDoPlayerDepositTrans); depois de: case PlayerInfoPremDays: value = player->premDays; break; adicione: case PlayerInfoBank: value = player->bank; break; depois de: int LuaScriptInterface::luaGetPlayerPremiumDays(lua_State *L){ return internalGetPlayerInfo(L,PlayerInfoPremDays);} adicione: int LuaScriptInterface::luaGetPlayerBalance(lua_State *L){ return internalGetPlayerInfo(L,PlayerInfoBank);} no final, adicione: int LuaScriptInterface::luaDoPlayerDeposit(lua_State *L) { //doPlayerDeposit(cid, cash) int64_t cash = (int64_t)popNumber(L); uint32_t cid = popNumber(L); ScriptEnviroment* env = getScriptEnv(); Player* player = env->getPlayerByUID(cid); if(player){ player->bank += cash; lua_pushnumber(L, LUA_TRUE); } else{ lua_pushnumber(L, LUA_ERROR); } return 1; } int LuaScriptInterface::luaDoPlayerWithdraw(lua_State *L) { //doPlayerWithdraw(cid, cash) int64_t cash = (int64_t)popNumber(L); uint32_t cid = popNumber(L); ScriptEnviroment* env = getScriptEnv(); Player* player = env->getPlayerByUID(cid); if(player){ player->bank -= cash; lua_pushnumber(L, LUA_TRUE); } else{ lua_pushnumber(L, LUA_ERROR); } return 1; } int LuaScriptInterface::luaDoPlayerDepositTrans(lua_State *L) { //doPlayerDepositTrans(name, cash) int64_t cash = (int64_t)popNumber(L); std::string name = popString(L); unsigned long guid; if(!IOPlayer::instance()->getGuidByName(guid, name)){ lua_pushnumber(L, LUA_ERROR); } if(Player* player = g_game.getPlayerByName(name)){ player->bank += cash; lua_pushnumber(L, LUA_TRUE); } else if(IOPlayer::instance()->playerExists(name)){ Player* player = new Player(name, NULL); if(!IOPlayer::instance()->loadPlayer(player, name)){ delete player; lua_pushnumber(L, LUA_ERROR); } player->bank += cash; IOPlayer::instance()->savePlayer(player); delete player; lua_pushnumber(L, LUA_TRUE); } return 1; } luascript.h (para xml e sql) depois de: PlayerInfoPremDays, adicione: PlayerInfoBank, depois de: static int internalGetPlayerInfo(lua_State *L, PlayerInfo_t info); adicione: static int luaDoPlayerDeposit(lua_State *L); static int luaDoPlayerWithdraw(lua_State *L); static int luaGetPlayerBalance(lua_State *L); static int luaDoPlayerDepositTrans(lua_State *L); ioplayersql.cpp (para sql) depois de: player->soul = result.getDataInt("soul"); adicione: player->bank = result.getDataLong("bank"); depois de: query << "`soul` = " << player->soul << ", "; adicione: query << "`bank` = " << player->bank << ", "; ioplayerxml.cpp (para xml)*** depois de: if(readXMLInteger(root, "soul", intValue)){ player->soul = intValue; } adicione: if(readXMLInteger(root, "bank", intValue)){ player->bank = intValue; } else player->bank = 0; depois de: sb.str(""); sb << player->soul; xmlSetProp(root, (const xmlChar*)"soul", (const xmlChar*)sb.str().c_str()); adicione: sb.str(""); sb << player->bank; xmlSetProp(root, (const xmlChar*)"bank", (const xmlChar*)sb.str().c_str()); player.cpp (para xml e sql) depois de: soul = 0; adicione: bank = 0; player.h (para xml e sql) depois de: int32_t soul, soulMax; adicone: int64_t bank; game.cpp (para xml e sql) no final, adicione: bool Game::bankWithdraw(Player* player, int64_t money, uint32_t flags) { if(player){ if (player->bank >= money) { player->bank -= money; return true; } else { return false; } } else{ return false; } } game.h (para xml e sql) depois de: void changeSkull(Player* player, Skulls_t newSkull); adicione: bool bankWithdraw(Player* player, int64_t money, uint32_t flags); house.cpp (para xml e sql) troque isso: if(g_game.removeMoney(depot, house->getRent(), FLAG_NOLIMIT)){ por isso: //if(g_game.removeMoney(depot, house->getRent(), FLAG_NOLIMIT)){ if(g_game.bankWithdraw(player, house->getRent(), FLAG_NOLIMIT)){ troque isso: player->sendTextMessage(MSG_INFO_DESCR, "You have successfully bought this house, be sure to have the money for the rent in your depot of this city."); por isso: //player->sendTextMessage(MSG_INFO_DESCR, "You have successfully bought this house, be sure to have the money for the rent in your depot of this city."); player->sendTextMessage(MSG_INFO_DESCR, "You have successfully bought this house, be sure to have the money for the rent in your bank account."); database do sql (para sql) ALTER TABLE `players` ADD `bank` INT( 64 ) NOT NULL DEFAULT '0' AFTER `soul` ; examplo de NPC (baseado no NPC Banker do Colex) local focus = 0local talk_start = 0 local target = 0 local dep = 0 local wit = 0 local trans = 0 local following = false local attacking = false local msg = '' local nome = '' local ux = 0 local n = 0 local na = 0 local rec = '' local gold = na local plat = 0 local crys = {} local i = 0 function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(cid, pos) if focus == cid then selfSay('Good bye then.') focus = 0 talk_start = 0 end end function onCreatureTurn(creature) 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 onCreatureSay(cid, type, msg) msg = string.lower(msg) nome = creatureGetName(cid) if (string.find(msg, 'hi') or string.find(msg, 'hello')) and (focus == 0) and getDistanceToCreature(cid) < 4 then dep = 0 wit = 0 trans = 0 selfSay('Hello ' .. nome .. '! Well come to the local bank, what do you want to do? here you can access your bank account saying (deposit, withdraw, balance, transfer).') focus = cid talk_start = os.clock() elseif string.find(msg, 'hi') and (focus ~= cid) and getDistanceToCreature(cid) < 4 then selfSay('Sorry, ' .. creatureGetName(cid) .. '! I talk to you in a minute.') end if dep == 0 then if (string.find(msg, 'deposit')) and (focus == cid) and getDistanceToCreature(cid) < 4 then selfSay('How much do you wish 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 talk_start = os.clock() selfSay('Do you really want to deposit '..n..' gold pieces?') dep = 2 end end end if dep == 2 and (focus == cid) and getDistanceToCreature(cid) < 4 then if (string.find(msg, 'yes')) then dep = 0 talk_start = os.clock() if doPlayerRemoveMoney(cid,n) then doPlayerDeposit(cid,n) selfSay('Deposit Succesful!') else selfSay('Sorry, you dont have enought money!') end end if (string.find(msg, 'no')) then selfSay('Ok then.') dep = 0 talk_start = os.clock() end end if wit == 0 then if (string.find(msg, 'withdraw')) and (focus == cid) and getDistanceToCreature(cid) < 4 then selfSay('How much do you wish 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 talk_start = os.clock() selfSay('Do you really want to withdraw '..n..' gold pieces?') wit = 2 end end end if wit == 2 and (focus == cid) and getDistanceToCreature(cid) < 4 then if (string.find(msg, 'yes')) then wit = 0 talk_start = os.clock() if n <= getPlayerBalance(cid) then doPlayerWithdraw(cid,n) doPlayerAddCash(cid,n) selfSay('withdraw successful!') else selfSay('Sorry, you dont have enought money in your account!') end end if (string.find(msg, 'no')) then selfSay('Ok then.') wit = 0 talk_start = os.clock() end end if (string.find(msg, 'balance')) and (focus == cid) and getDistanceToCreature(cid) < 4 then selfSay('You have got '..getPlayerBalance(cid)..' gold pieces in your bank account.') dep = 0 wit = 0 trans = 0 talk_start = os.clock() end if trans == 4 and (focus == cid) and getDistanceToCreature(cid) < 4 then if (string.find(msg, 'yes')) then if (doPlayerDepositTrans(rec, quant) == 1) then doPlayerWithdraw(cid, quant) selfSay('The money was successfuly transfered!') trans = 0 talk_start = os.clock() else selfSay('This player does exist!') end elseif (string.find(msg, 'no')) then selfSay('Ok then!') trans = 0 talk_start = os.clock() end end if trans == 3 and (focus == cid) and getDistanceToCreature(cid) < 4 then rec = msg selfSay('Do you want to transfer '..quant..' gps to '..rec..'?') trans = 4 talk_start = os.clock() end if trans == 2 and (focus == cid) and getDistanceToCreature(cid) < 4 then if (string.find(msg, 'yes')) then if getPlayerBalance(cid) >= quant then selfSay('Who do you want to trasnfer the money to?') trans = 3 talk_start = os.clock() else selfSay('Sorry, you do not have enough money!') trans = 0 talk_start = os.clock() end elseif (string.find(msg, 'no')) then selfSay('Ok then!') talk_start = os.clock() trans = 0 end end if trans == 1 and (focus == cid) and getDistanceToCreature(cid) < 4 then quant = getNumber(msg) if quant > 0 then selfSay('Do you really want to transfer '..quant..' gold pieces?') trans = 2 talk_start = os.clock() end end if trans == 0 then if (string.find(msg, 'transfer')) and (focus == cid) and getDistanceToCreature(cid) < 4 then selfSay('How much do you want to transfer?') dep = 0 wit = 0 trans = 1 talk_start = os.clock() end end if (msgcontains(msg, 'bye')) and (focus == cid) and getDistanceToCreature(cid) < 4 then selfSay('Have a nice day Sir!') focus = 0 dep = 0 wit = 0 trans = 0 end end function onCreatureChangeOutfit(creature) end function onThink() if (os.clock() - talk_start) > 30 then if focus > 0 then selfSay('Next Please...') end focus = 0 dep = 0 wit = 0 trans = 0 end if focus ~= 0 then if getDistanceToCreature(focus) > 5 then selfSay('Good bye then.') focus = 0 dep = 0 wit = 0 trans = 0 end end end function getNumber(txt) ux = string.gsub(txt,"%a","") ux = tonumber(ux) if ux ~= nill and ux > 0 then return ux else return 0 end end function doPlayerAddCash(cid, na) gold = na plat = 0 crys = {} crys[1] = 0 i = 1 repeat if gold >= 100 then plat = plat + 1 gold = gold - 100 end until gold < 100 repeat if plat >= 100 then if crys == 100 then i = i + 1 crys = 0 end crys = crys + 1 plat = plat - 100 end until plat < 100 if crys[1] > 0 then repeat doPlayerAddItem(cid,2160,crys) i = i-1 until i == 0 end if plat > 0 then doPlayerAddItem(cid,2152,plat) end if gold > 0 then doPlayerAddItem(cid,2148,gold) end end é isso, espero que aproveite! lembrando que eu NAO fiz essa função, foi o rob101 do otfans. cya... :hi: Link para o comentário https://xtibia.com/forum/topic/38356-79-xmlsql-fun%C3%A7ao-de-bank/ Compartilhar em outros sites More sharing options...
Kydrai 146 Postado Janeiro 10, 2007 Share Postado Janeiro 10, 2007 Ele é bem grande, mas ta mutio bom. Tava procurando esse code, msm vc copiando do otfans qm me ajudo foi vc Vlw, :hi: Link para o comentário https://xtibia.com/forum/topic/38356-79-xmlsql-fun%C3%A7ao-de-bank/#findComment-216634 Compartilhar em outros sites More sharing options...
soulblaster 0 Postado Janeiro 10, 2007 Autor Share Postado Janeiro 10, 2007 Hiho! opa, é sempre bom ajudar as pessoas =] vlw pelo comment ;] cya... :hi: Link para o comentário https://xtibia.com/forum/topic/38356-79-xmlsql-fun%C3%A7ao-de-bank/#findComment-216643 Compartilhar em outros sites More sharing options...
GM Tavin 0 Postado Janeiro 10, 2007 Share Postado Janeiro 10, 2007 Ótimo Codigo . Mas eu não sei qual é a diferença entre XML e SQL. =/ Link para o comentário https://xtibia.com/forum/topic/38356-79-xmlsql-fun%C3%A7ao-de-bank/#findComment-216648 Compartilhar em outros sites More sharing options...
Zorzin 0 Postado Janeiro 11, 2007 Share Postado Janeiro 11, 2007 Opa.. nice =) Depois vou adicionar aqui e testar.. ai eu edito Ah.. Soulblaster, adiciona ali no seu post lá emcima: Pra quem o ot for XML ao invés de SQL, deleta o: player->bank = result.getDataLong("bank"); e deleta o: query << "`bank` = " << player->bank << ", "; E em ioplayerxml.cpp: Depois de: if(readXMLInteger(root, "soul", intValue)){ player->soul = intValue; } Adicione: if(readXMLInteger(root, "bank", intValue)){ player->bank = intValue; } else player->bank = 0; -------------- E depois de: sb.str(""); sb << player->soul; xmlSetProp(root, (const xmlChar*)"soul", (const xmlChar*)sb.str().c_str()); Adicione: sb.str(""); sb << player->bank; xmlSetProp(root, (const xmlChar*)"bank", (const xmlChar*)sb.str().c_str()); ------------------------------------------------------------------------- Aí troca o titulo do post para: [7.9 Xml/Sql] Obrigado, Zorzin Link para o comentário https://xtibia.com/forum/topic/38356-79-xmlsql-fun%C3%A7ao-de-bank/#findComment-216844 Compartilhar em outros sites More sharing options...
soulblaster 0 Postado Janeiro 11, 2007 Autor Share Postado Janeiro 11, 2007 Hiho! Oba x] vlw zorzin vou faser isso e ja edito no topico =D cya... :hi: Link para o comentário https://xtibia.com/forum/topic/38356-79-xmlsql-fun%C3%A7ao-de-bank/#findComment-217024 Compartilhar em outros sites More sharing options...
tibiaa4e 86 Postado Janeiro 11, 2007 Share Postado Janeiro 11, 2007 Só hj q deu pra eu ver certim Mto boa msm Vlw por trazer aqui tomare q o talaturen add essa função no forgotten eu sou mto ruim em compila flws :hi: Link para o comentário https://xtibia.com/forum/topic/38356-79-xmlsql-fun%C3%A7ao-de-bank/#findComment-217067 Compartilhar em outros sites More sharing options...
GM Tavin 0 Postado Janeiro 11, 2007 Share Postado Janeiro 11, 2007 Vlws Zorzin Agora Entendi Belo Code Soul x) Link para o comentário https://xtibia.com/forum/topic/38356-79-xmlsql-fun%C3%A7ao-de-bank/#findComment-217105 Compartilhar em outros sites More sharing options...
siki 0 Postado Janeiro 15, 2007 Share Postado Janeiro 15, 2007 Meus parabéns cara... Estou montando a versão do meu server e gostei de ver a sua iniciativa de nos trazer essa "novidade" =) Agora mesmo já posso colocar na minha versão (Mystic OpenTibia)... Mais uma vez parabéns e obrigado! //Siki Link para o comentário https://xtibia.com/forum/topic/38356-79-xmlsql-fun%C3%A7ao-de-bank/#findComment-219791 Compartilhar em outros sites More sharing options...
Lordfire 309 Postado Janeiro 15, 2007 Share Postado Janeiro 15, 2007 so o primeiro nao funciona no evolutions ... que ######! Link para o comentário https://xtibia.com/forum/topic/38356-79-xmlsql-fun%C3%A7ao-de-bank/#findComment-219894 Compartilhar em outros sites More sharing options...
Fagunz 1 Postado Janeiro 15, 2007 Share Postado Janeiro 15, 2007 Parabens... Muito Bom Trabalho... Link para o comentário https://xtibia.com/forum/topic/38356-79-xmlsql-fun%C3%A7ao-de-bank/#findComment-219988 Compartilhar em outros sites More sharing options...
soulblaster 0 Postado Janeiro 15, 2007 Autor Share Postado Janeiro 15, 2007 Hiho! @all vlw pelos elogios ^^ é bom saber q estou ajudando ;] @Lordfire num intendi, oq vc quer dizer? =X cya... :hi: Link para o comentário https://xtibia.com/forum/topic/38356-79-xmlsql-fun%C3%A7ao-de-bank/#findComment-220371 Compartilhar em outros sites More sharing options...
Lordfire 309 Postado Janeiro 22, 2007 Share Postado Janeiro 22, 2007 quero dizer que no luascript.cpp do evolutions nao tem lua_register(m_luaState, "getPlayerPremiumDays", LuaScriptInterface::luaGetPlayerPremiumDays); //Lord Link para o comentário https://xtibia.com/forum/topic/38356-79-xmlsql-fun%C3%A7ao-de-bank/#findComment-226011 Compartilhar em outros sites More sharing options...
RoD LoKo 1 Postado Janeiro 22, 2007 Share Postado Janeiro 22, 2007 @Topic Legal essa função, mas já tinha a do Colex, eu pelo menos vi.. E usei ainda ... Mas mesmo assim, valeu por ajudar a todos... Abraços, //RoD Link para o comentário https://xtibia.com/forum/topic/38356-79-xmlsql-fun%C3%A7ao-de-bank/#findComment-226060 Compartilhar em outros sites More sharing options...
tibiaa4e 86 Postado Janeiro 22, 2007 Share Postado Janeiro 22, 2007 @up a do colex num funfa em lua 5.1 apenas em lua antiga Essa funciona em qualquer lua... flws :hi: Link para o comentário https://xtibia.com/forum/topic/38356-79-xmlsql-fun%C3%A7ao-de-bank/#findComment-226220 Compartilhar em outros sites More sharing options...
Posts Recomendados