Ir para conteúdo

dalvorsn

Conde
  • Total de itens

    750
  • Registro em

  • Última visita

  • Dias Ganhos

    8

Tudo que dalvorsn postou

  1. esse if da callback da spell ta todo errado, ele ta comparando um numeral com uma função =s, enfim ta ai arrumado local config = { efeitoTele = 10, -- efeito q ira aparacer a cada teleport. efeitoDamage = 22, -- efeito q ira aparecer ao hitar no alvo hits = 5, -- quantos hits vai dar delay = 500, -- intervalo de tempo a cada hit min = 1000, -- dano minimo max = 3000, -- dano maximo damage = COMBAT_PHYSICALDAMAGE -- tipo do dano } function onGetFormulaValues(cid, level, skill, attack, factor) local skillTotal, levelTotal = skill + attack, level / 5 return -(skillTotal * 5.5 + levelTotal), -(skillTotal * 8.5 + levelTotal) end function isWalkable(pos, creature, pz, proj) -- nord if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end if getTopCreature(pos).uid > 0 and creature then return false end if getTileInfo(pos).protection and not pz then return false end local n = not proj and 3 or 2 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, n) or hasProperty(tile.uid, 7) then return false end end end return true end function getPosDirs(p, dir) -- mkalo return dir == 1 and {x=p.x-1, y=p.y, z=p.z} or dir == 2 and {x=p.x-1, y=p.y+1, z=p.z} or dir == 3 and {x=p.x, y=p.y+1, z=p.z} or dir == 4 and {x=p.x+1, y=p.y+1, z=p.z} or dir == 5 and {x=p.x+1, y=p.y, z=p.z} or dir == 6 and {x=p.x+1, y=p.y-1, z=p.z} or dir == 7 and {x=p.x, y=p.y-1, z=p.z} or dir == 8 and {x=p.x-1, y=p.y-1, z=p.z} end function validPos(pos) tb = {} for i = 1, 8 do newpos = getPosDirs(pos, i) if isWalkable(newpos) then table.insert(tb, newpos) end end table.insert(tb, pos) return tb end spell = { start = function (cid, target, markpos, hits) if not isCreature(cid) then return true end if not isCreature(target) or hits < 1 then doTeleportThing(cid, markpos) doSendMagicEffect(getThingPos(cid), config.efeitoTele) return true end posAv = validPos(getThingPos(target)) rand = #posAv == 1 and 1 or #posAv - 1 doSendMagicEffect(getThingPos(cid), config.efeitoTele) doTeleportThing(cid, posAv[math.random(1, rand)]) doAreaCombatHealth(cid, config.damage, getThingPos(target), 0, -config.min, -config.max, config.efeitoDamage) addEvent(spell.start, config.delay, cid, target, markpos, hits - 1) end } function onCastSpell(cid) target = getCreatureTarget(cid) if isCreature(target) then spell.start(cid, target, getThingPos(cid), config.hits) return true end return false end
  2. addEvent(storm, i*35,cid,IceDAMAGE,36,52, -230, -410) a função storm já coloca o damage como negativo, se você colocar também, ele fica positivo e ao invez de retirar dano, irá acrescentar, apenas retire o sinal de negativo. pode ser também o tipo de damage, no caso esse iceDAMAGE parece estar fora dos padrões, verifique no seu data/lib/000-constant.lua se este damage está declarado lá, lembrando que lua é case-sensitive (diferencia maiuscula e minuscula)
  3. 'element' é o tipo de dano mude de acordo com as variaveis que estão no seu data/lib/000-constant.lua 'DistEfec' é o numero correspondente ao distance effect usado na magia 'MagEfec' é o numero correspondente ao magic effect usado na magia 'damage_1' é o dano minimo 'damage_2' é o dano máximo
  4. Isso? function storm(cid, element, DistEfec, MagEfec, damage_1, damage_2) if isCreature(cid) then local pos = getThingPos(cid) pos.x = pos.x + math.random(-4,4) pos.y = pos.y + math.random(-4,4) local frompos = getThingPos(cid) frompos.x = pos.x - 6 frompos.y = pos.y - 6 doSendDistanceShoot(frompos, pos, DistEfec) doAreaCombatHealth(cid, element, pos, 0, -damage_1, -damage_2, MagEfec) end end function onCastSpell(cid, var) for i = 1, 72 do addEvent(storm, i*35,cid,GHOSTDAMAGE,18,140, 110, 120) end return true end é isso mesmo, como eu configuro pra tirar dano, e tipo de dano, o que vai cair "do ceu" e etc? '=' Já te dei o rep ^-^ (Se tiver msn pra gente conversar melhor, passa por pm ^-^) é so passar eles como parametros na função addEvent dentro do for sintaxe: addEvent(função, tempo, parametros) storm(cid, element, DistEfec, MagEfec, damage_1, damage_2) addEvent(storm, time, cid, element, DistEfec, MagEfec, damage_1, damage_2)
  5. Isso? function storm(cid, element, DistEfec, MagEfec, damage_1, damage_2) if isCreature(cid) then local pos = getThingPos(cid) pos.x = pos.x + math.random(-4,4) pos.y = pos.y + math.random(-4,4) local frompos = getThingPos(cid) frompos.x = pos.x - 6 frompos.y = pos.y - 6 doSendDistanceShoot(frompos, pos, DistEfec) doAreaCombatHealth(cid, element, pos, 0, -damage_1, -damage_2, MagEfec) end end function onCastSpell(cid, var) for i = 1, 72 do addEvent(storm, i*35,cid,GHOSTDAMAGE,18,140, 110, 120) end return true end
  6. if (math.random(1, 1) == 1) then Genius, anyway; o código está demasiadamente grande para o que faz, mas se está começando na area parabéns e continue estudando.
  7. Funcional, mas creio que deveria comentar apenas a parte em que ele dá return, o erro é importante, para que a pessoa esteja ciente da versão diferente, mesmo que mudem poucas coisas, uma diferença razoavel de versão pode trazer bugs
  8. Isso ta mais para curiosidade que para tutorial. Mas de todo modo o importante é querer ajudar, só isso já vale.
  9. function putkks(value) str, n = tostring(value):reverse():gsub("000", "k"):reverse() return str end Pulo do gato riarai nem tinha me atentado a esse detalhe, e nem sabia que tu era o garou '-' pq mudo de nick mano?
  10. vish, seu code pode ser bem simplificado, usando string.gsub function putkks(value) str, _ = tostring(value):gsub("000", "k") return str end
  11. dalvorsn

    Spr Extractor

    Autor: Dalvo Nome: Sprite Extractor Descrição: É um extrator de sprites dos arquivos spr padrões do tibia. Como funciona: Primeiramente lê-se o arquivo em modo binário, pegam-se os dados de signatura e numero de sprites, apos isso é feita uma varredura nos bytes que os offsets dos ids apontam, iterando sobre eles e gravando-os em seus respectivos pixels, e salvando como bmp. O sistema foi feito completamente em lua, não é muito vantajoso se comparado com extratores feitas em outras linguagens, mas como o objetivo era ser objeto de estudo e não uma ferramente de utilização não vejo problema nisso e estou compartilhando com a comunidade, para os que estão a aprender lua possam analisar. Sprite Extractor O sistema é composto de dois arquivos: # readBytes.lua dofile("./SpriteReader.lua") function convert(num, count) local array = {} local aux = 0 for i = count, 2, -1 do local val = math.floor(num/(256^(i-1))) array[i] = val num = num - (val*(256^(i-1))) end array[1] = num return unpack(array) end function saveBMP(filename, width, height, pixels) sizeArrayColors = 4 * width * height size_1, size_2, size_3, size_4 = convert(sizeArrayColors+54, 4) width_1, width_2, width_3, width_4 = convert(width, 4) height_1, height_2, height_3, height_4 = convert(height, 4) size_array_1, size_array_2, size_array_3, size_array_4 = convert(sizeArrayColors, 4) local byteArray = { --bmp header 0x42, 0x4D, -- magic numbers size_1, size_2, size_3, size_4, --0x00, 0x12, 0x00, 0x00, -- tamanho em bytes da imagem (3072) 0x00, 0x00, 0x00, 0x00, -- sem uso 0x36, 0x00, 0x00, 0x00, -- endereço de onde começam as cores --dib header 0x28, 0x00, 0x00, 0x00, -- tamanho do dib header em bytes - 40 width_1, width_2, width_3, width_4, -- largura height_1, height_2, height_3, height_4, -- altura 0x01, 0x00, 0x18, 0x00, -- numero de bits por pixel (24bits/pixel) 0x00, 0x00, 0x00, 0x00, size_array_1, size_array_2, size_array_3, size_array_4, -- numeros de bytes no array de cores 0x13, 0x0B, 0x00, 0x00, -- resolução horizontal bit/meter 0x13, 0x0B, 0x00, 0x00, -- resolução horizontal bit/meter 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } local file = io.open(filename..".bmp", "w+b") for _, byte in pairs(byteArray) do file:write(type(byte) == "number" and string.char(byte) or byte) end for y = height , 1, -1 do for x = 1, width do for _, byte in pairs(pixels[x][y]) do file:write(string.char(byte)) end end end file:close() end function main() local file = io.open("./Tibia.spr", "rb") if(file)then reader = SpriteReader:load(file) reader.version = reader:getUint32() reader.numberOfSprites = reader:getUint16() io.write("Version: ",reader.version,"\nNumber Of Sprites: ", reader.numberOfSprites, "\n") if not(type(io.open("./Sprites")) == "userdata")then os.execute("mkdir Sprites") end print "Extraindo, aguarde ..." for id = 1, reader.numberOfSprites do --print("Extraindo: "..id.."/"..reader.numberOfSprites) saveBMP("./Sprites/"..tostring(id), 32, 32, reader:getPixelsData(id)) end print("Tempos gasto na extração: "..os.clock()) reader:closeData() else print("Arquivo .spr não encontrado") end end main() # SpriteReader.lua SpriteReader = {} --[[ * Inicia classe com atributo do tipo userdata 'data' * Seta atributos default e le data no modo "*a" --]] function SpriteReader:load(data) attr = {version = 0, numberOfSprites = 0, posByte = 1,file = data, data = data:read("*a"), id = 1} return setmetatable(attr, {__index = self}) end --[[ * Pega os valores minimo e maximos para numero de bytes fornecidos * signed é uma variavel boolean, quando true rearranja os limites para tipo signed --]] function SpriteReader:getRanges(byte, signed) local min, max = 0, ((256^byte) -1) if(signed)then min = -max/2 max = max/2 end return min, max end --[[ * le byte a byte somando seus valores 'byte' numero de vezes * se signed é true, reajusta o valor para signed --]] function SpriteReader:readBytes(byte, signed) local min, _ = self:getRanges(byte, signed) local value = 0 for var = 1, byte do value = value + ( self:nextByte() * (256^(var-1)) ) end return value + min end --[[ * le 'posByte', que é um atributo de controle, serve apaenas para armazenar o proximo byte * reajusta 'posByte' para posição seguinte * retorna 'byte' --]] function SpriteReader:nextByte() local byte = self.data:byte(self.posByte) self.posByte = self.posByte + 1 return tonumber(byte) end function SpriteReader:seek(offset) self.posByte = offset + 1 end --[[ * faz a leitura byte a byte 8 vezes somando seus valores pela progressão: * (byte) ^ 1 + (byte) ^ 2 + ... + (byte) ^ n * valido para todos unsigneds abaixo --]] function SpriteReader:getUint64() return self:readBytes(8, false) end function SpriteReader:getUint32() return self:readBytes(4, false) end function SpriteReader:getUint16() return self:readBytes(2, false) end function SpriteReader:getUint8() return self:readBytes(1, false) end --[[ * segue a mesma lógica anterior, com uma unica diferença * o valor final é reajustado para signed --]] function SpriteReader:getInt64() return self:readBytes(8, true) end function SpriteReader:getInt32() return self:readBytes(4, true) end function SpriteReader:getInt16() return self:readBytes(2, true) end function SpriteReader:getInt8() return self:readBytes(1, true) end --[[ * fecha o atributo file --]] function SpriteReader:closeData() return self.file:close() end --[[ * retorna os uma tabela onde table[x][y] representam os respectivos pixels (x, y) --]] function SpriteReader:getPixelsData(id) self:seek(6 + id * 4) self:seek(self:getUint32() + 3) local pixel, pixels = 0, {} local offset = self.posByte + self:getUint16() for x = 1, 32 do pixels[x] = {} for y = 32 , 1, -1 do pixels[x][y] = {255, 0, 255} end end while self.posByte < offset do local tp = self:getUint16() local colored = self:getUint16() pixel = pixel + tp for x = 1, colored do local r,g,b = self:getUint8(), self:getUint8(), self:getUint8() pixels[pixel%32+1][math.floor(pixel/32+1)] = {b, g, r} pixel = pixel + 1 end end --]] return pixels end Os arquivos devem ser colocados juntos em uma pasta, e a pasta deve contem o arquivo Tibia.spr, pode ser outros nomes ou diretorios, porem precisará modificar no script (qualquer noob faz). Me sinto na obrigação de atribuir crédito a 3 pessoas:Jo3Bingham (pelo tutorial sobre estrutura do spr), Colex (atravès de um script dele pude intender como são organizados os pixels no spr), baxnie (por me ajudar a entender a estrutura do spr, que não obtive total exito atraves do tutorial de Jo3Bingham). Para usários de Windows aconselho Scite, e para linux gosto de usar o Geany.
  12. #Topic Fiz de um modo POG, porém mil vezes mais funcional que o de vocês, veja: function addEvent(f, t, ...) os.execute("ping -n "..(tonumber(t) + 1).." 127.0.0.1 >NUL") return f(unpack(... and ... or {})) end Exemplo de uso: addEvent(function () return print(collectgarbage("count")) end, 10) Mas ainda assim não fica fiel a de otserv, pra ficar igual igual acho que teria que chamar dentro de uma coroutine e suspender ela pro resto do bloco executar Agora nao to com tempo, depois tento fazer Achei inútil a parte: for i,x in pairs(array) do table.insert(parameters, x) end Não tem a minima necessidade de usar indices em parametros, e a função table.remove retorna o valor removido, o que torna desnecessário o uso disso: local func = array[1] O código pode ser simplificado a isso: function executeArray(array) local func = table.remove(array, 1) return func(unpack(array)) end
  13. listDir(dirname) function listDir(dirname) local file = io.popen("dir "..tostring(dirname)) if(file)then str = file:read("*a") file:close() end return str end A função listDir(dirname) retorna uma string contendo todos os arquivos do diretório dirname ou nil caso não seja um diretório. isFile(file, dirname) function isFile(file, dirname) local files = listDir(dirname) if not(files)then return error("Can't open directory") elseif not io.open(dirname..""..file) then return error("File not found") end return true end A função isFile(file, dirname) verifica se o arquivo file pertence ao diretório dirname. Se pertecer a função retorna true, se não ela dispara um erro no console. Obs.: ela está com alguns erros ainda, mas pro propósito que foi criada serve. installOTScript(file, tag, type_ [, dir]) function installOTScript(file, tag, type_,dir) if not(dir)then dir = "" end local types = { [1] = {dirscript = "data/actions/scripts/", dirtag="data/actions/actions.xml", find = "<actions>"}, [2] = {dirscript = "data/creaturescripts/scripts/",dirtag = "data/creaturescripts/creaturescripts.xml",find= "<creaturescripts>"}, [3] = {dirscript = "data/globalevents/scripts/",dirtag = "data/globalevents/globalevents.xml",find= "<globalevents>"}, [4] = {dirscript = "data/lib/",dirtag ="empty"}, [5] = {dirscript = "data/movements/scripts/",dirtag = "data/movements/movements.xml",find= "<movements>"}, [6] = {dirscript = "data/spells/scripts/",dirtag = "data/spells/spells.xml",find = "<spells>"}, [7] = {dirscript = "data/talkactions/scripts/",dirtag = "data/talkactions/talkactions.xml",find = "<talkactions>"}, [8] = {dirscript = "data/weapons/scripts/",dirtag = "data/weapons/weapons.xml",find= "<weapons>"}, } if(isFile(file, dir))then if(types[type_])then str = io.open(dir..""..file):read(-1):close() io.open(types[type_].dirscript..file,"w+"):write(str):close() if not(types[type_].dirtag == "empty")then if(type_ == 2)then name = tag:gmatch("name=\"(.+)\"") register = io.open("data/creaturescripts/scripts/login.lua"):read(-1):close():gsub("function onLogin(cid)","function onLogin(cid) \n registerCreatureEvent(cid, "..name..")") io.open("data/creaturescripts/scripts/login.lua","w+"):write(register):close() end str_ = io.open(types[type_].dirtag):read(-1):close():gsub(types[type_].find, tag) if(str_:find(tag))then return print("This script is already installed") end xml = io.open(types[type_].dirtag, "w+") xml:write(str_):close() end else print("This type of script is not valid") end end end A função acima tem como objetivo facilitar a vida de pessoas mais leigas em scripting ou até mesmo facilitar a instalação de scripts. file é o nome do arquivo a ser instalado; tag é a tag do script a ser instalado; type_* é o número correspondente ao tipo de script de OTserv; dir é o diretório aonde estão os arquivos a serem instalados. * Os números referentes aos tipos de scripts são: 1 -> Actions 2 -> CreatureScripts 3 -> GlobalEvents 4 -> Lib 5 -> Movements 6 -> Spells 7 -> TalkActions 8 -> Weapons Obs.: Não foi possível testar a função ainda, pois meu computador está muito lento e mal está dando para abrir servidores, então caso haja algum erro ou bugs, por favor me informem, obrigado. Atenciosamente, Dalvo
  14. simples cara, basta tu usar o ip que seu moden te dá, algo do tipo 192.168.1.2, ou 10.1.1.2, para saber com precisão aperta ctrl + r digita 'cmd' e em seguida digite ipconfig /all, vai aparecer um monte de informações, procure por endereço de ip, e coloque o endereço que estiver la no seu ip changer.
  15. eu fiz ela hoje de madrugada, ta crua ainda, desprotegida de erros e tals, depois eu atualizo ela com as correções mas valeu por avisar, é bom que quem lê já toma cuidado ao usar
  16. moveToPos(cid, toPos[, delayStep]) function moveToPos(cid, toPos, delayStep) if not(delayStep)then delayStep = getCreatureBaseSpeed(cid) end local function move(pos) doMoveCreature(cid, getDirectionTo(pos, toPos)) doChangeSpeed(cid, -getCreatureSpeed(cid)) if not(pos.x == toPos.x and pos.y == toPos.y and pos.z == toPos.z)then addEvent(move, delayStep, getThingPos(cid)) else doChangeSpeed(cid, getCreatureBaseSpeed(cid)) end end move(getThingPos(cid)) return true end Dúvidas e/ou bugs postem. Obs.: cadê o code lua? >.<
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...