Eu refiz o seu código, pois a estrutura dele não estava legal. Não fazia sentido você setar a storage com tempo do os.time() sem nenhum acréscimo além dele, pois seria a mesma coisa que nada. E também não é bom fazer uma função dentro do onUse, é sempre bom fazer fora, como boas práticas.
Substitua seu código por:
---------------------------- FUNÇÃO DE HEALAR -----------------------------
local function doRegeneration(cid, health, effect, count)
if count > 0 then
doCreatureAddHealth(cid, math.floor(health))
doSendMagicEffect(getCreaturePosition(cid), effect)
addEvent(doRegeneration, 1000, cid, health, effect, count - 1)
end
end
---------------------------------------------------------------------------
local storage = 11148 -- STORAGE PARA ARMAZENAR UM TEMPO DE COOLDOWN PARA USAR A POTION NOVAMENTE
------------------------------ CÓDIGO --------------------------------------
function onUse(cid, item, fromPos, itemEx, toPos)
local tempo = 30 -- TEMPO EM SEGUNDOS QUE A POTION VAI HEALAR (ESSE MESMO TEMPO É ADICIONADO A STORAGE PARA FAZER UM EXHAUST E O PLAYER NÃO USAR MAIS DE UMA POTION DE UMA VEZ)
local health = 15 -- TANTO DE VIDA QUE O PLAYER VAI RECUPERAR
local effect = CONST_ME_MAGIC_GREEN -- EFEITO QUE VAI SAIR NO PLAYER QUANDO USAR A POTION
if getCreatureHealth(cid) == getCreatureMaxHealth(cid) then -- VERIFICA SE O PLAYER JÁ ESTÁ COM A VIDA TOTALMENTE CHEIA
return doPlayerSendCancel(cid, "Your health already is full.")
end
if not isPlayer(cid) then -- VERIFICA SE O PLAYER ESTÁ USANDO A POTION EM OUTRA CRIATURA
doPlayerSendCancel(cid, "You only can use the potion in you.")
return false
end
-- CONDIÇÃO PARA VER SE A POTION AINDA ESTÁ SENDO USADA NO PLAYER, PARA NÃO USAR MAIS DE UMA CORRENDO RISCO DE GASTAR POTION ATOA --
if getPlayerStorageValue(cid, storage) <= os.time() then
doRegeneration(cid, health, effect, tempo)
doChangeTypeItem(item.uid, item.type - 1)
setPlayerStorageValue(cid, storage, os.time() + tempo)
return true
else
doPlayerSendCancel(cid, "You are still being recovering.")
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You are still being recovering.")
return true
end
end
Deixei tudo comentado para você entender, e também adicionei algumas verificações, como se o player já estiver com a vida totalmente cheia e se ele está tentando usar a potion em outra criatura. Também fiz para setar a storage com o tempo (definido na storage tempo) para setar mais o tempo do os.time() (momento que o player usa a potion), é bom isso porque não corre risco do player usar a potion duas vezes ou mais seguidas sem querer e também não gastar potion atoa, caso a primeira já encha a vida totalmente.
Também mudei o tempo do addEvent para 1 segundo, pois estava 2 segundos e meio.
Testa e me fala se der algum erro.