475 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			475 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
 | 
						|
local math_min, math_max, math_floor = math.min, math.max, math.floor
 | 
						|
 | 
						|
-- returns all tuning of a vehicle
 | 
						|
function GetVehicleTuning(vehicle)
 | 
						|
	-- main colors
 | 
						|
	local primaryColor, secondaryColor = GetVehicleColours(vehicle)
 | 
						|
	local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle)
 | 
						|
 | 
						|
	-- custom colors
 | 
						|
	local customPrimaryColor, customSecondaryColor
 | 
						|
	if (GetIsVehiclePrimaryColourCustom(vehicle)) then
 | 
						|
		local r, g, b = GetVehicleCustomPrimaryColour(vehicle)
 | 
						|
		customPrimaryColor = { r, g, b }
 | 
						|
	end
 | 
						|
	if (GetIsVehicleSecondaryColourCustom(vehicle)) then
 | 
						|
		local r, g, b = GetVehicleCustomSecondaryColour(vehicle)
 | 
						|
		customSecondaryColor = { r, g, b }
 | 
						|
	end
 | 
						|
 | 
						|
	-- tire smoke color
 | 
						|
	r, g, b = GetVehicleTyreSmokeColor(vehicle)
 | 
						|
	local tireSmokeColor = { r, g, b }
 | 
						|
 | 
						|
	-- neon lights color
 | 
						|
	local r, g, b = GetVehicleNeonLightsColour(vehicle)
 | 
						|
	local neonLightsColor = { r, g, b }
 | 
						|
	local enabledNeonLights = {
 | 
						|
		IsVehicleNeonLightEnabled(vehicle, 0),
 | 
						|
		IsVehicleNeonLightEnabled(vehicle, 1),
 | 
						|
		IsVehicleNeonLightEnabled(vehicle, 2),
 | 
						|
		IsVehicleNeonLightEnabled(vehicle, 3),
 | 
						|
	}
 | 
						|
 | 
						|
	return {
 | 
						|
		-- 1
 | 
						|
		GetVehicleNumberPlateText(vehicle),
 | 
						|
 | 
						|
		-- 2
 | 
						|
		GetVehicleMods(vehicle),
 | 
						|
 | 
						|
		-- 3
 | 
						|
		primaryColor,
 | 
						|
		-- 4
 | 
						|
		secondaryColor,
 | 
						|
		-- 5
 | 
						|
		pearlescentColor,
 | 
						|
		-- 6
 | 
						|
		wheelColor,
 | 
						|
		-- 7
 | 
						|
		customPrimaryColor,
 | 
						|
		-- 8
 | 
						|
		customSecondaryColor,
 | 
						|
		-- 9
 | 
						|
		GetVehicleInteriorColor(vehicle),
 | 
						|
		-- 10
 | 
						|
		GetVehicleDashboardColor(vehicle),
 | 
						|
		-- 11
 | 
						|
		tireSmokeColor,
 | 
						|
 | 
						|
		-- 12
 | 
						|
		GetVehicleXenonLightsColour(vehicle),
 | 
						|
		-- 13
 | 
						|
		neonLightsColor,
 | 
						|
		-- 14
 | 
						|
		enabledNeonLights,
 | 
						|
 | 
						|
		-- 15
 | 
						|
		GetVehicleExtras(vehicle),
 | 
						|
 | 
						|
		-- 16
 | 
						|
		GetVehicleWheelType(vehicle),
 | 
						|
		-- 17
 | 
						|
		GetVehicleModVariation(vehicle, 23),
 | 
						|
		-- 18
 | 
						|
		GetVehicleModVariation(vehicle, 24),
 | 
						|
		-- 19
 | 
						|
		not GetVehicleTyresCanBurst(vehicle),
 | 
						|
		-- 20
 | 
						|
		(GetGameBuildNumber() >= 2372) and GetDriftTyresEnabled(vehicle),
 | 
						|
 | 
						|
		-- 21
 | 
						|
		GetVehicleNumberPlateTextIndex(vehicle),
 | 
						|
 | 
						|
		-- 22
 | 
						|
		GetVehicleWindowTint(vehicle),
 | 
						|
 | 
						|
		-- 23
 | 
						|
		GetVehicleLivery(vehicle),
 | 
						|
 | 
						|
		-- 24
 | 
						|
		GetVehicleRoofLivery(vehicle)
 | 
						|
	}
 | 
						|
end
 | 
						|
 | 
						|
-- apply all vehicle tuning
 | 
						|
function SetVehicleTuning(vehicle, tuning)
 | 
						|
	SetVehicleModKit(vehicle, 0)
 | 
						|
 | 
						|
	-- 16 wheelType
 | 
						|
	SetVehicleWheelType(vehicle, tuning[16])
 | 
						|
 | 
						|
	-- 2 mods
 | 
						|
	SetVehicleMods(vehicle, tuning[2], tuning[17], tuning[18])
 | 
						|
 | 
						|
	-- 3-4 primary/secondaryColor
 | 
						|
	SetVehicleColours(vehicle, tuning[3], tuning[4])
 | 
						|
	-- 5-6 pearlescent/wheelColor
 | 
						|
	SetVehicleExtraColours(vehicle, tuning[5], tuning[6])
 | 
						|
	-- 7 customPrimaryColor
 | 
						|
	if (tuning[7]) then
 | 
						|
		SetVehicleCustomPrimaryColour(vehicle, tuning[7][1], tuning[7][2], tuning[7][3])
 | 
						|
	end
 | 
						|
	-- 8 customSecondaryColor
 | 
						|
	if (tuning[8]) then
 | 
						|
		SetVehicleCustomSecondaryColour(vehicle, tuning[8][1], tuning[8][2], tuning[8][3])
 | 
						|
	end
 | 
						|
	-- 9 interiorColor
 | 
						|
	SetVehicleInteriorColor(vehicle, tuning[9])
 | 
						|
	-- 10 dashboardColor
 | 
						|
	SetVehicleDashboardColor(vehicle, tuning[10])
 | 
						|
	-- 11 tireSmokeColor
 | 
						|
	SetVehicleTyreSmokeColor(vehicle, tuning[11][1], tuning[11][2], tuning[11][3])
 | 
						|
 | 
						|
	-- 12 xenonLightsColor
 | 
						|
	SetVehicleXenonLightsColour(vehicle, tuning[12])
 | 
						|
	-- 13 neonLightsColor
 | 
						|
	SetVehicleNeonLightsColour(vehicle, tuning[13][1], tuning[13][2], tuning[13][3])
 | 
						|
	-- 14 enabledNeonLights
 | 
						|
	for i = 0, 3, 1 do
 | 
						|
		SetVehicleNeonLightEnabled(vehicle, i, tuning[14][i + 1])
 | 
						|
	end
 | 
						|
 | 
						|
	-- 15 extras
 | 
						|
	SetVehicleExtras(vehicle, tuning[15])
 | 
						|
 | 
						|
	-- 19 bulletproofTires
 | 
						|
	SetVehicleTyresCanBurst(vehicle, not tuning[19])
 | 
						|
	-- 20 driftTires
 | 
						|
	if (GetGameBuildNumber() >= 2372) then
 | 
						|
		SetDriftTyresEnabled(vehicle, tuning[20])
 | 
						|
	end
 | 
						|
 | 
						|
	-- 1 numberPlateText
 | 
						|
	SetVehicleNumberPlateText(vehicle, tuning[1])
 | 
						|
	-- 21 numberPlateTextIndex
 | 
						|
	SetVehicleNumberPlateTextIndex(vehicle, tuning[21])
 | 
						|
	-- 22 windowTint
 | 
						|
	SetVehicleWindowTint(vehicle, tuning[22])
 | 
						|
	-- 23 livery
 | 
						|
	SetVehicleLivery(vehicle, tuning[23])
 | 
						|
	-- 24 roofLivery
 | 
						|
	SetVehicleRoofLivery(vehicle, tuning[24])
 | 
						|
end
 | 
						|
 | 
						|
-- returns the status values of a vehicle
 | 
						|
function GetVehicleStatus(vehicle)
 | 
						|
	return {
 | 
						|
		-- 1 entity health
 | 
						|
		math_max(math_min(GetEntityHealth(vehicle), 1000), 0),
 | 
						|
		-- 2 body health
 | 
						|
		math_floor(math_max(math_min(GetVehicleBodyHealth(vehicle), 1000.0), 0.0) * 10.0) / 10.0,
 | 
						|
		-- 3 engine health
 | 
						|
		math_floor(math_max(math_min(GetVehicleEngineHealth(vehicle), 1000.0), -4000.0) * 10.0) / 10.0,
 | 
						|
		-- 4 petrol tank health
 | 
						|
		math_floor(math_max(math_min(GetVehiclePetrolTankHealth(vehicle), 1000.0), -1000.0) * 10.0) / 10.0,
 | 
						|
 | 
						|
		-- 5 dirt level
 | 
						|
		math_floor(GetVehicleDirtLevel(vehicle) * 10.0) / 10.0,
 | 
						|
		-- 6 fuel level
 | 
						|
		math_floor(GetFuelLevel(vehicle) * 10.0) / 10.0,
 | 
						|
 | 
						|
		-- 7 lock status
 | 
						|
		GetVehicleDoorLockStatus(vehicle),
 | 
						|
 | 
						|
		-- 8 tire states
 | 
						|
		GetVehicleTireStates(vehicle),
 | 
						|
		-- 9 door states
 | 
						|
		GetVehicleDoorStates(vehicle),
 | 
						|
		-- 10 window states
 | 
						|
		GetVehicleWindowStates(vehicle),
 | 
						|
	}
 | 
						|
end
 | 
						|
-- apply all vehicle status values
 | 
						|
function SetVehicleStatus(vehicle, status)
 | 
						|
	-- 1 entity health
 | 
						|
	SetEntityHealth(vehicle, math_floor(status[1]))
 | 
						|
	-- 2 body health
 | 
						|
	SetVehicleBodyHealth(vehicle, status[2] * 1.0)
 | 
						|
	-- 3 engine health
 | 
						|
	SetVehicleEngineHealth(vehicle, status[3] * 1.0)
 | 
						|
	-- 4 petrol tank health
 | 
						|
	SetVehiclePetrolTankHealth(vehicle, status[4] * 1.0)
 | 
						|
 | 
						|
	-- 5 dirt level
 | 
						|
	SetVehicleDirtLevel(vehicle, status[5] * 1.0)
 | 
						|
	-- 6 fuel level
 | 
						|
	SetFuelLevel(vehicle, status[6] * 1.0)
 | 
						|
 | 
						|
	-- 7 lock status
 | 
						|
	SetVehicleDoorsLocked(vehicle, status[7])
 | 
						|
 | 
						|
	-- 8 tire states
 | 
						|
	SetVehicleTireStates(vehicle, status[8])
 | 
						|
	-- 9 door states
 | 
						|
	SetVehicleDoorStates(vehicle, status[9])
 | 
						|
	-- 10 window states
 | 
						|
	SetVehicleWindowStates(vehicle, status[10])
 | 
						|
end
 | 
						|
 | 
						|
-- get additional values
 | 
						|
local function GetConvertibleRoofIsOpen(vehicle)
 | 
						|
	if (not IsVehicleAConvertible(vehicle)) then return false end
 | 
						|
 | 
						|
	local state = GetConvertibleRoofState(vehicle)
 | 
						|
	return state == 1 or state == 2 or state == 6
 | 
						|
end
 | 
						|
local function GetLandingGearIsUp(vehicle)
 | 
						|
	if (not DoesVehicleHaveLandingGear(vehicle)) then return false end
 | 
						|
	
 | 
						|
	local state = GetLandingGearState(vehicle)
 | 
						|
	return state == 1 or state == 4
 | 
						|
end
 | 
						|
local function GetVtolMode(vehicle, model)
 | 
						|
	if (not IsThisModelAPlane(model)) then return false end
 | 
						|
 | 
						|
	return GetVehicleFlightNozzlePosition(vehicle)
 | 
						|
end
 | 
						|
local function GetStubWingsAreDeployed(vehicle, model)
 | 
						|
	if (model ~= `akula` and model ~= `annihilator`) then return false end
 | 
						|
 | 
						|
	return AreHeliStubWingsDeployed(vehicle)
 | 
						|
end
 | 
						|
local function GetBoatAnchorState(vehicle, model)
 | 
						|
	if (not IsThisModelABoat(model)) then return false end
 | 
						|
 | 
						|
	return IsBoatAnchored(vehicle)
 | 
						|
end
 | 
						|
 | 
						|
function GetVehicleExtraValues(vehicle)
 | 
						|
	local model = GetEntityModel(vehicle)
 | 
						|
 | 
						|
	return {
 | 
						|
		engineState		= GetIsVehicleEngineRunning(vehicle) or nil,
 | 
						|
		roofState		= GetConvertibleRoofIsOpen(vehicle) or nil,
 | 
						|
		--outriggers		= AreOutriggerLegsDeployed(vehicle) or nil, -- no setter counterpart
 | 
						|
		landingGearUp	= GetLandingGearIsUp(vehicle) or nil,
 | 
						|
		vtolMode		= GetVtolMode(vehicle, model) or nil,
 | 
						|
		stubWings		= GetStubWingsAreDeployed(vehicle, model) or nil,
 | 
						|
		boatAnchor		= GetBoatAnchorState(vehicle, model) or nil,
 | 
						|
		-- hydraulics?
 | 
						|
	}
 | 
						|
end
 | 
						|
-- set additional values
 | 
						|
function SetVehicleExtraValues(vehicle, values)
 | 
						|
	if (values.engineState) then
 | 
						|
		SetVehicleEngineOn(vehicle, true, true, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if (values.roofState) then
 | 
						|
		LowerConvertibleRoof(vehicle, true)
 | 
						|
	end
 | 
						|
 | 
						|
	if (values.landingGearUp) then
 | 
						|
		ControlLandingGear(vehicle, 3)
 | 
						|
	end
 | 
						|
 | 
						|
	if (values.vtolMode) then
 | 
						|
		SetVehicleFlightNozzlePositionImmediate(vehicle, values.vtolMode)
 | 
						|
	end
 | 
						|
 | 
						|
	if (values.stubWings) then
 | 
						|
		SetDeployHeliStubWings(vehicle, true, false)
 | 
						|
	end
 | 
						|
 | 
						|
	if (values.boatAnchor) then
 | 
						|
		SetBoatRemainsAnchoredWhilePlayerIsDriver(vehicle, true)
 | 
						|
		SetBoatAnchor(vehicle, true)
 | 
						|
	end
 | 
						|
 | 
						|
	-- hydraulics?
 | 
						|
end
 | 
						|
 | 
						|
 | 
						|
-- returns all non-stock vehicle mods
 | 
						|
function GetVehicleMods(vehicle)
 | 
						|
	local mods = {}
 | 
						|
 | 
						|
	for i = 0, 49, 1 do
 | 
						|
		-- TODO check for 17, 19, 21 -- toggle or normal mods? -- currently not possible
 | 
						|
		if (i == 18 or i == 20 or i == 22) then
 | 
						|
			if (IsToggleModOn(vehicle, i)) then
 | 
						|
				mods[#mods + 1] = { 
 | 
						|
					-- 1 index
 | 
						|
					i, 
 | 
						|
					-- 2 isToggledOn
 | 
						|
					true 
 | 
						|
				}
 | 
						|
			end
 | 
						|
		else
 | 
						|
			local modIndex = GetVehicleMod(vehicle, i)
 | 
						|
			if (modIndex ~= -1) then
 | 
						|
				mods[#mods + 1] = { 
 | 
						|
					-- 1 index
 | 
						|
					i, 
 | 
						|
					-- 2 modIndex
 | 
						|
					modIndex 
 | 
						|
				}
 | 
						|
			end
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	return mods
 | 
						|
end
 | 
						|
-- apply all vehicle mods
 | 
						|
function SetVehicleMods(vehicle, mods, customFrontWheels, customRearWheels)
 | 
						|
	for i = 1, #mods do
 | 
						|
		local id = mods[i][1]
 | 
						|
 | 
						|
		-- TODO check for 17, 19, 21 -- toggle or normal mods? -- currently not possible
 | 
						|
		if (id == 18 or id == 20 or id == 22) then
 | 
						|
			ToggleVehicleMod(vehicle, id, mods[i][2])
 | 
						|
		else
 | 
						|
			SetVehicleMod(vehicle, id, mods[i][2], (id == 24) and customRearWheels or customFrontWheels)
 | 
						|
		end
 | 
						|
	end
 | 
						|
end
 | 
						|
 | 
						|
-- returns all vehicle extras
 | 
						|
function GetVehicleExtras(vehicle)
 | 
						|
	local extras = {}
 | 
						|
 | 
						|
	for i = 0, 20 do
 | 
						|
		if (DoesExtraExist(vehicle, i)) then
 | 
						|
			if (IsVehicleExtraTurnedOn(vehicle, i)) then
 | 
						|
				extras[#extras + 1] = { 
 | 
						|
					-- 1 index
 | 
						|
					i, 
 | 
						|
					-- 2 isToggledOn
 | 
						|
					0 
 | 
						|
				}
 | 
						|
			else
 | 
						|
				extras[#extras + 1] = { 
 | 
						|
					-- 1 index
 | 
						|
					i, 
 | 
						|
					-- 2 isToggledOn
 | 
						|
					1 
 | 
						|
				}
 | 
						|
			end
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	return extras
 | 
						|
end
 | 
						|
-- apply all vehicle extras
 | 
						|
function SetVehicleExtras(vehicle, extras)
 | 
						|
	for i = 1, #extras do
 | 
						|
		SetVehicleExtra(vehicle, extras[i][1], extras[i][2])
 | 
						|
	end
 | 
						|
end
 | 
						|
 | 
						|
-- returns all tire states
 | 
						|
function GetVehicleTireStates(vehicle)
 | 
						|
	local burstTires = {}
 | 
						|
 | 
						|
	for i = 0, 5 do
 | 
						|
		if (IsVehicleTyreBurst(vehicle, i, true)) then
 | 
						|
			burstTires[#burstTires + 1] = { 
 | 
						|
				-- 1 index
 | 
						|
				i, 
 | 
						|
				-- 2 isBurst
 | 
						|
				true 
 | 
						|
			}
 | 
						|
		elseif (IsVehicleTyreBurst(vehicle, i, false)) then
 | 
						|
			burstTires[#burstTires + 1] = { 
 | 
						|
				-- 1 index
 | 
						|
				i, 
 | 
						|
				-- 2 isBurst
 | 
						|
				false 
 | 
						|
			}
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	return burstTires
 | 
						|
end
 | 
						|
-- apply all tire states
 | 
						|
function SetVehicleTireStates(vehicle, tireStates)
 | 
						|
	for i = 1, #tireStates do
 | 
						|
		SetVehicleTyreBurst(vehicle, tireStates[i][1], tireStates[i][2], 1000.0)
 | 
						|
	end
 | 
						|
end
 | 
						|
 | 
						|
-- returns all door states
 | 
						|
function GetVehicleDoorStates(vehicle)
 | 
						|
	local doorStates = {}
 | 
						|
 | 
						|
	for i = 0, 7 do
 | 
						|
		if (GetIsDoorValid(vehicle, i)) then
 | 
						|
			doorStates[#doorStates + 1] = {
 | 
						|
				-- 1 index
 | 
						|
				i,
 | 
						|
				-- 2 missing
 | 
						|
				IsVehicleDoorDamaged(vehicle, i),
 | 
						|
				-- 3 angle (unused, causes problems)
 | 
						|
				--GetVehicleDoorAngleRatio(vehicle, i)
 | 
						|
			}
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	return doorStates
 | 
						|
end
 | 
						|
-- apply all door states
 | 
						|
function SetVehicleDoorStates(vehicle, doorStates)
 | 
						|
	for i = 1, #doorStates do
 | 
						|
		if (doorStates[i][2]) then
 | 
						|
			SetVehicleDoorBroken(vehicle, doorStates[i][1], true)
 | 
						|
		--elseif (doorStates[i][3] > 0.0) then
 | 
						|
		--	SetVehicleDoorControl(vehicle, doorStates[i][1], 1000, doorStates[i][3])
 | 
						|
		end
 | 
						|
	end
 | 
						|
end
 | 
						|
 | 
						|
-- returns all window states
 | 
						|
function GetVehicleWindowStates(vehicle)
 | 
						|
	if (AreAllVehicleWindowsIntact(vehicle)) then
 | 
						|
		return {}
 | 
						|
	end
 | 
						|
 | 
						|
	local windowStates = {}
 | 
						|
 | 
						|
	for i = 0, 13 do
 | 
						|
		if (not IsVehicleWindowIntact(vehicle, i)) then
 | 
						|
			windowStates[#windowStates + 1] = i
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	return windowStates
 | 
						|
end
 | 
						|
-- apply all window states
 | 
						|
function SetVehicleWindowStates(vehicle, windowStates)
 | 
						|
	for i = 1, #windowStates do
 | 
						|
		SmashVehicleWindow(vehicle, windowStates[i])
 | 
						|
	end
 | 
						|
end
 | 
						|
 | 
						|
 | 
						|
 | 
						|
-- returns true if vehicle is blacklisted and should not be saved
 | 
						|
function IsVehicleBlacklisted(vehicle)
 | 
						|
	-- check class
 | 
						|
	local class = GetVehicleClass(vehicle)
 | 
						|
	for i = 1, #classesBlacklist do
 | 
						|
		if (class == classesBlacklist[i]) then
 | 
						|
			return true
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	-- check model
 | 
						|
	local modelHash = GetEntityModel(vehicle)
 | 
						|
	for i = 1, #vehiclesBlacklist do
 | 
						|
		if (modelHash == vehiclesBlacklist[i]) then
 | 
						|
			return true
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	-- check plate
 | 
						|
	local plate = GetVehicleNumberPlateText(vehicle)
 | 
						|
	for i = 1, #platesBlacklist do
 | 
						|
		if (plate:find(platesBlacklist[i]:upper())) then
 | 
						|
			return true
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	return false
 | 
						|
end
 |