Jump to content

[AYUDA]Crear un Scoreboard con 3D


XxRomxX

Recommended Posts

El Scoreboard, usa por default, Shaders.Lo que hizo xlatino es agregar uno, y ademas, modificar como funciona el que traia por default.Yo lo se hacer, y es una tarea muy tediosa...

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?

Link to comment
El Scoreboard, usa por default, Shaders.Lo que hizo xlatino es agregar uno, y ademas, modificar como funciona el que traia por default.Yo lo se hacer, y es una tarea muy tediosa...

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?

El scoreboard, no usa shaders xD, corríjanme si me equivoco

Link to comment
  • MTA Team

Si usa.

El Scoreboard, usa por default, Shaders.Lo que hizo xlatino es agregar uno, y ademas, modificar como funciona el que traia por default.Yo lo se hacer, y es una tarea muy tediosa...

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
Link to comment
@Alexs no seas tan quejon, simplemente le señale el hecho de que era una tarea tediosa y que requeria bastante analisis.

El objetivo de este foro es que la gente aprenda y entienda las cosas, evitando confusiones, así que me quejare siempre que algún usuario haga algo que complique estos objetivos.

El scoreboard, no usa shaders xD, corríjanme si me equivoco

Tiene un archivo llamado 'rt_blend.fx' que contiene esto:

// 
// rt_blend.fx 
// 
  
  
//--------------------------------------------------------------------- 
// rt_blend settings 
//--------------------------------------------------------------------- 
texture sTexture0; 
  
  
//------------------------------------------------------------------------------------------ 
// Techniques 
//------------------------------------------------------------------------------------------ 
technique tec0 
{ 
    pass P0 
    { 
        // Set our texture 
        Texture[0] = sTexture0; 
  
        // Use additive blending 
        SrcBlend = One; 
        DestBlend = InvSrcAlpha; 
    } 
} 
  
// Fallback 
technique fallback 
{ 
    pass P0 
    { 
        // Just draw normally 
    } 
} 
  

Que tampoco es tan complejo, de todas formas, conociendo a @samt2497, hizo una scoreboard propia sin utilizar la de MTA.

Link to comment
  • Recently Browsing   0 members

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