Postado Julho 18, 2022 2 anos Autor Em 16/07/2022 em 07:20, FeeTads disse: fiz aqui meu bom, mas creio que será necessário você testar antes de por em prática kkkkkk, caso tenha algum bug, manda print do erro no console que aparecer PF. colocar em qualquer arquivo action.lua ex: data > actions > scripts > foodBuff.lua colocar no actions.xml data > actions > actions.xml <action itemid="9998 script="foodBuff.lua"/> TROCAR O 9998 PELO ID DO SEU FOOD/ITEM local itemID = 9998 -- id do item local tempoDeBuff = 60 -- em segundos local porcentagemDeCura = 2 -- vai curar 2% por [tempo entre curas] durante [tempo de buff] local qtdDeSkill = 10 -- quantidade de skill que dará local efeito = 4 -- efeito que sairá do player local removerItem = true -- remover o item? true = remove, false = não remove local tempoEntreCuras = 1 * 1000 -- tempo entre o efeito da cura, 1 * 1000 = 1000ms logo //1 segundo local need_vocation = {1,2,3,4,5} -- IDs da vocações QUE PODEM usar o food local buff = SKILL_FISHING -- qual skill vai aumentar //pra saber qual skill vc quer aumentar procure por "skill" em "lib/000-constant.lua" local storage = 5474767 -- pode ser qualquer numero //não pode repetir numero de outra storage existente local storage_buff_ativo = 5474768 local function CuraPorSegundo(cid, n) if isCreature(cid) then --se estiver logado entra, se não termina o loop, ou seja, se deslogar/morrer perde o efeito do food if n > 0 then doCreatureAddHealth(cid, (getCreatureMaxHealth(cid) * (porcentagemDeCura/100))) -- n mexer :P doSendMagicEffect(getThingPos(cid), efeito) -- efeito que vai sair do player else doPlayerAddSkill(cid, buff, -qtdDeSkill, true) -- quando acabar o efeito seta o fishing pro normal setPlayerStorageValue(cid, storage_buff_ativo, -1) end addEvent(CuraPorSegundo, tempoEntreCuras, cid, n-1) -- chama de novo a função passando -1 segundo pro tempo else return true end end function onUse(cid, item, frompos, item2, topos) local msg_no_vocation = "Sua Vocação não pode usar esse item!" -- mensagem caso não tenha a voc necessária local msg_sucess = "Você usou o Heal Food, o efeito irá durar"..tempoDeBuff.." segundos" -- mensagem de sucesso if item.itemid == itemID then local tempo = getPlayerStorageValue(cid, storage) - os.time() -- tempo recebe o tempo restante pra usar a potion de novo if tempo > 0 then -- se tempo for maior que 0, significa que está em uso if tempo > 60 then -- só pra mostrar bonitinho doPlayerSendCancel(cid,"Você precisa esperar "..math.floor(tempo/60).." minutos e "..(tempo%60).." segundos.") else doPlayerSendCancel(cid,"Você precisa esperar "..(tempo%60).." segundos.") end return true end for i=1 #need_vocation do -- checa as vocações que podem usar o food //setadas no cabeçalho if getPlayerVocation(cid) == need_vocation[i] then -- se for, aparece msg de sucesso na tela doPlayerSendTextMessage(cid, 22, msg_sucess) else doPlayerSendTextMessage(cid, 22, msg_no_vocation) -- se não tiver a vocação necessaria, manda msg avisando return true -- e sai da função end end setPlayerStorageValue(cid, storage, os.time() + tempoDeBuff) -- storage pra salvar o tempo de buff, apenas pra tirar o skill de fishing caso o player deslogue/morra doPlayerAddSkill(cid, buff, qtdDeSkill, true) -- aumenta o skill setado no cabeçalho setPlayerStorageValue(cid, storage_buff_ativo, 1) if removerItem then -- se removerItem no cabeçalho for true REMOVE O ITEM, se não, não remove doRemoveItem(item.uid, 1) -- função de remover o item, não precisa mexer end CuraPorSegundo(cid, tempoDeBuff) -- chama a função end return true end coloquei como exemplo no script > 2% de cura por segundo, durante 60 segundos, OU SEJA, o player vai curar 100% (na vdd ele irá curar 120%) de life (PORÉM não irá bugar pq caso o tibia reconheça que o player está com 100% de vida, ele não extrapola esse limite de 100%, só ignora a cura). obviamente vc pode alterar como quiser no script tempoDebuff = 30 (durante 30 segundos) tempoEntreCuras = 1 * 500 (a cada meio segundo) e o MAIS IMPORTANTE, itemID = 9998 (trocar o 9998 pro id do item) PS: caso o player morra/deslogue, irá perder o buff de cura da potion, PORÉM não perderá o skill **OBRIGATÓRIAMENTE** você precisará checar isso em algum creaturescript de login ex: data > creaturescripts > scripts > login.lua (login.lua é um arquivo padrão que existe em todo ot) procura por: function onLogin(cid) e logo abaixo adicione isso: if getPlayerStorageValue(cid, 5474768) == 1 then local buff = SKILL_FISHING -- PRECISA SER O MESMO do colocado no script do actions local qtdDeSkill = 10 -- PRECISA SER O MESMO do colocado no script do actions local liberar_food_pra_uso_apos_morte = true --Liberar o uso do food após o player morrer com ele ativo? true = libera o uso / false = o player tem que esperar o cooldown do uso acabar if liberar_food_pra_uso_apos_morte then setPlayerStorageValue(cid, 5474767, 0) end doPlayerAddSkill(cid, buff, -qtdDeSkill, true) setPlayerStorageValue(cid, 5474768, -1) end assim que ele logar, após ter deslogado/morrido com o food la ativo, irá tirar o buff de skill que foi adicionado. CASO queira mudar o EFEITO que sai do player, vai no teu GOD, e digita /z e o numero ex: /z 5 vai sair no GOD um efeito existem 69 efeitos (em tibia normal) ai vc procura um legal, e coloca no lugar de local efeito = 10 Cara muito bem explicado, script incrivel, vc colocou oque cada linha faz praticamente, isso vai ajudar demais para alguém leigo como eu kkk So que ocorreu o seguinte erro na distro. Editei apenas o item e o efeito, ainda não alterei nada no script
Postado Julho 18, 2022 2 anos Solução 6 horas atrás, Nother disse: o seguinte erro na distro. a distro deixou o erro ali kkkkkk " ' , ' expected near '#' " ? kkkkkk faltou uma virgula no for da linha 46 aki nesse for i=1 #need_vocation for i=1 #need_vocation do -- checa as vocações que podem usar o food //setadas no cabeçalho if getPlayerVocation(cid) == need_vocation[i] then -- se for, aparece msg de sucesso na tela doPlayerSendTextMessage(cid, 22, msg_sucess) else doPlayerSendTextMessage(cid, 22, msg_no_vocation) -- se não tiver a vocação necessaria, manda msg avisando return true -- e sai da função end end coloca assim for i=1, #need_vocation do só uma virgula após o i=1 de qualquer maneira, atualizei a linha 46 no código ali em cima, qualquer coisa só copiar e colar kkk e caso funcione 100%, deixa o REP+ e o Mark as Solution ? tmj meu mano Em 16/07/2022 em 07:20, FeeTads disse: local tempoDeBuff = 60 po mano e percebi um "mini erro" meu aqui, quando estava chamando a função, caso fosse diferente de 1 segundo, iria bugar deixando o código arrumado aki pra baixo fix: GARANTE que o buff vai durar exatamente o tempo descrito no cabeçalho, independente de quantas curas executar. fix2: arrumei a checagem de vocação do for também, da outra maneira ia checar apenas a primeira vocação e sair. sugiro muito que copie esse script \/ local itemID = 9998 -- id do item local tempoDeBuff = 60 -- em segundos local porcentagemDeCura = 2 -- vai curar 2% por [tempo entre curas] durante [tempo de buff] local qtdDeSkill = 10 -- quantidade de skill que dará local efeito = 4 -- efeito que sairá do player local removerItem = true -- remover o item? true = remove, false = não remove local tempoEntreCuras = 1 * 1000 -- tempo entre o efeito da cura, 1 * 1000 = 1000ms logo //1 segundo local need_vocation = {1,2,3,4,5} -- IDs da vocações QUE PODEM usar o food local buff = SKILL_FISHING -- qual skill vai aumentar //pra saber qual skill vc quer aumentar procure por "skill" em "lib/000-constant.lua" local storage = 5474767 -- pode ser qualquer numero //não pode repetir numero de outra storage existente local storage_buff_ativo = 5474768 local function CuraFoodBuff(cid, flag) if isCreature(cid) then --se estiver logado entra, se não termina o loop, ou seja, se deslogar/morrer perde o efeito do food if flag > 0 then doCreatureAddHealth(cid, (getCreatureMaxHealth(cid) * (porcentagemDeCura/100))) -- n mexer :P doSendMagicEffect(getThingPos(cid), efeito) -- efeito que vai sair do player flag = getPlayerStorageValue(cid, storage) - os.time() -- garante que execute a função pelo [tempo de buff] addEvent(CuraFoodBuff, tempoEntreCuras, cid, flag) -- chama de novo a função passando -1 segundo pro tempo else doPlayerAddSkill(cid, buff, -qtdDeSkill, true) -- quando acabar o efeito seta o fishing pro normal setPlayerStorageValue(cid, storage_buff_ativo, -1) return true end else return true end end function onUse(cid, item, frompos, item2, topos) local msg_no_vocation = "Sua Vocação não pode usar esse item!" -- mensagem caso não tenha a voc necessária local msg_sucess = "Você usou o Heal Food, o efeito irá durar"..tempoDeBuff.." segundos" -- mensagem de sucesso if item.itemid == itemID then local tempo = getPlayerStorageValue(cid, storage) - os.time() -- tempo recebe o tempo restante pra usar a potion de novo if tempo > 0 then -- se tempo for maior que 0, significa que está em uso if tempo > 60 then -- só pra mostrar bonitinho doPlayerSendCancel(cid,"Você precisa esperar "..math.floor(tempo/60).." minutos e "..(tempo%60).." segundos.") else doPlayerSendCancel(cid,"Você precisa esperar "..(tempo%60).." segundos.") end return true end for i=1, #need_vocation do -- checa as vocações que podem usar o food //setadas no cabeçalho if getPlayerVocation(cid) == need_vocation[i] then -- se for, aparece msg de sucesso na tela doPlayerSendTextMessage(cid, 22, msg_sucess) no_have_voc = false -- seta a variavel de não ter voc pra false, ou seja tem a voc necessaria break -- quebra o for depois disso //necessario deixar o BREAK end end if no_have_voc then doPlayerSendTextMessage(cid, 22, msg_no_vocation) -- se não tiver a vocação necessaria, manda msg avisando return true -- e sai da função end setPlayerStorageValue(cid, storage, os.time() + tempoDeBuff) -- storage pra salvar o tempo de buff, apenas pra tirar o skill de fishing caso o player deslogue/morra doPlayerAddSkill(cid, buff, qtdDeSkill, true) -- aumenta o skill setado no cabeçalho setPlayerStorageValue(cid, storage_buff_ativo, 1) if removerItem then -- se removerItem no cabeçalho for true REMOVE O ITEM, se não, não remove doRemoveItem(item.uid, 1) -- função de remover o item, não precisa mexer end CuraFoodBuff(cid, tempoDeBuff) -- chama a função end return true end Editado Julho 18, 2022 2 anos por FeeTads ajuste no for (veja o histórico de edições)
Postado Julho 18, 2022 2 anos Autor 1 hora atrás, FeeTads disse: a distro deixou o erro ali kkkkkk " ' , ' expected near '#' " ? kkkkkk faltou uma virgula no for da linha 46 aki nesse for i=1 #need_vocation for i=1 #need_vocation do -- checa as vocações que podem usar o food //setadas no cabeçalho if getPlayerVocation(cid) == need_vocation[i] then -- se for, aparece msg de sucesso na tela doPlayerSendTextMessage(cid, 22, msg_sucess) else doPlayerSendTextMessage(cid, 22, msg_no_vocation) -- se não tiver a vocação necessaria, manda msg avisando return true -- e sai da função end end coloca assim for i=1, #need_vocation do só uma virgula após o i=1 de qualquer maneira, atualizei a linha 46 no código ali em cima, qualquer coisa só copiar e colar kkk e caso funcione 100%, deixa o REP+ e o Mark as Solution ? tmj meu mano po mano e percebi um "mini erro" meu aqui, quando estava chamando a função, caso fosse diferente de 1 segundo, iria bugar deixando o código arrumado aki pra baixo fix: GARANTE que o buff vai durar exatamente o tempo descrito no cabeçalho, independente de quantas curas executar. fix2: arrumei a checagem de vocação do for também, da outra maneira ia checar apenas a primeira vocação e sair. sugiro muito que copie esse script \/ local itemID = 9998 -- id do item local tempoDeBuff = 60 -- em segundos local porcentagemDeCura = 2 -- vai curar 2% por [tempo entre curas] durante [tempo de buff] local qtdDeSkill = 10 -- quantidade de skill que dará local efeito = 4 -- efeito que sairá do player local removerItem = true -- remover o item? true = remove, false = não remove local tempoEntreCuras = 1 * 1000 -- tempo entre o efeito da cura, 1 * 1000 = 1000ms logo //1 segundo local need_vocation = {1,2,3,4,5} -- IDs da vocações QUE PODEM usar o food local buff = SKILL_FISHING -- qual skill vai aumentar //pra saber qual skill vc quer aumentar procure por "skill" em "lib/000-constant.lua" local storage = 5474767 -- pode ser qualquer numero //não pode repetir numero de outra storage existente local storage_buff_ativo = 5474768 local function CuraFoodBuff(cid, flag) if isCreature(cid) then --se estiver logado entra, se não termina o loop, ou seja, se deslogar/morrer perde o efeito do food if flag > 0 then doCreatureAddHealth(cid, (getCreatureMaxHealth(cid) * (porcentagemDeCura/100))) -- n mexer :P doSendMagicEffect(getThingPos(cid), efeito) -- efeito que vai sair do player flag = getPlayerStorageValue(cid, storage) - os.time() -- garante que execute a função pelo [tempo de buff] addEvent(CuraFoodBuff, tempoEntreCuras, cid, flag) -- chama de novo a função passando -1 segundo pro tempo else doPlayerAddSkill(cid, buff, -qtdDeSkill, true) -- quando acabar o efeito seta o fishing pro normal setPlayerStorageValue(cid, storage_buff_ativo, -1) return true end else return true end end function onUse(cid, item, frompos, item2, topos) local msg_no_vocation = "Sua Vocação não pode usar esse item!" -- mensagem caso não tenha a voc necessária local msg_sucess = "Você usou o Heal Food, o efeito irá durar"..tempoDeBuff.." segundos" -- mensagem de sucesso if item.itemid == itemID then local tempo = getPlayerStorageValue(cid, storage) - os.time() -- tempo recebe o tempo restante pra usar a potion de novo if tempo > 0 then -- se tempo for maior que 0, significa que está em uso if tempo > 60 then -- só pra mostrar bonitinho doPlayerSendCancel(cid,"Você precisa esperar "..math.floor(tempo/60).." minutos e "..(tempo%60).." segundos.") else doPlayerSendCancel(cid,"Você precisa esperar "..(tempo%60).." segundos.") end return true end for i=1, #need_vocation do -- checa as vocações que podem usar o food //setadas no cabeçalho if getPlayerVocation(cid) == need_vocation[i] then -- se for, aparece msg de sucesso na tela doPlayerSendTextMessage(cid, 22, msg_sucess) no_have_voc = false -- seta a variavel de não ter voc pra false, ou seja tem a voc necessaria break -- quebra o for depois disso //necessario deixar o BREAK end end if no_have_voc then doPlayerSendTextMessage(cid, 22, msg_no_vocation) -- se não tiver a vocação necessaria, manda msg avisando return true -- e sai da função end setPlayerStorageValue(cid, storage, os.time() + tempoDeBuff) -- storage pra salvar o tempo de buff, apenas pra tirar o skill de fishing caso o player deslogue/morra doPlayerAddSkill(cid, buff, qtdDeSkill, true) -- aumenta o skill setado no cabeçalho setPlayerStorageValue(cid, storage_buff_ativo, 1) if removerItem then -- se removerItem no cabeçalho for true REMOVE O ITEM, se não, não remove doRemoveItem(item.uid, 1) -- função de remover o item, não precisa mexer end CuraFoodBuff(cid, tempoDeBuff) -- chama a função end return true end Ficou perfeito, obrigado mesmo, não sabia que a distro tbm me falava oque falta no script kkkk achei que era so onde estava os erros, tava igual doido procurando essa virgula no script kk vlw mesmo
Postado Julho 18, 2022 2 anos 1 minuto atrás, Nother disse: Ficou perfeito, obrigado mesmo, não sabia que a distro tbm me falava oque falta no script kkkk achei que era so onde estava os erros, tava igual doido procurando essa virgula no script kk vlw mesmo GG mano, testa certinho, faz varios tipos de testes que os players podem tentar fazer, tipo usar e deslogar, usar varios, etc.. e ve se da algum bug, se der volta aki kkkkkkkk, tmj mano
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.