Postado Julho 10, 2020 4 anos Este é um post popular. Biblioteca de funções Lua Eu me recordo que alguns anos atrás quando iniciei meus estudos em Lua, a biblioteca de funções postada pelo @xWhiteWolf me ajudou muito com a escrita de alguns scripts, me fez economizar tempo e algumas linhas de código. Ter uma biblioteca de funções uteis é uma mão na roda para qualquer desenvolvedor pois poupa tempo que teria de ser gasto desenvolvendo algo que algum outro programador provavelmente já fez. Pensando nisso, hoje eu decidi trazer algumas funções Lua, tenho certeza que poderá ser útil pra alguém algum dia. Algumas dessas funções foram feitas por mim, outras por amigos meus e algumas eu já nem lembro mais onde encontrei. Irei postar aqui o conteúdo desta biblioteca porem ela também estará no final do tópico como anexo. As funções que me recordo a origem estará com os créditos do autor. Lib Spoiler -- 1º by ??? function getTimeString(self) local format = { {'dia', self / 60 / 60 / 24}, {'hora', self / 60 / 60 % 24}, {'minuto', self / 60 % 60}, {'segundo', self % 60} } local out = {} for k, t in ipairs(format) do local v = math.floor(t[2]) if(v > 0) then table.insert(out, (k < #format and (#out > 0 and ', ' or '') or ' e ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or '')) end end local ret = table.concat(out) if ret:len() < 16 and ret:find('segundo') then local a, b = ret:find(' e ') ret = ret:sub(b+1) end return ret end -- 2º by WooX function isPlayerOnline(name) local queryResult = db.storeQuery("SELECT `online` FROM `players` WHERE `name` = '"..name.."'") local result = result.getDataInt(queryResult, "online") > 0 and true or false return result end -- 3º by WooX function getOfflinePlayerStorage(guid, storage) if not isPlayerOnline(getPlayerNameByGUID(guid)) then local queryResult = db.storeQuery("SELECT `value` FROM `player_storage` WHERE `key` = '"..storage.."' and `player_id` = "..guid.."") local result = queryResult and result.getDataInt(queryResult, "value") or -1 return result end end -- 4º by WooX function setOfflinePlayerStorage(guid, storage, value) if not isPlayerOnline(getPlayerNameByGUID(guid)) then db.query("UPDATE `player_storage` SET `value` = '"..value.."' WHERE `key` = '"..storage.."' and `player_id` = "..guid.."") end end -- 5º by WooX function getItemNameByCount(itemID, count) if tonumber(count) and count > 1 and isItemStackable(itemID) then return getItemInfo(itemID).plural end return getItemNameById(itemID) end -- 6º by Reason function printTable(_table) local function getTable(_table, expand, tabs) local aux = "" if not type(_table) == "table" then return _table else for key,value in pairs(_table) do if type(value) == "table" then for i = 1, tabs -1 do aux = aux.."\t" end if type(key) == "string" then aux = aux.. '["'..key..'"] =\t{ \n'..getTable(value, true, tabs +1) else aux = aux.. "["..key.."] =\t{ \n"..getTable(value, true, tabs +1) end for i = 1, tabs do aux = aux.. "\t" end aux = aux.."},\n" else if expand then for i = 1, tabs -1 do aux = aux.. "\t" end end if type(key) == "string" then aux = aux.. '["'..key..'"] = '..(type(value) == "string" and '"'..value..'"' or tostring(value))..",\n" else aux = aux.. '['..key..'] = '..(type(value) == "string" and '"'..value..'"' or tostring(value))..",\n" end end end end return aux end if type(_table) == "table" then print(getTable(_table, false, 1)) return true else error("Parameter is not a table!") return false end end -- 7º by WooX function isWalkable(pos, checkCreatures, checkStairs, checkPZ, checkFields) if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end if checkCreatures and getTopCreature(pos).uid > 0 then return false end if checkPZ and getTilePzInfo(pos) then return false end for i = 0, 255 do pos.stackpos = i local tile = getTileThingByPos(pos) if tile.itemid ~= 0 and not isCreature(tile.uid) then if hasProperty(tile.uid, CONST_PROP_BLOCKPROJECTILE) or hasProperty(tile.uid, CONST_PROP_IMMOVABLEBLOCKSOLID) or (hasProperty(tile.uid, CONST_PROP_BLOCKPATHFIND) and not((not checkFields and getTileItemByType(pos, ITEM_TYPE_MAGICFIELD).itemid > 0) or hasProperty(tile.uid, CONST_PROP_HASHEIGHT) or hasProperty(tile.uid, CONST_PROP_FLOORCHANGEDOWN) or hasProperty(tile.uid, CONST_PROP_FLOORCHANGEUP))) then return false elseif checkStairs then if hasProperty(tile.uid, CONST_PROP_FLOORCHANGEDOWN) or hasProperty(tile.uid, CONST_PROP_FLOORCHANGEUP) then return false end end else break end end return true end Explicação das funções: Spoiler 1º - getTimeString(self) Útil para utilizar em mensagens de scripts que trabalham com exausted/cooldown ou qualquer tipo de delay que seja necessário retornar o valor de uma storage ou timestamp como uma string de tempo. Recebe como argumento um valor em segundos e retorna uma string contendo a quantidade de dias, horas ou minutos. Exemplo de uso: getTimeString(6431) retorna: 1 hora, 47 minutos e 11 segundos 2º - isPlayerOnline(name) Recebe como argumento o nome de um jogador e retorna se este jogador está ou não online, a função busca esta informação diretamente no banco de dados do servidor. Exemplo de uso: isPlayerOnline(Joaozinho) retorna: true/false 3º - getOfflinePlayerStorage(guid, storage) Busca o valor de uma storage em determinado player diretamente no banco de dados, podendo assim retornar o valor com o player offline (só funciona com o player offline). Recebe como argumento o GUID de um jogador em conjunto com uma storage e retorna o valor da storage deste jogador no banco de dados, no caso da não existência da storage retorna -1. Exemplo de uso: getOfflinePlayerStorage(80190, 5500) 4º - setOfflinePlayerStorage(guid, storage, value) Semelhante a anterior, esta função altera o valor de uma storage em determinado player diretamente no banco de dados, podendo assim alterar o valor com o player offline (só funciona com o player offline). Recebe como argumento o GUID de um jogador, uma storage e um valor. Altera o valor da storage deste jogador no banco de dados. Exemplo de uso: setOfflinePlayerStorage(80190, 5500, 300) 5º - getItemNameByCount(itemID, count) Recebe como argumento o ID de um item e uma quantia. Retorna o nome do item no plural caso o item seja acumulável. Exemplo de uso: getItemNameByCount(2677, 5) retorna: blueberries 6º - printTable(_table) Útil para exibir tabelas multi dimensionais. Recebe como argumento uma tabela e exibe o conteúdo. Exemplo de uso: printTable(getTileInfo(getThingPos(cid))) retorna: ["hardcore"] = false, ["noLogout"] = false, ["id"] = 3177, ["bed"] = false, ["uniqueid"] = 70014, ["aid"] = 10990, ["creatures"] = 1, ["depot"] = false, ["itemid"] = 3177, ["uid"] = 70014, ["actionid"] = 10990, ["teleport"] = false, ["things"] = 2, ["floorChange"] = { [1] = false, [2] = false, [3] = false, [4] = false, [5] = false, [6] = false, [7] = false, [8] = false, [9] = false, }, ["protection"] = true, ["downItems"] = 0, ["items"] = 0, ["topItems"] = 0, ["refresh"] = false, ["optional"] = false, ["magicField"] = false, ["type"] = 0, ["trashed"] = false, ["trashHolder"] = false, ["mailbox"] = false, 7º - isWalkable(pos, checkCreatures, checkStairs, checkPZ, checkFields) Verifica se uma posição é andável tomando como base 4 coisas na posição: se há alguma criatura, se há algum tipo de escada que não necessite de action, se a posição é protect zone ou se há fields que causam dano na posição. Recebe como argumento uma posição e true ou false no restante dos argumentos. Exemplo de uso: isWalkable(getPlayerLookPos(cid), true) retorna: true/false Por enquanto é isso... pretendo atualizar este tópico sempre que achar necessidade de escrever algo novo ou encontrar algo que possa ser útil a biblioteca. 090-woox_functions.lua Editado Setembro 6, 2020 4 anos por WooX (veja o histórico de edições) Nós somos aquilo que fazemos repetidamente. Excelência, não é um modo de agir, mas um hábito. Aristóteles
Postado Julho 10, 2020 4 anos Diretor muito bom Eu sou um entusiasta da programação apaixonado por ajudar a comunidade open source a crescer. Sempre em busca de novos desafios e oportunidades para contribuir com meu código. #OpenSource #Programação #Contribuição
Postado Setembro 22, 2020 4 anos Eu definitivamente preciso aprender usar essas 'for inpairs" esses tables sei la oq kk Eu fiz essa mesma coisa de formatar o tempo, olha o tamanho que ficou meu script, comparado com o teu Spoiler function remaningTime(a) local restante = (a - os.time()) local dias = math.floor(restante/86400) local rest1 = restante-(86400*dias) local horas = math.floor(rest1/3600) local rest2 = rest1-(3600*horas) local minutos= math.floor(rest2/60) local rest3 = rest2-(60*minutos) local segundos = rest3 local dia = "" local hora = "" local minuto = "" local segundo = "" if dias > 0 then if dias < 10 then dia = "0" end dia = dia..""..dias..":" end if horas > 0 then if horas < 10 then hora = "0" end hora = hora..""..horas..":" end if minutos <= 9 then minuto = "0" end minuto = minuto..""..minutos..":" if segundos <= 9 then segundo = "0" end segundo = segundo..""..segundos local text = dia..""..hora..""..minuto..""..segundo return text end MEUS POSTS: [Source] Sistema Anti-PVP ~~ PvP on/off por comando [CreatureScript] Sugestão de balanceamento ~~ Uma pequena sugestão de balanceamento das vocations ? [NPC] Daily Task ~~ Daily Task com 4 opções diarias Contador de Monstros ~~Sistema pra contar quantos monstros tem no sv, e uma melhoria pro sistema de Daily Tasks Calma, por enquanto é só, e em breve mais coisas ;} SE AJUDEI, DÁ O REP+, ESQUECE NÃO, VLW BB
Postado Setembro 22, 2020 4 anos Em 09/07/2020 em 21:40, WooX disse: Biblioteca de funções Lua Eu me recordo que alguns anos atrás quando iniciei meus estudos em Lua, a biblioteca de funções postada pelo @xWhiteWolf me ajudou muito com a escrita de alguns scripts, me fez economizar tempo e algumas linhas de código. Ter uma biblioteca de funções uteis é uma mão na roda para qualquer desenvolvedor pois poupa tempo que teria de ser gasto desenvolvendo algo que algum outro programador provavelmente já fez. Pensando nisso, hoje eu decidi trazer algumas funções Lua, tenho certeza que poderá ser útil pra alguém algum dia. Algumas dessas funções foram feitas por mim, outras por amigos meus e algumas eu já nem lembro mais onde encontrei. Irei postar aqui o conteúdo desta biblioteca porem ela também estará no final do tópico como anexo. As funções que me recordo a origem estará com os créditos do autor. Lib Ocultar conteúdo -- 1º by ??? function getTimeString(self) local format = { {'dia', self / 60 / 60 / 24}, {'hora', self / 60 / 60 % 24}, {'minuto', self / 60 % 60}, {'segundo', self % 60} } local out = {} for k, t in ipairs(format) do local v = math.floor(t[2]) if(v > 0) then table.insert(out, (k < #format and (#out > 0 and ', ' or '') or ' e ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or '')) end end local ret = table.concat(out) if ret:len() < 16 and ret:find('segundo') then local a, b = ret:find(' e ') ret = ret:sub(b+1) end return ret end -- 2º by WooX function isPlayerOnline(name) local queryResult = db.storeQuery("SELECT `online` FROM `players` WHERE `name` = '"..name.."'") local result = result.getDataInt(queryResult, "online") > 0 and true or false return result end -- 3º by WooX function getOfflinePlayerStorage(guid, storage) if not isPlayerOnline(getPlayerNameByGUID(guid)) then local queryResult = db.storeQuery("SELECT `value` FROM `player_storage` WHERE `key` = '"..storage.."' and `player_id` = "..guid.."") local result = queryResult and result.getDataInt(queryResult, "value") or -1 return result end end -- 4º by WooX function setOfflinePlayerStorage(guid, storage, value) if not isPlayerOnline(getPlayerNameByGUID(guid)) then db.query("UPDATE `player_storage` SET `value` = '"..value.."' WHERE `key` = '"..storage.."' and `player_id` = "..guid.."") end end -- 5º by WooX function getItemNameByCount(itemID, count) if tonumber(count) and count > 1 and isItemStackable(itemID) then return getItemInfo(itemID).plural end return getItemNameById(itemID) end -- 6º by Reason function printTable(_table) local function getTable(_table, expand, tabs) local aux = "" if not type(_table) == "table" then return _table else for key,value in pairs(_table) do if type(value) == "table" then for i = 1, tabs -1 do aux = aux.."\t" end if type(key) == "string" then aux = aux.. '["'..key..'"] =\t{ \n'..getTable(value, true, tabs +1) else aux = aux.. "["..key.."] =\t{ \n"..getTable(value, true, tabs +1) end for i = 1, tabs do aux = aux.. "\t" end aux = aux.."},\n" else if expand then for i = 1, tabs -1 do aux = aux.. "\t" end end if type(key) == "string" then aux = aux.. '["'..key..'"] = '..(type(value) == "string" and '"'..value..'"' or tostring(value))..",\n" else aux = aux.. '['..key..'] = '..(type(value) == "string" and '"'..value..'"' or tostring(value))..",\n" end end end end return aux end if type(_table) == "table" then print(getTable(_table, false, 1)) return true else error("Parameter is not a table!") return false end end -- 7º by WooX function isWalkable(pos, checkCreatures, checkStairs, checkPZ, checkFields) if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end if checkCreatures and getTopCreature(pos).uid > 0 then return false end if checkPZ and getTilePzInfo(pos) then return false end for i = 0, 255 do pos.stackpos = i local tile = getTileThingByPos(pos) if tile.itemid ~= 0 and not isCreature(tile.uid) then if hasProperty(tile.uid, CONST_PROP_BLOCKPROJECTILE) or hasProperty(tile.uid, CONST_PROP_IMMOVABLEBLOCKSOLID) or (hasProperty(tile.uid, CONST_PROP_BLOCKPATHFIND) and not((not checkFields and getTileItemByType(pos, ITEM_TYPE_MAGICFIELD).itemid > 0) or hasProperty(tile.uid, CONST_PROP_HASHEIGHT) or hasProperty(tile.uid, CONST_PROP_FLOORCHANGEDOWN) or hasProperty(tile.uid, CONST_PROP_FLOORCHANGEUP))) then return false elseif checkStairs then if hasProperty(tile.uid, CONST_PROP_FLOORCHANGEDOWN) or hasProperty(tile.uid, CONST_PROP_FLOORCHANGEUP) then return false end end else break end end return true end Explicação das funções: Mostrar conteúdo oculto 1º - getTimeString(self) Útil para utilizar em mensagens de scripts que trabalham com exausted/cooldown ou qualquer tipo de delay que seja necessário retornar o valor de uma storage ou timestamp como uma string de tempo. Recebe como argumento um valor em segundos e retorna uma string contendo a quantidade de dias, horas ou minutos. Exemplo de uso: getTimeString(6431) retorna: 1 hora, 47 minutos e 11 segundos 2º - isPlayerOnline(name) Recebe como argumento o nome de um jogador e retorna se este jogador está ou não online, a função busca esta informação diretamente no banco de dados do servidor. Exemplo de uso: isPlayerOnline(Joaozinho) retorna: true/false 3º - getOfflinePlayerStorage(guid, storage) Busca o valor de uma storage em determinado player diretamente no banco de dados, podendo assim retornar o valor com o player offline (só funciona com o player offline). Recebe como argumento o GUID de um jogador em conjunto com uma storage e retorna o valor da storage deste jogador no banco de dados, no caso da não existência da storage retorna -1. Exemplo de uso: getOfflinePlayerStorage(80190, 5500) 4º - setOfflinePlayerStorage(guid, storage, value) Semelhante a anterior, esta função altera o valor de uma storage em determinado player diretamente no banco de dados, podendo assim alterar o valor com o player offline (só funciona com o player offline). Recebe como argumento o GUID de um jogador, uma storage e um valor. Altera o valor da storage deste jogador no banco de dados. Exemplo de uso: setOfflinePlayerStorage(80190, 5500, 300) 5º - getItemNameByCount(itemID, count) Recebe como argumento o ID de um item e uma quantia. Retorna o nome do item no plural caso o item seja acumulável. Exemplo de uso: getItemNameByCount(2677, 5) retorna: blueberries 6º - printTable(_table) Útil para exibir tabelas multi dimensionais. Recebe como argumento uma tabela e exibe o conteúdo. Exemplo de uso: printTable(getTileInfo(getThingPos(cid))) retorna: ["hardcore"] = false, ["noLogout"] = false, ["id"] = 3177, ["bed"] = false, ["uniqueid"] = 70014, ["aid"] = 10990, ["creatures"] = 1, ["depot"] = false, ["itemid"] = 3177, ["uid"] = 70014, ["actionid"] = 10990, ["teleport"] = false, ["things"] = 2, ["floorChange"] = { [1] = false, [2] = false, [3] = false, [4] = false, [5] = false, [6] = false, [7] = false, [8] = false, [9] = false, }, ["protection"] = true, ["downItems"] = 0, ["items"] = 0, ["topItems"] = 0, ["refresh"] = false, ["optional"] = false, ["magicField"] = false, ["type"] = 0, ["trashed"] = false, ["trashHolder"] = false, ["mailbox"] = false, 7º - isWalkable(pos, checkCreatures, checkStairs, checkPZ, checkFields) Verifica se uma posição é andável tomando como base 4 coisas na posição: se há alguma criatura, se há algum tipo de escada que não necessite de action, se a posição é protect zone ou se há fields que causam dano na posição. Recebe como argumento uma posição e true ou false no restante dos argumentos. Exemplo de uso: isWalkable(getPlayerLookPos(cid), true) retorna: true/false Por enquanto é isso... pretendo atualizar este tópico sempre que achar necessidade de escrever algo novo ou encontrar algo que possa ser útil a biblioteca. 090-woox_functions.luaUnavailable tu está à começar agora na arte de scripter?
Postado Setembro 22, 2020 4 anos Autor 19 horas atrás, Mor3nao disse: Eu definitivamente preciso aprender usar essas 'for inpairs" esses tables sei la oq kk Eu fiz essa mesma coisa de formatar o tempo, olha o tamanho que ficou meu script, comparado com o teu Mostrar conteúdo oculto function remaningTime(a) local restante = (a - os.time()) local dias = math.floor(restante/86400) local rest1 = restante-(86400*dias) local horas = math.floor(rest1/3600) local rest2 = rest1-(3600*horas) local minutos= math.floor(rest2/60) local rest3 = rest2-(60*minutos) local segundos = rest3 local dia = "" local hora = "" local minuto = "" local segundo = "" if dias > 0 then if dias < 10 then dia = "0" end dia = dia..""..dias..":" end if horas > 0 then if horas < 10 then hora = "0" end hora = hora..""..horas..":" end if minutos <= 9 then minuto = "0" end minuto = minuto..""..minutos..":" if segundos <= 9 then segundo = "0" end segundo = segundo..""..segundos local text = dia..""..hora..""..minuto..""..segundo return text end Os créditos não são meus, infelizmente eu já nem lembro mais onde encontrei essa função, realmente está bem feita. 9 horas atrás, Marcryzius Valkerbur disse: tu está à começar agora na arte de scripter? Em 09/07/2020 em 21:40, WooX disse: alguns anos atrás quando iniciei meus estudos em Lua Nós somos aquilo que fazemos repetidamente. Excelência, não é um modo de agir, mas um hábito. Aristóteles
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.