Jump to content

Alternativa para setElementData?


Recommended Posts

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
  • Other Languages Moderators

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:

Link to comment

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

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

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