Arantes Posted April 24, 2020 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.
Arantes Posted April 25, 2020 Author 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)
Arantes Posted April 27, 2020 Author 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?
Angelo Pereira Posted April 27, 2020 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
Arantes Posted April 27, 2020 Author 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.
DNL291 Posted April 27, 2020 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
Arantes Posted April 27, 2020 Author 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)
Angelo Pereira Posted April 27, 2020 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
Angelo Pereira Posted April 27, 2020 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
Arantes Posted April 28, 2020 Author 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 .
Other Languages Moderators Lord Henry Posted April 28, 2020 Other Languages Moderators Posted April 28, 2020 Nunca use trigger dentro de uma função que está sendo chamada com onClientRender. 1
Angelo Pereira Posted April 28, 2020 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
Arantes Posted April 28, 2020 Author Posted April 28, 2020 Funcionou ! Obrigado a todos , removi a linha de verificação e esta perfeito. Novamente agradeço a todos pela ajuda !
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