Olá!
Primeiro de tudo, você precisa atualizar o intervalo de tempo (tick). Para isso, você pode usar o evento onClientPlayerDamage, anexado no localPlayer. Também, são necessárias algumas variáveis para salvar o estado atual da vida. Fiz um código de exemplo, que você pode usar para fazer o colete também.
local screenX, screenY = guiGetScreenSize()
local barWidth, barHeight = 220, 20
local barX, barY = screenX / 2 - barWidth / 2, screenY - (barHeight + 10)
local changeTick = 0
local currentHealth = getElementHealth(localPlayer)
local playerHealth = currentHealth
addEventHandler("onClientPlayerDamage", localPlayer, function(_, _, _, loss)
if loss > 0 then
changeTick = getTickCount()
end
end)
addEventHandler("onClientRender", root, function()
local changeHealth = getElementHealth(localPlayer)
if changeHealth ~= currentHealth then
playerHealth = interpolateBetween(currentHealth, 0, 0, getElementHealth(localPlayer), 0, 0, (getTickCount() - changeTick) / 800, "InOutQuad")
if playerHealth == changeHealth then
currentHealth = changeHealth
end
end
dxDrawRectangle(barX, barY, barWidth, barHeight, tocolor(20, 21, 22, 200), false)
dxDrawRectangle(barX, barY, barWidth * (playerHealth / 100), barHeight, tocolor(255, 55, 55, 255), false)
dxDrawRectangle(barX, barY, barWidth * (changeHealth / 100), barHeight, tocolor(255, 255, 255, 255), false)
end)
Demonstração: https://streamable.com/jnyky9