Jump to content

[ AJUDA] onClientRender Texto


Recommended Posts

Estou usando onClientRender para aparecer um dxDrawText em meu painel , pois ele mostra um valor do server-side. Com isto , ao abrir o painel , esse texto não para de piscar(trazendo o valor varias vezes), mas se eu usar addCommandHandler ele aparece apenas um vez. Gostaria de manter o texto em meu painel , apenas removendo ele ao utilizar removeEventHandler para fechar o painel.

Link to comment

No server-side esta assim :

function vehicleTime()
	local account = getPlayerAccount(source)
	if not isGuestAccount(account) then
		local vehicleState,vehicleTime = false,"NOT AVAILABLE"
		if getAccountData(account,"vehicleEnabled") == 1 then
			local vehicleTime = tonumber(getAccountData(account,"vehicleVIP"))
			if vehicleTime then
				local currentTime = getRealTime()
				if vehicleTime > currentTime.timestamp then
					local vehicleState,vehicleTime = true,convertMS(vehicleTime-currentTime.timestamp)					
					triggerClientEvent(source,"vehicleTempo",source,vehicleTime )
				end
			end
		end
	end
end
addEvent("vehicleTime",true) 
addEventHandler("vehicleTime",getRootElement(),vehicleTime) 

E no client-side assim :

panel = false

function vehicleTempo(vehicleTime) 	 
	dxDrawText("Seu Carro VIP expira em "..(tostring(vehicleTime) or 'BUGGED').."", screenW * 0.3309, screenH * 0.7227, screenW * 0.4191, screenH * 0.7461, tocolor(255, 255, 255, 255), 1.00, "default", "left", "top", false, false, true, true, false)
end 
addEvent("vehicleTempo",true) 
addEventHandler("vehicleTempo",getRootElement(),vehicleTempo) 
	  

function vehicleShow() 
	triggerServerEvent("vehicleTime",getLocalPlayer()) 
end 
addEventHandler("vehicleShow",getRootElement(),vehicleShow)

function dxPanel ()
    dxDrawImage(screenW * 0.2859, screenH * 0.1546, screenW * 0.4552, screenH * 0.6074, "image/wallpaper.png", 0, 0, 0, tocolor(255, 255, 255, 255), false)
end

function abrirPanel()
	if panel == false then
		if not fontScale then fontScale = screenW/40 end
		showCursor(true)
		panel = true
		addEventHandler("onClientRender", getRootElement(), dxPanel)
		addEventHandler("onClientRender", getRootElement(), vehicleShow)
	else
		showCursor(false)
		panel = false
		removeEventHandler("onClientRender", getRootElement(), dxPanel)
		removeEventHandler("onClientRender", getRootElement(), vehicleShow)
	end
end
addEvent("abrirPanel", true)
addEventHandler("abrirPanel", getRootElement(), abrirPanel)

function fecharPanel()
	if panel == false then
		removeEventHandler("onClientRender", getRootElement(), dxPanel)
		removeEventHandler("onClientRender", getRootElement(), vehicleShow)
		showCursor(false)
		panel = false
	end
end
bindKey("o", "down", fecharPanel)
addEvent("abrirPanel", true)
addEventHandler("abrirPanel", getRootElement(), fecharPanel)

 

Link to comment

O que você enviou, foi todo o código do seu script, ou está pela metade?

Bom, envie todo o código, para podermos te ajudar, e creio que há uma forma mais otimizada de fazer isto.

Você está usando um evento de onClientRender, onde o mesmo vai envia quase 400 envios para o server-side em 1 ms.

On 25/04/2020 at 10:41, MesaDowN said:

Acabei de descobrir que se aumentar o FPS Limit do server mais que 40 o texto não para de piscar , mas seu manter abaixo de 40 ele fica estático. Qual seria o problema?

INFO WIKI : https://wiki.multitheftauto.com/wiki/OnClientRender

Atenção

Este evento e onClientPreRender acionarão qualquer função à qual ele esteja anexado a cada quadro. Dependendo do FPS máximo do servidor e da capacidade do seu computador - você pode acabar acionando a função 30 a 60 vezes por segundo .

Como resultado, esse evento pode causar um atraso grave e / ou até travar se não for usado com cautela.

 

Edited by Angelo Pereira
  • Thanks 1
Link to comment

O que enviei , é a parte que adicionei ao meu código procurando(estudando) aqui pelo forum .

Basicamente estou colocando um texto no painel dx , onde mostra quanto tempo falta para acabar o carro vip , buscando na conta do jogador o tempo e mostrando visualmente ao painel.

O código funcionou certinho , buscou o tempo do jogador , converteu em dias e horas e mostrou no painel , mas o texto fica piscando quando aumento o FPS Limit do server , seria um incomodo ao utilizar este painel.

 

 

Link to comment
  • Moderators

O problema é que você não está renderizando a função vehicleTempo, em vez disso, você adicionou o render em uma função que vai chamar um evento do lado server, este evento, por sua vez, chamará o evento do dx, no lado cliente. Essa é a pior forma de manter o texto na tela... Um dos piores erros em script que já vi.

Quando chamar o evento "vehicleTempo" adicione o evento "onClientRender" para o dxDrawText, use uma outra função para o dxDrawText, dependendo da lógica do seu código, você pode colocá-lo na função dxPanel.

Edit:

42 minutes ago, Angelo Pereira said:

Você está usando um evento de onClientRender, onde o mesmo vai envia quase 400 envios para o server-side em 1 ms.

Não, não chegará a esse ponto de 400 vezes em 1ms (Lol), mas será muito e péssimo para a performance. Seria na verdade umas 30-60 chamadas por segundo (dependendo do FPS), pois é assim que a renderização do jogador funciona. onClientRender só é chamado quando o quadro do jogo do cliente é atualizado.

  • Like 1
  • Thanks 1
Link to comment

Obrigado a todos ! @DNL291Muito obrigado pela ajuda e orientação , mas não entendi bem o que disse para fazer .

Fiz da seguinte forma , mas ele não esta conseguindo obter o valor vehicleVIP , no dx esta me dando nil .

No server-side retirei o evento chamando o vehicleTempo.

E no client-side fiz assim:

panel = false

function vehicleShow() 
	triggerServerEvent("vehicleTime",getLocalPlayer()) 
end 
addEventHandler("onClientRender",getRootElement(),vehicleShow)

function dxPanel (vehicleTime)
    dxDrawText("Seu Carro VIP expira em "..(tostring(vehicleTime) or 'BUGGED').."", screenW * 0.3309, screenH * 0.7227, screenW * 0.4191, screenH * 0.7461, tocolor(255, 255, 255, 255), 1.00, "default", "left", "top", false, false, true, true, false)
    dxDrawImage(screenW * 0.2859, screenH * 0.1546, screenW * 0.4552, screenH * 0.6074, "image/wallpaper.png", 0, 0, 0, tocolor(255, 255, 255, 255), false)
end

function abrirPanel()
	if panel == false then		
		showCursor(true)
		panel = true
		addEventHandler("onClientRender", getRootElement(), dxPanel)
        addEventHandler("onClientRender", getRootElement(), vehicleShow)
	else
		showCursor(false)
		panel = false
		removeEventHandler("onClientRender", getRootElement(), dxPanel)
        removeEventHandler("onClientRender", getRootElement(), vehicleShow)
	end
end
addEvent("abrirPanel", true)
addEventHandler("abrirPanel", getRootElement(), abrirPanel)

function fecharPanel()
	if panel == false then
		removeEventHandler("onClientRender", getRootElement(), dxPanel)
        removeEventHandler("onClientRender", getRootElement(), vehicleShow)
		showCursor(false)
		panel = false
	end
end
bindKey("o", "down", fecharPanel)
addEvent("abrirPanel", true)
addEventHandler("abrirPanel", getRootElement(), fecharPanel)

 

Link to comment
49 minutes ago, DNL291 said:

Edit:

Não, não chegará a esse ponto de 400 vezes em 1ms (Lol), mas será muito e péssimo para a performance. Seria na verdade umas 30-60 chamadas por segundo (dependendo do FPS), pois é assim que a renderização do jogador funciona. onClientRender só é chamado quando o quadro do jogo do cliente é atualizado.

Thanks S2

Link to comment

Tente isso (Eu fiz em base ao que eu consegui compreende). (e fiz algumas mudanças).

--// Client-Side
local panel = false

--[[
function vehicleShow ( ) 
	triggerServerEvent("vehicleTime", getLocalPlayer () ) 
end 
addEventHandler("onClientRender",getRootElement(),vehicleShow)
--]]

function dxPanel ( )
   local vehicleTime = getElementData(localPlayer, "vehicleTempo") or 0
   if vehicleTime > 0 then
      dxDrawText("Seu Carro VIP expira em "..(tostring(vehicleTime) or 'BUGGED').."", screenW * 0.3309, screenH * 0.7227, screenW * 0.4191, screenH * 0.7461, tocolor(255, 255, 255, 255), 1.00, "default", "left", "top", false, false, true, true, false)
      dxDrawImage(screenW * 0.2859, screenH * 0.1546, screenW * 0.4552, screenH * 0.6074, "image/wallpaper.png", 0, 0, 0, tocolor(255, 255, 255, 255), false)
   end
end

function abrirPanel ( )
   if panel == false then		
      showCursor(true)
      panel = true
      addEventHandler("onClientRender", getRootElement(), dxPanel)
      timer = setTimer ( function ( ) 
         triggerServerEvent("vehicleTime", getLocalPlayer ( ) ) 
      end, 1000, 0 )
		
      --addEventHandler("onClientRender", getRootElement(), vehicleShow)
   else
      fecharPanel ( )
      --[[
      showCursor(false)
      panel = false
      removeEventHandler("onClientRender", getRootElement(), dxPanel)
      removeEventHandler("onClientRender", getRootElement(), vehicleShow)
      --]]
   end
end
addEvent("abrirPanel", true)
addEventHandler("abrirPanel", getRootElement(), abrirPanel)

function fecharPanel ( )
   if panel == false then
      removeEventHandler("onClientRender", getRootElement(), dxPanel)
      if isTimer ( timer ) then
         killTimer ( timer )
      end
      local vehicleTime = 0
      --removeEventHandler("onClientRender", getRootElement(), vehicleShow)
      showCursor(false)
      panel = true
   end
end
bindKey("o", "down", fecharPanel)
--addEvent("abrirPanel", true)
--addEventHandler("abrirPanel", getRootElement(), fecharPanel)
--// Server-Side
function f_vehicleTime ( ) --/> Tente não mistura o nome da função, com o seu código.
   local account = getPlayerAccount(source)
   if not isGuestAccount(account) then
      local vehicleState,vehicleTime = false, "NOT AVAILABLE"
      if getAccountData(account,"vehicleEnabled") == 1 then
         local vehicleTime = tonumber(getAccountData(account,"vehicleVIP"))
         if vehicleTime then
            local currentTime = getRealTime( )
            if vehicleTime > currentTime.timestamp then
               local vehicleState,vehicleTime = true, convertMS(vehicleTime-currentTime.timestamp)					
               --triggerClientEvent(source,"vehicleTempo",source,vehicleTime )
               setElementData( source, "vehicleTempo", vehicleTime )
            end
         end
      end
   end
end
addEvent("vehicleTime",true) 
addEventHandler("vehicleTime",getRootElement(), f_vehicleTime) 

Algumas coisas eu removi, e deixei comentado com -- or --[[ ]]-- para você saber o que você poderia ter feito.

Edited by Angelo Pereira
  • Thanks 1
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...