Gaimo Posted July 20, 2020 Share Posted July 20, 2020 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
Angelo Pereira Posted July 21, 2020 Share Posted July 21, 2020 (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 July 21, 2020 by Angelo Pereira Link to comment
Other Languages Moderators androksi Posted July 22, 2020 Other Languages Moderators Share Posted July 22, 2020 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
Gaimo Posted July 22, 2020 Author Share Posted July 22, 2020 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. Link to comment
Other Languages Moderators androksi Posted July 22, 2020 Other Languages Moderators Share Posted July 22, 2020 Cara, é o que eu disse, depende muito de seus objetivos. Particularmente, eu faria usando tabelas. 1 Link to comment
Gaimo Posted July 23, 2020 Author Share Posted July 23, 2020 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 androksi Posted July 23, 2020 Other Languages Moderators Share Posted July 23, 2020 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
Gaimo Posted July 23, 2020 Author Share Posted July 23, 2020 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 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