aka Blue Posted July 26, 2016 Share Posted July 26, 2016 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 . 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
MisterQuestions Posted July 28, 2016 Share Posted July 28, 2016 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
aka Blue Posted July 28, 2016 Author Share Posted July 28, 2016 ¿Podrías darme un ejemplo? Link to comment
MisterQuestions Posted July 28, 2016 Share Posted July 28, 2016 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
Recommended Posts