Jump to content

Name Tag


TorNix~|nR

Recommended Posts

Hello guys, I'm using custom nametag show

when I use player invisibility (setElementAlpha)

The nametag doesn't disabled, only it works on default nametag

Invisible Code

    setElementAlpha(source, 0)
	    setPlayerNametagShowing(source, false)

Help please?

Edited by TorNix~|nR
Link to comment
srfont = dxCreateFont("tag.ttf",13)

g_Root = getRootElement()
g_ResRoot = getResourceRootElement(getThisResource())
g_Players = getElementsByType('player')
g_Me = getLocalPlayer()
 
nametag = {}
local nametags = {}
local g_screenX,g_screenY = guiGetScreenSize()
local bHideNametags = false
 
local NAMETAG_SCALE = 0.5 --Overall adjustment of the nametag, use this to resize but constrain proportions
local NAMETAG_ALPHA_DISTANCE = 5--Distance to start fading out
local NAMETAG_DISTANCE = 50--Distance until we're gone
local NAMETAG_ALPHA = 50--The overall alpha level of the nametag
--The following arent actual pixel measurements, they're just proportional constraints
local NAMETAG_TEXT_BAR_SPACE = 5
local NAMETAG_WIDTH = 50 
local NAMETAG_HEIGHT = 5
local NAMETAG_WIDTH2 = 50 
local NAMETAG_HEIGHT2 = 3.5
local NAMETAG_TEXTSIZE = 0.3
local NAMETAG_TEXTSIZE2 = 0.2
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
 

    function creaTagDx ()
        -- Hideous quick fix --
        for i,player in ipairs(g_Players) do
            if isElement(player) then
                if player ~= g_Me then
                    setPlayerNametagShowing ( player, false )
                    if not nametags[player] then
                        if not getElementData(player,"Tag") then
                        nametag.create ( player )
                        else
                        nametag.destroy ( player )
                        --cancelEvent()
                    end
                end
            end
        end
    end
        if bHideNametags then
            return
        end
        local x,y,z = getCameraMatrix()
   
        for player in pairs(nametags) do
            while true do
                if not isElement(player) then break end
                if getElementData(player,"Tag") and getElementData(player,"Tag") == true then
                break
                end
                if getElementDimension(player) ~= getElementDimension(g_Me) then break end
                local px,py,pz = getElementPosition ( player )
                if processLineOfSight(x, y, z, px, py, pz, true, false, false, true, false, true) then break end
                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 = getPlayerNametagColor(player)
                    local offset = (scale) * NAMETAG_TEXT_BAR_SPACE/2
                    local w = dxGetTextWidth(getPlayerNameR(player), textscale * NAMETAG_TEXTSIZE, srfont) / 2
                    local wanted = getElementData(player, "Zombie kills")
                    dxDrawText ("ZK: [ "..tostring(wanted).." ]", sx, sy + 6, sx, sy + 6, tocolor(0,255,0,255), textscale*NAMETAG_TEXTSIZE2, srfont, "center", "bottom", false, false, false )
                    dxDrawText ( getPlayerNameR(player), sx, sy - offset, sx, sy - offset, tocolor(0,0,0,255), textscale*NAMETAG_TEXTSIZE, srfont, "center", "bottom", false, false, false )
                    dxDrawColorText ( getPlayerName(player), sx-w, sy - offset, sx, sy - offset, tocolor(r,g,b,textalpha), textscale*NAMETAG_TEXTSIZE, srfont, "center", "bottom", false, false, false )
                    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(255,0,0,50) )
-- health
                    local health
                    local p
                    local r,g
                    health = getElementHealth ( player )
                    health = math.max(health, 0)/100
                    p = -510*(health^2)
                    r,g = math.max(math.min(p + 255*health + 255, 255), 0), math.max(math.min(p + 765*health, 255), 0)
                    if health > 1.0 then
                        health = 1.0
                    end
                    dxDrawRectangle (   drawX + outlineThickness,
                                        drawY + outlineThickness,
                                        width - outlineThickness*2,
                                        height - outlineThickness*2,
                                        tocolor(0,0,0,50)
                                    )
                    dxDrawRectangle (   drawX + outlineThickness,
                                        drawY + outlineThickness,
                                        health*(width - outlineThickness*2),
                                        height - outlineThickness*2,
                                        tocolor(0,255,50,150)
                                    )       
-- ammo									
                    local drawX2 = sx - NAMETAG_WIDTH2*scale/2
                    drawY2 = sy + offset
                    local width2,height2 =  NAMETAG_WIDTH2*scale, NAMETAG_HEIGHT2*scale
                    local armor
                    local q
                    local n,k
                    armor = getPedArmor( player )
                    armor = math.max(armor, 0)/100
                    q = -510*(armor^2)
                    n,k = math.max(math.min(q + 255*armor+ 255, 255), 0), math.max(math.min(q + 765*armor, 255), 0)
                    if armor > 1.0 then
                        armor = 1.0
                    end
                   dxDrawRectangle (   drawX2 + outlineThickness,
                                        drawY2 + outlineThickness,
                                        width2 - outlineThickness*2,
                                        height2 - outlineThickness*2,
                                        tocolor(0,0,0,50)
                                    )
                    dxDrawRectangle (   drawX2 + outlineThickness,
                                        drawY2 + outlineThickness,
                                        armor*(width2 - outlineThickness*2),
                                        height2 - outlineThickness*2,
                                        tocolor(200,200,200,255)
                                    )      
                end
                break
            end
        end
    end
addEventHandler ( "onClientRender", g_Root, creaTagDx )
 
 
---------------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
)

 
-- Math functions
function math.lerp(from,to,alpha)
    return from + (to-from) * alpha
end
 
-- curve is { {x1, y1}, {x2, y2}, {x3, y3} ... }
function math.evalCurve( curve, input )
    -- First value
    if input<curve[1][1] then
        return curve[1][2]
    end
    -- Interp value
    for idx=2,#curve do
        if input<curve[idx][1] then
            local x1 = curve[idx-1][1]
            local y1 = curve[idx-1][2]
            local x2 = curve[idx][1]
            local y2 = curve[idx][2]
            -- Find pos between input points
            local alpha = (input - x1)/(x2 - x1);
            -- Map to output points
            return math.lerp(y1,y2,alpha)
        end
    end
    -- Last value
    return curve[#curve][2]
end

 function removeColorCoding ( name )
	return type(name)=='string' and string.gsub ( name, '#%x%x%x%x%x%x', '' ) or name
end

function getPlayerNameR ( player )
	return removeColorCoding ( getPlayerName ( player ) )
end


function dxDrawColorText(str, ax, ay, bx, by, color, scale, font,alignX,alignY,clip, wordBreak, postGUI)
  local pat = "(.-)#(%x%x%x%x%x%x)"
  local s, e, cap, col = str:find(pat, 1)
  local last = 1
  while s do
    if s ~= 1 or cap ~= "" then 
      local w = dxGetTextWidth(cap, scale, font)
      dxDrawText(cap, ax, ay, ax + w, by, color, scale, font,alignX,alignY,clip, wordBreak, postGUI)
      ax = ax + w
      color = tocolor(tonumber("0x"..string.sub(col, 1, 2)), tonumber("0x"..string.sub(col, 3, 4)), tonumber("0x"..string.sub(col, 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,alignX,alignY,clip, wordBreak, postGUI)
  end
end	

I'm using the invisible vehicle too, can you add it please? :)

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...