diff --git a/resources/[tools]/nordi_taxi/client/stations.lua b/resources/[tools]/nordi_taxi/client/stations.lua index 88c2275a3..0ba0627c9 100644 --- a/resources/[tools]/nordi_taxi/client/stations.lua +++ b/resources/[tools]/nordi_taxi/client/stations.lua @@ -330,3 +330,205 @@ AddEventHandler('onResourceStop', function(resourceName) end end end) + +-- Event für Admin Respawn +RegisterNetEvent('taxi:respawnAllStations', function() + -- Alle bestehenden Fahrzeuge löschen + for stationId, vehicles in pairs(stationVehicles) do + for vehicleId, vehicleInfo in pairs(vehicles) do + if DoesEntityExist(vehicleInfo.entity) then + exports['qb-target']:RemoveTargetEntity(vehicleInfo.entity) + DeleteEntity(vehicleInfo.entity) + end + if vehicleInfo.driver and DoesEntityExist(vehicleInfo.driver) then + DeleteEntity(vehicleInfo.driver) + end + end + end + + -- Stationen neu initialisieren + Wait(1000) + InitializeTaxiStations() + + lib.notify({ + title = 'Taxi Service', + description = 'Alle Taxi-Stationen wurden neu geladen', + type = 'success' + }) +end) + +-- Zusätzliche Funktionen für bessere Verwaltung +function GetNearestTaxiStation() + local playerCoords = GetEntityCoords(PlayerPedId()) + local nearestStation = nil + local nearestDistance = math.huge + + for stationId, station in pairs(Config.TaxiStations) do + local distance = #(playerCoords - station.blipCoords) + if distance < nearestDistance then + nearestDistance = distance + nearestStation = {id = stationId, data = station, distance = distance} + end + end + + return nearestStation +end + +-- Command um nächste Taxi-Station zu finden +RegisterCommand('nearesttaxi', function() + local nearest = GetNearestTaxiStation() + if nearest then + lib.notify({ + title = 'Taxi Service', + description = 'Nächste Station: ' .. nearest.data.name .. ' (' .. math.ceil(nearest.distance) .. 'm)', + type = 'info' + }) + + -- Waypoint zur nächsten Station setzen + SetNewWaypoint(nearest.data.blipCoords.x, nearest.data.blipCoords.y) + else + lib.notify({ + title = 'Taxi Service', + description = 'Keine Taxi-Station gefunden', + type = 'error' + }) + end +end) + +-- Erweiterte Ziel-Optionen für Station-Taxis +function OpenStationTaxiMenu(stationId, vehicleId, vehicle, driver, pricePerKm) + local options = {} + + -- Bekannte Ziele hinzufügen + for _, destination in pairs(Config.KnownDestinations) do + local customPrice = math.max(Config.MinFare, math.ceil((CalculateDistanceToCoords(destination.coords) / 1000) * pricePerKm)) + table.insert(options, { + title = destination.name, + description = 'Preis: $' .. customPrice .. ' | Entfernung: ' .. math.ceil(CalculateDistanceToCoords(destination.coords) / 1000 * 100) / 100 .. 'km', + icon = 'map-marker', + onSelect = function() + StartStationTaxiRide(stationId, vehicleId, vehicle, driver, destination.coords, customPrice) + end + }) + end + + -- Andere Taxi-Stationen als Ziele + table.insert(options, { + title = '📍 Andere Taxi-Stationen', + description = 'Fahre zu einer anderen Taxi-Station', + icon = 'taxi', + onSelect = function() + OpenStationSelectionMenu(stationId, vehicleId, vehicle, driver, pricePerKm) + end + }) + + -- Waypoint Option + table.insert(options, { + title = 'Zu meinem Waypoint', + description = 'Fahre zu deinem gesetzten Waypoint', + icon = 'location-dot', + onSelect = function() + local waypoint = GetFirstBlipInfoId(8) + if DoesBlipExist(waypoint) then + local coords = GetBlipInfoIdCoord(waypoint) + local distance = CalculateDistanceToCoords(coords) / 1000 + local price = math.max(Config.MinFare, math.ceil(distance * pricePerKm)) + StartStationTaxiRide(stationId, vehicleId, vehicle, driver, coords, price) + else + lib.notify({ + title = 'Taxi Service', + description = 'Du hast keinen Waypoint gesetzt', + type = 'error' + }) + OpenStationTaxiMenu(stationId, vehicleId, vehicle, driver, pricePerKm) + end + end + }) + + -- Aussteigen Option + table.insert(options, { + title = 'Aussteigen', + description = 'Das Taxi verlassen', + icon = 'door-open', + onSelect = function() + ExitStationTaxi(stationId, vehicleId, vehicle, driver) + end + }) + + lib.registerContext({ + id = 'station_taxi_menu', + title = 'Taxi - Ziel wählen (' .. Config.TaxiStations[stationId].name .. ')', + options = options + }) + + lib.showContext('station_taxi_menu') +end + +function OpenStationSelectionMenu(stationId, vehicleId, vehicle, driver, pricePerKm) + local options = {} + + for otherStationId, station in pairs(Config.TaxiStations) do + if otherStationId ~= stationId then + local distance = CalculateDistanceToCoords(station.blipCoords) / 1000 + local price = math.max(Config.MinFare, math.ceil(distance * pricePerKm)) + + table.insert(options, { + title = station.name, + description = 'Preis: $' .. price .. ' | Entfernung: ' .. math.ceil(distance * 100) / 100 .. 'km', + icon = 'building', + onSelect = function() + StartStationTaxiRide(stationId, vehicleId, vehicle, driver, station.blipCoords, price) + end + }) + end + end + + -- Zurück Option + table.insert(options, { + title = '← Zurück', + description = 'Zurück zum Hauptmenü', + icon = 'arrow-left', + onSelect = function() + OpenStationTaxiMenu(stationId, vehicleId, vehicle, driver, pricePerKm) + end + }) + + lib.registerContext({ + id = 'station_selection_menu', + title = 'Taxi-Stationen', + options = options + }) + + lib.showContext('station_selection_menu') +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 diff --git a/resources/[tools]/nordi_taxi/config.lua b/resources/[tools]/nordi_taxi/config.lua index 04f49ea89..88bc9b382 100644 --- a/resources/[tools]/nordi_taxi/config.lua +++ b/resources/[tools]/nordi_taxi/config.lua @@ -94,10 +94,6 @@ Config.TaxiStations = { } } }, - - - - { name = "Vespucci Beach Taxi", coords = vector4(-1266.53, -833.8, 17.11, 37.5), diff --git a/resources/[tools]/nordi_taxi/fxmanifest.lua b/resources/[tools]/nordi_taxi/fxmanifest.lua index e69de29bb..b7e740a2c 100644 --- a/resources/[tools]/nordi_taxi/fxmanifest.lua +++ b/resources/[tools]/nordi_taxi/fxmanifest.lua @@ -0,0 +1,26 @@ +fx_version 'cerulean' +game 'gta5' + +author 'YourName' +description 'Taxi System with ox_lib and qb-target' +version '1.0.0' + +shared_scripts { + '@ox_lib/init.lua', + 'config.lua' +} + +client_scripts { + 'client/main.lua', + 'client/stations.lua' +} + +server_scripts { + 'server/main.lua' +} + +dependencies { + 'qb-core', + 'ox_lib', + 'qb-target' +}