[Release] [Example] Vehicle Handling Editor

for me it will open for 1 sec then not open un tell i re log am i doing some wrong

are these settings saved to all vehicles and is it server also side?

Will this work to test the changes instantly? i’m just trying to find something where i don’t have to keep reloading the damn car addon everytime i change it. i don’t care if it’s local only, just trying to figure out where i want the settings for each car.

dont know if your still on here but i can help ive been off for some time

Are the changes permanent to the handling.meta?

how to change car handling
with out handling meta. just ytd, ytf, file

i started the resource but nothing is changing

any way to save these coz i have a car with no handling.meta and i wanna change the speed

Hello. My programmer wrote this script for my server. The script includes: tire wear, changeable gearbox, and changeable suspension settings. But I ran into a problem, rubber wear does not work on all cars. On some cars everything is fine, and on some tires always show full wear, even after its replacement. Also, the gearbox changes (initial driveforce and maximum speed) do not apply, and the suspension settings do not work. In the RolePlay server, the mechanic job function does not work - when the mechanic repairs the car, the body and the rubber is restored, but if the player gets into his car, the rubber is completely erased again. I don’t understand why it doesn’t work? Here is my script:

ESX = nil
local Vehicles = {}

Citizen.CreateThread(function()
while ESX == nil do
TriggerEvent(‘esx:getSharedObject’, function(obj) ESX = obj end)
Citizen.Wait(0)
end
ESX.TriggerServerCallback(‘esx_vehicleshop:getVehicles’, function(vehicles)
Vehicles = vehicles
end)
end)

local changetyresPrice = {
[‘street’] = 2500,
[‘sport’] = 5000,
[‘muscle’] = 2500,
[‘drag’] = 10000,
[‘vaz’] = 500,
[‘suv’] = 1000,
}

local repairEnginePrice = 1000
local repairBodyPrice = 2000 – Цена за ремонт кузова

local maxfInitialDragCoeff = 20-- максимальное значение fInitialDriveMaxFlatVel
local minfInitialDragCoeff = 1 – минимальное значение fInitialDriveMaxFlatVel

– меню Количество передач

local maxfnInitialDriveGears = 8
local minfnInitialDriveGears = 2

– меню Тормозное усилие

local maxfBrakeForce = 2
local minfBrakeForce = 0.01

– меню Баланс тормозов пер\зад

local minfBrakeBiasFront = 0.01
local maxfBrakeBiasFront = 1.0

– меню Жесткость пруэин

local minSuspensionForce = 1.0
local maxSuspensionForce = 5.0

– меню Аммортизаторы сжатие

local minSuspensionCompDamp = 0.5
local maxSuspensionCompDamp = 3.0

– меню Аммортизаторы отбой

local minfSuspensionReboundDamp = 0.5
local maxfSuspensionReboundDamp = 3.0

– меню Жесткость стабилизатора

local minAntiRollBarForce = 1.0
local maxAntiRollBarForce = 5.0

– меню Жесткость стабилизатора

local minAntiRollBarBiasFront = 0.01
local maxAntiRollBarBiasFront = 1.0
function openMenu()
ESX.UI.Menu.CloseAll()

local elements = {}

table.insert(elements, {label = 'НАЧАТЬ ГОНКУ', value = "menu_1"})             
table.insert(elements, {label = 'РЕМОНТ ДВИГАТЕЛЯ 1000$', value = "menu_2"})  
table.insert(elements, {label = 'РЕМОНТ КУЗОВА 2000$', value = "menu_3"})  
--table.insert(elements, {label = 'СМЕНИТЬ РЕЗИНУ', value = "menu_5"})  
table.insert(elements, {label = 'НАСТРОЙКА АВТО', value = "menu_6"})  

ESX.UI.Menu.Open(
    'default', GetCurrentResourceName(), 'menu',
    {
        title = 'Menu',
        align = 'bottom-right',
        elements = elements 
    },     
    function(data, menu)            
		if data.current.value == 'menu_1' then 
			
		ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'race_rate', {
			title = 'СТАВКА'
		}, function(data2, menu2)
			menu2.close()
			local rate = tonumber(data2.value)
			
			ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'race_delay', {
				title = 'ВРЕМЯ НА ПОДГОТОВКУ'
			}, function(data3, menu3)
				menu3.close()
				local delay = tonumber(data3.value)
				TriggerEvent("StreetRaces:startRaceMenu", rate, delay)
			
			
			end, function(data3, menu3)
				menu3.close()
			end)
		
			
		end, function(data2, menu2)
			menu2.close()
		end)
		menu.close()
		
		end
		if data.current.value == 'menu_2' then 
			if IsPedInAnyVehicle(GetPlayerPed(-1), false) then
				ESX.TriggerServerCallback('esx_menu:isUpdateAvailable', function(add)
					if add then 
						local vehicle = GetVehiclePedIsUsing(GetPlayerPed(-1))
						SetVehicleEngineHealth(vehicle, 1000.0)
						SetVehicleOnGroundProperly(vehicle)
					    SetVehicleUndriveable(vehicle, false)
					else
						ESX.ShowNotification('Недостаточно денег')
					end
				end, repairEnginePrice)
			else
				ESX.ShowNotification('Вы должны быть в машине')
			end
			menu.close()
		end
		if data.current.value == 'menu_3' then 
			if IsPedInAnyVehicle(GetPlayerPed(-1), false) then
				ESX.TriggerServerCallback('esx_menu:isUpdateAvailable', function(add)
					if add then 
						TriggerEvent("iens:repairNotMecano")			
					else
						ESX.ShowNotification('Недостаточно денег')
					end
				end, repairBodyPrice)
			else
				ESX.ShowNotification('Вы должны быть в машине')
			end
			menu.close()
		end
		if data.current.value == 'menu_4' then 
			TriggerEvent('xgc-tuner:openTuner')
			menu.close()
		end
		if data.current.value == 'menu_5' then 
			if IsPedInAnyVehicle(GetPlayerPed(-1), false) then
				local vehicle = GetVehiclePedIsUsing(GetPlayerPed(-1))
				for i=1, #Vehicles, 1 do
					if GetHashKey(Vehicles[i].model) == GetEntityModel(vehicle) then
						local price = changetyresPrice[Vehicles[i].category]
						ESX.TriggerServerCallback('esx_menu:isUpdateAvailable', function(add)
							if add then 
								TriggerEvent("TireWear:fixCar", vehicle)
							else
								ESX.ShowNotification('Недостаточно денег')
							end
						end, price)
						break
					end
				end
			
			
				
			else
				ESX.ShowNotification('Вы должны быть в машине')
			end
			menu.close()
		end
		if data.current.value == 'menu_6' then 
			if IsPedInAnyVehicle(GetPlayerPed(-1), false) then
				local vehicle = GetVehiclePedIsUsing(GetPlayerPed(-1))
				local selemets = {}
				--table.insert(selemets, {
				  --name    = "fInitialDragCoeff",
				  --label   = 'КОРОБКА ПЕРЕДАЧ',
				  --defaultValue = DecorGetFloat(vehicle, "fInitialDragCoeff"),
				  --value   = GetVehicleHandlingFloat(vehicle, "CHandlingData", "fInitialDragCoeff"),
				  --defaultFInitialDriveForce = DecorGetFloat(vehicle, "fInitialDriveForce"),
				  --type    = 'slider',
				  --max     = maxfInitialDragCoeff,
				  --min	  = minfInitialDragCoeff,
				--})
				table.insert(selemets, {
				  name    = "fSteeringLock",
				  label   = 'ВЫВОРОТ КОЛЁС',
				  value   = GetVehicleHandlingFloat(vehicle, "CHandlingData", "fSteeringLock"),
				  type    = 'slider',
				  max     = maxfSteeringLock,
				  min	  = minfSteeringLock,
				})
			    table.insert(selemets, {
				  name    = "nInitialDriveGears",
				  label   = 'КОЛИЧЕСТВО ПЕРЕДАЧ',
				  value   = GetVehicleHandlingFloat(vehicle, "CHandlingData", "nInitialDriveGears"),
				  type    = 'slider',
				  max     = maxnInitialDriveGears,
				  min	  = minnInitialDriveGears,
				})
				table.insert(selemets, {
				  name    = "fBrakeForce",
				  label   = 'ТОРМОЗНОЕ УСИЛИЕ',
				  value   = GetVehicleHandlingFloat(vehicle, "CHandlingData", "fBrakeForce"),
				  type    = 'slider',
				  max     = maxnfBrakeForce,
				  min	  = minnfBrakeForce,
				})
				table.insert(selemets, {
				  name    = "fBrakeBiasFront",
				  label   = 'БАЛАНС ТОРМОЗОВ ПЕР/ЗАД',
				  value   = GetVehicleHandlingFloat(vehicle, "CHandlingData", "fBrakeBiasFront"),
				  type    = 'slider',
				  max     = maxfBrakeBiasFront,
				  min	  = minfBrakeBiasFront,
				})
				table.insert(selemets, {
				  name    = "SuspensionForce",
				  label   = 'ЖЕСТКОСТЬ ПРУЖИН',
				  value   = GetVehicleHandlingFloat(vehicle, "CHandlingData", "SuspensionForce"),
				  type    = 'slider',
				  max     = maxSuspensionForce,
				  min	  = minSuspensionForce,
				})
				table.insert(selemets, {
				  name    = "SuspensionCompDamp",
				  label   = 'АММОРТИЗАТОРЫ СЖАТИЕ',
				  value   = GetVehicleHandlingFloat(vehicle, "CHandlingData", "SuspensionCompDamp"),
				  type    = 'slider',
				  max     = maxSuspensionCompDamp,
				  min	  = minSuspensionCompDamp,
				})
				table.insert(selemets, {
				  name    = "fSuspensionReboundDamp",
				  label   = 'АММОРТИЗАТОРЫ ОТБОЙ',
				  value   = GetVehicleHandlingFloat(vehicle, "CHandlingData", "fSuspensionReboundDamp"),
				  type    = 'slider',
				  max     = maxfSuspensionReboundDamp,
				  min	  = minfSuspensionReboundDamp,
				})
				table.insert(selemets, {
				  name    = "AntiRollBarForce",
				  label   = 'ЖЕСТКОСТЬ СТАБИЛИЗАТОРОВ',
				  value   = GetVehicleHandlingFloat(vehicle, "CHandlingData", "AntiRollBarForce"),
				  type    = 'slider',
				  max     = maxAntiRollBarForce,
				  min	  = minAntiRollBarForce,
				})
				table.insert(selemets, {
				  name    = "AntiRollBarBiasFront",
				  label   = 'БАЛАНС СТАБИЛИЗАТОРОВ ПЕР/ЗАД',
				  value   = GetVehicleHandlingFloat(vehicle, "CHandlingData", "AntiRollBarBiasFront"),
				  type    = 'slider',
				  max     = maxAntiRollBarBiasFront,
				  min	  = minAntiRollBarBiasFront,
				})
				ESX.UI.Menu.Open(
				'default', GetCurrentResourceName(), 'fInitialDragCoeff',
				{
					title = 'Menu',
					align = 'bottom-right',
					elements = selemets 
				},     
				function(data, menu)  
		

				end,
				function(data, menu)
					menu.close()
				end,
				function(data, menu)
					if data.current.name == 'fInitialDragCoeff' then 
						data.current.value = data.current.value + 0.0
						SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fInitialDragCoeff', data.current.value)
						if data.current.defaultValue ~= data.current.value then 
							local difference = (data.current.defaultValue - data.current.value) / 1000 
							local newvalue = data.current.defaultFInitialDriveForce - difference
							SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fInitialDriveForce', newvalue)
						else 
							SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fInitialDriveForce', data.current.defaultFInitialDriveForce)
						end
						print('fInitialDriveForce ' .. GetVehicleHandlingFloat(vehicle, "CHandlingData", "fInitialDriveForce"))
						print('fInitialDragCoeff ' .. GetVehicleHandlingFloat(vehicle, "CHandlingData", "fInitialDragCoeff"))
					end
					if data.current.name == 'fSteeringLock' then 
						data.current.value = data.current.value + 0.00
						SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fSteeringLock', data.current.value)
					end
                    if data.current.name == 'nInitialDriveGears' then 
						data.current.value = data.current.value + 0.00
						SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'nInitialDriveGears', data.current.value)
					end
					if data.current.name == 'fBrakeForce' then 
						data.current.value = data.current.value + 0.00
						SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fBrakeForce', data.current.value)
					end
					if data.current.name == 'fBrakeBiasFront' then 
						data.current.value = data.current.value + 0.00
						SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fBrakeBiasFront', data.current.value)
					end
					if data.current.name == 'SuspensionForce' then 
						data.current.value = data.current.value + 0.00
						SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'SuspensionForce', data.current.value)
					end
					if data.current.name == 'SuspensionCompDamp' then 
						data.current.value = data.current.value + 0.00
						SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'SuspensionCompDamp', data.current.value)
					end
					if data.current.name == 'fSuspensionReboundDamp' then 
						data.current.value = data.current.value + 0.00
						SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fSuspensionReboundDamp', data.current.value)
					end
					if data.current.name == 'AntiRollBarForce' then 
						data.current.value = data.current.value + 0.00
						SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'AntiRollBarForce', data.current.value)
					end
					if data.current.name == 'AntiRollBarBiasFront' then 
						data.current.value = data.current.value + 0.00
						SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'AntiRollBarBiasFront', data.current.value)
					end
				end

				)
			else
				ESX.ShowNotification('Вы должны быть в машине')
			end	
		end
    end,
	function(data, menu)
		menu.close()
	end
)

end

Citizen.CreateThread(function()
if not DecorIsRegisteredAsType(“fInitialDragCoeff”, 1) then
DecorRegister(“fInitialDragCoeff”, 1)
end
if not DecorIsRegisteredAsType(“fInitialDriveForce”, 1) then
DecorRegister(“fInitialDriveForce”, 1)
end
while true do
Citizen.Wait(0)
if IsControlJustPressed(0, 244) then
openMenu()
end
if IsPedInAnyVehicle(GetPlayerPed(-1), false) then
local vehicle = GetVehiclePedIsUsing(GetPlayerPed(-1))
if not DecorExistOn(vehicle, ‘fInitialDragCoeff’) then
DecorSetFloat(vehicle, ‘fInitialDragCoeff’, GetVehicleHandlingFloat(vehicle, “CHandlingData”, “fInitialDragCoeff”))
end
if not DecorExistOn(vehicle, ‘fInitialDriveForce’) then
DecorSetFloat(vehicle, ‘fInitialDriveForce’, GetVehicleHandlingFloat(vehicle, “CHandlingData”, “fInitialDriveForce”))
end
end

end
end)

is there a way to reset the values to the original ones?

delete the car and respawn

help me to install

Can it be used together with vMenu?

if it works how install vMenu and warmenu