Si usa.
Una respuesta tan ambigua es inútil e incluso innecesaria, ¿Por que no le haces el favor a @XxRomxX y al resto de posibles interesados de exponerles el proceso tan tedioso que utilizarías?
Para guiarte, te mostrare como modifique el parte del manejo del shader en dxscrorebard_rt.lua : (de igual manera, debes modificar algunas cosas en el dxscoreboard_client.lua.)
openedon = 1 shouldDraw = false local shaderset = {} animtime = 900 shaderset.RotateZ = 0 shaderset.PersCenterOffsetX = 0 shaderset.PersCenterOffsetY = 0 shaderset.sHighlightOffset = 1.75 shaderset.RotateY = 355 shaderset.TesselateX = 50 shaderset.sWaveSize = 0.154 shaderset.TesselateY = 8 shaderset.Size = 0.2 shaderset.RotateX = 10 shaderset.PosY = 0.87 shaderset.sWaveFreq = 2 shaderset.Alpha = 255 shaderset.sHighlightAmount = 0.78 shaderset.PersCenIsScreen = 0 shaderset.sWireframe = 0 shaderset.RotCenterOffsetY = 0 shaderset.RotCenterOffsetZ = 0 shaderset.RotCenIsScreen = 0 shaderset.RotCenterOffsetX = 0 shaderset.sWaveSpeed = 10 shaderset.PosX = 0.93 local swareached = 0 overAvatar = false local sw, sh = guiGetScreenSize() local rtShader, rt local lastUpdateTime = 0 addEventHandler("onClientResourceStart", resourceRoot, function(resource) rtShader = dxCreateShader("rt_blend.fx") avShader = dxCreateShader("rt_blend.fx") end) function drawScoreboard() cursorCache = {} if #savedRowsNext > 0 then savedRows = savedRowsNext savedRowsNext = {} end if not scoreboardDrawn then bForceUpdate = true end local bUpdate = false if getTickCount() - lastUpdateTime > 1000 or bForceUpdate then bUpdate = true bForceUpdate = false lastUpdateTime = getTickCount() end local sX, sY = getRequiredRtSize() if rt then local rX, rY = dxGetMaterialSize(rt) if sX ~= rX or sY ~= rY then destroyElement(rt) rt = nil end end if not rt then rt = dxCreateRenderTarget(sX, sY, true) bUpdate = true end if not rt then doDrawScoreboard(false, false, guiGetScreenSize()) return end local newRowIdx = getCursorOverRow(true) if newRowIdx ~= lastRowIdx then lastRowIdx = newRowIdx bUpdate = true end doDrawScoreboard(true, true, guiGetScreenSize()) if bUpdate then dxSetRenderTarget(rt, true) local drawOverGUISaved = drawOverGUI drawOverGUI = false doDrawScoreboard(true, false, getRequiredRtSize()) drawOverGUI = drawOverGUISaved dxSetRenderTarget() end local percent = math.max(math.min(getTickCount() - openedon, animtime), 0) / animtime if not scoreboardToggled then percent = percent * -1 end if percent <= -1 then shouldDraw = false return else shouldDraw = true end local deltaroty = shaderset.RotateY - 270 local offput = deltaroty * percent if percent < 0 then offput = swareached + swareached * percent else swareached = offput end local x, y = scoreboardGetTopCornerPosition() local rotarget = 270 + offput dxSetShaderValue(rtShader, "sTexture0", rt) if overAvatar then local ufcent = 0 if percent > 0 then ufcent = percent else ufcent = 1 + percent end dxSetShaderValue(avShader, "sTexture0", overAvatar[1]) dxSetShaderTransform(avShader, 450 - 105 * ufcent, 0, shaderset.RotateZ, 1, 0, shaderset.RotCenterOffsetZ, shaderset.RotCenIsScreen > 0.5, shaderset.PersCenterOffsetX, shaderset.PersCenterOffsetY, 0.5 < shaderset.PersCenIsScreen) dxDrawImage(overAvatar[2] * 0.25, sh * 0.5 - overAvatar[3] * 0.5, overAvatar[2], overAvatar[3], avShader, 0, 0, 0, tocolor(255, 255, 255), drawOverGUI) end dxSetShaderTransform(rtShader, shaderset.RotateX, rotarget, shaderset.RotateZ, shaderset.RotCenterOffsetX, 1, shaderset.RotCenterOffsetZ, shaderset.RotCenIsScreen > 0.5, shaderset.PersCenterOffsetX, shaderset.PersCenterOffsetY, 0.5 < shaderset.PersCenIsScreen) if x then dxDrawImage(x, y, sX, sY, rtShader, 0, 0, 0, tocolor(255, 255, 255), drawOverGUI) end end function reescale(x, y, sx, sy, scale) x = x - (x * scale - x) y = y - (y * scale - y) sx = sx * scale sy = sy * scale return x, y, sx, sy end function getRequiredRtSize() local sX, sY = calculateWidth(), calculateHeight() if not sX then sX, sY = guiGetScreenSize() else sY = sY + 30 end return math.floor(sX), math.floor(sY) end cursorCache = {} function getCursorScoreboardPosition(rtPass) if #cursorCache == 0 then local cX, cY = getCursorPosition() local sX, sY = guiGetScreenSize() cX, cY = cX * sX, cY * sY if rtPass then local x, y = scoreboardGetTopCornerPosition() cX, cY = cX - x, cY - y end cursorCache = {cX, cY} end return unpack(cursorCache) end savedRowsNext = {} savedRows = {} function checkCursorOverRow(rtPass, xl, xh, yl, yh) if isCursorShowing() then savedRowsNext[#savedRowsNext + 1] = { xl, xh, yl, yh } local cX, cY = getCursorScoreboardPosition(rtPass) if xl <= cX and xh >= cX and yl <= cY and yh >= cY then return true end end return false end function getCursorOverRow(rtPass) if isCursorShowing() then local cX, cY = getCursorScoreboardPosition(rtPass) for idx, row in ipairs(savedRows) do if cX >= row[1] and cX <= row[2] and cY >= row[3] and cY <= row[4] then return idx end end end return false end local bAddFakePlayers = false local bAllowFPlayers = true if bAllowFPlayers then _getElementsByType = getElementsByType _getElementType = getElementType _getPlayerTeam = getPlayerTeam _getPlayerNametagColor = getPlayerNametagColor _getPlayersInTeam = getPlayersInTeam _getPlayerName = getPlayerName _getPlayerPing = getPlayerPing function getElementsByType(type) local results = _getElementsByType(type) if type == "player" then for k, fp in ipairs(_getElementsByType("fplayer")) do results[#results + 1] = fp end end return results end function getPlayerTeam(player) if isElement(player) then if _getElementType(player) == "fplayer" then return getElementData(player, "team") else return _getPlayerTeam(player) end else return false end end function getElementType(elem) local trtype = _getElementType(elem) if trtype == "fplayer" then trtype = "player" end return trtype end function getPlayerNametagColor(plr) if _getElementType(plr) == "fplayer" then return 255, 255, 255, 255 end return _getPlayerNametagColor(plr) end function getPlayersInTeam(team) local trlist = _getPlayersInTeam(team) for k, fp in ipairs(_getElementsByType("fplayer")) do if getElementData(fp, "team") == team then trlist[#trlist + 1] = fp end end return trlist end function getPlayerName(player) if _getElementType(player) == "fplayer" then return tostring(getElementData(player, "name")) end return _getPlayerName(player) end function getPlayerPing(player) if _getElementType(player) == "fplayer" then return math.random(10, 100) end return _getPlayerPing(player) end end if bAddFakePlayers then do local numberOfTeams = 4 local numberOfPlayersPerTeam = 20 _getElementsByType = getElementsByType function getElementsByType(type) local results = _getElementsByType(type) if type == "player" then results = {} for t = 1, numberOfTeams do for p = 1, numberOfPlayersPerTeam do results