696 lines
		
	
	
		
			No EOL
		
	
	
		
			20 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			696 lines
		
	
	
		
			No EOL
		
	
	
		
			20 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
Utils.Vehicles = {}
 | 
						|
local generatedPlates = {}
 | 
						|
 | 
						|
-----------------------------------------------------------------------------------------------------------------------------------------
 | 
						|
-- SpawnVehicle functions
 | 
						|
-----------------------------------------------------------------------------------------------------------------------------------------
 | 
						|
 | 
						|
function Utils.Vehicles.spawnVehicle(model,x,y,z,h,blip_data,properties)
 | 
						|
	assert(Utils.Entity.isPlayerNearCoords(x,y,z,424.0),("^3Resource ^1%s^3 Tried to spawn vehicle on the client but the position is too far away (Out of onesync range).^7"):format(getResourceName()))
 | 
						|
	assert(properties, "Vehicle properties are null")
 | 
						|
	assert(properties.plate, "Vehicle properties must have at least properties.plate")
 | 
						|
	properties.fuelLevel = properties.fuelLevel or 100.0
 | 
						|
	properties.engineHealth = properties.engineHealth or 1000.0
 | 
						|
	properties.bodyHealth = properties.bodyHealth or 1000.0
 | 
						|
 | 
						|
	local model_hash = GetHashKey(model)
 | 
						|
	Utils.Entity.loadModel(model_hash)
 | 
						|
 | 
						|
	local vehicle = CreateVehicle(model_hash,x,y,z+0.5,h,true,false)
 | 
						|
	local netid = NetworkGetNetworkIdFromEntity(vehicle)
 | 
						|
	SetVehicleHasBeenOwnedByPlayer(vehicle, true)
 | 
						|
	SetNetworkIdCanMigrate(netid, true)
 | 
						|
	SetVehicleNeedsToBeHotwired(vehicle, false)
 | 
						|
	SetVehRadioStation(vehicle, 'OFF')
 | 
						|
 | 
						|
	Utils.Vehicles.setVehicleProperties(vehicle, properties)
 | 
						|
	Utils.Framework.setVehicleFuel(vehicle, properties.plate, model, properties.fuelLevel + 0.0)
 | 
						|
	Utils.Framework.giveVehicleKeys(vehicle, properties.plate, model)
 | 
						|
 | 
						|
	SetModelAsNoLongerNeeded(model_hash)
 | 
						|
 | 
						|
	local blip
 | 
						|
	if blip_data and blip_data.name then
 | 
						|
		blip = Utils.Blips.createBlipForEntity(vehicle,blip_data.name,blip_data.sprite,blip_data.color)
 | 
						|
	end
 | 
						|
 | 
						|
	generatedPlates[properties.plate] = vehicle
 | 
						|
	return vehicle,blip
 | 
						|
end
 | 
						|
 | 
						|
function Utils.Vehicles.deleteVehicle(vehicle)
 | 
						|
	local plate = removePlateInGeneratedPlatesFromVehicle(vehicle)
 | 
						|
	if IsEntityAVehicle(vehicle) then
 | 
						|
		Utils.Framework.removeVehicleKeys(vehicle)
 | 
						|
		SetEntityAsMissionEntity(vehicle, true, true)
 | 
						|
		DeleteVehicle(vehicle)
 | 
						|
	elseif plate then
 | 
						|
		Utils.Framework.removeVehicleKeysFromPlate(plate)
 | 
						|
	end
 | 
						|
end
 | 
						|
 | 
						|
function removePlateInGeneratedPlatesFromVehicle(vehicle)
 | 
						|
	for k, v in pairs(generatedPlates) do
 | 
						|
		if v == vehicle then
 | 
						|
			generatedPlates[k] = nil
 | 
						|
			return k
 | 
						|
		end
 | 
						|
	end
 | 
						|
end
 | 
						|
 | 
						|
-----------------------------------------------------------------------------------------------------------------------------------------
 | 
						|
-- Functions
 | 
						|
-----------------------------------------------------------------------------------------------------------------------------------------
 | 
						|
 | 
						|
function Utils.Vehicles.getPlate(vehicle)
 | 
						|
	if vehicle == 0 then return end
 | 
						|
	return Utils.Math.trim(GetVehicleNumberPlateText(vehicle))
 | 
						|
end
 | 
						|
 | 
						|
function Utils.Vehicles.generateTempVehiclePlateWithPrefix(resource)
 | 
						|
	config_spawned_vehicles = Config.spawned_vehicles[resource]
 | 
						|
	if not config_spawned_vehicles then
 | 
						|
		print("^3WARNING: Missing config '^1Config.spawned_vehicles[" .. resource .. "]^3' in resource '^1lc_utils^3'. The value will be set to its default. Consider redownloading the original config to obtain the correct config.^7")
 | 
						|
		Config.spawned_vehicles[resource] = {
 | 
						|
			['is_static'] = false,
 | 
						|
			['plate_prefix'] = "TEMP"
 | 
						|
		}
 | 
						|
		config_spawned_vehicles = Config.spawned_vehicles[resource]
 | 
						|
	end
 | 
						|
	if config_spawned_vehicles.is_static then
 | 
						|
		return config_spawned_vehicles.plate_prefix
 | 
						|
	else
 | 
						|
		return Utils.Vehicles.generateTempVehiclePlate(config_spawned_vehicles.plate_prefix)
 | 
						|
	end
 | 
						|
end
 | 
						|
 | 
						|
function Utils.Vehicles.generateTempVehiclePlate(prefix)
 | 
						|
	assert(#prefix <= 7, "Plate prefix is too long: '" .. prefix .. "' (maximum 7 characters allowed)")
 | 
						|
 | 
						|
	local remainingChars = 8 - #prefix
 | 
						|
	local maxAttempts = 1000
 | 
						|
 | 
						|
	for _ = 1, maxAttempts do
 | 
						|
		local randomChars = ""
 | 
						|
		for i = 1, remainingChars do
 | 
						|
			local randomNumber = tostring(math.random(0, 9))
 | 
						|
			randomChars = randomChars .. randomNumber
 | 
						|
		end
 | 
						|
 | 
						|
		local plate = prefix .. randomChars
 | 
						|
 | 
						|
		if not generatedPlates[plate] then
 | 
						|
			generatedPlates[plate] = true
 | 
						|
			return plate
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	error("Failed to generate a unique plate for the prefix: '" ..prefix.. "'")
 | 
						|
end
 | 
						|
 | 
						|
function Utils.Vehicles.removeKeysFromPlate(plate,model)
 | 
						|
	generatedPlates[plate] = nil
 | 
						|
	Utils.Framework.removeVehicleKeysFromPlate(plate,model)
 | 
						|
end
 | 
						|
 | 
						|
-----------------------------------------------------------------------------------------------------------------------------------------
 | 
						|
-- VehicleProperties
 | 
						|
-----------------------------------------------------------------------------------------------------------------------------------------
 | 
						|
 | 
						|
function Utils.Vehicles.getVehicleProperties(vehicle)
 | 
						|
	if DoesEntityExist(vehicle) then
 | 
						|
		---@type number | number[], number | number[]
 | 
						|
		local colorPrimary, colorSecondary = GetVehicleColours(vehicle)
 | 
						|
		local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle)
 | 
						|
 | 
						|
		if GetIsVehiclePrimaryColourCustom(vehicle) then
 | 
						|
			colorPrimary = { GetVehicleCustomPrimaryColour(vehicle) }
 | 
						|
		end
 | 
						|
 | 
						|
		if GetIsVehicleSecondaryColourCustom(vehicle) then
 | 
						|
			colorSecondary = { GetVehicleCustomSecondaryColour(vehicle) }
 | 
						|
		end
 | 
						|
 | 
						|
		local extras = {}
 | 
						|
 | 
						|
		for i = 1, 15 do
 | 
						|
			if DoesExtraExist(vehicle, i) then
 | 
						|
				extras[i] = IsVehicleExtraTurnedOn(vehicle, i) and 0 or 1
 | 
						|
			end
 | 
						|
		end
 | 
						|
 | 
						|
		local modLiveryCount = GetVehicleLiveryCount(vehicle)
 | 
						|
		local modLivery = GetVehicleLivery(vehicle)
 | 
						|
 | 
						|
		if modLiveryCount == -1 or modLivery == -1 then
 | 
						|
			modLivery = GetVehicleMod(vehicle, 48)
 | 
						|
		end
 | 
						|
 | 
						|
		local damage = {
 | 
						|
			windows = {},
 | 
						|
			doors = {},
 | 
						|
			tyres = {},
 | 
						|
		}
 | 
						|
 | 
						|
		local windows = 0
 | 
						|
 | 
						|
		for i = 0, 7 do
 | 
						|
			RollUpWindow(vehicle, i)
 | 
						|
 | 
						|
			if not IsVehicleWindowIntact(vehicle, i) then
 | 
						|
				windows += 1
 | 
						|
				damage.windows[windows] = i
 | 
						|
			end
 | 
						|
		end
 | 
						|
 | 
						|
		local doors = 0
 | 
						|
 | 
						|
		for i = 0, 5 do
 | 
						|
			if IsVehicleDoorDamaged(vehicle, i) then
 | 
						|
				doors += 1
 | 
						|
				damage.doors[doors] = i
 | 
						|
			end
 | 
						|
		end
 | 
						|
 | 
						|
		for i = 0, 7 do
 | 
						|
			if IsVehicleTyreBurst(vehicle, i, false) then
 | 
						|
				damage.tyres[i] = IsVehicleTyreBurst(vehicle, i, true) and 2 or 1
 | 
						|
			end
 | 
						|
		end
 | 
						|
 | 
						|
		local neons = {}
 | 
						|
 | 
						|
		for i = 0, 3 do
 | 
						|
			neons[i + 1] = IsVehicleNeonLightEnabled(vehicle, i)
 | 
						|
		end
 | 
						|
 | 
						|
		return {
 | 
						|
			model = GetEntityModel(vehicle),
 | 
						|
			plate = GetVehicleNumberPlateText(vehicle),
 | 
						|
			plateIndex = GetVehicleNumberPlateTextIndex(vehicle),
 | 
						|
			bodyHealth = math.floor(GetVehicleBodyHealth(vehicle) + 0.5),
 | 
						|
			engineHealth = math.floor(GetVehicleEngineHealth(vehicle) + 0.5),
 | 
						|
			tankHealth = math.floor(GetVehiclePetrolTankHealth(vehicle) + 0.5),
 | 
						|
			fuelLevel = math.floor(GetVehicleFuelLevel(vehicle) + 0.5),
 | 
						|
			oilLevel = math.floor(GetVehicleOilLevel(vehicle) + 0.5),
 | 
						|
			dirtLevel = math.floor(GetVehicleDirtLevel(vehicle) + 0.5),
 | 
						|
			color1 = colorPrimary,
 | 
						|
			color2 = colorSecondary,
 | 
						|
			pearlescentColor = pearlescentColor,
 | 
						|
			interiorColor = GetVehicleInteriorColor(vehicle),
 | 
						|
			dashboardColor = GetVehicleDashboardColour(vehicle),
 | 
						|
			wheelColor = wheelColor,
 | 
						|
			wheelWidth = GetVehicleWheelWidth(vehicle),
 | 
						|
			wheelSize = GetVehicleWheelSize(vehicle),
 | 
						|
			wheels = GetVehicleWheelType(vehicle),
 | 
						|
			windowTint = GetVehicleWindowTint(vehicle),
 | 
						|
			xenonColor = GetVehicleXenonLightsColor(vehicle),
 | 
						|
			neonEnabled = neons,
 | 
						|
			neonColor = { GetVehicleNeonLightsColour(vehicle) },
 | 
						|
			extras = extras,
 | 
						|
			tyreSmokeColor = { GetVehicleTyreSmokeColor(vehicle) },
 | 
						|
			modSpoilers = GetVehicleMod(vehicle, 0),
 | 
						|
			modFrontBumper = GetVehicleMod(vehicle, 1),
 | 
						|
			modRearBumper = GetVehicleMod(vehicle, 2),
 | 
						|
			modSideSkirt = GetVehicleMod(vehicle, 3),
 | 
						|
			modExhaust = GetVehicleMod(vehicle, 4),
 | 
						|
			modFrame = GetVehicleMod(vehicle, 5),
 | 
						|
			modGrille = GetVehicleMod(vehicle, 6),
 | 
						|
			modHood = GetVehicleMod(vehicle, 7),
 | 
						|
			modFender = GetVehicleMod(vehicle, 8),
 | 
						|
			modRightFender = GetVehicleMod(vehicle, 9),
 | 
						|
			modRoof = GetVehicleMod(vehicle, 10),
 | 
						|
			modEngine = GetVehicleMod(vehicle, 11),
 | 
						|
			modBrakes = GetVehicleMod(vehicle, 12),
 | 
						|
			modTransmission = GetVehicleMod(vehicle, 13),
 | 
						|
			modHorns = GetVehicleMod(vehicle, 14),
 | 
						|
			modSuspension = GetVehicleMod(vehicle, 15),
 | 
						|
			modArmor = GetVehicleMod(vehicle, 16),
 | 
						|
			modNitrous = GetVehicleMod(vehicle, 17),
 | 
						|
			modTurbo = IsToggleModOn(vehicle, 18),
 | 
						|
			modSubwoofer = GetVehicleMod(vehicle, 19),
 | 
						|
			modSmokeEnabled = IsToggleModOn(vehicle, 20),
 | 
						|
			modHydraulics = IsToggleModOn(vehicle, 21),
 | 
						|
			modXenon = IsToggleModOn(vehicle, 22),
 | 
						|
			modFrontWheels = GetVehicleMod(vehicle, 23),
 | 
						|
			modBackWheels = GetVehicleMod(vehicle, 24),
 | 
						|
			modCustomTiresF = GetVehicleModVariation(vehicle, 23),
 | 
						|
			modCustomTiresR = GetVehicleModVariation(vehicle, 24),
 | 
						|
			modPlateHolder = GetVehicleMod(vehicle, 25),
 | 
						|
			modVanityPlate = GetVehicleMod(vehicle, 26),
 | 
						|
			modTrimA = GetVehicleMod(vehicle, 27),
 | 
						|
			modOrnaments = GetVehicleMod(vehicle, 28),
 | 
						|
			modDashboard = GetVehicleMod(vehicle, 29),
 | 
						|
			modDial = GetVehicleMod(vehicle, 30),
 | 
						|
			modDoorSpeaker = GetVehicleMod(vehicle, 31),
 | 
						|
			modSeats = GetVehicleMod(vehicle, 32),
 | 
						|
			modSteeringWheel = GetVehicleMod(vehicle, 33),
 | 
						|
			modShifterLeavers = GetVehicleMod(vehicle, 34),
 | 
						|
			modAPlate = GetVehicleMod(vehicle, 35),
 | 
						|
			modSpeakers = GetVehicleMod(vehicle, 36),
 | 
						|
			modTrunk = GetVehicleMod(vehicle, 37),
 | 
						|
			modHydrolic = GetVehicleMod(vehicle, 38),
 | 
						|
			modEngineBlock = GetVehicleMod(vehicle, 39),
 | 
						|
			modAirFilter = GetVehicleMod(vehicle, 40),
 | 
						|
			modStruts = GetVehicleMod(vehicle, 41),
 | 
						|
			modArchCover = GetVehicleMod(vehicle, 42),
 | 
						|
			modAerials = GetVehicleMod(vehicle, 43),
 | 
						|
			modTrimB = GetVehicleMod(vehicle, 44),
 | 
						|
			modTank = GetVehicleMod(vehicle, 45),
 | 
						|
			modWindows = GetVehicleMod(vehicle, 46),
 | 
						|
			modDoorR = GetVehicleMod(vehicle, 47),
 | 
						|
			modLivery = modLivery,
 | 
						|
			modRoofLivery = GetVehicleRoofLivery(vehicle),
 | 
						|
			modLightbar = GetVehicleMod(vehicle, 49),
 | 
						|
			windows = damage.windows,
 | 
						|
			doors = damage.doors,
 | 
						|
			tyres = damage.tyres,
 | 
						|
			bulletProofTyres = GetVehicleTyresCanBurst(vehicle),
 | 
						|
			driftTyres = GetDriftTyresEnabled(vehicle),
 | 
						|
		}
 | 
						|
	end
 | 
						|
end
 | 
						|
 | 
						|
function Utils.Vehicles.setVehicleProperties(vehicle, props)
 | 
						|
	if not DoesEntityExist(vehicle) then error(("Unable to set vehicle properties for '%s' (entity does not exist)"):format(vehicle)) end
 | 
						|
 | 
						|
	local colorPrimary, colorSecondary = GetVehicleColours(vehicle)
 | 
						|
	local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle)
 | 
						|
 | 
						|
	SetVehicleModKit(vehicle, 0)
 | 
						|
	SetVehicleAutoRepairDisabled(vehicle, true)
 | 
						|
 | 
						|
	SetVehicleNumberPlateText(vehicle, props.plate)
 | 
						|
 | 
						|
	if props.plateIndex then
 | 
						|
		SetVehicleNumberPlateTextIndex(vehicle, props.plateIndex)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.bodyHealth then
 | 
						|
		SetVehicleBodyHealth(vehicle, props.bodyHealth + 0.0)
 | 
						|
	else
 | 
						|
		SetVehicleBodyHealth(vehicle, 1000.0)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.engineHealth then
 | 
						|
		SetVehicleEngineHealth(vehicle, props.engineHealth + 0.0)
 | 
						|
	else
 | 
						|
		SetVehicleEngineHealth(vehicle, 1000.0)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.tankHealth then
 | 
						|
		SetVehiclePetrolTankHealth(vehicle, props.tankHealth + 0.0)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.fuelLevel then
 | 
						|
		SetVehicleFuelLevel(vehicle, props.fuelLevel + 0.0)
 | 
						|
	else
 | 
						|
		SetVehicleFuelLevel(vehicle, 100.0)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.oilLevel then
 | 
						|
		SetVehicleOilLevel(vehicle, props.oilLevel + 0.0)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.dirtLevel then
 | 
						|
		SetVehicleDirtLevel(vehicle, props.dirtLevel + 0.0)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.color1 then
 | 
						|
		if type(props.color1) == 'table' then
 | 
						|
			SetVehicleCustomPrimaryColour(vehicle, props.color1[1], props.color1[2], props.color1[3])
 | 
						|
		else
 | 
						|
			ClearVehicleCustomPrimaryColour(vehicle)
 | 
						|
			SetVehicleColours(vehicle, tonumber(props.color1) --[[@as number]], tonumber(props.color2) or colorSecondary --[[@as number]])
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	if props.color2 then
 | 
						|
		if type(props.color2) == 'table' then
 | 
						|
			SetVehicleCustomSecondaryColour(vehicle, props.color2[1], props.color2[2], props.color2[3])
 | 
						|
		else
 | 
						|
			ClearVehicleCustomPrimaryColour(vehicle)
 | 
						|
			SetVehicleColours(vehicle, tonumber(props.color1) or colorPrimary --[[@as number]], tonumber(props.color2) --[[@as number]])
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	if props.pearlescentColor or props.wheelColor then
 | 
						|
		SetVehicleExtraColours(vehicle, props.pearlescentColor or pearlescentColor, props.wheelColor or wheelColor)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.interiorColor then
 | 
						|
		SetVehicleInteriorColor(vehicle, props.interiorColor)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.dashboardColor then
 | 
						|
		SetVehicleDashboardColor(vehicle, props.dashboardColor)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.wheels then
 | 
						|
		SetVehicleWheelType(vehicle, props.wheels)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.wheelSize then
 | 
						|
		SetVehicleWheelSize(vehicle, props.wheelSize)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.wheelWidth then
 | 
						|
		SetVehicleWheelWidth(vehicle, props.wheelWidth)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.windowTint then
 | 
						|
		SetVehicleWindowTint(vehicle, props.windowTint)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.neonEnabled then
 | 
						|
		for i = 1, #props.neonEnabled do
 | 
						|
			SetVehicleNeonLightEnabled(vehicle, i - 1, props.neonEnabled[i])
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	if props.extras then
 | 
						|
		for id, disable in pairs(props.extras) do
 | 
						|
			SetVehicleExtra(vehicle, tonumber(id) --[[@as number]], disable == 1)
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	if props.windows then
 | 
						|
		for i = 1, #props.windows do
 | 
						|
			RemoveVehicleWindow(vehicle, props.windows[i])
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	if props.doors then
 | 
						|
		for i = 1, #props.doors do
 | 
						|
			SetVehicleDoorBroken(vehicle, props.doors[i], true)
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	if props.tyres then
 | 
						|
		for tyre, state in pairs(props.tyres) do
 | 
						|
			SetVehicleTyreBurst(vehicle, tonumber(tyre) --[[@as number]], state == 2, 1000.0)
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	if props.neonColor then
 | 
						|
		SetVehicleNeonLightsColour(vehicle, props.neonColor[1], props.neonColor[2], props.neonColor[3])
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modSmokeEnabled ~= nil then
 | 
						|
		ToggleVehicleMod(vehicle, 20, props.modSmokeEnabled)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.tyreSmokeColor then
 | 
						|
		SetVehicleTyreSmokeColor(vehicle, props.tyreSmokeColor[1], props.tyreSmokeColor[2], props.tyreSmokeColor[3])
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modSpoilers then
 | 
						|
		SetVehicleMod(vehicle, 0, props.modSpoilers, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modFrontBumper then
 | 
						|
		SetVehicleMod(vehicle, 1, props.modFrontBumper, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modRearBumper then
 | 
						|
		SetVehicleMod(vehicle, 2, props.modRearBumper, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modSideSkirt then
 | 
						|
		SetVehicleMod(vehicle, 3, props.modSideSkirt, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modExhaust then
 | 
						|
		SetVehicleMod(vehicle, 4, props.modExhaust, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modFrame then
 | 
						|
		SetVehicleMod(vehicle, 5, props.modFrame, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modGrille then
 | 
						|
		SetVehicleMod(vehicle, 6, props.modGrille, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modHood then
 | 
						|
		SetVehicleMod(vehicle, 7, props.modHood, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modFender then
 | 
						|
		SetVehicleMod(vehicle, 8, props.modFender, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modRightFender then
 | 
						|
		SetVehicleMod(vehicle, 9, props.modRightFender, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modRoof then
 | 
						|
		SetVehicleMod(vehicle, 10, props.modRoof, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modEngine then
 | 
						|
		SetVehicleMod(vehicle, 11, props.modEngine, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modBrakes then
 | 
						|
		SetVehicleMod(vehicle, 12, props.modBrakes, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modTransmission then
 | 
						|
		SetVehicleMod(vehicle, 13, props.modTransmission, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modHorns then
 | 
						|
		SetVehicleMod(vehicle, 14, props.modHorns, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modSuspension then
 | 
						|
		SetVehicleMod(vehicle, 15, props.modSuspension, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modArmor then
 | 
						|
		SetVehicleMod(vehicle, 16, props.modArmor, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modNitrous then
 | 
						|
		SetVehicleMod(vehicle, 17, props.modNitrous, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modTurbo ~= nil then
 | 
						|
		ToggleVehicleMod(vehicle, 18, props.modTurbo)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modSubwoofer ~= nil then
 | 
						|
		ToggleVehicleMod(vehicle, 19, props.modSubwoofer)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modHydraulics ~= nil then
 | 
						|
		ToggleVehicleMod(vehicle, 21, props.modHydraulics)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modXenon ~= nil then
 | 
						|
		ToggleVehicleMod(vehicle, 22, props.modXenon)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.xenonColor then
 | 
						|
		SetVehicleXenonLightsColor(vehicle, props.xenonColor)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modFrontWheels then
 | 
						|
		SetVehicleMod(vehicle, 23, props.modFrontWheels, props.modCustomTiresF)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modBackWheels then
 | 
						|
		SetVehicleMod(vehicle, 24, props.modBackWheels, props.modCustomTiresR)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modPlateHolder then
 | 
						|
		SetVehicleMod(vehicle, 25, props.modPlateHolder, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modVanityPlate then
 | 
						|
		SetVehicleMod(vehicle, 26, props.modVanityPlate, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modTrimA then
 | 
						|
		SetVehicleMod(vehicle, 27, props.modTrimA, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modOrnaments then
 | 
						|
		SetVehicleMod(vehicle, 28, props.modOrnaments, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modDashboard then
 | 
						|
		SetVehicleMod(vehicle, 29, props.modDashboard, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modDial then
 | 
						|
		SetVehicleMod(vehicle, 30, props.modDial, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modDoorSpeaker then
 | 
						|
		SetVehicleMod(vehicle, 31, props.modDoorSpeaker, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modSeats then
 | 
						|
		SetVehicleMod(vehicle, 32, props.modSeats, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modSteeringWheel then
 | 
						|
		SetVehicleMod(vehicle, 33, props.modSteeringWheel, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modShifterLeavers then
 | 
						|
		SetVehicleMod(vehicle, 34, props.modShifterLeavers, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modAPlate then
 | 
						|
		SetVehicleMod(vehicle, 35, props.modAPlate, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modSpeakers then
 | 
						|
		SetVehicleMod(vehicle, 36, props.modSpeakers, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modTrunk then
 | 
						|
		SetVehicleMod(vehicle, 37, props.modTrunk, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modHydrolic then
 | 
						|
		SetVehicleMod(vehicle, 38, props.modHydrolic, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modEngineBlock then
 | 
						|
		SetVehicleMod(vehicle, 39, props.modEngineBlock, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modAirFilter then
 | 
						|
		SetVehicleMod(vehicle, 40, props.modAirFilter, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modStruts then
 | 
						|
		SetVehicleMod(vehicle, 41, props.modStruts, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modArchCover then
 | 
						|
		SetVehicleMod(vehicle, 42, props.modArchCover, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modAerials then
 | 
						|
		SetVehicleMod(vehicle, 43, props.modAerials, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modTrimB then
 | 
						|
		SetVehicleMod(vehicle, 44, props.modTrimB, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modTank then
 | 
						|
		SetVehicleMod(vehicle, 45, props.modTank, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modWindows then
 | 
						|
		SetVehicleMod(vehicle, 46, props.modWindows, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modDoorR then
 | 
						|
		SetVehicleMod(vehicle, 47, props.modDoorR, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modLivery then
 | 
						|
		SetVehicleMod(vehicle, 48, props.modLivery, false)
 | 
						|
		SetVehicleLivery(vehicle, props.modLivery)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modRoofLivery then
 | 
						|
		SetVehicleRoofLivery(vehicle, props.modRoofLivery)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.modLightbar then
 | 
						|
		SetVehicleMod(vehicle, 49, props.modLightbar, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.bulletProofTyres ~= nil then
 | 
						|
		SetVehicleTyresCanBurst(vehicle, props.bulletProofTyres)
 | 
						|
	end
 | 
						|
 | 
						|
	if props.driftTyres then
 | 
						|
		-- SetDriftTyresEnabled(vehicle, true)
 | 
						|
	end
 | 
						|
 | 
						|
	return true
 | 
						|
end
 | 
						|
 | 
						|
-----------------------------------------------------------------------------------------------------------------------------------------
 | 
						|
-- isSpawnPointClear
 | 
						|
-----------------------------------------------------------------------------------------------------------------------------------------
 | 
						|
 | 
						|
function EnumerateEntitiesWithinDistance(entities, isPlayerEntities, coords, maxDistance)
 | 
						|
	local nearbyEntities = {}
 | 
						|
 | 
						|
	if coords then
 | 
						|
		coords = vector3(coords.x, coords.y, coords.z)
 | 
						|
	else
 | 
						|
		local playerPed = PlayerPedId()
 | 
						|
		coords = GetEntityCoords(playerPed)
 | 
						|
	end
 | 
						|
 | 
						|
	for k,entity in pairs(entities) do
 | 
						|
		local distance = #(coords - GetEntityCoords(entity))
 | 
						|
 | 
						|
		if distance <= maxDistance then
 | 
						|
			table.insert(nearbyEntities, isPlayerEntities and k or entity)
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	return nearbyEntities
 | 
						|
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
 | 
						|
}
 | 
						|
 | 
						|
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
 | 
						|
 | 
						|
function EnumerateVehicles()
 | 
						|
	return EnumerateEntities(FindFirstVehicle, FindNextVehicle, EndFindVehicle)
 | 
						|
end
 | 
						|
 | 
						|
GetVehicles = function()
 | 
						|
	local vehicles = {}
 | 
						|
 | 
						|
	for vehicle in EnumerateVehicles() do
 | 
						|
		table.insert(vehicles, vehicle)
 | 
						|
	end
 | 
						|
 | 
						|
	return vehicles
 | 
						|
end
 | 
						|
 | 
						|
GetVehiclesInArea = function(coords, maxDistance) return EnumerateEntitiesWithinDistance(GetVehicles(), false, coords, maxDistance) end
 | 
						|
Utils.Vehicles.isSpawnPointClear = function(coords, maxDistance) return #GetVehiclesInArea(coords, maxDistance) == 0 end |