-
Total de itens
750 -
Registro em
-
Última visita
-
Dias Ganhos
8
Tudo que dalvorsn postou
-
provavelmente quando ultrapassar o limite ou ele nao vai deixar add mais, ou vai apagar os debaixo, acho mais provavel apagar os de baixo if getPlayerLevel >= 100 then E tu quer saber de diretorio ou arquivos? são coisas diferentes Bem, de qualquer modo, nativamente e forma limpa não tem um meio, há sim varias gambiarras, vou citar uma delas aqui: function exists(name) if type(name)~="string" then return false end return os.rename(name,name) and true or false end function isFile(name) if type(name)~="string" then return false end if not exist(name) then return false end local f = io.open(name) if f then f:close() return true end return false end function isDir(name) return (exist(name) and not isFile(name)) end
-
NetworkMessage Autor: DalvoDescrição: Lib direcionada a manipulação de bytes, feita com intuito de auxiliar nos opcodes para otclient, porém tem uma vasta gama de utilidades. NetworkMessage = {}function NetworkMessage.create(pdata) -- NetworkMessage.create([pdata]) -- @params -- 'pdata': string -- Instancia a classe NetworkMessage, se pdata é fornecido é definido o atributo data igual a pdata e size igual a #pdata return setmetatable({ data = pdata or "", size = pdata and #pdata or 0, pos = 1}, { __index = NetworkMessage })endfunction NetworkMessage:reset() -- NetworkMessage.reset(self) -- self:reset() -- @params -- 'self': table -- Reinicia os atributos do objeto self.data = "" self.size = 0 self.pos = 1endfunction NetworkMessage:setBuffer(buffer) -- NetworkMessage.setBuffer(self, buffer) -- self:setBuffer(buffer) -- @params -- 'self': table -- 'buffer': string -- Define 'buffer' como atributo data if not type(buffer) == "string" then return false end self.data = buffer self.size = #buffer self.pos = 1endfunction NetworkMessage:getBuffer() -- NetworkMessage.getBuffer(self) -- self:getBuffer() -- @params -- 'self': table -- Retorna o atributo 'data' return self.dataendfunction NetworkMessage:getSize() -- NetworkMessage.getSize(self) -- self:getSize() -- @params -- 'self': table -- Retorna o atributo 'size' return self.sizeendfunction NetworkMessage:getRanges(byteCount, signed) -- NetworkMessage.getRanges(self, byteCount, signed) -- self:getRanges(byteCount, signed) -- @params -- 'self': table -- 'byteCount': number -- 'signed': boolean -- Função interna usada para calcular o limite do valor de 'byteCount' bytes, se signed é true reajusta seu valor para signed local min, max = 0, ((256^byteCount) -1) if(signed)then max = math.floor(max/2) min = -max-1 end return -min, maxendfunction NetworkMessage:canRead(size) -- NetworkMessage.canRead(self, size) -- self:canRead(size) -- @params -- 'self': table -- 'size': number -- Verifica se pode ser lido o numero 'size' de bytes, retorna um booleano return (self.pos + size) > (self.size + 1)endfunction NetworkMessage:readBytes(byteCount, signed) -- NetworkMessage.readBytes(self, byteCount, signed) -- self:readBytes(byteCount, signed) -- @params -- 'self': table -- 'byteCount': number -- 'signed': boolean -- Tenta ler 'byteCount' numero de bytes, retorna o valor numerico dos bytes -- se possivel a leitura, e false se não. Se signed é true reajusta valor para signed if self:canRead(byteCount) then return false end local min, _ = self:getRanges(byteCount, signed) local value = 0 for byte = 1, byteCount do value = value + ( self.data:byte(self.pos) * (256^(byte-1)) ) self.pos = self.pos + 1 end return value + minendfunction NetworkMessage:addBytes(value, count, signed) -- NetworkMessage.addBytes(self, value, count, signed) -- self:addBytes(value, count, signed) -- @params -- 'self': table -- 'value': number -- 'count':number -- 'signed':boolean -- Tenta escrever 'value' em 'count' bytes, se 'value' for maior que o numero de bytes -- suporta retorna false. Se signed é true reajusta valor para signed if signed then value = value * 2 end if value >= (256^count) then return false end for byte = count, 1, -1 do local power = (256 ^ (byte-1)) self.data = self.data .. string.char( math.floor(value/power) ) value = value % power end self.size = self.size + count self.pos = self.pos + count return trueend-- Metodos para pegar valoresfunction NetworkMessage:getU8() return self:readBytes(1, false)endfunction NetworkMessage:getU16() return self:readBytes(2, false)endfunction NetworkMessage:getU32() return self:readBytes(4, false)endfunction NetworkMessage:getU64() return self:readBytes(8, false)endfunction NetworkMessage:getI8() return self:readBytes(1, true)endfunction NetworkMessage:getI16() return self:readBytes(2, true)endfunction NetworkMessage:getI32() return self:readBytes(4, true)endfunction NetworkMessage:getI64() return self:readBytes(8, true)end-- Metodos para adição de valoresfunction NetworkMessage:addU8(value) return self:addBytes(value, 1, false)endfunction NetworkMessage:addU16(value) return self:addBytes(value, 2, false)endfunction NetworkMessage:addU32(value) return self:addBytes(value, 4, false)endfunction NetworkMessage:addU64(value) return self:addBytes(value, 8, false)endfunction NetworkMessage:addI8(value) return self:addBytes(value, 1, true)endfunction NetworkMessage:addI16(value) return self:addBytes(value, 2, true)endfunction NetworkMessage:addI32(value) return self:addBytes(value, 4, true)endfunction NetworkMessage:addI64(value) return self:addBytes(value, 8, true)endfunction NetworkMessage:addString(str) -- NetworkMessage.addString(self, str) -- self:addString(str) -- @params -- 'self': table -- 'str': string -- Tenta adicionar 'str', se o tamanho supera dois bytes, retorna false if not self:addU16(#str) then return false end self.data = self.data .. str self.size = self.size + #str self.pos = self.pos + #str return trueendfunction NetworkMessage:getString() -- NetworkMessage.getString(self) -- self:getString() -- @params -- 'self': table -- Tenta ler a string e retorna-la em caso de sucesso, se falho retorna false local size = self:getU16() if not (size and self:canRead(size)) then return false end local str = "" for byte=0, size-1 do str = str .. string.char(self.data:byte(self.pos + byte)) end self.pos = self.pos + size return strend Link da lib
-
dúvida Alguem ajuda nesses 2 erros? Help
tópico respondeu ao edilson22 de dalvorsn em Lixeira Pública
Mostra o erro e completo cara, ai não ta dizendo exatamente o erro, nem se quer onde é, mas suponho que seja em algum mod porque usa o domolib com as informações que deu fica complicado, tenta copiar o erro completo ai -
function removeWall() return true end WTF!! que desgraça é essa vei? não deveria ter uma função ai para remover a parede não? >.<
-
olha um script de box que tu consegue fazer, é a coisa mais banal do mundo, só dar um transform e setar os atributos
-
msg->put<uint16_t>(type+1); Mas tem que trocar na source toda onde declara e onde usa ><
-
Não, ele é feito para protocolos recentes, acima de 10.1, atualmente para 10.36 Convertê-lo para 8.6 seria bem complicado, e até onde sei os desenvolvedores nao tem nem se quer a intenção de fazer um para versoes antigas como 8.6
-
[OTClient] Adicionando a transparencia
tópico respondeu ao Tony Araujo de dalvorsn em Tutoriais de Clients
Acho mais sensato atualizar para a versao mais recente, acredito que nao mude muita coisa nos modulos escritos anteriormente rs -
Envia tudo do server, é melhor cara, dai tu monta a estrutura do pacote em bytes, não fica absurdamente grande não, tu vai pelo tamanho, por exemplo, o id do icone tu precisa de um uint16_t, o tempo de cooldown pode usar um uint8_t, e o nome é string, usa um uint8_t para o tamanho e o faz a leitura da string Porem com nem todos os pokes tem todos os cds, é desnecessario enviar cds vazios, então tu faz o primeiro byte de todos com o numero de moves, dai faz a leitura que nem disse ai pra cada move e caso não tenha lib do networkmessage, da uma lida em bitstream e endianess que é de boas de fazer, a parte de leitura eu fiz uma vez num script: 'spr extractor' no arquivo SpriteReader, a parte de leitura ta la, e a de escrita é o inverso, não muda quase nada
-
tfs 1.0 com toda certeza é melhor e mais estavel cara, sai dessa de 0.4
-
[OTClient] Adicionando a transparencia
tópico respondeu ao Tony Araujo de dalvorsn em Tutoriais de Clients
Nao precisa baixar um cliente especifico pra isso, tem gamefeature pra isso ta ;x é só ativar -
// Crypt g_lua.registerSingletonClass("g_crypt"); g_lua.bindSingletonFunction("g_crypt", "genUUID", &Crypt::genUUID, &g_crypt); g_lua.bindSingletonFunction("g_crypt", "setMachineUUID", &Crypt::setMachineUUID, &g_crypt); g_lua.bindSingletonFunction("g_crypt", "getMachineUUID", &Crypt::getMachineUUID, &g_crypt); g_lua.bindSingletonFunction("g_crypt", "encrypt", &Crypt::encrypt, &g_crypt); g_lua.bindSingletonFunction("g_crypt", "decrypt", &Crypt::decrypt, &g_crypt); g_lua.bindSingletonFunction("g_crypt", "sha1Encode", &Crypt::sha1Encode, &g_crypt); g_lua.bindSingletonFunction("g_crypt", "md5Encode", &Crypt::md5Encode, &g_crypt); g_lua.bindSingletonFunction("g_crypt", "rsaGenerateKey", &Crypt::rsaGenerateKey, &g_crypt); g_lua.bindSingletonFunction("g_crypt", "rsaSetPublicKey", &Crypt::rsaSetPublicKey, &g_crypt); g_lua.bindSingletonFunction("g_crypt", "rsaSetPrivateKey", &Crypt::rsaSetPrivateKey, &g_crypt); g_lua.bindSingletonFunction("g_crypt", "rsaCheckKey", &Crypt::rsaCheckKey, &g_crypt); g_lua.bindSingletonFunction("g_crypt", "rsaGetSize", &Crypt::rsaGetSize, &g_crypt);
-
Só pra constar, extendedOpcode é uma creaturescript, ou seja, precisa de registro no login.lua Alem disso, quando instanciar protocol no cliente, verifique se foi corretamente, com um if protocol then, pois só existe o protocol depois do gamestart, entao tu não pode usar ele a qualquer momento, tem que estar ao menos logado
-
A do meu cel é boa '-' 3g geralmente bate 6mb e 4g ja chegou a 13mb .-. E é vivo rs
-
Não né, vem tudo, mas tu não é cliente maker? tu tem que ter todos os clientes de tibia, vai baixando aos poucos e deixa salvo ai contigo
-
Site onde tu pode fazer download de todos os clientes do tibia, tem da 3.0 a 10.38
-
tibia.sx
-
[Arquivado]Sala de Teleportes: Prós e Contras
tópico respondeu ao BreisPodeu de dalvorsn em Noticias - Arquivo
Sala de teleportes é ruim, porém se não tiver rpg para os players encontrarem os respawns, fica complicado, não e legal sair sem rumo pelo mapa Tu tem que fazer quest, missoes, dando dicas de onde ir, e nesses caminhos colocar os respawns, tudo de acordo com o level, dando uma sequencia ao jogo, de modo que o player nao fica acomodado com tp e nem se mata procurando por todo canto sem rumo Uma coisa bacana tambem seria fazer um npc algo como "ancião" ou algo assim que de informações sobre respawns, mesmo que nao seja algo tao objetivo, mas que seja pelo menos dicas -
Depende de que servidor voce esta usando, se for tfs 1.0 ele ja tem o networkmessage, no caso de outros teria que adicionar a lib dele, questao e que a lib nao e minha, nao posso simplesmente passar ela
-
Tem sim, cria uma creaturescripts onKill e registrar nos players, dai pega a chance que tu configou de acordo com o nome da criatura que ta sendo morta, se for monstro, e cria o monstro ali, mas faz um addevent para ele nao aparecer no mesmo instante. Isso por script Por source voce faria no spawn, dai de acordo com a chance tu configurou ele cria o master, mas de todo modo nos dois voce teria que ter o xml do outro mostro, o master Claro que não é exatamente necessario, voce consegue criar ele virtualmente, mas seria pelas sources
-
Tira o connect e disconnect do 'onTextMessage' E coloca no lugar o seguinte: ProtocolGame.registerExtendedOpcode(numero_do_opcode, getParams) E no disconnect: ProtocolGame.unregisterExtendedOpcode(numero_do_opcode) Altera também algumas coisas na função getParams function getParams(protocol, opcode, buffer) if not g_game.isOnline() then return end if string.find(buffer, '12//,') then if string.find(buffer, 'hide') then hide() else show() end elseif string.find(buffer, '12|,') then atualizarCDs(buffer) elseif string.find(buffer, '12&,') then FixTooltip(buffer) end end E no server, onde está enviando sendcancel, é so enviar com o numero do opcode que usou pra registrar com o texto que enviava pelo sendcancel mas cara, a vantagem de usar opcode é usar em bytes, esse jeito ai vai continuar em texto, só vai mudar o fato de estar usando o extendedopcode
-
dúvida Ícone de executáveis com RSA modificado
pergunta respondeu ao IvanAppel de dalvorsn em Resolvidos
Copia de novo o conteudo, e que no segundo parametro do gsub eu tinha colocado OpenTibia, sendo que deveria ser rsa.OpenTibia -
dúvida Ícone de executáveis com RSA modificado
pergunta respondeu ao IvanAppel de dalvorsn em Resolvidos
Tu cria esse arquivo na pasta onde ta o cliente, com o nome Tibia.exe, dai ele vai criar um novo com nome New.exe ja com a rsa trocada, veja se funciona bem ai deixei um errinho no script que tinha postado, ja editei la, se tiver com erro no parametro do gsub e so copiar de novo ai que ta arrumado -
Tu quer fazer isso somente por scripting? se for cara, só tem uma maneira que eu imagino, mas nao é muito legal, tu faria criaria os xml de acordo com um padrão, e daria reload, dai ao bicho morrer apagaria o arquivo, não acredito que exista outra forma apenas por script que não essa, mesmo assim isso é uma gambiarra fudida que pode acabar com teu server, é melhor alterar a função que te mandei que tu vai fazer muito mais clean
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.