>
Guide 2026-05-10

Système de camionnage et livraisons pour FiveM

TDYSKY

TDYSKY

Fondateur et développeur principal chez Agency Scripts

Pourquoi les emplois dans le camionnage sont importants pour l'économie des serveurs

Les travaux de camionnage et de livraison constituent l'épine dorsale économique de tout serveur de jeu de rôle FiveM. Ils fournissent une source de revenus fiable aux nouveaux acteurs qui n’ont pas encore établi de connexions ou trouvé de travail spécialisé, tout en créant également l’infrastructure logistique qui relie les entreprises à travers la carte. Lorsqu’un restaurant a besoin d’ingrédients, qu’un concessionnaire automobile a besoin de véhicules transportés ou qu’un chantier de construction a besoin de matériaux, le camionnage crée le pont entre l’offre et la demande. Un système de camionnage bien conçu transforme ce qui pourrait être un simple trajet d'un point A à un point B en un cheminement de carrière engageant avec la planification d'itinéraires, la gestion du fret, la mise à niveau des véhicules et des décisions risque-récompense concernant l'emprunt d'itinéraires plus longs mais plus rémunérateurs à travers des territoires dangereux. Le travail de camionnage remplit également la carte d'activité, plaçant de gros véhicules sur les autoroutes et donnant à la police quelque chose à surveiller pour les infractions au code de la route, créant ainsi des rencontres de jeu de rôle naturelles entre les camionneurs et les forces de l'ordre.

Configuration des itinéraires et système de contrat

Concevez ton système de camionnage autour d'un modèle contractuel dans lequel les chauffeurs récupèrent les tâches auprès d'un tableau de répartition au dépôt de camionnage. Chaque contrat précise le lieu de ramassage, la destination de livraison, le type de cargaison, le poids, le taux de rémunération et le délai. Organisez les contrats en niveaux en fonction de la classe de permis de conduire et du niveau d'expérience, de sorte que les nouveaux conducteurs commencent par des livraisons locales à l'aide de camions fourgons tandis que les transporteurs chevronnés effectuent des trajets en remorques sur plusieurs cartes avec des matières dangereuses. Le système contractuel doit générer des itinéraires de manière dynamique à partir d'un pool de points de collecte et de livraison plutôt que d'utiliser des itinéraires statiques, qui deviennent répétitifs après quelques exécutions :

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,
}

Le système de niveaux et d'XP crée une progression qui maintient les conducteurs engagés au fil du temps. Chaque livraison réussie rapporte des points d'expérience avec des bonus pour une livraison à temps et une livraison sans dommage. Le système d'expérience débloque des contrats de niveau supérieur avec un meilleur salaire mais aussi une plus grande difficulté, car les itinéraires plus longs traversent des zones plus dangereuses et les véhicules plus gros sont plus difficiles à conduire dans les rues étroites de la ville.

Gestion des véhicules et des remorques

Les véhicules de camionnage nécessitent une manipulation particulière par rapport aux voitures des joueurs classiques. Lorsqu'un chauffeur accepte un contrat, faites apparaître le camion approprié au point d'apparition du dépôt et attachez toute remorque requise. Utiliser AttachVehicleToTrailer pour une physique correcte de la remorque et mettre en œuvre un système d'attelage manuel dans lequel les conducteurs doivent reculer leur cabine jusqu'à la remorque et appuyer sur une touche pour l'atteler. Ce processus manuel ajoute un gameplay basé sur les compétences et crée des moments satisfaisants lorsqu'un conducteur réussit une marche arrière difficile dans un quai de chargement étroit. Suivez attentivement l'état de fixation de la remorque, car la physique des remorques de GTA peut détacher les remorques lors de collisions, et ton script doit le détecter et en informer le conducteur :

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)

Suivi des dommages et de l'état des marchandises

L’état de la cargaison ajoute une couche significative de gameplay à chaque livraison. Suivez l'état de santé de la cargaison en fonction des impacts, de la vitesse sur les bosses et du comportement de conduite tout au long de l'itinéraire. Lorsque le camion entre en collision avec des objets ou d'autres véhicules, calculez la gravité de l'impact à l'aide du delta de vitesse du véhicule et appliquez des dommages proportionnels à la cargaison. Les marchandises fragiles, comme les appareils électroniques ou le verre, subissent de lourds dommages suite à des chocs mineurs, tandis que les marchandises robustes, comme l'acier de construction, enregistrent à peine les impacts. Affichez l'état du chargement en pourcentage sur le HUD afin que les conducteurs puissent voir les conséquences de leur conduite en temps réel. Réduisez le paiement final proportionnellement aux dommages causés à la cargaison et fixez un seuil minimum en dessous duquel la livraison échoue entièrement car la cargaison est détruite. Ce mécanisme encourage naturellement une conduite prudente sans limiter artificiellement la vitesse, permettant aux conducteurs de faire leurs propres calculs risque-récompense sur la conduite rapide pour respecter la limite de temps plutôt que sur la conduite prudente pour préserver l'état de la cargaison.

Navigation GPS et affichage de l'itinéraire

Fournissez aux camionneurs un système GPS spécialisé qui prend en compte la taille du véhicule lors du calcul des itinéraires. Les points de cheminement standard de GTA envoient les joueurs dans des ruelles étroites et sous des ponts bas qu'une remorque ne peut pas parcourir. Remplacez la navigation par défaut avec des marqueurs d'itinéraire personnalisés qui suivent les routes adaptées aux camions, évitent les virages serrés et avertissent les conducteurs des obstacles à venir. Affichez l'itinéraire sous la forme d'une série de points de contrôle sur la mini-carte avec des indicateurs de distance jusqu'au prochain et affichez une heure d'arrivée estimée en fonction de la vitesse actuelle. Ajoutez un mécanisme de consommation de carburant lié à la distance parcourue et au poids du véhicule afin que les conducteurs doivent planifier les arrêts de carburant sur les longs trajets, créant ainsi des points de décision supplémentaires dans le trajet :

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

Stations de pesée et inspections

Ajoutez des stations de pesée le long des routes principales où les camionneurs doivent s'arrêter et faire inspecter leur cargaison. Cette mécanique crée des points d'interaction naturels sur les longs trajets et ouvre des opportunités de jeu de rôle entre les camionneurs et les inspecteurs du DOT, qui peuvent être dirigés par des PNJ ou dirigés par des joueurs exerçant un travail auprès d'une autorité de transport. À une station de pesée, vérifiez le poids total du camion par rapport aux limites légales, vérifiez que le manifeste de fret correspond à ce qui a été chargé et inspectez l'état du véhicule. Les camions en surpoids reçoivent des amendes qui réduisent les bénéfices de livraison, incitant les conducteurs à respecter les limites légales. Si ton serveur dispose d'une force de police, donnez aux agents la possibilité d'effectuer des inspections routières avec des contrôles similaires, créant ainsi des rencontres organiques avec les forces de l'ordre qui ne reposent pas sur la criminalité. La conformité des stations de pesée ajoute une autre couche de réalisme que les acteurs du camionnage dévoués apprécient réellement car elle valide leur engagement dans ce rôle.

Système de convoi multijoueur

Autorisez plusieurs camionneurs à former des convois pour des livraisons groupées qui paient un bonus par conducteur participant. Le chef de convoi accepte un contrat spécial multi-camions qui génère des livraisons liées vers la même zone de destination. Les membres du convoi partagent un canal radio pour la coordination, voient les positions de chacun sur la mini-carte avec des marqueurs de convoi spéciaux et reçoivent un bonus de proximité lorsqu'ils conduisent à une distance raisonnable les uns des autres. Cela encourage le jeu social et crée des moments visuels impressionnants lorsqu’une file de camions roule ensemble sur l’autoroute. Mettez en place un indicateur de formation de convoi qui montre la position de chaque membre dans la file et met en évidence toute personne qui prend du retard ou prend un mauvais virage. Le bonus de convoi devrait être suffisamment important pour inciter à se regrouper, généralement vingt à trente pour cent de plus que les courses en solo, ce qui vaut la peine d'attendre les autres conducteurs plutôt que de partir immédiatement seul.

Mesures de performance et anti-exploit

Les systèmes de camionnage génèrent de gros véhicules qui ont des coûts de rendu importants, alors gérez soigneusement leur cycle de vie. Supprimez immédiatement le camion et la remorque lorsqu'une livraison est terminée ou échoue plutôt que de les laisser sur la carte. Si le chauffeur se déconnecte en cours de livraison, nettoyez les véhicules générés côté serveur et marquez le contrat comme abandonné. Empêchez les exploits de téléportation en suivant la position du camion à intervalles réguliers et en tu assurant qu'il suit un chemin plausible depuis le ramassage jusqu'au dépôt, en signalant les livraisons pour lesquelles le véhicule a parcouru des distances impossibles entre les contrôles. Acceptation des contrats à taux limité pour empêcher les joueurs d'accepter et d'annuler rapidement des contrats pour sélectionner les itinéraires les plus rémunérateurs. Stockez les statistiques de livraison par joueur pour les classements et les réalisations, mais la base de données par lots écrit sur une minuterie plutôt que d'écrire après chaque point de contrôle pour minimiser la charge de la base de données pendant les heures de pointe lorsque de nombreux pilotes sont actifs simultanément.

Partager cet article

Prêt à améliorer votre serveur ?

Découvrez nos scripts FiveM premium dans la boutique Agency Scripts ou rejoignez notre communauté Discord pour le support et les mises à jour.