Gaimo Posted August 31, 2020 Share Posted August 31, 2020 Eu vi que sempre que possível é bom evitar setElementData, ao menos a parte de sincronizar com o servidor, mas no meu caso estou precisando requisitar uma informação do jogador que está no banco de dados, sei que posso solicitar com o triggerServerEvent, mas pra retornar preciso usar triggerClientEvent?? Ou tem como eu colocar um return no event pra ele retornar o que eu quero? Meu script é tipo uma missão, então quando o jogador aceitar ela, quero salvar isso na conta dele, pra que o dialogo seja diferente caso ele já tenha aceitado a missão e converse com o NPC novamente. Parte que interessa: if distance <= 3 then -- VERIFICAR NO SERVIDOR SE O JOGADOR JÁ ACEITOU A QUEST, SE SIM ENTAO: -- SE NAO: if jonny_clicks == 5 then if not g.accept or not g.cancel then g.accept = dgsCreateButton(sW/2, sH/2, 155, 30, "Claro mano deixa comigo.", false,_,_,_,_,_,_,_,tocolor(0,0,0,0), tocolor(0,100,0,255), tocolor(0,100,0,200)) g.cancel = dgsCreateButton(sW/2 + 170, sH/2, 170, 30, "Ta maluco vou fazer isso não.", false,_,_,_,_,_,_,_,tocolor(0,0,0,0), tocolor(140,0,0,255), tocolor(140,0,0,200)) addEventHandler ( "onDgsMouseClick", g.accept, accept_quest ) addEventHandler ( "onDgsMouseClick", g.cancel, cancel_quest ) end elseif jonny_clicks < #jonny_msgs then jonny_clicks = jonny_clicks + 1 end end Inclusive aceito sugestões para melhorar o script. Script completo: Spoiler loadstring(exports.dgs:dgsImportOOPClass(true))() local jonny_info = createPed(0, 1170.47, -1486.69, 22.76, 90) local jonny_msgs = { "", -- 1 ----------------- QUEST 01 ------------------------------------------------------------- "Olá, "..getPlayerName(localPlayer).." Seja bem-vindo ao servidor!", "Nosso servidor ainda é novo, falta algumas coisas mas logo estará no topo pode apostar.", "Se tiver alguma dúvida chame um staff no chat.", "Tenho uma missão pra tu, quebra esse galho pra mim?", -- Claro deixa comigo | Ta maluco vou fazer isso não "Entrega esse pacote pro Jorge e diz que ele ta me devendo!", -- 6 "Se mudar de ideia fala comigo "..getPlayerName(localPlayer)..".", -- 7 ---------------------------------------------------------------------------------------- } local jonny_clicks = 1 local sW, sH = guiGetScreenSize() local g = {} function dxDrawTextOnElement(TheElement,text,height,distance,R,G,B,alpha,size,font,...) local x, y, z = getElementPosition(TheElement) local x2, y2, z2 = getCameraMatrix() local distance = distance or 20 local height = height or 1 if (isLineOfSightClear(x, y, z+2, x2, y2, z2, ...)) then local sx, sy = getScreenFromWorldPosition(x, y, z+height) if(sx) and (sy) then local distanceBetweenPoints = getDistanceBetweenPoints3D(x, y, z, x2, y2, z2) if(distanceBetweenPoints < distance) then dxDrawText(text, sx+2, sy+2, sx, sy, tocolor(R or 255, G or 255, B or 255, alpha or 255), (size or 1)-(distanceBetweenPoints / distance), font or "arial", "center", "center") end end end end function clean() destroyElement(g.cancel) destroyElement(g.accept) removeEventHandler ( "onDgsMouseClick", g.accept, accept_quest ) removeEventHandler ( "onDgsMouseClick", g.accept, cancel_quest ) g = {} end function accept_quest() clean() jonny_clicks = 6 exports.notification:addNotification("Você recebeu um pacote do Jonny, leve para o Jorge.", "info") -- ADICIONAR NA CONTA DO JOGADOR UMA QUEST triggerServerEvent ( "addQuest", resourceRoot, localPlayer ) end function cancel_quest() clean() jonny_clicks = 7 setTimer(function() jonny_clicks = 1 end, 1000*15, 1) end addEventHandler( "onClientResourceStart", resourceRoot, function() addEventHandler ( "onClientPreRender", root, function() --dxDrawTextOnElement(jonny_info, "Para conversar com Jonny pressione M e clique nele.", 1, 20, 255,255,255,255, 2) dxDrawTextOnElement(jonny_info, "Jonny", 1, 20, 255,255,255,255, 2) dxDrawTextOnElement(jonny_info, jonny_msgs[jonny_clicks], 1.3, 20, 255,255,255,255, 2) end) end) addEventHandler ( "onClientClick", getRootElement(), function(button, state, absoluteX, absoluteY, worldX, worldY, worldZ, clickedElement) if button and button == "left" and state == "down" and clickedElement and clickedElement == jonny_info then local x,y,z = getElementPosition(localPlayer) local px,py,pz = getElementPosition(jonny_info) local distance = getDistanceBetweenPoints3D(x,y,z,px,py,pz) if distance <= 3 then -- VERIFICAR NO SERVIDOR SE O JOGADOR JÁ ACEITOU A QUEST, SE SIM ENTAO: -- SE NAO: if jonny_clicks == 5 then if not g.accept or not g.cancel then g.accept = dgsCreateButton(sW/2, sH/2, 155, 30, "Claro mano deixa comigo.", false,_,_,_,_,_,_,_,tocolor(0,0,0,0), tocolor(0,100,0,255), tocolor(0,100,0,200)) g.cancel = dgsCreateButton(sW/2 + 170, sH/2, 170, 30, "Ta maluco vou fazer isso não.", false,_,_,_,_,_,_,_,tocolor(0,0,0,0), tocolor(140,0,0,255), tocolor(140,0,0,200)) addEventHandler ( "onDgsMouseClick", g.accept, accept_quest ) addEventHandler ( "onDgsMouseClick", g.cancel, cancel_quest ) end elseif jonny_clicks < #jonny_msgs then jonny_clicks = jonny_clicks + 1 end end end end) Link to comment
Boechat Posted August 31, 2020 Share Posted August 31, 2020 triggerServerEvent só returna true ou falso, dizendo se a função foi chamada com sucesso ou não, pra vc retornar dados eu recomendo que use um triggerClientEvent de retorno ou algum outro jeito que adapte ao seu script. Link to comment
Gaimo Posted August 31, 2020 Author Share Posted August 31, 2020 Acho que eu sei como posso fazer com triggerServerEvent e triggerClientEvent mas a diferença em questão de desempenho contra o setElementData e getElementData vale o esforço ? kkkk Link to comment
Other Languages Moderators androksi Posted August 31, 2020 Other Languages Moderators Share Posted August 31, 2020 Olá. Cara, para ser bem sincero — e também como a maioria diz — tudo depende de como você utiliza essa função. Por mais que eu brinque bastante com quem me pergunta sobre, não dispenso o uso dela, até porque é uma função, está ali para ser usada. Lembre-se apenas que tudo tem um limite, qualquer exagero é ruim para o servidor; e qualquer outra coisa. Saber usar de forma correta é super válido. Por mais que eu não a uso há um bom tempo, às vezes, para coisas simples é necessário usar, embora eu prefira usar trigger hehe. Nesse seu caso, como é que você está fazendo as missões? Pelo o que parece, está em resources separados. Por que não faz no mesmo resource, e cria uma tabela server-side, daí basta armazenar as missões que o jogador aceitou/já completou. Um ID também poderia ser criado, para cada missão, como uma forma de identificar. Dessa forma você iria apenas mandar a tabela para o client-side, e você poderia verificar se o jogador já fez ou não a missão. Contudo, sobre a questão de performance nesse caso, cara, nem se preocupe. É bem pequena, e até imperceptível. Nunca se esqueça também de remover a elementData do jogador. Alterá-la para nil ou false não adianta, ainda irá consumir a rede do seu servidor. Funções em questão das coisas que escrevi acima: setElementData triggerClientEvent triggerServerEvent removeElementData Link to comment
Gaimo Posted August 31, 2020 Author Share Posted August 31, 2020 Muito obrigado pela resposta!! Na verdade ainda estou fazendo, por enquanto está no mesmo resource, mas pretendo reformular ele todo pra que seja feito pra suportar várias missões e tals, vou começar a ver a opção de utilizar trigger, não sabia dessa do removeElementData vou começar a utilizar. Sobre váriaveis eu posso deleta-las também? Por que quando não estou usando eu simplesmente deixo como nil. Link to comment
Other Languages Moderators androksi Posted August 31, 2020 Other Languages Moderators Share Posted August 31, 2020 Sim, você pode anular variáveis. Elas são armazenadas na memória do computador. Recomendo também o uso da função collectgarbage, após anular alguma variável. Mas só um adendo: JAMAIS UTILIZE ESSA FUNÇÃO EM TODOS OS SEUS RESOURCES! Use apenas naqueles resources que você acha que está consumindo bastante memória RAM. Link to comment
Gaimo Posted August 31, 2020 Author Share Posted August 31, 2020 Pra anular uma variável basta deixa-la como nil ? Link to comment
KronoS Lettify Posted September 1, 2020 Share Posted September 1, 2020 1 hour ago, Gaimo said: Pra anular uma variável basta deixa-la como nil ? Sim 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