Jump to content

[ AJUDA] onClientRender Texto


Recommended Posts

Posted

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.

Posted

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)

 

Posted

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?

Posted (edited)

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

" Se eu te ajudei, deixe sua avaliação, obrigado ! "

Joinha!

 

Posted

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.

 

 

Posted

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.

Please do not PM me with scripting related question nor support, use the forums instead.

Posted

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)

 

Posted
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

" Se eu te ajudei, deixe sua avaliação, obrigado ! "

Joinha!

 

Posted (edited)

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

" Se eu te ajudei, deixe sua avaliação, obrigado ! "

Joinha!

 

  • Moderators
Posted

Nunca use trigger dentro de uma função que está sendo chamada com onClientRender.

Eu te ajudei ou achou meu comentário útil? Não esqueça de deixar um Thanksspacer.png

Minhas contribuições para a comunidade: LordHenry - MTA Wiki Profile
Inscreva-se no meu canal do YouTube: Lord Henry - Entertainment
Discord Oficial do MTA: https://mtasa.com/discord
Blacklist e Whitelist de Scripters: Planilha

Por favor, não me envie mensagens privadas solicitando suporte. Crie um tópico no fórum em vez disso.

Posted
11 minutes ago, Arantes said:

Muito obrigado por querer ajudar ? , deu esse erro aqui "attempt to compare number with string" na linha 13 ali do client-side .

Então ele não retorna somente números?

Então remove a linha dessa verificação e tentar novamente

" Se eu te ajudei, deixe sua avaliação, obrigado ! "

Joinha!

 

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