Jump to content

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


Recommended Posts

Posted

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?

 

Posted (edited)

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
Posted

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)

 

Posted

Vou utilizar client-side and server-side, por questão de desempenho qual seria melhor? Não sabia que dava pra verificar dessa forma eu utilizava for puta merda vou arrumar aqui.

 

Posted

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

Posted

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)

 

Posted

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>

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