Jump to content

Recommended Posts

muito bom ^^ 

APOIE NOSSAS CAUSAS - IBEACIBEAC

SEJA UM APOIADOR E AJUDE ALGUÉM

Se você acha que meu trabalho merece uma ajuda nessa quarentena, então seja um apoiador fiel doehttps://streamlabs.com/l3k0t1

 

 CANAL YOUTUBE: https://www.youtube.com/channel/UCMP25Br519j7dD1FFEMzPgA?view_as=subscriber

Meu grupo no Discord: https://discord.gg/qMS5pm9

"Você tem um sonho? Não deixe os outros te derrubarem e lute por aquilo que você acredita" by L3K0T  

 

GENTILEZA GERA GENTILEZA

 

 

Link to post
Share on other sites

  • 3 weeks later...

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

Link to post
Share on other sites

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?

Link to post
Share on other sites

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 

Link to post
Share on other sites

  • 1 month later...

Amigo, desculpe a pergunta, pode parecer meio besta...
Eu vim aqui pro seu forum através do: Trade Offline V2.0


Acabei de realizar as alterações nas sources que ele solicitou, mas assim que cheguei nessa 
fase da Lib, confesso que fiquei meio perdido em como adicionar essa Lib e com qual nome eu deveria adicioná-la...

Você conseguiria explicar o processo de instalação dessa lib em um Ubuntu 14.04?
Vai me ajudar muito cara, estou atrás desse shop a algum tempo...

Obrigado

 

Link to post
Share on other sites

  • 3 weeks later...
Em 10/11/2020 em 17:50, xaverlock disse:

Você conseguiria explicar o processo de instalação dessa lib em um Ubuntu 14.04?
Vai me ajudar muito cara, estou atrás desse shop a algum tempo...

Só jogar o arquivo na pasta data/lib.

 

 

 

Nós somos aquilo que fazemos repetidamente. Excelência, não é um modo de agir, mas um hábito.

                                                                                                                                                                                                                                        Aristóteles 

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Similar Content

    • By Endless
      Olá meus senhores, tem muita gente que pede serviços em relação a Gerar Outfits Animadas do seu cliente, o que muitos não sabem é que existe esse sistema de Gerar as Outfit animadas gratuitamente na internet e ele foi desenvolvido pelo Gesior.pl (Polones), então todo o crédito deste tutorial em relações a códigos vão para ele.

      Primeiro de tudo, o que é esse Sistema de Gerar Outfits Animadas?

      Basicamente é 1 Sistema Web que vai ler o teu tibia.spr / tibia.dat e seu items.otb e gerar todas suas outfit do seu cliente em forma de frames e na hora de exibir o sistema utiliza uma script em php que fica responsável por montar 1 gif utilizando esses frames.
      O resultado é algo como isto:



      Existe 2 formas de utilizar o sistema, eu vou ensinar a mais fácil, para quem quiser vou deixar o link do código fonte e vocês podem simplesmente estar clonando o repositório e fazer suas alterações a vontade. (Sim, ele é open source e.e).

      Código Fonte: https://github.com/gesior/open-tibia-library 

      Explicando como utilizar o sistema:

      1° acesse o link => https://outfit-images.ots.me/generator/

      Você deve visualizar algo como isto: 



      Percebam que ele vai pedir os seguintes dados: 
      -Client Version:
      -Sprite file:
      -Dat file:
      -Otb file:

      Antes de sair adicionando, precisamos configurar nosso cliente para que o sistema consiga reconhecer ele. Abra seu cliente no object builder. Agora vá na área de effects e apague todos os efeitos. Sim apague TODOS, agora vá até Tools->Spriter Otimizer



      Clique em start e você vai ter 1 retorno parecido com isto:



      Agora aperta CTRL+SHIFT+S, vamos salvar esse cliente em 1 pasta separada (você só vai usar ele pra esse sistema, então fique tranquilo, você não vai apagar o original). Na hora de salvar deixe desmarcado as 3 opções (Extended, Transparency, Improved Animations).



      Tendo feito isso, agora vamos voltar para o site. 
      Em Client Version você vai digitar a versão de seu cliente. Exemplo: Se for 8.60 digite 860
      Em sprite file você vai selecionar o tibia.spr do seu cliente que você exportou (esse sem efeitos)
      Em dat file você vai selecionar o tibia.dat do seu cliente que você exportou (esse sem efeitos)
      Em otb file você vai selecionar o items.otb do seu servidor.

      Agora clique em Load Files. Você deve ter 1 retorno parecido com isto:



      Agora clique em Generate Imagens e ele vai começar a gerar os frames das suas outfits.



      Ao terminar ele vai efetuar sozinho o download das outfits.




      Agora acesse este repositório no github e baixe os arquivos: https://github.com/gesior/open-tibia-library/tree/master/tools/colored-outfit-images-generator

      Tendo feito o download, você vai extrair a pasta outfits.zip que você baixo e extrair a pasta que você clonou o repositório. Ao extrair o arquivo outfits.zip você vai encontrar 1 pasta chamada outfits_anim, dentro dela você deve ter algo como isto:



      Cada pasta é referente a 1 looktype do seu cliente.
      Agora copie a pasta 'outfits_anim' que está dentro da pasta outfits que você extraiu e cole dentro da pasta do repositório que foi clonado. Ficando assim:



      Pronto, agora você somente precisa deixar essa pasta em 1 servidor web e utilizar a mesma via requisição. Exemplo:
      Se você for exibir uma outfit, você pode exibir da seguinte forma:
      <img src="http://seudominio.com/nomedapastaqueestaoosarquivos/animoutfit.php/?id=270">  
      Esse id será o looktype que você deseja. Lembrando que: Você pode colocar 1 script pra puxar a outfit de cada vocação e chamar esse diretório, ele vai exibir a imagem já com o diretório correto.
      Sugestão de uso: Para derivados de NTO/DBO e afins, você pode utilizar para exibir as outfits de transformações de cada Personagens, algo como isto:



       
      Outra opção é exibir na lista de Ranking no menu da direita (Normalmente Tibia Classico faz isso)
      A criatividade fica por conta de vocês.
       
      Créditos:
      Gesior.pl por todo o código e disponibilizar para a comunidade em 1 Forum Gringo
      A mim por disponibilizar o tutorial para a comunidade.
    • By Rogex Joyz
      Um script simples (sei que existe outros parecidos/iguais, este funcionou perfeitamente pra tfs 0.4), mas que coloca todo um RPG naquela quest/hunt que você quer montar. No caso uma mystic flame fica ao lado (editável) de um empty coal basin (id: 1485) e após colocar um item (editável) em cima desta coal basin, a mystic flame passa a teleportar para um local pré destinado (Funciona exatamente igual ao de acesso as tumbas de Ankrahmun do global). Sem o item no local correto, ela é apenas uma mystic flame sem destino podendo andar em cima dela sem que nada aconteça. Para voltar, coloque outra mystic flame no destino com o AID 19383 (esta mystic flame faz o player retornar sem sacríficio). Vamos ao script ?
      😄
      créditos: Andu
       
      Em movements.xml adicione estas duas linhas:
       
      <movevent type="StepIn" actionid="19382" event="script" value="flametp.lua" />
      <movevent type="StepIn" actionid="19383" event="script" value="flametp.lua" />
       
      Em movements crie um arquivo lua com o nome flametp e adicione dentro dele: 
       
      function onStepIn(cid, item, position, fromPosition) local tileActionID = 19382 -- actionid inserida na primeira mystic flame (a do sacrifício) local tileActionIDBack = 19383 -- actionid inserida na segunda mystic flame (a de retorno sem sacrifício) local coin = 8978 -- id do item que precisará estar na coal basin para que a mystic flame teleporte o player local teleportTo = {x=12687, y=3426, z=14}-- posição em que o player será teleportado ao fazer o sacrifício local teleportBack = {x=14012, y=33793, z=15}-- posição em que o player irá voltar no momento que passar pela mystic flame sem sacrifício local itemPosition = {x=14012, y=33788, z=15, stackpos=STACKPOS_TOP_MOVEABLE_ITEM_OR_CREATURE} local getItem = getThingFromPos(itemPosition)-- posição em que o item de sacrifício terá que estar para ativar a primeira mystic flame if isPlayer(cid) == TRUE then if item.itemid == 1397 and item.actionid == tileActionID then if getItem.itemid == coin then doRemoveItem(getItem.uid, 1) doTeleportThing(cid, teleportTo) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_TELEPORT) doSendMagicEffect(getThingPos(item.uid), CONST_ME_TELEPORT) doSendMagicEffect(itemPosition, 15) end elseif item.itemid == 1397 and item.actionid == tileActionIDBack then doTeleportThing(cid, teleportBack) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_TELEPORT) doSendMagicEffect(getThingPos(item.uid), CONST_ME_TELEPORT) end end return TRUE end
    • By Cat
      LISTA DE LOOKTYPES
       
      0-1283
       
    • By luanluciano93
      Olá pessoal, eu estava ajudando um amigo em um script de Tibia Naruto, e me deparei com a necessidade de usar uma função para trocar o nome de um summon, mas isso teria que ser inGame, e depois de procurar um pouco achei a função setCreatureName, que faz exatamente o que eu precisava.

      O que ela faz?
      Como eu expliquei acima, ela muda o nome da Creature inGame, podendo ser bastante útil (dependendo da sua criatividade).

      Como instalar? 
      A instalação é feita inteiramente nas sources, então vamos lá .. 

      1 - No arquivo monster.h encontre esse trecho: 
      class Monster : public Creature { private: Monster(MonsterType* _mType); public:  E adicione isso abaixo de public::
      std::string name, nameDescription; 2 - Ainda em monster.h procure por:
      virtual const std::string& getName() const {return mType->name;} E substitua por isso:
      virtual const std::string& getName() const {return name;} 3 - Ainda em monster.h procure por:
      virtual const std::string& getNameDescription() const {return mType->nameDescription;} E substitua por isso:
      virtual const std::string& getNameDescription() const {return nameDescription;} 4 - Ainda em monster.h procure por:
      virtual std::string getDescription(int32_t) const {return mType->nameDescription + ".";} E substitua por isso:
      virtual std::string getDescription(int32_t) const {return nameDescription + ".";} 5 - Agora em monster.cpp procure por:
      Monster::Monster(MonsterType* _mType): Nas linhas abaixo tem a linha: raid = NULL; , adicione isso logo abaixo: 
      name = _mType->name; nameDescription = _mType->nameDescription;  
       
      6 - Agora em luascript.h adicione isso perto das linhas semelhantes:
      static int32_t luaSetCreatureName(lua_State* L); 7 - Agora em luascript.cpp adicione isso perto das linhas semelhantes:
      //setCreatureName(cid, name, description) lua_register(m_luaState, "setCreatureName", LuaInterface::luaSetCreatureName); 8 - Ainda em luascript.cpp adicione isso perto das linhas semelhantes: 
      int32_t LuaInterface::luaSetCreatureName(lua_State* L) { // setCreatureName(cid, newName, newDescription) std::string newDesc = popString(L); std::string newName = popString(L); ScriptEnviroment* env = getEnv(); Creature* creature; if (creature = env->getCreatureByUID(popNumber(L))) { Monster* monster = (Monster*)creature; monster->name = newName; monster->nameDescription = newDesc; lua_pushboolean(L, true); } else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; }  Pelo fato de algumas diferenças no modo de escrever a função entre as TFS, pode ocorrer erros, e então substitua as seguintes linhas dos 2 passos anteriores:
       
       
       
      Créditos: Scarlet Ayeid
       
       
      É isso pessoal ... um exemplo de uso dentro de alguma função é assim basicamente:
      local pos = {x = 10, y = 10, z = 7} local Teste = doCreateMonster("Rat", pos) setCreatureName(Teste, ""..getCreatureName(cid).."", "a "..getCreatureName(cid).."") Espero ter ajudado pessoal, até mais.
    • By vitinhoo96
      Bom estou querendo por um Castle 48h no mue otserv, porem não achei nem um topico com o sistema, eu procurei muito aqui no forum e não achei, se alguem puder por gentileza estar me ajudando agredeço !!
  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...

Important Information

Confirmação de Termo