Danttas Posted November 17, 2022 Share Posted November 17, 2022 (edited) 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 November 17, 2022 by Danttas Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now