Tony Scripter Posted April 21, 2021 Posted April 21, 2021 Estou desenvolvendo um emprego, para aprimorar a minha programação e tenho dificuldades em tabela, queria saber como eu poderia fazer um emprego no seguinte modelo: TabelaMarkers = { {1, 1, 1}, -- Primeiro Marker {2, 2, 2}, -- Segundo Marker {3, 3, 3}, -- Terceiro Marker {4, 4, 4}, -- Quarto Marker } O jogador iria pegar um carro, e iria gerar o primeiro marker, quando o player passar por cima do marker o veiculo para e fica freezado durante 5 segundos, depois que foi liberado gera o 2 marker, depois o 3 marker e por ultimo o 4 marker.
Moderators Lord Henry Posted April 21, 2021 Moderators Posted April 21, 2021 Client-side: Spoiler local tabelaMarkers = { [1] = {0, 0, 2.1}, -- Não precisaria indexar nesse caso, mas fiz só pra ficar mais fácil saber qual posição é de qual marker. [2] = {12, 2.45, 2.1}, [3] = {22.5, -9.7, 2.1}, -- Mudei as coordenadas apenas para facilitar no teste. [4] = {36, -26, 1.5}, } local contador = 1 -- Apenas um contador que serve como iterador, para saber qual a próxima coordenada a ser usada. local theMarker = false -- Variável do marker em si. local oCarro = false -- Variável temporária do veículo em si. addEvent ("startJob", true) -- Adiciona um evento customizado, que pode ser chamado por outros scripts inclusive server-side. addEventHandler ("startJob", root, function (theCar) -- Esse evento é chamado pelo server quando o jogador usa o comando /job. theCar é o veículo criado para o jogador usar. if (source == localPlayer) then -- Evita de ativar com outros jogadores. O source foi definido lá no trigger do server no 3 parâmetro. oCarro = theCar -- Fiz isso apenas para ser possível ler o veículo nas outras funções deste script. addEventHandler ("onClientVehicleEnter", oCarro, generateMarker) -- Agora que o veículo pode ser lido pelo client, adiciona este evento que ativa quando alguém entra nele. end end) function generateMarker (ped, seat) -- Função ativada quando alguém entra no veículo theCar. if (ped == localPlayer and seat == 0) then -- Se quem entrou no veículo for o localPlayer e como motorista, então: local x, y, z = unpack (tabelaMarkers[contador]) -- Obtém as coordenadas do item [1] da tabela. if (isElement (theMarker)) then -- Se já existe o marker (o que não deveria, mas evita bugs), então: setElementPosition (theMarker, x, y, z) -- Seta a posição do marker nas coordenadas obtidas. else -- Se não existe o marker, então cria ele nas coordenadas obtidas. theMarker = createMarker (x, y, z, "cylinder") end outputChatBox ("Siga os markers até o destino.") end end function MarkerHit (hitPlayer) -- Essa função só funciona após criar o marker. if (hitPlayer == localPlayer) then -- Se o elemento que colidiu for o localPlayer, então: contador = contador + 1 -- Incrementa +1 no contador. Ou seja, se antes ele era 1, agora é 2. if (contador <= #tabelaMarkers) then -- Se existe o item [contador] na tabela, então: (se o contador é menor ou igual ao tamanho da tabela) local x, y, z = unpack (tabelaMarkers[contador]) -- Obtém as coordenadas do item [contador] da tabela. if (isElement (theMarker)) then -- Se já existe o marker (o que deve sim existir), então: setElementPosition (theMarker, x, y, z) -- Seta a posição do marker para as novas coordenadas. else -- Se não existe o marker (por bug), então: theMarker = createMarker (x, y, z, "cylinder") -- Cria o marker nas novas coordenadas. end else -- Se não existe o item [contador] na tabela, o que indica que não tem a próxima coordenada, então: destroyElement (theMarker) -- Destrói o marker theMarker = nil -- Anula a variável dele para liberar espaço da memória. outputChatBox ("Chegou ao destino.") -- Manda isso pro jogador que colidiu no último marker. contador = 1 -- Reseta o contador para não bugar na próxima vez que ele fizer a viagem. removeEventHandler ("onClientVehicleEnter", oCarro, generateMarker) -- Remove este evento, pois ele será adicionado novamente quando o jogador usar o comando /job pra recomeçar. triggerServerEvent ("deleteMyVeh", resourceRoot) -- Ativa este evento no server, que serve para deletar o veículo e anular sua variável lá. oCarro = nil -- Anula essa variável temporária. end end end addEventHandler ("onClientMarkerHit", resourceRoot, MarkerHit) -- Ativa essa função quando algo colidir em algum marker deste resource. Server-side: Spoiler local jobCars = {} -- Tabela vazia onde ficarão os veículos do emprego. addCommandHandler ("job", function (thePlayer, cmd) -- Comando para iniciar este teste. if (isElement (jobCars[thePlayer])) then -- Evita duplicar o veículo ao usar /job várias vezes. destroyElement (jobCars[thePlayer]) -- Destrói o veículo que já existia antes de criar outro. end jobCars[thePlayer] = createVehicle (589, 0, -10, 3.5) -- Cria o veículo. triggerClientEvent (thePlayer, "startJob", thePlayer, jobCars[thePlayer]) -- Ativa o evento "startJob" no cliente do thePlayer, setando thePlayer como source e jobCars[thePlayer] como 1 parâmetro de função. end) function destroyMyVeh () if (client) then -- Se esta função está sendo ativada por algum client, então: if (isElement (jobCars[client])) then -- client = localPlayer que ativou o evento "deleteMyVeh" no client-side. destroyElement (jobCars[client]) -- Destrói o veículo deste jogador. jobCars[client] = nil -- Anula a variável do veículo para liberar espaço na memória. end elseif (isElement (jobCars[source])) then -- Se o evento está sendo ativado normalmente pelo server, ou seja, pelo onPlayerQuit, então source é o jogador que saiu do server. Se existe o veículo do jogador que quitou do server, então: destroyElement (jobCars[source]) -- Destrói o veículo do jogador que quitou. jobCars[source] = nil -- Anula a variável do veículo para liberar espaço na memória. end end addEvent ("deleteMyVeh", true) -- Adiciona este evento customizado, que poderá ser chamado por outros scripts, incluindo client-side. addEventHandler ("deleteMyVeh", root, destroyMyVeh) -- Faz com que o evento customizado ative esta função. addEventHandler ("onPlayerQuit", root, destroyMyVeh) -- Também ativa esta função quando alguém desconectar do servidor. Fiz este exemplo pois é muito detalhe pra explicar só com texto. 2 Eu te ajudei ou achou meu comentário útil? Não esqueça de deixar um Thanks! Minhas contribuições para a comunidade: LordHenry - MTA Wiki Profile Inscreva-se no meu canal do YouTube: Lord Henry - Entertainment Discord Oficial do MTA: https://mtasa.com/discord Blacklist e Whitelist de Scripters: Planilha Por favor, não me envie mensagens privadas solicitando suporte. Crie um tópico no fórum em vez disso.
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