Jump to content

Estou com problemas na infobox


Recommended Posts

Bom dia, estou com um problema muito chato na infobox do meu servidor, ela fica repetindo em cima dela mesma.
(Sobrepondo a anterior) dessa forma acaba que o player não consegue ler as noticias pq a outra infobox sobrepôs, queria saber se vcs conseguem
me ajudar a resolver este problema.

 

renderTimers = {}

notificationFont = DxFont("files/Roboto.ttf", 12);
notificationFontBold = DxFont("files/RobotoB.ttf", 13);

function createRender(id, func)
    if not isTimer(renderTimers[id]) then
        renderTimers[id] = setTimer(func, 5, 0)
    end
end

function destroyRender(id)
    if isTimer(renderTimers[id]) then
        killTimer(renderTimers[id])
        renderTimers[id] = nil
        collectgarbage("collect")
    end
end

local cache = {}
local sx, sy = guiGetScreenSize()
local renderState = false
local types = {}

local details = {
    ["warning"] = {"Perigo!", "warning", "w.mp3"},
    ["error"] = {"Erro!", "error", "error.wav"},
    ["info"] = {"Informação!", "information", "i.mp3"},
    ["mod"] = {"Baixando Mods...", "information", "i.mp3"},
    ["staff"] = {"ANÚNCIO", "adminduty", "adminduty.mp3"},
    ["success"] = {"Sucesso!", "success", "s.mp3"},
}

function searchBox(key)
    local val
    for k,v in pairs(cache) do
        if v["key"] == key then
            val = k
            break
        end
    end
    
    return val
end

function updateBoxDetails(key, detailID, nValue)
    if detailID == "msg" then
        local k = searchBox(key)
        if k then
            local type = cache[k]["type"]
            local msg = nValue
            local textLength
            if #details[type][1] >= #msg then
                textLength = dxGetTextWidth(details[type][1], 0.75, notificationFontBold, true) + 10
            else
                textLength = dxGetTextWidth(msg, 0.75, notificationFont, true) + 10
            end
            
            cache[k]["msg"] = msg
            cache[k]["length"] = textLength
        end
    elseif detailID == "custom2.details" then
        local k = searchBox(key)
        if k then
            cache[k]["customProg"] = nValue
        end
    end
end

function getColors(render)
    local enabled = true
    if render then
        if lastClickTick + 250 > getTickCount() then
            enabled = false
        end
        lastUpdateTick = getTickCount()
    end
    
    if enabled then
        engine = exports['BVPinfo']
        types = {
            --[type] = {"awesomeIcon", r,g,b}
            ["warning"] = {"", {engine:getServerColor('lightyellow', false)}},
            ["error"] = {"", {engine:getServerColor('red', false)}},
            ["info"] = {"", {engine:getServerColor('blue', false)}},
            ["mod"] = {"", {engine:getServerColor('blue', false)}},
            ["staff"] = {"", {engine:getServerColor('lightyellow', false)}},
            ["success"] = {"", {engine:getServerColor('green', false)}},
        }
    end
end

function addBox(type, msg, key, customDetails)
    getColors()
    
    if types[type] then
        local customData = {}
        local showtime = #msg * 500
        local customProg
        local typ, data = unpack(customDetails or {0, 0})
        if typ == 1 then
            showtime = tonumber(data)
        elseif typ == 2 then
            customProg = data
        end
        
        local textLength
        if #details[type][1] >= #msg then
            textLength = dxGetTextWidth(details[type][1], 0.75, notificationFontBold, true) + 10
        else
            textLength = dxGetTextWidth(msg, 0.75, notificationFont, true) + 10
        end
        
        playSound("files/sounds/"..details[type][3])
        table.insert(cache, 
            {
                ["key"] = key or #cache + 1,
                ["msg"] = msg, 
                ["length"] = textLength, 
                ["now"] = getTickCount(), 
                ["end"] = getTickCount() + 2000, 
                ["state"] = "fadeIn", 
                ["type"] = type, 
                ["tick"] = 0,
                ["showtime"] = showtime,
                ["customProg"] = customProg,
            }
        )
        outputConsole("["..type.."] "..string.gsub(msg, "#%x%x%x%x%x%x", ""))
        
        if #cache >= 1 then
            if not renderState then
                renderState = true
                addEventHandler("onClientRender", root, drawnBoxes, true, "low-5")
                createRender("drawnBoxes", drawnBoxes)
            end
        end
    end
end
addEvent("addBox", true)
addEventHandler("addBox", root, addBox)
 
local between = 32
function drawnBoxes()
    _sx, _sy = sx, sy
    _nowY = sy - 305 - (47 * 1)
    local now = getTickCount()
    for k,v in ipairs(cache) do
        local msg = v["msg"]
        local length = v["length"]
        local startTime = v["now"]
        local endTime = v["end"]
        local state = v["state"]
        local type = v["type"]
        local tick = v["tick"]
        local showtime = v["showtime"] or 8000
        local customProg = v["customProg"]
        local boxSize = 25 
        local pos, alpha -- = v["pos"], v["alpha"]
        
        local r,g,b = unpack(types[type][2])
        if not r or not g or not b then
            getColors(true)
        end
        
        local icon = types[type][1]
        local timeLine = false
        local timeLineProg
        
        if state == "fadeIn" then
            local elapsedTime = now - startTime
            local duration = endTime - startTime
            local progress = elapsedTime / duration
            
            if progress < 1 then
                pos = {interpolateBetween(20 - 80, sy - 305 - (47 * 1), 0, 20, sy - 305 - (47 * 1), 0, progress, 'OutQuad')}
                alpha = {interpolateBetween(0,0,0, 220,255,0, progress, 'OutQuad')}
            else
                alpha = {220, 255, 0}
                pos = {20, sy - 305 - (47 * 1), 0}
                cache[k]["now"] = getTickCount()
                cache[k]["end"] = getTickCount() + showtime
                cache[k]["state"] = "timeLineStart"
            end
        elseif state == "timeLineStart" then
            alpha = {220, 255, 0}
            pos = {20, sy - 305 - (47 * 1), 0}
            local elapsedTime = now - startTime
            local duration = endTime - startTime
            local progress = elapsedTime / duration
            
            if customProg and customProg[1] and customProg[2] then
                progress = customProg[2] / customProg[1] -- now / max
            end
            
            timeLine = true
            
            timeLineProg = progress
            if progress >= 1 then
                cache[k]["now"] = getTickCount()
                cache[k]["end"] = getTickCount() + 1600
                cache[k]["state"] = "fadeOut"
            end
        elseif state == "fadeOut" then
            timeLine = true
            local now = getTickCount()
            local elapsedTime = now - startTime
            local duration = endTime - startTime
            local progress = elapsedTime / duration
            
            pos = {interpolateBetween(20, sy - 305 - (47 * 1), 0, 20, sy - 305 - (47 * 1), 0, progress, 'OutQuad')}
            alpha = {interpolateBetween(220, 255,0, 0,0,0, progress, 'OutQuad')}

            if progress >= 0.95 then
                table.remove(cache, k)
                if #cache <= 0 then
                    if renderState then
                        renderState = false
                        removeEventHandler("onClientRender", root, drawnBoxes)
                        destroyRender("drawnBoxes")
                    end
                end
            end
        end
        
        local boxWidth = length + 80
        dxDrawRectangle(pos[1], pos[2], boxWidth, 50, tocolor(22, 22, 22, 150, alpha[1]),true)
        dxDrawText(msg, pos[1] + 55 + 10, pos[2] + 26, 0, 0, tocolor(156, 156, 156, alpha[2]), 0.75, notificationFont, 'left', 'top',false,false,true,true,false)
        nowY = sy - 305 - (47 * 1) + between
        dxDrawText(details[type][1], pos[1] + 55 + 10, pos[2] + 10, 0, 0, tocolor(255, 255, 255, alpha[2]), 0.75, notificationFontBold, 'left', 'top',false,false,true,false,false)
        dxDrawImage(pos[1] + 10, pos[2] + 10, 30, 30, 'files/notificationIcons/'..details[type][2]..'.png', 0,0,0, tocolor(r, g, b, alpha[2]),true)
        
        if timeLine then
            timeLineSize = interpolateBetween(boxWidth, 0,0, 0, 0,0, timeLineProg or 1, customProg and "Linear" or 'OutQuad')
        else
            timeLineSize = boxWidth
        end
        dxDrawRectangle(pos[1], pos[2] + 48, timeLineSize, 2, tocolor(r, g, b, alpha[2]),true)
        
        nowY = sy - 305 - (47 * 1) + 35
    end
end

 

Edited by Danttas
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...