-
Total de itens
750 -
Registro em
-
Última visita
-
Dias Ganhos
8
Tudo que dalvorsn postou
-
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
-
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)
-
'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
-
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)
-
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
-
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.
-
Fazendo Com Que O Seu Ot Aceite Qualquer Item.otb!
tópico respondeu ao dreigon67 de dalvorsn em Tutoriais de Programação
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 -
Entendendo O Comando Os.time() Para Vip System
tópico respondeu ao vmf91 de dalvorsn em Lixeira Pública
Isso ta mais para curiosidade que para tutorial. Mas de todo modo o importante é querer ajudar, só isso já vale.- 3 respostas
-
- os.time();
- vip system
-
(e 1 mais)
Tags:
-
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?
-
vish, seu code pode ser bem simplificado, usando string.gsub function putkks(value) str, _ = tostring(value):gsub("000", "k") return str end
-
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.
-
Função Addevent(Func, Time, Arg)
tópico respondeu ao Demonbholder de dalvorsn em Mods, funções e outros
#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 -
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
-
[Encerrado] Somente Eu Não Consigo Entrar No Meu Servidor!
tópico respondeu ao othereality de dalvorsn em Tópicos Sem Resposta
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. -
Movetopos(Cid, Topos[, Delaystep])
tópico respondeu ao dalvorsn de dalvorsn em Mods, funções e outros
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 -
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.