Jump to content

Texto encima de la cabeza de un jugador


aka Blue

Recommended Posts

Buenas, estuve intentando de mil y una formas hacer lo siguiente pero nada, no encuentro manera. A ver, lo que quiero hacer es que al escribir un mensaje en el chat, salga un texto encima del hueso de la cabeza del jugador, el problema es que, cuando yo lo pongo, se le pone a todos los jugadores en la cabeza y no solo a mi...

Aquí dejo el código, es bastante sencillo la verdad, arreglé un pequeño ejemplo de la wiki:

local fuente = dxCreateFont ( "Lato-Light.ttf", 12 ) 
local mensaje, tipo 
local localPlayer = getLocalPlayer( ) 
local disponible = true 
function eliminarMensaje( ) timer = setTimer( function ( ) mensaje = " " tipo = nil end, 1000, 1 ) end 
  
addCommandHandler( "toggletextos", 
    function( ) 
        if disponible == false then 
            addEventHandler( "onClientRender", root, dibujar_names ) 
            disponible = true 
        else 
            removeEventHandler( "onClientRender", root, dibujar_names ) 
            disponible = false 
        end 
    end 
) 
  
addEvent( "onChat", true ) 
addEventHandler( "onChat", getRootElement( ), 
    function( message, type ) 
        if message and type then 
            eliminarMensaje( ) 
            mensaje = message 
            tipo = type 
        end 
    end 
) 
  
function dibujar_names( ) 
    local px, py, pz, tx, ty, tz 
    local jugadores = getElementsByType( 'player' ) 
    px, py, pz = getCameraMatrix( ) 
    tx, ty, tz = getElementPosition( localPlayer ) 
    for i=1, #jugadores do 
        local v = jugadores[ i ] 
        if getDistanceBetweenPoints3D( tx, ty, tz, getElementPosition( v ) ) <= 8 then 
            if isLineOfSightClear( px, py, pz, tx, ty, tz, true, false, false, true, false, false, false,localPlayer ) then 
                local sx, sy, sz = getPedBonePosition( v, 6 ) 
                local x, y = getScreenFromWorldPosition( sx, sy, sz + 0.3 ) 
                    if x then -- getScreenFromWorldPosition returns false if the point isn't on screen 
                    dxDrawText( getPlayerName( v ):gsub("_"," "), x, y-7+2, x, y, tocolor(0, 0, 0), 1, fuente, "center", "center" ) 
                    dxDrawText( getPlayerName( v ):gsub("_"," "), x, y-7, x, y, tocolor(255, 255, 255), 1, fuente, "center", "center" ) 
                    if isChatBoxInputActive() and not isTimer( timer ) then 
                        dxDrawText( "Hablando o actuando...", x, y+43+2, x, y, tocolor(0, 0, 0), 0.7, fuente, "center", "center" ) 
                        dxDrawText( "Hablando o actuando... ", x, y+43, x, y, tocolor(255, 255, 255), 0.7, fuente, "center", "center" ) 
                    end 
                    if isConsoleActive() and not isTimer( timer ) then 
                        dxDrawText( "Consola abierta...", x, y+43+2, x, y, tocolor(0, 0, 0), 0.7, fuente, "center", "center" ) 
                        dxDrawText( "Consola abierta... ", x, y+43, x, y, tocolor(255, 255, 255), 0.7, fuente, "center", "center" )                  
                    end 
                    if tipo == 0 then 
                        dxDrawText( "> "..mensaje, x, y+43+2, x, y, tocolor(0, 0, 0), 0.7, fuente, "center", "center" ) 
                        dxDrawText( "> "..mensaje, x, y+43, x, y, tocolor(255, 255, 255), 0.7, fuente, "center", "center" ) 
                    elseif tipo == 1 then 
                        dxDrawText( "*"..getPlayerName(v):gsub("_"," ").." "..mensaje, x, y+43+2, x, y, tocolor(0, 0, 0), 0.7, fuente, "center", "center" ) 
                        dxDrawText( "*"..getPlayerName(v):gsub("_"," ").." "..mensaje, x, y+43, x, y, tocolor(255, 0, 0), 0.7, fuente, "center", "center" ) 
                    else 
                        dxDrawText( "", x, y+18, x, y, tocolor(255, 0, 0), 2, fuente, "center", "center" ) 
                    end 
                end 
            end 
        end 
    end 
end 
addEventHandler( "onClientRender", root, dibujar_names ) 

El triggeo:

addEventHandler( "onPlayerChat", getRootElement(), 
    function( message, type ) 
        if type == 0 then 
            triggerClientEvent( source, "onChat", source, message, 0 ) 
        elseif type == 1 then 
            triggerClientEvent( source, "onChat", source, message, 1 )       
        end 
    end 
) 

Como se aprecia, por ejemplo al yo escribir un mensaje, se trigea el evento al cliente y le crea un texto encima del hueso de la cabeza del jugador. El problema está en que se lo dibuja a todos xD.

PD: Mi error puede ser una tontería pero es que no encuentro manera. Quizás sea por el loop, pero intenté de todo y nada.

Link to comment

Deja el onClientRender activo, no creo haya tanto problema.

Puedes usar una tabla para poner messages[player♥ = {...}

Y haga render a todos los mensajes.

Obviamente has que se vayan removiendo despues de un tiempo.

Si la tabla esta vacia al final, usa messages[player] = nil y asi checas si tienes que hacer render a ese jugador.

o igual si ese jugador tiene #messages[player] ~= 0 entonces dibuje lo que haya.

No sé si me explique bien...

Link to comment

Hmmm okay...

Tal vez no sea lo correcto.

Pero ten una base.

No solo copies y pegues.

Entiende un poco el código así aprendes & se te facilita en el futuro :)

  
local messages = {} 
  
function onChatted(message,type) 
    if not messages[source] then 
        messages[source] = {} 
    end 
     
    table.insert(messages[source],{ 
        tick = getTickCount(), 
        message = message, 
        type = type, 
    }) 
     
end 
addEvent("server:sendedChat",true) 
addEventHandler("server:sendedChat",root,onChatted) 
  
function onQuit() 
    if messages[source] then 
        messages[source] = nil 
    end 
end 
addEventHandler("onClientPlayerQuit",root,onQuit) 
  
function onRender() 
     
    for _,player in pairs(getElementsByType("player")) do 
        local messages = messages[player] 
         
        -- blah. 
        -- loopea los messages & dibujalos. 
        -- con el tick despues de cierto tiempo has que se remuevan. (getTickCount() - message.tick > tiempo_max debería funcionar) 
         
         
    end 
     
end 
addEventHandler("onClientRender",root,onRender) 
  

Link to comment
  • Recently Browsing   0 members

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