2025-08-06 15:36:50 +02:00
|
|
|
-- logs text to the console
|
|
|
|
function Log(text)
|
|
|
|
if (Config.isDebug) then
|
|
|
|
Log(text)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Return all vehicle modifications in an array
|
|
|
|
function GetVehicleModifications(vehicle)
|
|
|
|
local color1, color2 = GetVehicleColours(vehicle)
|
|
|
|
local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle)
|
|
|
|
|
|
|
|
local extras = {}
|
|
|
|
for i = 0, 20, 1 do
|
|
|
|
if (DoesExtraExist(vehicle, i)) then
|
|
|
|
if (IsVehicleExtraTurnedOn(vehicle, i)) then
|
|
|
|
table.insert(extras, { i, 0 })
|
|
|
|
else
|
|
|
|
table.insert(extras, { i, 1 })
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local tiresBurst = {}
|
|
|
|
for i = 0, 5, 1 do
|
|
|
|
if (IsVehicleTyreBurst(vehicle, i, true)) then
|
|
|
|
table.insert(tiresBurst, { i, true })
|
|
|
|
elseif (IsVehicleTyreBurst(vehicle, i, false)) then
|
|
|
|
table.insert(tiresBurst, { i, false })
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local doorsMissing = {}
|
|
|
|
for i = 0, 7, 1 do
|
|
|
|
if (IsVehicleDoorDamaged(vehicle, i)) then
|
|
|
|
table.insert(doorsMissing, i)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local windowsBroken = {}
|
|
|
|
--for i = 0, 13, 1 do
|
|
|
|
-- if (not IsVehicleWindowIntact(vehicle, i)) then
|
|
|
|
-- table.insert(windowsBroken, i)
|
|
|
|
-- end
|
|
|
|
--end
|
|
|
|
|
|
|
|
-- custom colors
|
|
|
|
local hasCustomPrimaryColor = GetIsVehiclePrimaryColourCustom(vehicle)
|
|
|
|
local customPrimaryColor = nil
|
|
|
|
if (hasCustomPrimaryColor) then
|
|
|
|
local r, g, b = GetVehicleCustomPrimaryColour(vehicle)
|
|
|
|
customPrimaryColor = { r, g, b }
|
|
|
|
end
|
|
|
|
|
|
|
|
local hasCustomSecondaryColor = GetIsVehicleSecondaryColourCustom(vehicle)
|
|
|
|
local customSecondaryColor = nil
|
|
|
|
if (hasCustomSecondaryColor) then
|
|
|
|
local r, g, b = GetVehicleCustomSecondaryColour(vehicle)
|
|
|
|
customSecondaryColor = { r, g, b }
|
|
|
|
end
|
|
|
|
|
|
|
|
return {
|
|
|
|
-- 1 model
|
|
|
|
GetEntityModel(vehicle),
|
|
|
|
|
|
|
|
-- 2 lockStatus
|
|
|
|
GetVehicleDoorLockStatus(vehicle),
|
|
|
|
|
|
|
|
-- 3 health
|
|
|
|
math.floor(GetEntityHealth(vehicle) * 10.0) / 10.0,
|
|
|
|
-- 4 bodyHealth
|
|
|
|
math.floor(GetVehicleBodyHealth(vehicle) * 10.0) / 10.0,
|
|
|
|
-- 5 engineHealth
|
|
|
|
math.floor(GetVehicleEngineHealth(vehicle) * 10.0) / 10.0,
|
|
|
|
-- 6 petrolTankHealth
|
|
|
|
math.floor(GetVehiclePetrolTankHealth(vehicle) * 10.0) / 10.0,
|
|
|
|
|
|
|
|
-- 7 dirtLevel
|
|
|
|
math.floor(GetVehicleDirtLevel(vehicle) * 10.0) / 10.0,
|
|
|
|
-- 8 fuelLevel
|
|
|
|
math.floor(exports[Config.exports]:GetFuel(vehicle) * 10.0) / 10.0,
|
|
|
|
|
|
|
|
---------------------------------------------------------------------- Implementierung Miho
|
|
|
|
--math.floor(DecorGetFloat(vehicle, Config.FuelDecor)*10) / 10.0,
|
|
|
|
---------------------------------------------------------------------- Implementierung Miho ENDE
|
|
|
|
|
|
|
|
-- 9 plateIndex
|
|
|
|
GetVehicleNumberPlateTextIndex(vehicle),
|
|
|
|
|
|
|
|
-- 10 primaryColor
|
|
|
|
color1,
|
|
|
|
-- 11 secondaryColor
|
|
|
|
color2,
|
|
|
|
-- 12 pearlescentColor
|
|
|
|
pearlescentColor,
|
|
|
|
-- 13 wheelColor
|
|
|
|
wheelColor,
|
|
|
|
|
|
|
|
-- 14 wheelType
|
|
|
|
GetVehicleWheelType(vehicle),
|
|
|
|
-- 15 customWheelsFront
|
|
|
|
GetVehicleModVariation(vehicle, 23);
|
|
|
|
-- 16 customWheelsBack
|
|
|
|
GetVehicleModVariation(vehicle, 24);
|
|
|
|
-- 17 windowTint
|
|
|
|
GetVehicleWindowTint(vehicle),
|
|
|
|
-- 18 enabledNeon
|
|
|
|
{
|
|
|
|
IsVehicleNeonLightEnabled(vehicle, 0),
|
|
|
|
IsVehicleNeonLightEnabled(vehicle, 1),
|
|
|
|
IsVehicleNeonLightEnabled(vehicle, 2),
|
|
|
|
IsVehicleNeonLightEnabled(vehicle, 3),
|
|
|
|
},
|
|
|
|
-- 19 neonColor
|
|
|
|
table.pack(GetVehicleNeonLightsColour(vehicle)),
|
|
|
|
-- 20 tireSmokeColor
|
|
|
|
table.pack(GetVehicleTyreSmokeColor(vehicle)),
|
|
|
|
|
|
|
|
-- 21 extras
|
|
|
|
extras,
|
|
|
|
|
|
|
|
-- 22-32 mods
|
|
|
|
GetVehicleMod(vehicle, 0),
|
|
|
|
GetVehicleMod(vehicle, 1),
|
|
|
|
GetVehicleMod(vehicle, 2),
|
|
|
|
GetVehicleMod(vehicle, 3),
|
|
|
|
GetVehicleMod(vehicle, 4),
|
|
|
|
GetVehicleMod(vehicle, 5),
|
|
|
|
GetVehicleMod(vehicle, 6),
|
|
|
|
GetVehicleMod(vehicle, 7),
|
|
|
|
GetVehicleMod(vehicle, 8),
|
|
|
|
GetVehicleMod(vehicle, 9),
|
|
|
|
GetVehicleMod(vehicle, 10),
|
|
|
|
|
|
|
|
-- 33-38 mods
|
|
|
|
GetVehicleMod(vehicle, 11),
|
|
|
|
GetVehicleMod(vehicle, 12),
|
|
|
|
GetVehicleMod(vehicle, 13),
|
|
|
|
GetVehicleMod(vehicle, 14),
|
|
|
|
GetVehicleMod(vehicle, 15),
|
|
|
|
GetVehicleMod(vehicle, 16),
|
|
|
|
|
|
|
|
-- 39-41 mods
|
|
|
|
IsToggleModOn(vehicle, 18),
|
|
|
|
IsToggleModOn(vehicle, 20),
|
|
|
|
IsToggleModOn(vehicle, 22),
|
|
|
|
|
|
|
|
-- 42-43 mods
|
|
|
|
GetVehicleMod(vehicle, 23),
|
|
|
|
GetVehicleMod(vehicle, 24),
|
|
|
|
|
|
|
|
-- 44-66 mods
|
|
|
|
GetVehicleMod(vehicle, 25),
|
|
|
|
GetVehicleMod(vehicle, 26),
|
|
|
|
GetVehicleMod(vehicle, 27),
|
|
|
|
GetVehicleMod(vehicle, 28),
|
|
|
|
GetVehicleMod(vehicle, 29),
|
|
|
|
GetVehicleMod(vehicle, 30),
|
|
|
|
GetVehicleMod(vehicle, 31),
|
|
|
|
GetVehicleMod(vehicle, 32),
|
|
|
|
GetVehicleMod(vehicle, 33),
|
|
|
|
GetVehicleMod(vehicle, 34),
|
|
|
|
GetVehicleMod(vehicle, 35),
|
|
|
|
GetVehicleMod(vehicle, 36),
|
|
|
|
GetVehicleMod(vehicle, 37),
|
|
|
|
GetVehicleMod(vehicle, 38),
|
|
|
|
GetVehicleMod(vehicle, 39),
|
|
|
|
GetVehicleMod(vehicle, 40),
|
|
|
|
GetVehicleMod(vehicle, 41),
|
|
|
|
GetVehicleMod(vehicle, 42),
|
|
|
|
GetVehicleMod(vehicle, 43),
|
|
|
|
GetVehicleMod(vehicle, 44),
|
|
|
|
GetVehicleMod(vehicle, 45),
|
|
|
|
GetVehicleMod(vehicle, 46),
|
|
|
|
GetVehicleMod(vehicle, 48),
|
|
|
|
|
|
|
|
-- 67 livery
|
|
|
|
GetVehicleLivery(vehicle),
|
|
|
|
|
|
|
|
-- 68 missingDoors
|
|
|
|
doorsMissing,
|
|
|
|
|
|
|
|
-- 69 bulletproofTires
|
|
|
|
not GetVehicleTyresCanBurst(vehicle),
|
|
|
|
-- 70 tiresBurst
|
|
|
|
tiresBurst,
|
|
|
|
|
|
|
|
-- 71 brokenWindows
|
|
|
|
windowsBroken,
|
|
|
|
|
|
|
|
-- 72 xenon lights
|
|
|
|
GetVehicleXenonLightsColour(vehicle),
|
|
|
|
|
|
|
|
-- 73 custom primary color
|
|
|
|
customPrimaryColor,
|
|
|
|
-- 74 custom secondary color
|
|
|
|
customSecondaryColor,
|
|
|
|
|
|
|
|
-- 75 interior color
|
|
|
|
GetVehicleInteriorColor(vehicle)
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Apply all modifications to a vehicle entity
|
|
|
|
function SetVehicleModifications(vehicle, plate, modifications)
|
|
|
|
SetVehicleModKit(vehicle, 0)
|
|
|
|
|
|
|
|
-- plate
|
|
|
|
SetVehicleNumberPlateText(vehicle, plate)
|
|
|
|
SetVehicleNumberPlateTextIndex(vehicle, modifications[9])
|
|
|
|
|
|
|
|
-- lockStatus
|
|
|
|
SetVehicleDoorsLocked(vehicle, modifications[2])
|
|
|
|
|
|
|
|
-- colours
|
|
|
|
SetVehicleColours(vehicle, modifications[10], modifications[11])
|
|
|
|
if (modifications[73]) then
|
|
|
|
SetVehicleCustomPrimaryColour(vehicle, modifications[73][1], modifications[73][2], modifications[73][3])
|
|
|
|
end
|
|
|
|
if (modifications[74]) then
|
|
|
|
SetVehicleCustomSecondaryColour(vehicle, modifications[74][1], modifications[74][2], modifications[74][3])
|
|
|
|
end
|
|
|
|
if (modifications[75]) then
|
|
|
|
SetVehicleInteriorColor(vehicle, modifications[75])
|
|
|
|
end
|
|
|
|
|
|
|
|
SetVehicleExtraColours(vehicle, modifications[12], modifications[13])
|
|
|
|
|
|
|
|
SetVehicleTyreSmokeColor(vehicle, modifications[20][1], modifications[20][2], modifications[20][3])
|
|
|
|
|
|
|
|
-- wheels
|
|
|
|
SetVehicleWheelType(vehicle, modifications[14])
|
|
|
|
|
|
|
|
-- windows
|
|
|
|
SetVehicleWindowTint(vehicle, modifications[17])
|
|
|
|
|
|
|
|
-- neonlight
|
|
|
|
SetVehicleNeonLightEnabled(vehicle, 0, modifications[18][1])
|
|
|
|
SetVehicleNeonLightEnabled(vehicle, 1, modifications[18][2])
|
|
|
|
SetVehicleNeonLightEnabled(vehicle, 2, modifications[18][3])
|
|
|
|
SetVehicleNeonLightEnabled(vehicle, 3, modifications[18][4])
|
|
|
|
|
|
|
|
SetVehicleNeonLightsColour(vehicle, modifications[19][1], modifications[19][2], modifications[19][3])
|
|
|
|
|
|
|
|
-- mods
|
|
|
|
SetVehicleMod(vehicle, 0, modifications[22], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 1, modifications[23], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 2, modifications[24], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 3, modifications[25], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 4, modifications[26], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 5, modifications[27], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 6, modifications[28], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 7, modifications[29], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 8, modifications[30], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 9, modifications[31], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 10, modifications[32], modifications[15])
|
|
|
|
|
|
|
|
SetVehicleMod(vehicle, 11, modifications[33], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 12, modifications[34], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 13, modifications[35], modifications[15])
|
|
|
|
|
|
|
|
SetVehicleMod(vehicle, 14, modifications[36], modifications[15])
|
|
|
|
|
|
|
|
SetVehicleMod(vehicle, 15, modifications[37], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 16, modifications[38], modifications[15])
|
|
|
|
|
|
|
|
ToggleVehicleMod(vehicle, 18, modifications[39])
|
|
|
|
ToggleVehicleMod(vehicle, 20, modifications[40])
|
|
|
|
ToggleVehicleMod(vehicle, 22, modifications[41])
|
|
|
|
|
|
|
|
SetVehicleMod(vehicle, 23, modifications[42], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 24, modifications[43], modifications[16])
|
|
|
|
|
|
|
|
SetVehicleMod(vehicle, 25, modifications[44], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 26, modifications[45], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 27, modifications[46], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 28, modifications[47], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 29, modifications[48], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 30, modifications[49], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 31, modifications[50], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 32, modifications[51], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 33, modifications[52], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 34, modifications[53], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 35, modifications[54], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 36, modifications[55], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 37, modifications[56], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 38, modifications[57], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 39, modifications[58], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 40, modifications[59], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 41, modifications[60], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 42, modifications[61], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 43, modifications[62], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 44, modifications[63], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 45, modifications[64], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 46, modifications[65], modifications[15])
|
|
|
|
SetVehicleMod(vehicle, 48, modifications[66], modifications[15])
|
|
|
|
|
|
|
|
SetVehicleLivery(vehicle, modifications[67])
|
|
|
|
|
|
|
|
-- extras
|
|
|
|
for i = 1, #modifications[21], 1 do
|
|
|
|
SetVehicleExtra(vehicle, modifications[21][i][1], modifications[21][i][2])
|
|
|
|
end
|
|
|
|
|
|
|
|
-- stats
|
|
|
|
SetEntityHealth(vehicle, modifications[3])
|
|
|
|
SetVehicleBodyHealth(vehicle, modifications[4])
|
|
|
|
SetVehicleEngineHealth(vehicle, modifications[5])
|
|
|
|
SetVehiclePetrolTankHealth(vehicle, modifications[6])
|
|
|
|
if (Config.renderScorched and (modifications[5] < -3999.0 or modifications[6] < -999.0)) then
|
|
|
|
TriggerServerEvent("mh_Parking:renderScorched", NetworkGetNetworkIdFromEntity(vehicle), true)
|
|
|
|
end
|
|
|
|
|
|
|
|
SetVehicleDirtLevel(vehicle, modifications[7])
|
|
|
|
exports[Config.exports]:SetFuel(vehicle, modifications[8])
|
|
|
|
|
|
|
|
---------------------------------------------------------------------- Implementierung Miho
|
|
|
|
--[[
|
|
|
|
fuel = modifications[8]
|
|
|
|
if type(fuel) == 'number' and fuel >= 0 and fuel <= 100 then
|
|
|
|
SetVehicleFuelLevel(vehicle, fuel + 0.0)
|
|
|
|
DecorSetFloat(vehicle, Config.FuelDecor, GetVehicleFuelLevel(vehicle))
|
|
|
|
end
|
|
|
|
]]
|
|
|
|
---------------------------------------------------------------------- Implementierung Miho ENDE
|
|
|
|
|
|
|
|
|
|
|
|
-- doors
|
|
|
|
for i = 1, #modifications[68], 1 do
|
|
|
|
SetVehicleDoorBroken(vehicle, modifications[68][i], true)
|
|
|
|
end
|
|
|
|
|
|
|
|
-- tires
|
|
|
|
SetVehicleTyresCanBurst(vehicle, not modifications[69])
|
|
|
|
if (not modifications[69]) then
|
|
|
|
for i = 1, #modifications[70], 1 do
|
|
|
|
SetVehicleTyreBurst(vehicle, modifications[70][i][1], modifications[70][i][2], 1000.0)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-- windows
|
|
|
|
for i = 1, #modifications[71], 1 do
|
|
|
|
SmashVehicleWindow(vehicle, modifications[71][i])
|
|
|
|
end
|
|
|
|
|
|
|
|
-- xenon lights
|
|
|
|
if (modifications[72]) then
|
|
|
|
SetVehicleXenonLightsColour(vehicle, modifications[72])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Return closest loaded vehicle entity or nil if no vehicle is found
|
|
|
|
function GetClosestVehicle(position, maxRadius)
|
|
|
|
local vehicles = GetAllVehicles()
|
|
|
|
local dist = maxRadius
|
|
|
|
local closestVehicle = nil
|
|
|
|
|
|
|
|
for i=1, #vehicles, 1 do
|
|
|
|
local vehicleCoords = GetEntityCoords(vehicles[i])
|
|
|
|
local tempDist = Vdist(vehicleCoords.x, vehicleCoords.y, vehicleCoords.z, position.x, position.y, position.z)
|
|
|
|
if (tempDist < dist) then
|
|
|
|
dist = tempDist
|
|
|
|
closestVehicle = vehicles[i]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if (closestVehicle ~= nil and DoesEntityExist(closestVehicle)) then
|
|
|
|
return closestVehicle
|
|
|
|
else
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Returns all loaded vehicles on client side
|
|
|
|
function GetAllVehicles()
|
|
|
|
local vehicles = {}
|
|
|
|
|
|
|
|
for vehicle in EnumerateVehicles() do
|
|
|
|
table.insert(vehicles, vehicle)
|
|
|
|
end
|
|
|
|
|
|
|
|
return vehicles
|
|
|
|
end
|
|
|
|
|
|
|
|
function IsVehicleBlacklisted(vehicle)
|
|
|
|
-- check class
|
|
|
|
local class = GetVehicleClass(vehicle)
|
|
|
|
for i = 1, #Config.classesBlacklist, 1 do
|
|
|
|
if (class == Config.classesBlacklist[i]) then
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-- check model
|
|
|
|
local modelHash = GetEntityModel(vehicle)
|
|
|
|
for i = 1, #Config.vehiclesBlacklist, 1 do
|
|
|
|
if (modelHash == Config.vehiclesBlacklist[i]) then
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
function GetVehiclePosition(plate)
|
|
|
|
if (GetResourceState("kimi_callbacks") ~= "started") then
|
|
|
|
Log("^1[ERROR] \"kimi_callbacks\" is either not installed properly or hasn't been started!")
|
|
|
|
Log("^1[ERROR] The export \"GetVehiclePosition\" can only be used when having this resource installed.")
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
|
|
|
|
if (plate == nil) then
|
|
|
|
Log("^1[ERROR] \"plate\" was nil while trying to call export \"GetVehiclePosition\"!")
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
|
|
|
|
if (type(plate) ~= "string") then
|
|
|
|
Log("^1[ERROR] \"plate\" (\"" .. plate .. "\") needs to be of type string when calling export \"GetVehiclePosition\"!")
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
|
|
|
|
local position = exports["kimi_callbacks"]:Trigger("AP:getVehiclePosition", plate:upper())
|
|
|
|
|
|
|
|
return position
|
|
|
|
end
|
|
|
|
|
|
|
|
function GetVehiclePositions(...)
|
|
|
|
if (GetResourceState("kimi_callbacks") ~= "started") then
|
|
|
|
Log("^1[ERROR] \"kimi_callbacks\" is either not installed properly or hasn't been started!")
|
|
|
|
Log("^1[ERROR] The export \"GetVehiclePositions\" can only be used when having this resource installed.")
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
|
|
|
|
local plates = { ... }
|
|
|
|
|
|
|
|
for i, plate in ipairs(plates) do
|
|
|
|
if (plate == nil) then
|
|
|
|
Log("^1[ERROR] \"plate\" (Index: \"" .. i .. "\") was nil while trying to call export \"GetVehiclePositions\"!")
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
|
|
|
|
if (type(plate) ~= "string") then
|
|
|
|
Log("^1[ERROR] \"plate\" (\"" .. plate .. "\") (Index: " .. i .. ") needs to be of type string when calling export \"GetVehiclePositions\"!")
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
|
|
|
|
plates[i] = plates[i]:upper()
|
|
|
|
end
|
|
|
|
|
|
|
|
local data = exports["kimi_callbacks"]:Trigger("AP:getVehiclePositions", plates)
|
|
|
|
|
|
|
|
return data
|
|
|
|
end
|
|
|
|
|
|
|
|
-- getting all vehicles
|
|
|
|
function EnumerateVehicles()
|
|
|
|
return EnumerateEntities(FindFirstVehicle, FindNextVehicle, EndFindVehicle)
|
|
|
|
end
|
|
|
|
function EnumerateEntities(initFunc, moveFunc, disposeFunc)
|
|
|
|
return coroutine.wrap(function()
|
|
|
|
local iter, id = initFunc()
|
|
|
|
if not id or id == 0 then
|
|
|
|
disposeFunc(iter)
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
local enum = {handle = iter, destructor = disposeFunc}
|
|
|
|
setmetatable(enum, entityEnumerator)
|
|
|
|
|
|
|
|
local next = true
|
|
|
|
repeat
|
|
|
|
coroutine.yield(id)
|
|
|
|
next, id = moveFunc(iter)
|
|
|
|
until not next
|
|
|
|
|
|
|
|
enum.destructor, enum.handle = nil, nil
|
|
|
|
disposeFunc(iter)
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
local entityEnumerator = {
|
|
|
|
__gc = function(enum)
|
|
|
|
if enum.destructor and enum.handle then
|
|
|
|
enum.destructor(enum.handle)
|
|
|
|
end
|
|
|
|
enum.destructor = nil
|
|
|
|
enum.handle = nil
|
|
|
|
end
|
|
|
|
}
|