Jump to content

Ajuda Desenvolvimento Emprego


Recommended Posts

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.

Link to comment
  • Other Languages Moderators

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.

  • Thanks 2
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...