Guia 2026-05-10

Desenvolvimento de Jobs de Camionagem e Entregas em FiveM

TDYSKY

TDYSKY

Fundador & Lead Developer na Agency Scripts

Por que os trabalhos de transporte rodoviário são importantes para a economia dos servidores

Os trabalhos de transporte e entrega servem como a espinha dorsal econômica de qualquer servidor de roleplay FiveM. Proporcionam uma fonte de rendimento fiável para novos intervenientes que ainda não estabeleceram ligações ou encontraram trabalho especializado, ao mesmo tempo que criam a infraestrutura logística que liga as empresas em todo o mapa. Quando um restaurante precisa de ingredientes, uma concessionária de automóveis precisa de veículos transportados ou um canteiro de obras precisa de materiais, o transporte rodoviário cria a ponte entre a oferta e a demanda. Um sistema de transporte rodoviário bem projetado transforma o que poderia ser um simples trabalho do ponto A ao ponto B em uma carreira envolvente com planejamento de rotas, gerenciamento de carga, atualizações de veículos e decisões de risco-recompensa sobre rotas mais longas, mas mais bem pagas, através de território perigoso. O trabalho de transporte rodoviário também preenche o mapa com atividade, colocando veículos grandes nas rodovias e dando à polícia algo para monitorar infrações de trânsito, criando encontros naturais entre caminhoneiros e policiais.

Configuração de rota e sistema de contrato

Projete seu sistema de transporte rodoviário em torno de um modelo de contrato em que os motoristas escolhem os trabalhos em um painel de despacho no depósito de transporte rodoviário. Cada contrato especifica o local de coleta, destino de entrega, tipo de carga, peso, taxa de pagamento e limite de tempo. Organize os contratos em níveis com base na classe da carteira de motorista e no nível de experiência, para que os novos motoristas comecem com entregas locais usando caminhões baú, enquanto os transportadores veteranos realizam viagens de reboque através do mapa com materiais perigosos. O sistema de contrato deve gerar rotas dinamicamente a partir de um conjunto de pontos de coleta e entrega, em vez de usar rotas estáticas, que se tornam repetitivas após algumas execuções:

Config.TruckingDepot = {
    location = vector3(152.29, -3210.88, 5.91),
    spawnPoint = vector4(162.45, -3207.12, 5.91, 270.0),
    returnPoint = vector3(148.77, -3215.44, 5.91),
}

Config.ContractTiers = {
    [1] = {
        label = 'Local Delivery',
        requiredLevel = 0,
        vehicle = 'mule',
        payRange = { 500, 1200 },
        timeLimit = 600,
        routes = {
            { pickup = vector3(89.54, -1745.62, 29.33),
              dropoff = vector3(-46.23, -1758.49, 29.42),
              cargo = 'electronics', weight = 500 },
            { pickup = vector3(821.77, -2160.33, 29.62),
              dropoff = vector3(-324.18, -1522.87, 27.56),
              cargo = 'food_supplies', weight = 350 },
            { pickup = vector3(-1088.34, -2002.19, 13.22),
              dropoff = vector3(1214.56, -1386.73, 35.37),
              cargo = 'clothing', weight = 200 },
        }
    },
    [2] = {
        label = 'Regional Haul',
        requiredLevel = 5,
        vehicle = 'packer',
        trailer = 'trailers',
        payRange = { 2000, 4500 },
        timeLimit = 900,
        routes = {
            { pickup = vector3(1378.22, -2078.85, 52.04),
              dropoff = vector3(-2556.14, 2334.67, 33.06),
              cargo = 'construction_materials', weight = 15000 },
            { pickup = vector3(-58.83, -2538.92, 6.07),
              dropoff = vector3(2671.84, 1678.93, 24.49),
              cargo = 'fuel_barrels', weight = 12000,
              hazardous = true },
        }
    },
    [3] = {
        label = 'Long Haul',
        requiredLevel = 15,
        vehicle = 'hauler',
        trailer = 'tanker',
        payRange = { 5000, 10000 },
        timeLimit = 1200,
        routes = {
            { pickup = vector3(2682.34, 1410.77, 24.52),
              dropoff = vector3(-1143.27, -2002.47, 13.18),
              cargo = 'refined_fuel', weight = 25000,
              hazardous = true, fragile = false },
        }
    },
}

Config.LevelXP = {
    perDelivery = 25,
    bonusOnTime = 15,
    bonusNoDamage = 20,
    penaltyLate = -10,
    penaltyCargoDamage = -15,
}

O sistema de nível e XP cria uma progressão que mantém os motoristas engajados ao longo do tempo. Cada entrega bem-sucedida ganha pontos de experiência com bônus pela conclusão no prazo e entrega da carga sem danos. O sistema de experiência desbloqueia contratos de nível superior com melhores salários, mas também com maior dificuldade, à medida que rotas mais longas passam por áreas mais perigosas e veículos maiores são mais difíceis de dirigir em ruas estreitas da cidade.

Gestão de veículos e reboques

Os veículos de transporte precisam de manuseio especial em comparação com os carros de jogadores normais. Quando um motorista aceita um contrato, coloque o caminhão apropriado no ponto de spawn do depósito e anexe qualquer trailer necessário. Use AttachVehicleToTrailer para a física adequada do trailer e implemente um sistema de acoplamento manual onde os motoristas devem recuar a cabine até o trailer e pressionar uma tecla para engatá-lo. Este processo manual adiciona jogabilidade baseada em habilidade e cria momentos satisfatórios quando um motorista faz uma ré difícil em um compartimento de carga apertado. Rastreie o estado de fixação do trailer com cuidado porque a física do trailer do GTA pode separar trailers durante colisões, e seu script precisa detectar isso e notificar o motorista:

local activeTrailer = nil
local trailerAttached = false

function SpawnTruckWithTrailer(vehicleModel, trailerModel, spawnPoint)
    -- Spawn truck
    local truckHash = GetHashKey(vehicleModel)
    RequestModel(truckHash)
    while not HasModelLoaded(truckHash) do Wait(10) end

    local truck = CreateVehicle(truckHash, spawnPoint.x, spawnPoint.y,
        spawnPoint.z, spawnPoint.w, true, false)
    SetVehicleNumberPlateText(truck, 'HAUL' .. math.random(100, 999))
    SetEntityAsMissionEntity(truck, true, true)
    SetModelAsNoLongerNeeded(truckHash)

    -- Spawn trailer if needed
    if trailerModel then
        local trailerHash = GetHashKey(trailerModel)
        RequestModel(trailerHash)
        while not HasModelLoaded(trailerHash) do Wait(10) end

        local trailerSpawn = GetOffsetFromEntityInWorldCoords(truck, 0.0, -8.0, 0.0)
        activeTrailer = CreateVehicle(trailerHash, trailerSpawn.x,
            trailerSpawn.y, trailerSpawn.z, spawnPoint.w, true, false)
        SetEntityAsMissionEntity(activeTrailer, true, true)
        SetModelAsNoLongerNeeded(trailerHash)

        -- Auto-attach trailer
        AttachVehicleToTrailer(truck, activeTrailer, 1.0)
        trailerAttached = true
    end

    return truck
end

-- Monitor trailer attachment status
CreateThread(function()
    while activeTrailer do
        if trailerAttached then
            local truck = GetVehiclePedIsIn(PlayerPedId(), false)
            if truck ~= 0 and not IsVehicleAttachedToTrailer(truck) then
                trailerAttached = false
                lib.notify({
                    title = 'Trailer Detached!',
                    description = 'Your trailer has come loose! Re-attach it.',
                    type = 'error'
                })
                -- Add blip to trailer location
                local trailerCoords = GetEntityCoords(activeTrailer)
                local blip = AddBlipForEntity(activeTrailer)
                SetBlipSprite(blip, 479)
                SetBlipColour(blip, 1)
                BeginTextCommandSetBlipName('STRING')
                AddTextComponentSubstringPlayerName('Detached Trailer')
                EndTextCommandSetBlipName(blip)
            end
        end
        Wait(1000)
    end
end)

Rastreamento de danos e condições de carga

A condição da carga adiciona uma camada significativa de jogabilidade a cada entrega. Acompanhe a saúde da carga com base em impactos, velocidade em lombadas e comportamento de direção ao longo do trajeto. Quando o caminhão colidir com objetos ou outros veículos, calcule a gravidade do impacto usando o delta de velocidade do veículo e aplique danos proporcionais à carga. Cargas frágeis, como eletrônicos ou vidro, sofrem grandes danos devido a pequenos choques, enquanto cargas robustas, como aço de construção, quase não registram impactos. Exiba a integridade da carga como uma porcentagem no HUD para que os motoristas possam ver as consequências de sua direção em tempo real. Reduza o pagamento final proporcionalmente aos danos à carga e estabeleça um limite mínimo abaixo do qual a entrega falha totalmente porque a carga foi destruída. Essa mecânica incentiva naturalmente uma direção cuidadosa sem limitar artificialmente a velocidade, permitindo que os motoristas façam seus próprios cálculos de risco-recompensa sobre dirigir rápido para cumprir o limite de tempo em vez de dirigir com cuidado para preservar a condição da carga.

Navegação GPS e exibição de rota

Forneça aos caminhoneiros um sistema GPS especializado que leve em consideração o tamanho do veículo no cálculo das rotas. Os waypoints padrão do GTA enviam os jogadores por becos estreitos e sob pontes baixas onde um trailer não consegue navegar. Substitua a navegação padrão por marcadores de rota personalizados que seguem estradas adequadas para caminhões, evitam curvas fechadas e alertam os motoristas sobre obstáculos futuros. Exiba a rota como uma série de pontos de verificação no minimapa com indicadores de distância até o próximo e mostre um tempo estimado de chegada com base na velocidade atual. Adicione uma mecânica de consumo de combustível vinculada à distância percorrida e ao peso do veículo para que os motoristas planejem paradas para abastecimento de combustível em viagens longas, criando pontos de decisão adicionais na viagem:

function CreateTruckRoute(pickupCoords, dropoffCoords)
    -- Clear previous route
    ClearGpsMultiRoute()

    -- Set up checkpoint blips along the route
    local checkpoints = CalculateTruckFriendlyRoute(pickupCoords, dropoffCoords)

    for i, checkpoint in ipairs(checkpoints) do
        local blip = AddBlipForCoord(checkpoint.x, checkpoint.y, checkpoint.z)
        SetBlipSprite(blip, 1)
        SetBlipScale(blip, 0.6)
        SetBlipColour(blip, i == #checkpoints and 5 or 3)
        SetBlipAsShortRange(blip, true)
        table.insert(routeBlips, blip)
    end

    -- Set final destination waypoint
    SetNewWaypoint(dropoffCoords.x, dropoffCoords.y)

    -- Start GPS multi-route display
    StartGpsMultiRoute(6, true, true)
    for _, cp in ipairs(checkpoints) do
        AddPointToGpsMultiRoute(cp.x, cp.y, cp.z)
    end
    SetGpsMultiRouteRender(true)
end

Estações de pesagem e inspeções

Adicione estações de pesagem ao longo das principais rodovias onde os caminhoneiros devem parar e ter sua carga inspecionada. Essa mecânica cria pontos de interação naturais em viagens longas e abre oportunidades de roleplay entre caminhoneiros e inspetores do DOT, que podem ser conduzidos por NPCs ou comandados por jogadores com cargo de autoridade de transporte. Em uma estação de pesagem, verifique o peso total do caminhão em relação aos limites legais, verifique se o manifesto de carga corresponde ao que foi carregado e inspecione as condições do veículo. Os camiões com excesso de peso recebem multas que reduzem os lucros das entregas, incentivando os motoristas a permanecerem dentro dos limites legais. Se o seu servidor tiver uma força policial, dê aos policiais a capacidade de realizar inspeções na estrada com verificações semelhantes, criando encontros orgânicos de aplicação da lei que não dependem do crime. A conformidade com as estações de pesagem acrescenta outra camada de realismo que os jogadores dedicados do transporte rodoviário realmente apreciam porque valida seu compromisso com a função.

Sistema de comboio multijogador

Permitir que vários caminhoneiros formem comboios para entregas em grupo que pagam um bônus por motorista participante. O líder do comboio aceita um contrato especial de vários caminhões que gera entregas interligadas indo para a mesma área de destino. Os membros do comboio compartilham um canal de rádio para coordenação, veem as posições uns dos outros no minimapa com marcadores especiais do comboio e recebem um bônus de proximidade ao dirigirem a uma distância razoável um do outro. Isso incentiva a jogabilidade social e cria momentos visuais impressionantes quando uma fila de caminhões percorre a rodovia juntos. Implemente um indicador de formação de comboio que mostre a posição de cada membro na fila e destaque quem ficar para trás ou tomar o caminho errado. O bônus do comboio deve ser significativo o suficiente para incentivar o agrupamento, normalmente de vinte a trinta por cento mais do que viagens individuais, fazendo com que valha a pena esperar por outros motoristas em vez de partir imediatamente sozinho.

Medidas de desempenho e anti-exploração

Os sistemas de transporte rodoviário geram veículos grandes que têm custos de renderização significativos, portanto, gerencie seu ciclo de vida com cuidado. Exclua o caminhão e o trailer imediatamente quando uma entrega for concluída ou falhar, em vez de deixá-los no mapa. Se o motorista se desconectar no meio da entrega, limpe os veículos gerados no servidor e marque o contrato como abandonado. Evite explorações de teletransporte rastreando a posição do caminhão em intervalos regulares e garantindo que ele siga um caminho plausível desde a coleta até a entrega, sinalizando entregas onde o veículo percorreu distâncias impossíveis entre as verificações. Aceitação de contrato com limite de taxa para evitar que os jogadores aceitem e cancelem contratos rapidamente para escolher as rotas mais bem pagas. Armazene estatísticas de entrega por jogador para tabelas de classificação e conquistas, mas o banco de dados em lote grava em um cronômetro em vez de gravar após cada ponto de verificação para minimizar a carga do banco de dados durante horários de pico, quando muitos motoristas estão ativos simultaneamente.

Partilhar este artigo

Pronto para melhorar o teu servidor?

Explora os nossos scripts FiveM premium na loja Agency Scripts ou junta-te à nossa comunidade no Discord para suporte e atualizações.