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 | 
