From 395693bac1795015bfec3ff7dcd32645e0e4a97b Mon Sep 17 00:00:00 2001 From: Nordi98 Date: Wed, 30 Jul 2025 02:53:21 +0200 Subject: [PATCH] Update stations.lua --- .../[tools]/nordi_taxi/client/stations.lua | 205 +++++++++++++----- 1 file changed, 146 insertions(+), 59 deletions(-) diff --git a/resources/[tools]/nordi_taxi/client/stations.lua b/resources/[tools]/nordi_taxi/client/stations.lua index 4c4156943..f1f640684 100644 --- a/resources/[tools]/nordi_taxi/client/stations.lua +++ b/resources/[tools]/nordi_taxi/client/stations.lua @@ -157,36 +157,84 @@ RegisterNetEvent('taxi:enterStationVehicle', function(data) -- Türen entsperren SetVehicleDoorsLocked(vehicle, 1) - -- Fahrer spawnen - local driverHash = GetHashKey("a_m_m_taxi_01") - RequestModel(driverHash) - local timeout = GetGameTimer() + 10000 - while not HasModelLoaded(driverHash) and GetGameTimer() < timeout do - print("^3[TAXI STATIONS DEBUG]^7 Waiting for driver model to load...") - Wait(100) + -- Verschiedene Fahrer-Models versuchen + local driverModels = { + "a_m_m_taxi_01", + "s_m_y_taxi_01", + "a_m_y_business_01", + "a_m_m_business_01", + "a_m_y_downtown_01" + } + + local driver = nil + local driverHash = nil + + for _, modelName in pairs(driverModels) do + print("^2[TAXI STATIONS DEBUG]^7 Trying driver model: " .. modelName) + driverHash = GetHashKey(modelName) + + RequestModel(driverHash) + local timeout = GetGameTimer() + 5000 + while not HasModelLoaded(driverHash) and GetGameTimer() < timeout do + print("^3[TAXI STATIONS DEBUG]^7 Waiting for driver model " .. modelName .. " to load...") + Wait(100) + end + + if HasModelLoaded(driverHash) then + print("^2[TAXI STATIONS DEBUG]^7 Driver model " .. modelName .. " loaded successfully") + + driver = CreatePedInsideVehicle(vehicle, 26, driverHash, -1, true, false) + + if DoesEntityExist(driver) then + print("^2[TAXI STATIONS DEBUG]^7 Driver created successfully: " .. driver) + break + else + print("^1[TAXI STATIONS DEBUG]^7 Failed to create driver with model: " .. modelName) + SetModelAsNoLongerNeeded(driverHash) + end + else + print("^1[TAXI STATIONS DEBUG]^7 Failed to load driver model: " .. modelName) + end end - if not HasModelLoaded(driverHash) then - print("^1[TAXI STATIONS DEBUG]^7 Failed to load driver model!") - return - end - - local driver = CreatePedInsideVehicle(vehicle, 26, driverHash, -1, true, false) - - if not DoesEntityExist(driver) then - print("^1[TAXI STATIONS DEBUG]^7 Failed to create driver!") - return + -- Fallback: Fahrer ohne Model erstellen + if not driver or not DoesEntityExist(driver) then + print("^3[TAXI STATIONS DEBUG]^7 Using fallback driver creation...") + + -- Standard Male Model verwenden + driverHash = GetHashKey("mp_m_freemode_01") + RequestModel(driverHash) + local timeout = GetGameTimer() + 5000 + while not HasModelLoaded(driverHash) and GetGameTimer() < timeout do + Wait(100) + end + + if HasModelLoaded(driverHash) then + driver = CreatePedInsideVehicle(vehicle, 26, driverHash, -1, true, false) + print("^2[TAXI STATIONS DEBUG]^7 Fallback driver created: " .. (driver or "nil")) + end end - print("^2[TAXI STATIONS DEBUG]^7 Driver created: " .. driver) - - SetEntityAsMissionEntity(driver, true, true) - SetPedFleeAttributes(driver, 0, 0) - SetPedCombatAttributes(driver, 17, 1) - SetPedSeeingRange(driver, 0.0) - SetPedHearingRange(driver, 0.0) - SetPedAlertness(driver, 0) - SetPedKeepTask(driver, true) + -- Wenn immer noch kein Fahrer, ohne Fahrer fortfahren + if not driver or not DoesEntityExist(driver) then + print("^1[TAXI STATIONS DEBUG]^7 Could not create any driver, continuing without driver") + driver = nil + else + -- Fahrer konfigurieren + SetEntityAsMissionEntity(driver, true, true) + SetPedFleeAttributes(driver, 0, 0) + SetPedCombatAttributes(driver, 17, 1) + SetPedSeeingRange(driver, 0.0) + SetPedHearingRange(driver, 0.0) + SetPedAlertness(driver, 0) + SetPedKeepTask(driver, true) + + -- Fahrer-Outfit für Taxi + SetPedComponentVariation(driver, 8, 0, 0, 0) -- Shirt + SetPedComponentVariation(driver, 11, 0, 0, 0) -- Jacket + SetPedComponentVariation(driver, 4, 0, 0, 0) -- Pants + SetPedComponentVariation(driver, 6, 0, 0, 0) -- Shoes + end -- Spieler einsteigen lassen TaskEnterVehicle(playerPed, vehicle, 10000, 0, 1.0, 1, 0) @@ -210,7 +258,7 @@ RegisterNetEvent('taxi:enterStationVehicle', function(data) if not IsPedInVehicle(playerPed, vehicle, false) then print("^1[TAXI STATIONS DEBUG]^7 Player failed to enter vehicle") -- Cleanup - if DoesEntityExist(driver) then + if driver and DoesEntityExist(driver) then DeleteEntity(driver) end SetVehicleDoorsLocked(vehicle, 2) @@ -269,6 +317,18 @@ function OpenStationTaxiMenu(stationId, vehicleId, vehicle, driver, pricePerKm) end }) + -- Selbst fahren Option (wenn kein Fahrer) + if not driver or not DoesEntityExist(driver) then + table.insert(options, { + title = '🚗 Selbst fahren', + description = 'Du fährst das Taxi selbst (kostenlos)', + icon = 'car', + onSelect = function() + SelfDriveStationTaxi(stationId, vehicleId, vehicle) + end + }) + end + -- Aussteigen Option table.insert(options, { title = 'Aussteigen', @@ -288,6 +348,41 @@ function OpenStationTaxiMenu(stationId, vehicleId, vehicle, driver, pricePerKm) lib.showContext('station_taxi_menu') end +function SelfDriveStationTaxi(stationId, vehicleId, vehicle) + print("^2[TAXI STATIONS DEBUG]^7 Player driving taxi themselves") + + local playerPed = PlayerPedId() + + -- Spieler zum Fahrersitz bewegen + TaskShuffleToNextVehicleSeat(playerPed, vehicle) + + lib.notify({ + title = 'Taxi Service', + description = 'Du fährst das Taxi jetzt selbst. Bringe es zur Station zurück wenn du fertig bist.', + type = 'info' + }) + + -- Überwachung für Rückgabe + CreateThread(function() + while DoesEntityExist(vehicle) do + local playerPed = PlayerPedId() + + -- Prüfen ob Spieler noch im Fahrzeug ist + if not IsPedInVehicle(playerPed, vehicle, false) then + print("^2[TAXI STATIONS DEBUG]^7 Player left self-drive taxi") + + -- Nach 30 Sekunden Taxi zurück zur Station + SetTimeout(30000, function() + ReturnTaxiToStation(stationId, vehicleId, vehicle, nil) + end) + break + end + + Wait(5000) + end + end) +end + function OpenStationSelectionMenu(stationId, vehicleId, vehicle, driver, pricePerKm) print("^2[TAXI STATIONS DEBUG]^7 Opening station selection menu") @@ -331,6 +426,29 @@ end function StartStationTaxiRide(stationId, vehicleId, vehicle, driver, destination, price) print("^2[TAXI STATIONS DEBUG]^7 Starting station taxi ride to: " .. tostring(destination)) + -- Wenn kein Fahrer, Spieler selbst fahren lassen + if not driver or not DoesEntityExist(driver) then + lib.notify({ + title = 'Taxi Service', + description = 'Kein Fahrer verfügbar. Fahre selbst zum Ziel! (Kostenlos)', + type = 'info' + }) + + -- Destination Blip erstellen + local destinationBlip = AddBlipForCoord(destination.x, destination.y, destination.z) + SetBlipSprite(destinationBlip, 1) + SetBlipColour(destinationBlip, 2) + SetBlipScale(destinationBlip, 0.8) + BeginTextCommandSetBlipName("STRING") + AddTextComponentString("Taxi Ziel") + EndTextCommandSetBlipName(destinationBlip) + + -- Route setzen + SetNewWaypoint(destination.x, destination.y) + + return + end + lib.notify({ title = 'Taxi Service', description = 'Fahrt gestartet - Preis: $' .. price, @@ -412,7 +530,7 @@ function ReturnTaxiToStation(stationId, vehicleId, vehicle, driver) end -- Fahrer löschen - if DoesEntityExist(driver) then + if driver and DoesEntityExist(driver) then DeleteEntity(driver) print("^2[TAXI STATIONS DEBUG]^7 Driver deleted") end @@ -520,37 +638,6 @@ RegisterNetEvent('taxi:respawnAllStations', function() }) end) --- Verbesserte Fahrzeug-Respawn-Logik -function RespawnStationVehicle(stationId, vehicleId) - if not stationVehicles[stationId] or not stationVehicles[stationId][vehicleId] then - return - end - - local vehicleData = stationVehicles[stationId][vehicleId].data - - -- Prüfen ob Position frei ist - local coords = vehicleData.coords - local existingVehicles = GetGamePool('CVehicle') - local positionBlocked = false - - for _, veh in pairs(existingVehicles) do - local vehCoords = GetEntityCoords(veh) - if #(vector3(coords.x, coords.y, coords.z) - vehCoords) < 3.0 then - positionBlocked = true - break - end - end - - if not positionBlocked then - SpawnStationVehicle(stationId, vehicleId, vehicleData) - else - -- Erneut versuchen nach 30 Sekunden - SetTimeout(30000, function() - RespawnStationVehicle(stationId, vehicleId) - end) - end -end - -- Cleanup beim Resource Stop AddEventHandler('onResourceStop', function(resourceName) if GetCurrentResourceName() == resourceName then