forked from Simnation/Main
ed
This commit is contained in:
parent
ac7a7489e3
commit
f44120d03d
1 changed files with 110 additions and 61 deletions
|
@ -2,6 +2,7 @@ local QBCore = exports['qb-core']:GetCoreObject()
|
|||
local currentTaxi = nil
|
||||
local currentDriver = nil
|
||||
local taxiBlip = nil
|
||||
local mapBlip = nil
|
||||
local destinationBlip = nil
|
||||
local taxiMeter = {
|
||||
isRunning = false,
|
||||
|
@ -44,7 +45,7 @@ function CallTaxi()
|
|||
|
||||
print("^2[TAXI DEBUG]^7 Player coords: " .. tostring(playerCoords))
|
||||
|
||||
-- Spawn-Position für Taxi finden
|
||||
-- Spawn-Position für Taxi finden - Direkt aus Config
|
||||
local spawnCoords = GetTaxiSpawnPosition(playerCoords)
|
||||
if not spawnCoords then
|
||||
print("^1[TAXI DEBUG]^7 No spawn position found")
|
||||
|
@ -82,18 +83,47 @@ function CallTaxi()
|
|||
-- Zum Spieler fahren
|
||||
TaskVehicleDriveToCoord(driver, taxi, playerCoords.x, playerCoords.y, playerCoords.z, 25.0, 0, GetEntityModel(taxi), 786603, 1.0, true)
|
||||
|
||||
-- Blip für Taxi erstellen
|
||||
-- Blip für Taxi erstellen (Entity-Blip)
|
||||
taxiBlip = AddBlipForEntity(taxi)
|
||||
SetBlipSprite(taxiBlip, 198)
|
||||
SetBlipColour(taxiBlip, 5)
|
||||
SetBlipScale(taxiBlip, 0.8)
|
||||
SetBlipDisplay(taxiBlip, 2) -- Zeigt auf Minimap und großer Karte
|
||||
SetBlipShowCone(taxiBlip, true) -- Zeigt Sichtkegel
|
||||
SetBlipAsShortRange(taxiBlip, false) -- Immer sichtbar, egal wie weit entfernt
|
||||
BeginTextCommandSetBlipName("STRING")
|
||||
AddTextComponentString("Dein Taxi")
|
||||
EndTextCommandSetBlipName(taxiBlip)
|
||||
|
||||
-- Zusätzlicher Blip auf der Karte für bessere Sichtbarkeit
|
||||
local taxiCoords = GetEntityCoords(taxi)
|
||||
mapBlip = AddBlipForCoord(taxiCoords.x, taxiCoords.y, taxiCoords.z)
|
||||
SetBlipSprite(mapBlip, 198)
|
||||
SetBlipColour(mapBlip, 5)
|
||||
SetBlipScale(mapBlip, 1.0)
|
||||
SetBlipDisplay(mapBlip, 4) -- Nur auf großer Karte
|
||||
BeginTextCommandSetBlipName("STRING")
|
||||
AddTextComponentString("Dein Taxi")
|
||||
EndTextCommandSetBlipName(mapBlip)
|
||||
|
||||
-- Blip aktualisieren während Taxi unterwegs ist
|
||||
CreateThread(function()
|
||||
while DoesEntityExist(taxi) and mapBlip do
|
||||
local taxiCoords = GetEntityCoords(taxi)
|
||||
SetBlipCoords(mapBlip, taxiCoords.x, taxiCoords.y, taxiCoords.z)
|
||||
Wait(1000)
|
||||
end
|
||||
|
||||
-- Blip entfernen wenn Thread beendet
|
||||
if mapBlip then
|
||||
RemoveBlip(mapBlip)
|
||||
mapBlip = nil
|
||||
end
|
||||
end)
|
||||
|
||||
lib.notify({
|
||||
title = 'Taxi Service',
|
||||
description = 'Taxi ist unterwegs zu dir!',
|
||||
description = 'Taxi ist unterwegs zu dir! Verfolge es auf der Karte.',
|
||||
type = 'success'
|
||||
})
|
||||
|
||||
|
@ -113,74 +143,68 @@ end
|
|||
function GetTaxiSpawnPosition(playerCoords)
|
||||
print("^2[TAXI DEBUG]^7 Finding spawn position...")
|
||||
|
||||
local spawnDistance = 100.0
|
||||
local maxAttempts = 10
|
||||
-- Prüfen ob Config.MobileTaxiSpawns existiert und nicht leer ist
|
||||
if not Config.MobileTaxiSpawns or #Config.MobileTaxiSpawns == 0 then
|
||||
print("^1[TAXI DEBUG]^7 Config.MobileTaxiSpawns is missing or empty")
|
||||
return nil
|
||||
end
|
||||
|
||||
for i = 1, maxAttempts do
|
||||
local angle = math.random() * 2 * math.pi
|
||||
local x = playerCoords.x + math.cos(angle) * spawnDistance
|
||||
local y = playerCoords.y + math.sin(angle) * spawnDistance
|
||||
-- Alle Spawn-Positionen nach Entfernung sortieren
|
||||
local sortedSpawns = {}
|
||||
for i, spawnPos in ipairs(Config.MobileTaxiSpawns) do
|
||||
local distance = #(playerCoords - vector3(spawnPos.x, spawnPos.y, spawnPos.z))
|
||||
table.insert(sortedSpawns, {
|
||||
coords = spawnPos,
|
||||
distance = distance
|
||||
})
|
||||
end
|
||||
|
||||
local groundZ = 0.0
|
||||
local foundGround, z = GetGroundZFor_3dCoord(x, y, playerCoords.z + 50.0, groundZ, false)
|
||||
-- Nach Entfernung sortieren (nächste zuerst)
|
||||
table.sort(sortedSpawns, function(a, b)
|
||||
return a.distance < b.distance
|
||||
end)
|
||||
|
||||
if foundGround then
|
||||
local spawnCoords = vector4(x, y, z, math.deg(angle))
|
||||
-- Prüfen ob die nächsten Positionen frei sind
|
||||
for i, spawn in ipairs(sortedSpawns) do
|
||||
local spawnCoords = spawn.coords
|
||||
|
||||
-- Prüfen ob Position frei ist (ohne IsPositionClear)
|
||||
-- Prüfen ob Position frei ist
|
||||
local clearArea = true
|
||||
local vehicles = GetGamePool('CVehicle')
|
||||
|
||||
-- Prüfen ob andere Fahrzeuge in der Nähe sind
|
||||
for _, vehicle in ipairs(vehicles) do
|
||||
local vehCoords = GetEntityCoords(vehicle)
|
||||
if #(vector3(x, y, z) - vehCoords) < 5.0 then
|
||||
if #(vector3(spawnCoords.x, spawnCoords.y, spawnCoords.z) - vehCoords) < 5.0 then
|
||||
clearArea = false
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
-- Prüfen ob Peds in der Nähe sind
|
||||
-- Wenn Position frei ist, verwenden
|
||||
if clearArea then
|
||||
local peds = GetGamePool('CPed')
|
||||
for _, ped in ipairs(peds) do
|
||||
local pedCoords = GetEntityCoords(ped)
|
||||
if #(vector3(x, y, z) - pedCoords) < 5.0 then
|
||||
clearArea = false
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Prüfen ob Position auf einer Straße ist
|
||||
if clearArea then
|
||||
local isOnRoad = IsPointOnRoad(x, y, z, 0)
|
||||
if isOnRoad then
|
||||
print("^2[TAXI DEBUG]^7 Found spawn position at attempt " .. i)
|
||||
print("^2[TAXI DEBUG]^7 Using spawn position from config: " .. tostring(spawnCoords) .. " (Distance: " .. spawn.distance .. "m)")
|
||||
return spawnCoords
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
spawnDistance = spawnDistance + 20.0
|
||||
end
|
||||
|
||||
print("^1[TAXI DEBUG]^7 No spawn position found after " .. maxAttempts .. " attempts")
|
||||
|
||||
-- Fallback: Verwende eine der vordefinierten Spawn-Positionen
|
||||
if Config.MobileTaxiSpawns and #Config.MobileTaxiSpawns > 0 then
|
||||
local randomSpawn = Config.MobileTaxiSpawns[math.random(#Config.MobileTaxiSpawns)]
|
||||
print("^3[TAXI DEBUG]^7 Using fallback spawn position")
|
||||
return randomSpawn
|
||||
end
|
||||
|
||||
return nil
|
||||
-- Wenn keine freie Position gefunden wurde, die am weitesten entfernte verwenden
|
||||
local fallbackSpawn = sortedSpawns[#sortedSpawns].coords
|
||||
print("^3[TAXI DEBUG]^7 No clear spawn position found, using fallback: " .. tostring(fallbackSpawn))
|
||||
return fallbackSpawn
|
||||
end
|
||||
|
||||
function SpawnTaxi(coords)
|
||||
print("^2[TAXI DEBUG]^7 Spawning taxi at: " .. tostring(coords))
|
||||
|
||||
local taxiModel = GetHashKey(Config.TaxiVehicles[1].model)
|
||||
-- Sicherstellen dass wir ein gültiges Taxi-Model haben
|
||||
local taxiModel = nil
|
||||
if Config.TaxiVehicles and #Config.TaxiVehicles > 0 then
|
||||
taxiModel = GetHashKey(Config.TaxiVehicles[1].model)
|
||||
else
|
||||
taxiModel = GetHashKey("taxi") -- Fallback
|
||||
end
|
||||
|
||||
print("^2[TAXI DEBUG]^7 Taxi model hash: " .. taxiModel)
|
||||
|
||||
RequestModel(taxiModel)
|
||||
|
@ -195,7 +219,23 @@ function SpawnTaxi(coords)
|
|||
return nil
|
||||
end
|
||||
|
||||
local taxi = CreateVehicle(taxiModel, coords.x, coords.y, coords.z, coords.w, true, false)
|
||||
-- Sicherstellen dass die Z-Koordinate über dem Boden ist
|
||||
local groundZ = 0.0
|
||||
local foundGround, z = GetGroundZFor_3dCoord(coords.x, coords.y, coords.z, groundZ, false)
|
||||
|
||||
local finalZ = coords.z
|
||||
if foundGround then
|
||||
-- Sicherstellen dass wir nicht unter Wasser spawnen
|
||||
local waterZ = GetWaterHeight(coords.x, coords.y, coords.z)
|
||||
if waterZ > z then
|
||||
print("^3[TAXI DEBUG]^7 Water detected at spawn position, adjusting height")
|
||||
finalZ = waterZ + 2.0 -- 2 Meter über Wasser
|
||||
else
|
||||
finalZ = z + 0.5 -- 0.5 Meter über Boden
|
||||
end
|
||||
end
|
||||
|
||||
local taxi = CreateVehicle(taxiModel, coords.x, coords.y, finalZ, coords.w, true, false)
|
||||
|
||||
if not DoesEntityExist(taxi) then
|
||||
print("^1[TAXI DEBUG]^7 Failed to create taxi vehicle!")
|
||||
|
@ -675,6 +715,11 @@ function DespawnTaxi()
|
|||
taxiBlip = nil
|
||||
end
|
||||
|
||||
if mapBlip then
|
||||
RemoveBlip(mapBlip)
|
||||
mapBlip = nil
|
||||
end
|
||||
|
||||
if destinationBlip then
|
||||
RemoveBlip(destinationBlip)
|
||||
destinationBlip = nil
|
||||
|
@ -696,7 +741,6 @@ function DespawnTaxi()
|
|||
currentTaxi = nil
|
||||
print("^2[TAXI DEBUG]^7 Taxi deleted")
|
||||
end
|
||||
|
||||
print("^2[TAXI DEBUG]^7 Taxi despawn completed")
|
||||
end)
|
||||
else
|
||||
|
@ -706,6 +750,11 @@ function DespawnTaxi()
|
|||
taxiBlip = nil
|
||||
end
|
||||
|
||||
if mapBlip then
|
||||
RemoveBlip(mapBlip)
|
||||
mapBlip = nil
|
||||
end
|
||||
|
||||
if destinationBlip then
|
||||
RemoveBlip(destinationBlip)
|
||||
destinationBlip = nil
|
||||
|
@ -723,7 +772,6 @@ function DespawnTaxi()
|
|||
end
|
||||
end
|
||||
|
||||
|
||||
function CalculateDistanceToCoords(coords)
|
||||
local playerCoords = GetEntityCoords(PlayerPedId())
|
||||
return #(playerCoords - coords)
|
||||
|
@ -755,3 +803,4 @@ AddEventHandler('onResourceStop', function(resourceName)
|
|||
print("^2[TAXI DEBUG]^7 Main cleanup completed")
|
||||
end
|
||||
end)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue