Zurück zum Blog
Guide8 Min. Lesezeit

FiveM-Lkw-Fahrerjob-System: Skripte für Langstreckenlieferungen

Füge deinem FiveM-Server eine richtige Karriere als Lkw-Fahrer hinzu. Strecken, Ladungen, Gehalt und Top-Skripte für QBCore- und ESX-Wirtschaftssysteme.

Agency Scripts

Gründer und leitender Entwickler bei Agency Scripts

Warum Lkw-Jobs für die Serverwirtschaft wichtig sind

Lkw- und Lieferjobs sind das wirtschaftliche Rückgrat jedes FiveM-Rollenspielservers. Sie bieten neuen Spielern, die noch keine Kontakte geknüpft oder eine spezialisierte Arbeit gefunden haben, eine zuverlässige Einnahmequelle und schaffen gleichzeitig die Logistikinfrastruktur, die Unternehmen auf der Karte miteinander verbindet. Wenn ein Restaurant Zutaten, ein Autohändler zu transportierende Fahrzeuge oder eine Baustelle Material benötigt, verbindet der Lkw-Verkehr Angebot und Nachfrage. Ein gut gestaltetes Lkw-System macht aus einer einfachen Strecke von Punkt A nach Punkt B einen spannenden Karriereweg mit Routenplanung, Frachtmanagement, Fahrzeugverbesserungen und Risiko-Nutzen-Abwägungen: Nimm längere, aber besser bezahlte Routen durch gefährliches Gebiet oder nicht? Der Lkw-Job bringt außerdem mehr Betrieb auf die Karte. Große Fahrzeuge sind auf den Autobahnen unterwegs und bieten der Polizei Anlass, den Verkehr auf Verstöße zu überwachen. So entstehen natürliche Rollenspielbegegnungen zwischen Lkw-Fahrern und Polizei.

Routenkonfiguration und Auftragssystem

Gestalte dein Lkw-System nach einem Auftragsmodell, bei dem Fahrer ihre Jobs an einer Dispositionstafel im Lkw-Depot auswählen. Jeder Auftrag gibt den Abholort, den Lieferort, die Frachtart, das Gewicht, die Bezahlung und das Zeitlimit an. Teile Aufträge nach Führerscheinklasse und Erfahrungsstufe in Kategorien ein, damit neue Fahrer mit lokalen Lieferungen in Transportern beginnen, während erfahrene Fahrer mit Gefahrgut und Sattelzügen Strecken quer über die Karte fahren. Das Auftragssystem sollte Strecken dynamisch aus einer Auswahl von Abhol- und Lieferorten zusammenstellen, statt feste Routen zu verwenden, die nach wenigen Fahrten eintönig werden:

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

Das Stufen- und EP-System sorgt für Fortschritt, der Fahrer langfristig motiviert. Für jede erfolgreiche Lieferung erhält der Fahrer Erfahrungspunkte, mit Boni für pünktliche Lieferungen und unbeschädigte Fracht. Das Erfahrungssystem schaltet höherstufige Aufträge mit besserer Bezahlung, aber auch größerem Schwierigkeitsgrad frei, da längere Strecken durch gefährlichere Gebiete führen und größere Fahrzeuge auf engen Straßen der Stadt schwieriger zu steuern sind.

Fahrzeug- und Anhängerverwaltung

Für Lkw gelten besondere Anforderungen, die sich von denen normaler Spielerautos unterscheiden. Wenn ein Fahrer einen Auftrag annimmt, erstellst du den passenden Lkw am Spawnpunkt des Depots und hängst einen eventuell benötigten Anhänger an. Verwende AttachVehicleToTrailer für eine realistische Anhängerphysik und implementiere ein manuelles Kupplungssystem, bei dem Fahrer ihr Zugfahrzeug rückwärts an den Anhänger heranfahren und eine Taste drücken müssen, um ihn anzukoppeln. Dieser manuelle Vorgang sorgt für Gameplay, bei dem Geschicklichkeit zählt, und für Erfolgserlebnisse, wenn ein Fahrer ein schwieriges Rückwärtsmanöver in eine enge Laderampe schafft. Behalte den Verbindungsstatus des Anhängers genau im Blick, denn die Anhängerphysik von GTA kann dazu führen, dass sich Anhänger bei Kollisionen lösen. Dein Script muss dies erkennen und den Fahrer benachrichtigen:

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)

Frachtschaden und Zustandsverfolgung

Der Zustand der Ladung verleiht jeder Lieferung eine zusätzliche spielerische Ebene. Verfolge den Zustand der Ladung während der gesamten Route anhand von Zusammenstößen, der Geschwindigkeit beim Überfahren von Unebenheiten und dem Fahrverhalten. Wenn der Truck mit Objekten oder anderen Fahrzeugen kollidiert, berechne die Aufprallstärke anhand der Geschwindigkeitsänderung des Fahrzeugs und füge der Ladung entsprechend Schaden zu. Empfindliche Fracht wie Elektronik oder Glas nimmt schon bei leichten Stößen erheblichen Schaden, während robuste Fracht wie Baustahl Aufprälle kaum registriert. Zeige den Zustand der Ladung als Prozentsatz auf dem HUD an, damit Fahrer die Auswirkungen ihres Fahrverhaltens in Echtzeit sehen. Verringere die endgültige Auszahlung proportional zum Ladungsschaden und lege einen Mindestwert fest, unterhalb dessen die Lieferung vollständig scheitert, weil die Ladung zerstört wurde. Diese Mechanik fördert auf natürliche Weise vorsichtiges Fahren, ohne die Geschwindigkeit künstlich zu begrenzen. So können Fahrer selbst abwägen, ob sie schnell fahren, um das Zeitlimit einzuhalten, oder vorsichtig, um den Zustand der Ladung zu bewahren.

GPS-Navigation und Routenanzeige

Biete Truckern ein spezielles GPS-System, das bei der Routenberechnung die Größe des Fahrzeugs berücksichtigt. Standard-GTA-Wegpunkte führen Spieler durch schmale Gassen und unter niedrigen Brücken hindurch, die ein Sattelzug nicht passieren kann. Ersetze die Standardnavigation durch benutzerdefinierte Routenmarkierungen, die für Trucks geeigneten Straßen folgen, enge Kurven vermeiden und Fahrer vor bevorstehenden Hindernissen warnen. Zeige die Route als eine Reihe von Checkpoint-Markierungen auf der Minimap an, einschließlich einer Anzeige der Entfernung zum nächsten Checkpoint, und blende eine geschätzte Ankunftszeit auf Grundlage der aktuellen Geschwindigkeit ein. Füge eine an die zurückgelegte Strecke und das Fahrzeuggewicht gekoppelte Kraftstoffverbrauchsmechanik hinzu, damit Fahrer bei langen Fahrten Tankstopps einplanen müssen. Das schafft zusätzliche Entscheidungen während der Fahrt:

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

Wiegestationen und Kontrollen

Füge entlang wichtiger Autobahnstrecken Wiegestationen hinzu, an denen Trucker anhalten und ihre Ladung kontrollieren lassen müssen. Diese Mechanik schafft bei langen Fahrten natürliche Interaktionspunkte und eröffnet Möglichkeiten für Roleplay zwischen Truckern und Kontrolleuren des Verkehrsministeriums (DOT), die entweder von NPCs übernommen oder von Spielern mit einem Job bei der Verkehrsbehörde besetzt werden können. Überprüfe an einer Wiegestation das Gesamtgewicht des Trucks auf Einhaltung der gesetzlichen Grenzwerte, kontrolliere, ob der Frachtbrief mit der geladenen Fracht übereinstimmt, und untersuche den Zustand des Fahrzeugs. Überladene Trucks erhalten Bußgelder, die den Liefergewinn schmälern und Fahrer dazu anregen, die gesetzlichen Grenzwerte einzuhalten. Wenn es auf deinem Server eine Polizei gibt, ermögliche es Beamten, ähnliche Kontrollen am Straßenrand durchzuführen. So entstehen organische Begegnungen mit der Polizei, die nicht auf Kriminalität beruhen. Die Einhaltung der Vorschriften an Wiegestationen sorgt für eine weitere Ebene an Realismus, die engagierte Trucker wirklich schätzen, weil sie ihr Engagement für die Rolle würdigt.

Multiplayer-Konvoisystem

Ermögliche es mehreren Truckern, sich für gemeinsame Lieferungen zu Konvois zusammenzuschließen, die jedem teilnehmenden Fahrer einen Bonus einbringen. Der Konvoiführer nimmt einen besonderen Auftrag für mehrere Trucks an, der miteinander verknüpfte Lieferungen in dieselbe Zielregion generiert. Konvoimitglieder nutzen für die Koordination einen gemeinsamen Funkkanal, sehen die Positionen der anderen auf der Minimap anhand spezieller Konvoi-Markierungen und erhalten einen Nähebonus, wenn sie in angemessenem Abstand zueinander fahren. Das fördert soziales Gameplay und sorgt für beeindruckende Szenen, wenn eine Reihe von Trucks gemeinsam über die Autobahn rollt. Implementiere eine Konvoi-Formationsanzeige, die die Position jedes Mitglieds in der Kolonne zeigt und hervorhebt, wenn jemand zurückfällt oder falsch abbiegt. Der Konvoibonus sollte groß genug sein, um Gruppen zu motivieren, normalerweise zwanzig bis dreißig Prozent mehr als bei Einzelfahrten. So lohnt es sich, auf andere Fahrer zu warten, anstatt sofort allein loszufahren.

Performance und Maßnahmen gegen Exploits

Trucking-Systeme spawnen große Fahrzeuge, die erhebliche Rendering-Ressourcen beanspruchen. Verwalte ihren Lebenszyklus daher sorgfältig. Lösche Truck und Anhänger sofort, wenn eine Lieferung abgeschlossen ist oder scheitert, anstatt sie auf der Karte stehen zu lassen. Wenn der Fahrer während einer Lieferung die Verbindung trennt, räume serverseitig gespawnte Fahrzeuge auf und markiere den Auftrag als abgebrochen. Verhindere Teleportations-Exploits, indem du die Position des Trucks in regelmäßigen Abständen verfolgst und sicherstellst, dass er einer plausiblen Route von der Abholung bis zur Ablieferung folgt. Markiere Lieferungen, bei denen das Fahrzeug zwischen den Prüfungen unmögliche Entfernungen zurückgelegt hat. Begrenze die Häufigkeit, mit der Aufträge angenommen werden können, damit Spieler nicht schnell Aufträge annehmen und abbrechen können, um nur die bestbezahlten Routen auszuwählen. Speichere Lieferstatistiken pro Spieler für Bestenlisten und Erfolge, aber bündele Datenbank-Schreibvorgänge und führe sie nach einem Zeitplan aus, statt nach jedem Checkpoint zu schreiben. So minimierst du die Datenbanklast während der Stoßzeiten, wenn viele Fahrer gleichzeitig unterwegs sind.

Bereit loszulegen?

Hol dir die Scripts in unserem Shop, oder komm auf den Discord für Support, Updates und einen Blick auf das, was kommt.