Jump to content

Dúvida sobre qual a melhor opção setElementData ou Table


Recommended Posts

Estou desenvolvendo uma concessionaria com banco de dados tudo certinho, o sistema de comprar está funcionando perfeitamente.
 

Porém estou pensando como vai ser o sistema de spawnar os veículos e a verificação de quem pode entrar,  qual seria a melhor opção? :

1) Adicionar um setElementData no veículo com as informações que eu vou usar, exemplo {dono, placa, veh_id} e as verificações serão com getElementData

ou

2) Criar uma tabela e adicionar os veículos e os dados

 

Na segunda opção vou ter mais trabalho, e sempre que precisar verificar um veiculo vou precisar rodar um FOR pra procurar se o carro pertence a tabela. Qual seria o mais recomendado?

 

Link to comment

Bom, se você precisar trabalhar com esses dados do lado client-side, você vai precisar fazer em setElementData.

Agora, se você vai trabalha com esses dados em apenas no seu server-side, faça em tabela.

--

Caso, você tenha seu elemento na função, você pode fazer a busca usando este elemento na tabela, igual quando busca o player na tabela.

Edited by Angelo Pereira
Link to comment
  • Other Languages Moderators

Depende de como você quer fazer, há possibilidades de fazer usando as duas formas: setElementData ou tabelas. Outra coisa que você deve levar em conta é a organização, pois se usar tabelas para aprimorar o desempenho, mas fizer de qualquer jeito, não adianta de nada, vamos combinar, né?

O que você deve pensar é:

  • Coisas que irão atualizar e devem ser atualizadas em tempo real;
  • O que seria mais viável: usar triggerClientEvent para atualizar o client-side ou ir pelo caminho mais fácil, usando setElementData
On 20/07/2020 at 16:14, Gaimo said:

Na segunda opção vou ter mais trabalho, e sempre que precisar verificar um veiculo vou precisar rodar um FOR pra procurar se o carro pertence a tabela. Qual seria o mais recomendado?

Por que usar for? Basta verificar se o veículo está indexado à tabela, assim como se usa para verificar o jogador.

-- SERVER-SIDE

local vehicles = {}

-- Criar veículo
local veh = createVehicle(411, 0, 0, 3)

-- Indexar à tabela
vehicles[veh] = {owner = "Andrei", plateText = "JFA-8842", vehId = 3}

-- Como buscaria?
addEventHandler("onVehicleEnter", root, function(thePlayer)
    if vehicles[source] and vehicles[source].owner == getPlayerName(thePlayer) then
        print("Você é o dono!")
        triggerClientEvent(thePlayer, "updateInfo", resourceRoot, vehicles[source])
    else
        print("Você não é o dono ou algo deu errado :/")
    end
end)

-- CLIENT-SIDE
local myVehicle = {}

addEventHandler("onClientRender", root, function()
    if isPedInVehicle(localPlayer) then
        dxDrawText("A placa do seu veículo é: " .. myVehicle.plateText or "?", 400, 320, 80, 20)
    end
end)

addEvent("updateInfo", true)
addEventHandler("updateInfo", resourceRoot, function(t)
    -- O nome dos atributos dentro de myVehicle poderia ser qualquer um, estou copiando apenas para ser mais rápido hehe
    myVehicle.owner = t.owner
    myVehicle.plateText = t.plateText
end)

 

Link to comment

Okay, vou testar por tabelas, minha ideia é colocar um texto no veículo com suas informações, Nome, ID, Valor e Quantidade, para isso estou usando o dxDrawTextOnElement mas não está exibindo nada, como eu deveria enviar para todos os clients?

 

Client-side

local all_veh = {}

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

addEvent( "show_tag", true )
addEventHandler( "show_tag", localPlayer, function(name, id, price, amount)
    if amount then all_veh = {source, name, id, price, amount} end
    all_veh = {source, name, id, price, amount="ilimitada"}
end)


addEventHandler("onClientRender", root, function()
    if #all_veh > 0 then
        for i=1, #all_veh do
            dxDrawTextOnElement(all_veh[i][1],"Nome: "..all_veh[i][2].." ID: "..all_veh[i][3].." Valor: "..all_veh[i][4].." Quantidade: "..all_veh[i][5].."\nPara comprar digite /comprar ID",1 , 20, 255, 255, 255, 255, 2)
        end
    end
end)

Server-side
 

triggerClientEvent("show_tag", veh, name, id, price, amount)

veh = objeto veiculo

Existe algum problema enviar o veh como source? Porque pelo que eu entendi, já estou enviando para todos os clients e o source do evento é o veh

Link to comment
  • Other Languages Moderators

Não, o source do evento não será o parâmetro veh. Use desta forma, passando todos os parâmetros para o client-side.

triggerClientEvent("show_tag", resourceRoot, veh, name, id, price, amount)

E lá no client-side, use assim:

addEvent( "show_tag", true )
addEventHandler( "show_tag", resourceRoot, function(veh, name, id, price, amount)
    if amount then all_veh = {veh, name, id, price, amount} end
    all_veh = {veh, name, id, price, amount="ilimitada"}
end)

Agora uma correção: a variável all_veh SEMPRE irá ser substituída por outra, pois ela não está recebendo indexação nenhuma para cada novo carro. Faça dessa maneira:

addEvent( "show_tag", true )
addEventHandler( "show_tag", resourceRoot, function(veh, name, id, price, amount)
    local index = #all_veh + 1
    
    if not all_veh[index] then
        all_veh[index] = {}
    end
    
    if amount then
        return all_veh[index] = {veh, name, id, price, amount}
    end
    all_veh[index] = {veh, name, id, price, amount="ilimitada"}
end)

 

Link to comment

Server-side

addEventHandler("onResourceStart", resourceRoot, function()
    local veh_in_db = executeSQLQuery("SELECT * FROM dealership")

    if #veh_in_db > 0 then
        for i=1, #veh_in_db do
            local x, y, z, rx, ry, rz = unpack(fromJSON(tostring(veh_in_db[i]["position"])))
            local veh = createVehicle(veh_in_db[i]["model"], x, y, z, rx, ry, rz)
                        
            table.insert(all_veh, veh)
            setElementFrozen(veh, true)
            setVehicleDamageProof(veh, true)

            if veh_in_db[i]["amount"] ~= -1 then
                triggerClientEvent("show_tag", resourceRoot, veh, veh_in_db[i]["name"], veh_in_db[i]["id"], veh_in_db[i]["price"], veh_in_db[i]["amount"])
            else
                triggerClientEvent("show_tag", resourceRoot, veh, veh_in_db[i]["name"], veh_in_db[i]["id"], veh_in_db[i]["price"])
            end
        end
    end

end)

Client-side
 

local all_veh = {}

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

addEvent( "show_tag", true )
addEventHandler( "show_tag", resourceRoot, function(veh, name, id, price, amount)
    if amount then
        table.insert(all_veh, {veh, name, tostring(id), tostring(price), tostring(amount)}) tostring(all_veh[1][2]) return
    end
	table.insert(all_veh, {veh, name, tostring(id), tostring(price), amount="ilimitada"})
end)


addEventHandler("onClientRender", root, function()
    if #all_veh > 0 then
        for i=1, #all_veh do
            dxDrawTextOnElement(all_veh[i][1],"Nome: "..all_veh[i][2].." ID: "..all_veh[i][3].." Valor: R$"..all_veh[i][4].." Quantidade: "..all_veh[i][5].."\nPara comprar digite /comprar ID",1 , 20, 255, 255, 255, 255, 2) -- 
        end
    end
end)

Erro: Server triggered clientside event show_tag, but event is not added clientside

Mas quando eu utilizo o comando /add e utilizo o mesmo trigger funciona.

setTimer(triggerClientEvent, 1000, 1, "show_tag", resourceRoot, veh, veh_in_db["name"], veh_in_db["id"], veh_in_db["price"], veh_in_db["amount"])

Com o timer funcionou <em><em><em><em>?</em></em></em></em>

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