Como todos já sabem por meio de meu keynote, estou saindo do OpenTibia, e resolvi preparar um último release, e claro, sem deixar tudo pronto, incentivando o desenvolvimento e para que as pessoas se virem um pouco sozinhas, resolvi criar um sistema de banco dinâmico, funcional em qualquer servidor, e sem uso de I/O ou mesmo LuaSQL.
Features
- Função para depósito
- Função para saque
- Função para depositar tudo
- Função para sacar tudo
- Conversão dinâmica de dinheiro para a forma mais fácil (concedida de Jovial)
- Transferência de quantias
- Função para balanço bancário
- Função de checagem de valor (para ver se é válido)
- Função para pegar a quantidade de dinheiro que o jogador possui
Vamos então a essa classe:
Bank = {} Bank.__index = Bank STORAGE_BANK = 666 function Bank:getPlayerMoney(cid) return ((getPlayerItemCount(cid, ITEM_CRYSTAL_COIN) * 10000) + (getPlayerItemCount(cid, ITEM_PLATINUM_COIN) * 100) + getPlayerItemCount(cid, ITEM_GOLD_COIN)) end function Bank:isValidValue(value) if ((type(value) == "number") and (value > 0)) then return TRUE end return FALSE end function Bank:getBalance(cid) return getPlayerStorageValue(cid, STORAGE_BANK) end function Bank:doConvertMoney(value) local crystal, platinum, gold if (value >= 10000) then crystal = math.floor(value / 10000) value = value - (crystal * 10000) else crystal = 0 end if (value >= 100) then platinum = math.floor(value / 100) value = value - (platinum * 100) else platinum = 0 end if (value >= 0) then gold = value else debug('[Bank:doConvertMoney] Unknown Error') end return gold, platinum, crystal end function Bank:doWithdraw(cid, value) if ((self:isValidValue(value) == TRUE) and (self:getBalance(cid) >= value)) then doPlayerAddMoney(cid, value) setPlayerStorageValue(cid, STORAGE_BANK, self:getBalance(cid) - value) end return FALSE end function Bank:doWithdrawAll(cid) self:doWithdraw(cid, self:getPlayerMoney(cid)) return TRUE end function Bank:doDeposit(cid, value) if ((self:isValidValue(value) == TRUE) and (self:getPlayerMoney(cid) >= value)) then doPlayerRemoveMoney(cid, value) setPlayerStorageValue(cid, self:getBalance(cid) + value) end return FALSE end function Bank:doDepositAll(cid) self:doDeposit(cid, self:getPlayerMoney(cid)) return TRUE end function Bank:doTransfer(cid, name, value) local target = getPlayerByName(name) if ((self:isValidValue(value) == TRUE) and (self:getPlayerMoney(cid) >= value) and (isPlayer(target) == TRUE)) then self:doWithdraw(cid, self:getBalance(cid) - value) self:doDeposit(target, self:getBalance(target) + value) end return FALSE end
Aqui vai um exemplo de pig bank que você dá use no mesmo e depois no dinheiro e este então, é depositado.
function onUse(cid, item, frompos, item2, topos) local coins = {ITEM_GOLD_COIN, ITEM_PLATINUM_COIN, ITEM_CRYSTAL_COIN} local coinValue = {[ITEM_GOLD_COIN] = 1, [ITEM_PLATINUM_COIN] = 100, [ITEM_CRYSTAL_COIN] = 10000} if ((item2.type >= 0) and (isInArray(coins, item2.itemid) then Bank:doDeposit(cid, item2.type * coinValue[item2.itemid]) doRemoveItem(item2.itemid, item2.type) end return FALSE end