Arantes Posted April 24, 2020 Share Posted April 24, 2020 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
beast99 Posted April 25, 2020 Share Posted April 25, 2020 Mostre seu código para o conseguirmos ajudar. 1 Link to comment
Arantes Posted April 25, 2020 Author Share Posted April 25, 2020 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
Arantes Posted April 27, 2020 Author Share Posted April 27, 2020 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? Link to comment
Angelo Pereira Posted April 27, 2020 Share Posted April 27, 2020 (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 April 27, 2020 by Angelo Pereira 1 Link to comment
Arantes Posted April 27, 2020 Author Share Posted April 27, 2020 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
DNL291 Posted April 27, 2020 Share Posted April 27, 2020 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. 1 1 Link to comment
Arantes Posted April 27, 2020 Author Share Posted April 27, 2020 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
Angelo Pereira Posted April 27, 2020 Share Posted April 27, 2020 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
Angelo Pereira Posted April 27, 2020 Share Posted April 27, 2020 (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 April 27, 2020 by Angelo Pereira 1 Link to comment
Arantes Posted April 28, 2020 Author Share Posted April 28, 2020 Muito obrigado por querer ajudar , deu esse erro aqui "attempt to compare number with string" na linha 13 ali do client-side . Link to comment
Other Languages Moderators Lord Henry Posted April 28, 2020 Other Languages Moderators Share Posted April 28, 2020 Nunca use trigger dentro de uma função que está sendo chamada com onClientRender. 1 Link to comment
Angelo Pereira Posted April 28, 2020 Share Posted April 28, 2020 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 1 Link to comment
Arantes Posted April 28, 2020 Author Share Posted April 28, 2020 Funcionou ! Obrigado a todos , removi a linha de verificação e esta perfeito. Novamente agradeço a todos pela ajuda ! Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now