488 lines
		
	
	
	
		
			17 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			488 lines
		
	
	
	
		
			17 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
-- 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
 | 
						|
}
 |