Jump to content

race nametags


velcan1

Recommended Posts

Hi again, I have a big problem that is annoying me in the race mode.

2eusf3s.png

What you see in that pic is, that the nametag text goes up when you go far away, and thats the error im being annoying with, I want the nametag text to be over the health bar always, not go far when I move away.

This is my script

nametag = {} 
local nametags = {} 
local g_screenX,g_screenY = guiGetScreenSize() 
local bHideNametags = false 
  
local NAMETAG_SCALE = 0.3 --Overall adjustment of the nametag, use this to resize but constrain proportions 
local NAMETAG_ALPHA_DISTANCE = 50 --Distance to start fading out 
local NAMETAG_DISTANCE = 120 --Distance until we're gone 
local NAMETAG_ALPHA = 120 --The overall alpha level of the nametag 
--The following arent actual pixel measurements, they're just proportional constraints 
local NAMETAG_TEXT_BAR_SPACE = 2 
local NAMETAG_WIDTH = 50 
local NAMETAG_HEIGHT = 5 
local NAMETAG_TEXTSIZE = 0.7 
local NAMETAG_OUTLINE_THICKNESS = 1.2 
-- 
local NAMETAG_ALPHA_DIFF = NAMETAG_DISTANCE - NAMETAG_ALPHA_DISTANCE 
NAMETAG_SCALE = 1/NAMETAG_SCALE * 800 / g_screenY  
  
-- Ensure the name tag doesn't get too big 
local maxScaleCurve = { {0, 0}, {3, 3}, {13, 5} } 
-- Ensure the text doesn't get too small/unreadable 
local textScaleCurve = { {0, 0.8}, {0.8, 1.2}, {99, 99} } 
-- Make the text a bit brighter and fade more gradually 
local textAlphaCurve = { {0, 0}, {25, 100}, {120, 190}, {255, 190} } 
  
function nametag.create ( player ) 
    nametags[player] = true 
end 
  
function nametag.destroy ( player ) 
    nametags[player] = nil 
end 
  
addEventHandler ( "onClientRender", g_Root, 
    function() 
        -- Hideous quick fix -- 
        for i,player in ipairs(g_Players) do 
            if player ~= g_Me then 
                setPlayerNametagShowing ( player, false ) 
                if not nametags[player] then 
                    nametag.create ( player ) 
                end 
            end 
        end 
        if bHideNametags then 
            return 
        end 
        local x,y,z = getCameraMatrix() 
        for player in pairs(nametags) do  
            while true do 
                if not isPedInVehicle(player) or isPlayerDead(player) then break end 
                local vehicle = getPedOccupiedVehicle(player) 
                local px,py,pz = getElementPosition ( vehicle ) 
                local pdistance = getDistanceBetweenPoints3D ( x,y,z,px,py,pz ) 
                if pdistance <= NAMETAG_DISTANCE then 
                    --Get screenposition 
                    local sx,sy = getScreenFromWorldPosition ( px, py, pz+0.95, 0.06 ) 
                    if not sx or not sy then break end 
                    --Calculate our components 
                    local scale = 1/(NAMETAG_SCALE * (pdistance / NAMETAG_DISTANCE)) 
                    local alpha = ((pdistance - NAMETAG_ALPHA_DISTANCE) / NAMETAG_ALPHA_DIFF) 
                    alpha = (alpha < 0) and NAMETAG_ALPHA or NAMETAG_ALPHA-(alpha*NAMETAG_ALPHA) 
                    scale = math.evalCurve(maxScaleCurve,scale) 
                    local textscale = math.evalCurve(textScaleCurve,scale) 
                    local textalpha = math.evalCurve(textAlphaCurve,alpha) 
                    local outlineThickness = NAMETAG_OUTLINE_THICKNESS*(scale) 
                    --Draw our text 
                    local r,g,b = 255,255,255 
                    local team = getPlayerTeam(player) 
                    if team then 
                        r,g,b = getTeamColor(team) 
                    end 
                    local offset = (scale) * NAMETAG_TEXT_BAR_SPACE/2 
                    dxDrawText ( _getPlayerName(player), sx-30, sy-40 + offset, sx, sy, tocolor(r,g,b,textalpha), textscale*NAMETAG_TEXTSIZE, "default", "center", "bottom", false, false, false ) 
                    --We draw three parts to make the healthbar.  First the outline/background 
                    local drawX = sx - NAMETAG_WIDTH*scale/2 
                    drawY = sy + offset 
                    local width,height =  NAMETAG_WIDTH*scale, NAMETAG_HEIGHT*scale 
                    dxDrawRectangle ( drawX, drawY, width, height, tocolor(0,0,0,alpha) ) 
                    --Next the inner background  
                    local health = getElementHealth(vehicle) 
                    health = math.max(health - 250, 0)/750 
                    local p = -510*(health^2) 
                    local r,g = math.max(math.min(p + 255*health + 255, 255), 0), math.max(math.min(p + 765*health, 255), 0) 
                    dxDrawRectangle (   drawX + outlineThickness,  
                                        drawY + outlineThickness,  
                                        width - outlineThickness*2,  
                                        height - outlineThickness*2,  
                                        tocolor(r,g,0,0.4*alpha)  
                                    ) 
                    --Finally, the actual health 
                    dxDrawRectangle (   drawX + outlineThickness,  
                                        drawY + outlineThickness,  
                                        health*(width - outlineThickness*2),  
                                        height - outlineThickness*2,  
                                        tocolor(r,g,0,alpha)  
                                    )            
                end 
                break 
            end 
        end 
    end 
) 
  
  
---------------THE FOLLOWING IS THE MANAGEMENT OF NAMETAGS----------------- 
addEventHandler('onClientResourceStart', g_ResRoot, 
    function() 
        for i,player in ipairs(getElementsByType"player") do 
            if player ~= g_Me then 
                nametag.create ( player ) 
            end 
        end 
    end 
) 
  
addEventHandler ( "onClientPlayerJoin", g_Root, 
    function() 
        if source == g_Me then return end 
        setPlayerNametagShowing ( source, false ) 
        nametag.create ( source ) 
    end 
) 
  
addEventHandler ( "onClientPlayerQuit", g_Root, 
    function() 
        nametag.destroy ( source ) 
    end 
) 
  
  
addEvent ( "onClientScreenFadedOut", true ) 
addEventHandler ( "onClientScreenFadedOut", g_Root, 
    function() 
        bHideNametags = true 
    end 
) 
  
addEvent ( "onClientScreenFadedIn", true ) 
addEventHandler ( "onClientScreenFadedIn", g_Root, 
    function() 
        bHideNametags = false 
    end 
) 
  
  

If someone could help me please.

Link to comment

I checked it fast so i dont really know if its right or not.. but i believe its from the sy-40 + offset in this:

dxDrawText ( _getPlayerName(player), sx-30, sy-40 + offset, sx, sy, tocolor(r,g,b,textalpha), textscale*NAMETAG_TEXTSIZE, "default", "center", "bottom", false, false, false )

so try this:

dxDrawText ( _getPlayerName(player), sx, sy, g_screenX, g_screenY, tocolor(r,g,b,textalpha), textscale*NAMETAG_TEXTSIZE, "default", "center", "bottom", false, false, false )

and see how it works.. and then edit your:

local sx,sy = getScreenFromWorldPosition ( px, py, pz+0.95, 0.06 )

to change position of the nametags.

Link to comment

Sorry for late response..

You could either use getScreenFromWorldPosition two times, one for nametags and one for healthbar, or do the same thing i did by using dxGetFontHeight and for healthbar position y, using sy + fontHeight*(anynumber).

Link to comment
  • 5 months later...
nametag = {} 
local nametags = {} 
local g_screenX,g_screenY = guiGetScreenSize() 
local bHideNametags = false 
  
local NAMETAG_SCALE = 0.3 --Overall adjustment of the nametag, use this to resize but constrain proportions 
local NAMETAG_ALPHA_DISTANCE = 50 --Distance to start fading out 
local NAMETAG_DISTANCE = 120 --Distance until we're gone 
local NAMETAG_ALPHA = 120 --The overall alpha level of the nametag 
--The following arent actual pixel measurements, they're just proportional constraints 
local NAMETAG_TEXT_BAR_SPACE = 2 
local NAMETAG_WIDTH = 50 
local NAMETAG_HEIGHT = 5 
local NAMETAG_TEXTSIZE = 0.3 
local NAMETAG_OUTLINE_THICKNESS = 1.2 
-- 
local NAMETAG_ALPHA_DIFF = NAMETAG_DISTANCE - NAMETAG_ALPHA_DISTANCE 
NAMETAG_SCALE = 1/NAMETAG_SCALE * 800 / g_screenY 
  
-- Ensure the name tag doesn't get too big 
local maxScaleCurve = { {0, 0}, {3, 3}, {13, 5} } 
-- Ensure the text doesn't get too small/unreadable 
local textScaleCurve = { {0, 0.8}, {0.8, 1.2}, {99, 99} } 
-- Make the text a bit brighter and fade more gradually 
local textAlphaCurve = { {0, 0}, {25, 100}, {120, 190}, {255, 190} } 
  
function nametag.create ( player ) 
    nametags[player] = true 
end 
  
function nametag.destroy ( player ) 
    nametags[player] = nil 
end 
  
---------------THE FOLLOWING IS THE MANAGEMENT OF NAMETAGS----------------- 
addEventHandler('onClientResourceStart', g_ResRoot, 
    function() 
        for i,player in ipairs(getElementsByType"player") do 
            if player ~= g_Me then 
                nametag.create ( player ) 
            end 
        end 
    end 
) 
  
addEventHandler ( "onClientPlayerJoin", g_Root, 
    function() 
        if source == g_Me then return end 
        setPlayerNametagShowing ( source, false ) 
        nametag.create ( source ) 
    end 
) 
  
addEventHandler ( "onClientPlayerQuit", g_Root, 
    function() 
        nametag.destroy ( source ) 
    end 
) 
  
  
addEvent ( "onClientScreenFadedOut", true ) 
addEventHandler ( "onClientScreenFadedOut", g_Root, 
    function() 
        bHideNametags = true 
    end 
) 
  
addEvent ( "onClientScreenFadedIn", true ) 
addEventHandler ( "onClientScreenFadedIn", g_Root, 
    function() 
        bHideNametags = false 
    end 
) 
  
  
  
addEventHandler ( "onClientRender", g_Root, 
    function() 
        -- Hideous quick fix -- 
        for i,player in ipairs(g_Players) do 
                setPlayerNametagShowing ( player, false ) 
                if not nametags[player] then 
                    nametag.create ( player ) 
                end 
        end 
        if bHideNametags then 
            return 
        end 
        local x,y,z = getCameraMatrix() 
        for player in pairs(nametags) do 
            while true do 
                if not isPedInVehicle(player) or isPlayerDead(player) then break end 
                local vehicle = getPedOccupiedVehicle(player) 
                local px,py,pz = getElementPosition ( vehicle ) 
                local pdistance = getDistanceBetweenPoints3D ( x,y,z,px,py,pz ) 
                if pdistance <= NAMETAG_DISTANCE then 
                    --Get screenposition 
                    local sx,sy = getScreenFromWorldPosition ( px, py, pz+0.95, 0.06 ) 
                    if not sx or not sy then break end 
                    --Calculate our components 
                    local scale = 1/(NAMETAG_SCALE * (pdistance / NAMETAG_DISTANCE)) 
                    local alpha = ((pdistance - NAMETAG_ALPHA_DISTANCE) / NAMETAG_ALPHA_DIFF) 
                    alpha = (alpha < 0) and NAMETAG_ALPHA or NAMETAG_ALPHA-(alpha*NAMETAG_ALPHA) 
                    scale = math.evalCurve(maxScaleCurve,scale) 
                    local textscale = math.evalCurve(textScaleCurve,scale) 
                    local textalpha = math.evalCurve(textAlphaCurve,alpha) 
                    local outlineThickness = NAMETAG_OUTLINE_THICKNESS*(scale) 
                    --Draw our text 
                    local r,g,b = 255,255,255 
                    local team = getPlayerTeam(player) 
                    if team then 
                        r,g,b = getTeamColor(team) 
                    end 
                    local offset = (scale) * NAMETAG_TEXT_BAR_SPACE/2 
                    --dxDrawText ( getPlayerName(player), sx, sy - offset, sx, sy - offset, tocolor(r,g,b,textalpha), textscale*NAMETAG_TEXTSIZE, "default", "center", "bottom", false, false, false ) 
                    dxDrawText ( getPlayerName(player), sx + 1, sy - offset + 1, sx + 1, sy - offset + 1, tocolor(0,0,0,255), textscale*NAMETAG_TEXTSIZE, "bankgothic", "center", "bottom", false, false, false ) 
                    dxDrawColorText( getPlayerNametagText(player), sx, sy - offset, sx, sy - offset, tocolor(r,g,b,textalpha), textscale*NAMETAG_TEXTSIZE, 'bankgothic', 'center', 'bottom' ) 
                    --We draw three parts to make the healthbar.  First the outline/background 
                    local drawX = sx - NAMETAG_WIDTH*scale/2 
                    drawY = sy + offset 
                    local width,height =  NAMETAG_WIDTH*scale, NAMETAG_HEIGHT*scale 
                    dxDrawRectangle ( drawX, drawY, width, height, tocolor(0,0,0,alpha) ) 
                    --Next the inner background 
                    local health = getElementHealth(vehicle) 
                    health = math.max(health - 250, 0)/750 
                    local p = -510*(health^2) 
                    local r,g = math.max(math.min(p + 255*health + 255, 255), 0), math.max(math.min(p + 765*health, 255), 0) 
                    
          dxDrawRectangle (     drawX + outlineThickness, 
                                        drawY + outlineThickness, 
                                        width - outlineThickness*2, 
                                        height - outlineThickness*2, 
                                        tocolor(178,178,178,0.4*alpha) 
                                    ) 
                    --Finally, the actual health 
          
                    dxDrawRectangle (   drawX + outlineThickness, 
                                        drawY + outlineThickness, 
                                        health*(width - outlineThickness*2), 
                                        height - outlineThickness*2, 
                                        tocolor(0,128,255,alpha) 
                                    )           
                end 
                break 
            end 
        end 
    end 
) 
  
function dxDrawColorText(str, ax, ay, bx, by, color, scale, font, alignX, alignY) 
  if alignX then 
    if alignX == "center" then 
      local w = dxGetTextWidth(str:gsub("#%x%x%x%x%x%x",""), scale, font) 
      ax = ax + (bx-ax)/2 - w/2 
    elseif alignX == "right" then 
      local w = dxGetTextWidth(str:gsub("#%x%x%x%x%x%x",""), scale, font) 
      ax = bx - w 
    end 
  end 
  
  if alignY then 
    if alignY == "center" then 
      local h = dxGetFontHeight(scale, font) 
      ay = ay + (by-ay)/2 - h/2 
    elseif alignY == "bottom" then 
      local h = dxGetFontHeight(scale, font) 
      ay = by - h 
    end 
  end 
  
  local pat = "(.-)#(%x%x%x%x%x%x)" 
  local s, e, cap, col = str:find(pat, 1) 
  local last = 1 
  while s do 
    if cap == "" and col then color = tocolor(tonumber("0x"..col:sub(1, 2)), tonumber("0x"..col:sub(3, 4)), tonumber("0x"..col:sub(5, 6)), 255) end 
    if s ~= 1 or cap ~= "" then 
      local w = dxGetTextWidth(cap, scale, font) 
      dxDrawText(cap, ax, ay, ax + w, by, color, scale, font) 
      ax = ax + w 
      color = tocolor(tonumber("0x"..col:sub(1, 2)), tonumber("0x"..col:sub(3, 4)), tonumber("0x"..col:sub(5, 6)), 255) 
    end 
    last = e + 1 
    s, e, cap, col = str:find(pat, last) 
  end 
  if last <= #str then 
    cap = str:sub(last) 
    local w = dxGetTextWidth(cap, scale, font) 
    dxDrawText(cap, ax, ay, ax + w, by, color, scale, font) 
  end 
end 

Link to comment
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

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