forked from Simnation/Main
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
|