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.