82 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
 | 
						|
local function DrawProgressRect(x, y, w, h, r, g, b, a)
 | 
						|
    DrawRect(x + w * 0.5, y + h * 0.5, w, h, r, g, b, a)
 | 
						|
end
 | 
						|
 | 
						|
local function DrawProgressBar(coords, fraction, alpha, scale)
 | 
						|
    local onScreen, sx, sy = GetScreenCoordFromWorldCoord(coords.x, coords.y, coords.z)
 | 
						|
    if not onScreen then return end
 | 
						|
    
 | 
						|
    local boxW, boxH = 0.1 * scale, 0.018 * scale
 | 
						|
    
 | 
						|
    fraction = math.max(0.0, math.min(fraction, 1.0))
 | 
						|
    alpha = math.max(0, math.min(alpha, 255))
 | 
						|
    
 | 
						|
    DrawProgressRect(sx - 0.001 - (boxW / 2), sy - 0.0015 - (boxH * 0.5), boxW + 0.002, boxH + 0.003, 0, 0, 0, math.floor(alpha * 0.7))
 | 
						|
    
 | 
						|
    local fillW = boxW * fraction
 | 
						|
    DrawProgressRect(sx - (boxW / 2), sy - (boxH * 0.5), fillW, boxH, 108, 240, 156, math.floor(alpha * 0.9))
 | 
						|
end
 | 
						|
 | 
						|
function ProgressBar(coords, duration, baseScale)
 | 
						|
    baseScale = baseScale or 1
 | 
						|
    
 | 
						|
    local maxDist = 30.0
 | 
						|
    local fillTime    = duration
 | 
						|
    local holdTime    = 250
 | 
						|
    
 | 
						|
    local fadeInTime  = 250
 | 
						|
    local fadeOutTime = 250
 | 
						|
    
 | 
						|
    local startTime   = GetGameTimer()
 | 
						|
    local fadeInEnd   = startTime + fadeInTime
 | 
						|
    local fillStart   = fadeInEnd
 | 
						|
    local fillEnd     = fillStart + fillTime
 | 
						|
    local holdEnd     = fillEnd + holdTime
 | 
						|
    local fadeOutEnd  = holdEnd + fadeOutTime
 | 
						|
    
 | 
						|
    while true do
 | 
						|
        Citizen.Wait(0)
 | 
						|
        
 | 
						|
        local camCoords = GetFinalRenderedCamCoord()
 | 
						|
        local dist = #(camCoords - coords)
 | 
						|
        local scale = baseScale
 | 
						|
        
 | 
						|
        if dist > 4.0 then
 | 
						|
            scale = (baseScale * ((maxDist - dist) / maxDist))
 | 
						|
        end
 | 
						|
        
 | 
						|
        local now = GetGameTimer()
 | 
						|
        
 | 
						|
        if scale > 0.1 then
 | 
						|
            local alpha
 | 
						|
            if now < fadeInEnd then
 | 
						|
                local pct = (now - startTime) / fadeInTime
 | 
						|
                alpha = math.floor(255 * pct)
 | 
						|
            elseif now < holdEnd then
 | 
						|
                alpha = 255
 | 
						|
            else
 | 
						|
                local pct = (now - holdEnd) / fadeOutTime
 | 
						|
                alpha = math.floor(255 * (1.0 - pct))
 | 
						|
            end
 | 
						|
            
 | 
						|
            local fraction
 | 
						|
            if now < fillStart then
 | 
						|
                fraction = 0.0
 | 
						|
            elseif now < fillEnd then
 | 
						|
                local pct = (now - fillStart) / fillTime
 | 
						|
                fraction = pct
 | 
						|
            else
 | 
						|
                fraction = 1.0
 | 
						|
            end
 | 
						|
            
 | 
						|
            DrawProgressBar(coords + vec3(0, 0, 0.1), fraction, alpha, scale)
 | 
						|
        end
 | 
						|
        
 | 
						|
        if now >= fadeOutEnd then
 | 
						|
            break
 | 
						|
        end
 | 
						|
    end
 | 
						|
    
 | 
						|
    return true
 | 
						|
end
 |