1
0
Fork 0
forked from Simnation/Main
Main/resources/[carscripts]/AdvancedParking/client/cl_utils.lua
2025-08-07 14:38:30 +02:00

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