The code is illogical. You're creating a blip for each player instead of only creating one for the player that used his weapon. The timer is also not needed.
local blip = {}
addEventHandler('onWeaponFire', root, function()
if (not isElement(source) or isPedDead(source)) then return end
local r, g, b = getPlayerNametagColor(source)
if (isElement(blip[source])) then
setBlipColor(blip[source], r, g, b)
else
blip[source] = createBlipAttachedTo(source, 0, 2, r, g, b)
end
end)