Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

3aiophX.png

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 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 

  • Respostas 6
  • Visualizações 2.9k
  • Created
  • Última resposta

Top Posters In This Topic

Postado
  • Diretor

muito bom ^^ 

 

20230912_034613.png.cf49b650c34dd7d7b1f79bd49c70f53c.png

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

 

  • 3 weeks later...
Postado

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:

 

SE AJUDEI, DÁ O REP+, ESQUECE NÃO, VLW BB <3

Postado
Em 09/07/2020 em 21:40, WooX disse:

3aiophX.png

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
  • 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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo