M Menu, manual transmission mod, and simple trainer. And Yes
I would try it on itās own and then if I recall correctly there is a engine option in simple trainer that may be constantly fixing it thatās not God mode.
What is that option?
If Iām remembering right itās someone in the vehicle options. I apologize I am at work and unable to look at this time. But when I get home later I will try to look.
I have looked in Simple Trainer and couldnāt find what I thought was gonna be in there. I did find in my Lambda menu a no mechanical damage option but you said you do not use that menu. I am leaning towards it being a conflict with another script you have running with it. I suggest disabling all other mods and try just the damage mod and see how it behaves.
Is there a way to make it so someone can only repair their car once before it gets ātoo badly damagedā instead of three?
Is it possible to adjust individual strengths? Because of all the scripts I have tried have had too week engines and too strong bodies for my taste.
Really nice script, but can you do something about not being able to drive without releasing and pressing gas while reversing / and the other way around? Only some cars from 1960 have this problem with non-synced 1st gear which requires the car to be completely still while shifting to 1st.
there is an option for it
sundayDriver = false, -- If true, the accelerator response is scaled to enable easy slow driving. Will not prevent full throttle. Does not work with binary accelerators like a keyboard. Set to false to disable. The included stop-without-reversing and brake-light-hold feature does also work for keyboards.
is there away to add a charge and a timer to the /repair ??
yesā¦pretty easy just code it in.
im no coder lol
but thanks for your reply
(probably wrong topic) but I was wondering if there is a way to disable fixing their vehicle through a trainer? Probably not but thought Iād ask.
The car never FULLY breaks and doesnt explode, anyone knows why?
Config:
------------------------------------------
-- iEnsomatic RealisticVehicleFailure --
------------------------------------------
--
-- Created by Jens Sandalgaard
--
-- This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
--
-- https://github.com/iEns/RealisticVehicleFailure
--
-- Configuration:
-- IMPORTANT: Some of these values MUST be defined as a floating point number. ie. 10.0 instead of 10
--[[
cfg = {
deformationMultiplier = -1, -- How much should the vehicle visually deform from a collision. Range 0.0 to 10.0 Where 0.0 is no deformation and 10.0 is 10x deformation. -1 = Don't touch. Visual damage does not sync well to other players.
deformationExponent = 0.4, -- How much should the handling file deformation setting be compressed toward 1.0. (Make cars more similar). A value of 1=no change. Lower values will compress more, values above 1 it will expand. Dont set to zero or negative.
collisionDamageExponent = 0.6, -- How much should the handling file deformation setting be compressed toward 1.0. (Make cars more similar). A value of 1=no change. Lower values will compress more, values above 1 it will expand. Dont set to zero or negative.
damageFactorEngine = 10.0, -- Sane values are 1 to 100. Higher values means more damage to vehicle. A good starting point is 10
damageFactorBody = 10.0, -- Sane values are 1 to 100. Higher values means more damage to vehicle. A good starting point is 10
damageFactorPetrolTank = 64.0, -- Sane values are 1 to 200. Higher values means more damage to vehicle. A good starting point is 64
engineDamageExponent = 0.6, -- How much should the handling file engine damage setting be compressed toward 1.0. (Make cars more similar). A value of 1=no change. Lower values will compress more, values above 1 it will expand. Dont set to zero or negative.
weaponsDamageMultiplier = 0.01, -- How much damage should the vehicle get from weapons fire. Range 0.0 to 10.0, where 0.0 is no damage and 10.0 is 10x damage. -1 = don't touch
degradingHealthSpeedFactor = 10, -- Speed of slowly degrading health, but not failure. Value of 10 means that it will take about 0.25 second per health point, so degradation from 800 to 305 will take about 2 minutes of clean driving. Higher values means faster degradation
cascadingFailureSpeedFactor = 8.0, -- Sane values are 1 to 100. When vehicle health drops below a certain point, cascading failure sets in, and the health drops rapidly until the vehicle dies. Higher values means faster failure. A good starting point is 8
degradingFailureThreshold = 800.0, -- Below this value, slow health degradation will set in
cascadingFailureThreshold = 360.0, -- Below this value, health cascading failure will set in
engineSafeGuard = 100.0, -- Final failure value. Set it too high, and the vehicle won't smoke when disabled. Set too low, and the car will catch fire from a single bullet to the engine. At health 100 a typical car can take 3-4 bullets to the engine before catching fire.
torqueMultiplierEnabled = true, -- Decrease engine torque as engine gets more and more damaged
limpMode = false, -- If true, the engine never fails completely, so you will always be able to get to a mechanic unless you flip your vehicle and preventVehicleFlip is set to true
limpModeMultiplier = 0.15, -- The torque multiplier to use when vehicle is limping. Sane values are 0.05 to 0.25
preventVehicleFlip = true, -- If true, you can't turn over an upside down vehicle
sundayDriver = true, -- If true, the accelerator response is scaled to enable easy slow driving. Will not prevent full throttle. Does not work with binary accelerators like a keyboard. Set to false to disable. The included stop-without-reversing and brake-light-hold feature does also work for keyboards.
sundayDriverAcceleratorCurve = 7.5, -- The response curve to apply to the accelerator. Range 0.0 to 10.0. Higher values enables easier slow driving, meaning more pressure on the throttle is required to accelerate forward. Does nothing for keyboard drivers
sundayDriverBrakeCurve = 5.0, -- The response curve to apply to the Brake. Range 0.0 to 10.0. Higher values enables easier braking, meaning more pressure on the throttle is required to brake hard. Does nothing for keyboard drivers
displayBlips = false, -- Show blips for mechanics locations
compatibilityMode = false, -- prevents other scripts from modifying the fuel tank health to avoid random engine failure with BVA 2.01 (Downside is it disabled explosion prevention)
randomTireBurstInterval = 0, -- Number of minutes (statistically, not precisely) to drive above 22 mph before you get a tire puncture. 0=feature is disabled
-- Class Damagefactor Multiplier
-- The damageFactor for engine, body and Petroltank will be multiplied by this value, depending on vehicle class
-- Use it to increase or decrease damage for each class
classDamageMultiplier = {
[0] = 1.0, -- 0: Compacts
1.0, -- 1: Sedans
1.0, -- 2: SUVs
1.0, -- 3: Coupes
1.0, -- 4: Muscle
1.0, -- 5: Sports Classics
1.0, -- 6: Sports
1.0, -- 7: Super
0.25, -- 8: Motorcycles
0.7, -- 9: Off-road
0.25, -- 10: Industrial
1.0, -- 11: Utility
1.0, -- 12: Vans
1.0, -- 13: Cycles
0.5, -- 14: Boats
1.0, -- 15: Helicopters
1.0, -- 16: Planes
1.0, -- 17: Service
0.75, -- 18: Emergency
0.75, -- 19: Military
1.0, -- 20: Commercial
1.0 -- 21: Trains
}
}
]]--
-- Alternate configuration values provided by ImDylan93 - Vehicles can take more damage before failure, and the balance between vehicles has been tweaked.
-- To use: comment out the settings above, and uncomment this section.
cfg = {
deformationMultiplier = -1, -- How much should the vehicle visually deform from a collision. Range 0.0 to 10.0 Where 0.0 is no deformation and 10.0 is 10x deformation. -1 = Don't touch
deformationExponent = 3.0, -- How much should the handling file deformation setting be compressed toward 1.0. (Make cars more similar). A value of 1=no change. Lower values will compress more, values above 1 it will expand. Dont set to zero or negative.
collisionDamageExponent = 1.0, -- How much should the handling file deformation setting be compressed toward 1.0. (Make cars more similar). A value of 1=no change. Lower values will compress more, values above 1 it will expand. Dont set to zero or negative.
damageFactorEngine = 2.1, -- Sane values are 1 to 100. Higher values means more damage to vehicle. A good starting point is 10
damageFactorBody = 7.1, -- Sane values are 1 to 100. Higher values means more damage to vehicle. A good starting point is 10
damageFactorPetrolTank = 71.0, -- Sane values are 1 to 100. Higher values means more damage to vehicle. A good starting point is 64
engineDamageExponent = 1.0, -- How much should the handling file engine damage setting be compressed toward 1.0. (Make cars more similar). A value of 1=no change. Lower values will compress more, values above 1 it will expand. Dont set to zero or negative.
weaponsDamageMultiplier = 0.124, -- How much damage should the vehicle get from weapons fire. Range 0.0 to 10.0, where 0.0 is no damage and 10.0 is 10x damage. -1 = don't touch
degradingHealthSpeedFactor = 7.4, -- Speed of slowly degrading health, but not failure. Value of 10 means that it will take about 0.25 second per health point, so degradation from 800 to 305 will take about 2 minutes of clean driving. Higher values means faster degradation
cascadingFailureSpeedFactor = 1.5, -- Sane values are 1 to 100. When vehicle health drops below a certain point, cascading failure sets in, and the health drops rapidly until the vehicle dies. Higher values means faster failure. A good starting point is 8
degradingFailureThreshold = 500.0, -- Below this value, slow health degradation will set in
cascadingFailureThreshold = 100.0, -- Below this value, health cascading failure will set in
engineSafeGuard = 1.0, -- Final failure value. Set it too high, and the vehicle won't smoke when disabled. Set too low, and the car will catch fire from a single bullet to the engine. At health 100 a typical car can take 3-4 bullets to the engine before catching fire.
torqueMultiplierEnabled = true, -- Decrease engine torge as engine gets more and more damaged
limpMode = false, -- If true, the engine never fails completely, so you will always be able to get to a mechanic unless you flip your vehicle and preventVehicleFlip is set to true
limpModeMultiplier = 0.15, -- The torque multiplier to use when vehicle is limping. Sane values are 0.05 to 0.25
preventVehicleFlip = true, -- If true, you can't turn over an upside down vehicle
sundayDriver = false, -- If true, the accelerator response is scaled to enable easy slow driving. Will not prevent full throttle. Does not work with binary accelerators like a keyboard. Set to false to disable. The included stop-without-reversing and brake-light-hold feature does also work for keyboards.
sundayDriverAcceleratorCurve = 7.5, -- The response curve to apply to the accelerator. Range 0.0 to 10.0. Higher values enables easier slow driving, meaning more pressure on the throttle is required to accelerate forward. Does nothing for keyboard drivers
sundayDriverBrakeCurve = 5.0, -- The response curve to apply to the Brake. Range 0.0 to 10.0. Higher values enables easier braking, meaning more pressure on the throttle is required to brake hard. Does nothing for keyboard drivers
displayBlips = false, -- Show blips for mechanics locations
randomTireBurstInterval = 0,
classDamageMultiplier = {
[0] = 1.0, -- 0: Compacts
1.0, -- 1: Sedans
1.0, -- 2: SUVs
0.95, -- 3: Coupes
1.0, -- 4: Muscle
0.95, -- 5: Sports Classics
0.95, -- 6: Sports
0.95, -- 7: Super
0.27, -- 8: Motorcycles
0.7, -- 9: Off-road
0.25, -- 10: Industrial
0.35, -- 11: Utility
0.85, -- 12: Vans
1.0, -- 13: Cycles
0.4, -- 14: Boats
0.1, -- 15: Helicopters
0.7, -- 16: Planes
0.75, -- 17: Service
0.85, -- 18: Emergency
0.67, -- 19: Military
0.43, -- 20: Commercial
1.0 -- 21: Trains
}
}
-- End of Main Configuration
-- Configure Repair system
-- id=446 for wrench icon, id=72 for spraycan icon
repairCfg = {
mechanics = {
-- {name="Mechanic", id=446, r=25.0, x=-337.0, y=-135.0, z=39.0}, -- LSC Burton
-- {name="Mechanic", id=446, r=25.0, x=-1155.0, y=-2007.0, z=13.0}, -- LSC by airport
-- {name="Mechanic", id=446, r=25.0, x=734.0, y=-1085.0, z=22.0}, -- LSC La Mesa
-- {name="Mechanic", id=446, r=25.0, x=1177.0, y=2640.0, z=37.0}, -- LSC Harmony
-- {name="Mechanic", id=446, r=25.0, x=108.0, y=6624.0, z=31.0}, -- LSC Paleto Bay
-- {name="Mechanic", id=446, r=18.0, x=538.0, y=-183.0, z=54.0}, -- Mechanic Hawic
-- {name="Mechanic", id=446, r=15.0, x=1774.0, y=3333.0, z=41.0}, -- Mechanic Sandy Shores Airfield
-- {name="Mechanic", id=446, r=15.0, x=1143.0, y=-776.0, z=57.0}, -- Mechanic Mirror Park
-- {name="Mechanic", id=446, r=30.0, x=2508.0, y=4103.0, z=38.0}, -- Mechanic East Joshua Rd.
-- {name="Mechanic", id=446, r=16.0, x=2006.0, y=3792.0, z=32.0}, -- Mechanic Sandy Shores gas station
-- {name="Mechanic", id=446, r=25.0, x=484.0, y=-1316.0, z=29.0}, -- Hayes Auto, Little Bighorn Ave.
-- {name="Mechanic", id=446, r=33.0, x=-1419.0, y=-450.0, z=36.0}, -- Hayes Auto Body Shop, Del Perro
-- {name="Mechanic", id=446, r=33.0, x=268.0, y=-1810.0, z=27.0}, -- Hayes Auto Body Shop, Davis
-- {name="Mechanic", id=446, r=24.0, x=288.0, y=-1730.0, z=29.0}, -- Hayes Auto, Rancho (Disabled, looks like a warehouse for the Davis branch)
-- {name="Mechanic", id=446, r=27.0, x=1915.0, y=3729.0, z=32.0}, -- Otto's Auto Parts, Sandy Shores
-- {name="Mechanic", id=446, r=45.0, x=-29.0, y=-1665.0, z=29.0}, -- Mosley Auto Service, Strawberry
-- {name="Mechanic", id=446, r=44.0, x=-212.0, y=-1378.0, z=31.0}, -- Glass Heroes, Strawberry
-- {name="Mechanic", id=446, r=33.0, x=258.0, y=2594.0, z=44.0}, -- Mechanic Harmony
-- {name="Mechanic", id=446, r=18.0, x=-32.0, y=-1090.0, z=26.0}, -- Simeons
-- {name="Mechanic", id=446, r=25.0, x=-211.0, y=-1325.0, z=31.0}, -- Bennys
-- {name="Mechanic", id=446, r=25.0, x=903.0, y=3563.0, z=34.0}, -- Auto Repair, Grand Senora Desert
-- {name="Mechanic", id=446, r=25.0, x=437.0, y=3568.0, z=38.0} -- Auto Shop, Grand Senora Desert
},
fixMessages = {
"Skleiles kabelki, pyk dziala jak nowe",
"Cos tam sie wylewalo ale juz nie, chyba dobrze?",
"Dwa kopy w silnik i dalej dziala",
"Czary mary hokus pokus, dziala... Powinno przynajmniej",
"Pokrzyczales na samochod, ludzie sie patrzeli ale dziala",
"Naplules na deske, auto sie obrazilo i dziala",
"Uzyles TASME KLEJACA - Jest bardzo efektowna"
},
fixMessageCount = 7,
noFixMessages = {
"No dalej cos tam sie wylewa ale jedzie",
"Silnik wyglada spoko",
"Sprawdziles i tasma klejaca dalej klei",
"Podglosiles radio. Nie slychac juz tych niepokojacych dzwiekow",
"Nie widze problemu. Jedzie to jedzie",
"Nie naprawiaj co nie jest popsute, nie sluchales. Ale chociaz nie jest gorzej"
},
noFixMessageCount = 6
}
RepairEveryoneWhitelisted = true
RepairWhitelist =
{
"steam:123456789012345",
"steam:000000000000000",
"ip:192.168.0.1" -- not sure if ip whitelist works?
}
Client
------------------------------------------
-- iEnsomatic RealisticVehicleFailure --
------------------------------------------
--
-- Created by Jens Sandalgaard
--
-- This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
--
-- https://github.com/iEns/RealisticVehicleFailure
--
local pedInSameVehicleLast=false
local vehicle
local lastVehicle
local vehicleClass
local fCollisionDamageMult = 0.0
local fDeformationDamageMult = 0.0
local fEngineDamageMult = 0.0
local fBrakeForce = 1.0
local isBrakingForward = false
local isBrakingReverse = false
local healthEngineLast = 1000.0
local healthEngineCurrent = 1000.0
local healthEngineNew = 1000.0
local healthEngineDelta = 0.0
local healthEngineDeltaScaled = 0.0
local healthBodyLast = 1000.0
local healthBodyCurrent = 1000.0
local healthBodyNew = 1000.0
local healthBodyDelta = 0.0
local healthBodyDeltaScaled = 0.0
local healthPetrolTankLast = 1000.0
local healthPetrolTankCurrent = 1000.0
local healthPetrolTankNew = 1000.0
local healthPetrolTankDelta = 0.0
local healthPetrolTankDeltaScaled = 0.0
local tireBurstLuckyNumber
math.randomseed(GetGameTimer());
local tireBurstMaxNumber = cfg.randomTireBurstInterval * 1200; -- the tire burst lottery runs roughly 1200 times per minute
if cfg.randomTireBurstInterval ~= 0 then tireBurstLuckyNumber = math.random(tireBurstMaxNumber) end -- If we hit this number again randomly, a tire will burst.
local fixMessagePos = math.random(repairCfg.fixMessageCount)
local noFixMessagePos = math.random(repairCfg.noFixMessageCount)
-- Display blips on map
Citizen.CreateThread(function()
if (cfg.displayBlips == true) then
for _, item in pairs(repairCfg.mechanics) do
item.blip = AddBlipForCoord(item.x, item.y, item.z)
SetBlipSprite(item.blip, item.id)
SetBlipAsShortRange(item.blip, true)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString(item.name)
EndTextCommandSetBlipName(item.blip)
end
end
end)
local function notification(msg)
SetNotificationTextEntry("STRING")
AddTextComponentString(msg)
DrawNotification(false, false)
end
local function isPedDrivingAVehicle()
local ped = GetPlayerPed(-1)
vehicle = GetVehiclePedIsIn(ped, false)
if IsPedInAnyVehicle(ped, false) then
-- Check if ped is in driver seat
if GetPedInVehicleSeat(vehicle, -1) == ped then
local class = GetVehicleClass(vehicle)
-- We don't want planes, helicopters, bicycles and trains
if class ~= 15 and class ~= 16 and class ~=21 and class ~=13 then
return true
end
end
end
return false
end
local function IsNearMechanic()
local ped = GetPlayerPed(-1)
local pedLocation = GetEntityCoords(ped, 0)
for _, item in pairs(repairCfg.mechanics) do
local distance = GetDistanceBetweenCoords(item.x, item.y, item.z, pedLocation["x"], pedLocation["y"], pedLocation["z"], true)
if distance <= item.r then
return true
end
end
end
local function fscale(inputValue, originalMin, originalMax, newBegin, newEnd, curve)
local OriginalRange = 0.0
local NewRange = 0.0
local zeroRefCurVal = 0.0
local normalizedCurVal = 0.0
local rangedValue = 0.0
local invFlag = 0
if (curve > 10.0) then curve = 10.0 end
if (curve < -10.0) then curve = -10.0 end
curve = (curve * -.1)
curve = 10.0 ^ curve
if (inputValue < originalMin) then
inputValue = originalMin
end
if inputValue > originalMax then
inputValue = originalMax
end
OriginalRange = originalMax - originalMin
if (newEnd > newBegin) then
NewRange = newEnd - newBegin
else
NewRange = newBegin - newEnd
invFlag = 1
end
zeroRefCurVal = inputValue - originalMin
normalizedCurVal = zeroRefCurVal / OriginalRange
if (originalMin > originalMax ) then
return 0
end
if (invFlag == 0) then
rangedValue = ((normalizedCurVal ^ curve) * NewRange) + newBegin
else
rangedValue = newBegin - ((normalizedCurVal ^ curve) * NewRange)
end
return rangedValue
end
local function tireBurstLottery()
local tireBurstNumber = math.random(tireBurstMaxNumber)
if tireBurstNumber == tireBurstLuckyNumber then
-- We won the lottery, lets burst a tire.
if GetVehicleTyresCanBurst(vehicle) == false then return end
local numWheels = GetVehicleNumberOfWheels(vehicle)
local affectedTire
if numWheels == 2 then
affectedTire = (math.random(2)-1)*4 -- wheel 0 or 4
elseif numWheels == 4 then
affectedTire = (math.random(4)-1)
if affectedTire > 1 then affectedTire = affectedTire + 2 end -- 0, 1, 4, 5
elseif numWheels == 6 then
affectedTire = (math.random(6)-1)
else
affectedTire = 0
end
SetVehicleTyreBurst(vehicle, affectedTire, false, 1000.0)
tireBurstLuckyNumber = math.random(tireBurstMaxNumber) -- Select a new number to hit, just in case some numbers occur more often than others
end
end
RegisterNetEvent('iens:repair')
AddEventHandler('iens:repair', function()
if isPedDrivingAVehicle() then
local ped = GetPlayerPed(-1)
vehicle = GetVehiclePedIsIn(ped, false)
if IsNearMechanic() then
SetVehicleUndriveable(vehicle,false)
SetVehicleFixed(vehicle)
healthBodyLast=1000.0
healthEngineLast=1000.0
healthPetrolTankLast=1000.0
SetVehicleEngineOn(vehicle, true, false )
notification("~g~The mechanic repaired your car!")
return
end
if GetVehicleEngineHealth(vehicle) < cfg.cascadingFailureThreshold + 5 then
if GetVehicleOilLevel(vehicle) > 0 then
SetVehicleUndriveable(vehicle,false)
SetVehicleEngineHealth(vehicle, cfg.cascadingFailureThreshold + 5)
SetVehiclePetrolTankHealth(vehicle, 750.0)
healthEngineLast=cfg.cascadingFailureThreshold +5
healthPetrolTankLast=750.0
SetVehicleEngineOn(vehicle, true, false )
SetVehicleOilLevel(vehicle,(GetVehicleOilLevel(vehicle)/3)-0.5)
notification("~g~" .. repairCfg.fixMessages[fixMessagePos] .. ", teraz do mechanika!")
fixMessagePos = fixMessagePos + 1
if fixMessagePos > repairCfg.fixMessageCount then fixMessagePos = 1 end
else
notification("~r~Ten pojazd jest na straty. Nie ma jak naprawic!")
end
else
notification("~y~" .. repairCfg.noFixMessages[noFixMessagePos] )
noFixMessagePos = noFixMessagePos + 1
if noFixMessagePos > repairCfg.noFixMessageCount then noFixMessagePos = 1 end
end
else
notification("~y~Musisz byc w pojezdzie aby go naprawic")
end
end)
RegisterNetEvent('iens:notAllowed')
AddEventHandler('iens:notAllowed', function()
notification("~r~You don't have permission to repair vehicles")
end)
if cfg.torqueMultiplierEnabled or cfg.preventVehicleFlip or cfg.limpMode then
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
if cfg.torqueMultiplierEnabled or cfg.sundayDriver or cfg.limpMode then
if pedInSameVehicleLast then
local factor = 1.0
if cfg.torqueMultiplierEnabled and healthEngineNew < 900 then
factor = (healthEngineNew+200.0) / 1100
end
if cfg.sundayDriver and GetVehicleClass(vehicle) ~= 14 then -- Not for boats
local accelerator = GetControlValue(2,71)
local brake = GetControlValue(2,72)
local speed = GetEntitySpeedVector(vehicle, true)['y']
-- Change Braking force
local brk = fBrakeForce
if speed >= 1.0 then
-- Going forward
if accelerator > 127 then
-- Forward and accelerating
local acc = fscale(accelerator, 127.0, 254.0, 0.1, 1.0, 10.0-(cfg.sundayDriverAcceleratorCurve*2.0))
factor = factor * acc
end
if brake > 127 then
-- Forward and braking
isBrakingForward = true
brk = fscale(brake, 127.0, 254.0, 0.01, fBrakeForce, 10.0-(cfg.sundayDriverBrakeCurve*2.0))
end
elseif speed <= -1.0 then
-- Going reverse
if brake > 127 then
-- Reversing and accelerating (using the brake)
local rev = fscale(brake, 127.0, 254.0, 0.1, 1.0, 10.0-(cfg.sundayDriverAcceleratorCurve*2.0))
factor = factor * rev
end
if accelerator > 127 then
-- Reversing and braking (Using the accelerator)
isBrakingReverse = true
brk = fscale(accelerator, 127.0, 254.0, 0.01, fBrakeForce, 10.0-(cfg.sundayDriverBrakeCurve*2.0))
end
else
-- Stopped or almost stopped or sliding sideways
local entitySpeed = GetEntitySpeed(vehicle)
if entitySpeed < 1 then
-- Not sliding sideways
if isBrakingForward == true then
--Stopped or going slightly forward while braking
DisableControlAction(2,72,true) -- Disable Brake until user lets go of brake
SetVehicleForwardSpeed(vehicle,speed*0.98)
SetVehicleBrakeLights(vehicle,true)
end
if isBrakingReverse == true then
--Stopped or going slightly in reverse while braking
DisableControlAction(2,71,true) -- Disable reverse Brake until user lets go of reverse brake (Accelerator)
SetVehicleForwardSpeed(vehicle,speed*0.98)
SetVehicleBrakeLights(vehicle,true)
end
if isBrakingForward == true and GetDisabledControlNormal(2,72) == 0 then
-- We let go of the brake
isBrakingForward=false
end
if isBrakingReverse == true and GetDisabledControlNormal(2,71) == 0 then
-- We let go of the reverse brake (Accelerator)
isBrakingReverse=false
end
end
end
if brk > fBrakeForce - 0.02 then brk = fBrakeForce end -- Make sure we can brake max.
SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fBrakeForce', brk) -- Set new Brake Force multiplier
end
if cfg.limpMode == true and healthEngineNew < cfg.engineSafeGuard + 5 then
factor = cfg.limpModeMultiplier
end
SetVehicleEngineTorqueMultiplier(vehicle, factor)
end
end
if cfg.preventVehicleFlip then
local roll = GetEntityRoll(vehicle)
if (roll > 75.0 or roll < -75.0) and GetEntitySpeed(vehicle) < 2 then
DisableControlAction(2,59,true) -- Disable left/right
DisableControlAction(2,60,true) -- Disable up/down
end
end
end
end)
end
Citizen.CreateThread(function()
while true do
Citizen.Wait(50)
local ped = GetPlayerPed(-1)
if isPedDrivingAVehicle() then
vehicle = GetVehiclePedIsIn(ped, false)
vehicleClass = GetVehicleClass(vehicle)
healthEngineCurrent = GetVehicleEngineHealth(vehicle)
if healthEngineCurrent == 1000 then healthEngineLast = 1000.0 end
healthEngineNew = healthEngineCurrent
healthEngineDelta = healthEngineLast - healthEngineCurrent
healthEngineDeltaScaled = healthEngineDelta * cfg.damageFactorEngine * cfg.classDamageMultiplier[vehicleClass]
healthBodyCurrent = GetVehicleBodyHealth(vehicle)
if healthBodyCurrent == 1000 then healthBodyLast = 1000.0 end
healthBodyNew = healthBodyCurrent
healthBodyDelta = healthBodyLast - healthBodyCurrent
healthBodyDeltaScaled = healthBodyDelta * cfg.damageFactorBody * cfg.classDamageMultiplier[vehicleClass]
healthPetrolTankCurrent = GetVehiclePetrolTankHealth(vehicle)
if cfg.compatibilityMode and healthPetrolTankCurrent < 1 then
-- SetVehiclePetrolTankHealth(vehicle, healthPetrolTankLast)
-- healthPetrolTankCurrent = healthPetrolTankLast
healthPetrolTankLast = healthPetrolTankCurrent
end
if healthPetrolTankCurrent == 1000 then healthPetrolTankLast = 1000.0 end
healthPetrolTankNew = healthPetrolTankCurrent
healthPetrolTankDelta = healthPetrolTankLast-healthPetrolTankCurrent
healthPetrolTankDeltaScaled = healthPetrolTankDelta * cfg.damageFactorPetrolTank * cfg.classDamageMultiplier[vehicleClass]
if healthEngineCurrent > cfg.engineSafeGuard+1 then
SetVehicleUndriveable(vehicle,false)
end
if healthEngineCurrent == cfg.engineSafeGuard then
SetVehicleUndriveable(vehicle,true)
end
-- If ped spawned a new vehicle while in a vehicle or teleported from one vehicle to another, handle as if we just entered the car
if vehicle ~= lastVehicle then
pedInSameVehicleLast = false
end
if pedInSameVehicleLast == true then
-- Damage happened while in the car = can be multiplied
-- Only do calculations if any damage is present on the car. Prevents weird behavior when fixing using trainer or other script
if healthEngineCurrent ~= 1000.0 or healthBodyCurrent ~= 1000.0 or healthPetrolTankCurrent ~= 1000.0 then
-- Combine the delta values (Get the largest of the three)
local healthEngineCombinedDelta = math.max(healthEngineDeltaScaled, healthBodyDeltaScaled, healthPetrolTankDeltaScaled)
-- If huge damage, scale back a bit
if healthEngineCombinedDelta > (healthEngineCurrent - cfg.engineSafeGuard) then
healthEngineCombinedDelta = healthEngineCombinedDelta * 0.7
end
-- If complete damage, but not catastrophic (ie. explosion territory) pull back a bit, to give a couple of seconds og engine runtime before dying
if healthEngineCombinedDelta > healthEngineCurrent then
--healthEngineCombinedDelta = healthEngineCurrent - (cfg.cascadingFailureThreshold / 5)
end
------- Calculate new value
healthEngineNew = healthEngineLast - healthEngineCombinedDelta
------- Sanity Check on new values and further manipulations
-- If somewhat damaged, slowly degrade until slightly before cascading failure sets in, then stop
if healthEngineNew > (cfg.cascadingFailureThreshold + 5) and healthEngineNew < cfg.degradingFailureThreshold then
healthEngineNew = healthEngineNew-(0.038 * cfg.degradingHealthSpeedFactor)
end
-- If Damage is near catastrophic, cascade the failure
if healthEngineNew < cfg.cascadingFailureThreshold then
healthEngineNew = healthEngineNew-(0.1 * cfg.cascadingFailureSpeedFactor)
end
-- Prevent Engine going to or below zero. Ensures you can reenter a damaged car.
if healthEngineNew < cfg.engineSafeGuard then
healthEngineNew = cfg.engineSafeGuard
end
-- Prevent Explosions
if cfg.compatibilityMode == false and healthPetrolTankCurrent < 750 then
--healthPetrolTankNew = 750.0
end
-- Prevent negative body damage.
if healthBodyNew < 0 then
--healthBodyNew = 0.0
end
end
else
-- Just got in the vehicle. Damage can not be multiplied this round
-- Set vehicle handling data
fDeformationDamageMult = GetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fDeformationDamageMult')
fBrakeForce = GetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fBrakeForce')
local newFDeformationDamageMult = fDeformationDamageMult ^ cfg.deformationExponent -- Pull the handling file value closer to 1
if cfg.deformationMultiplier ~= -1 then SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fDeformationDamageMult', newFDeformationDamageMult * cfg.deformationMultiplier) end -- Multiply by our factor
if cfg.weaponsDamageMultiplier ~= -1 then SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fWeaponDamageMult', cfg.weaponsDamageMultiplier/cfg.damageFactorBody) end -- Set weaponsDamageMultiplier and compensate for damageFactorBody
--Get the CollisionDamageMultiplier
fCollisionDamageMult = GetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fCollisionDamageMult')
--Modify it by pulling all number a towards 1.0
local newFCollisionDamageMultiplier = fCollisionDamageMult ^ cfg.collisionDamageExponent -- Pull the handling file value closer to 1
SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fCollisionDamageMult', newFCollisionDamageMultiplier)
--Get the EngineDamageMultiplier
fEngineDamageMult = GetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fEngineDamageMult')
--Modify it by pulling all number a towards 1.0
local newFEngineDamageMult = fEngineDamageMult ^ cfg.engineDamageExponent -- Pull the handling file value closer to 1
SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fEngineDamageMult', newFEngineDamageMult)
-- If body damage catastrophic, reset somewhat so we can get new damage to multiply
if healthBodyCurrent < cfg.cascadingFailureThreshold then
healthBodyNew = cfg.cascadingFailureThreshold
end
pedInSameVehicleLast = true
end
-- set the actual new values
if healthEngineNew ~= healthEngineCurrent then
SetVehicleEngineHealth(vehicle, healthEngineNew)
end
if healthBodyNew ~= healthBodyCurrent then SetVehicleBodyHealth(vehicle, healthBodyNew) end
if healthPetrolTankNew ~= healthPetrolTankCurrent then SetVehiclePetrolTankHealth(vehicle, healthPetrolTankNew) end
-- Store current values, so we can calculate delta next time around
healthEngineLast = healthEngineNew
healthBodyLast = healthBodyNew
healthPetrolTankLast = healthPetrolTankNew
lastVehicle=vehicle
if cfg.randomTireBurstInterval ~= 0 and GetEntitySpeed(vehicle) > 10 then tireBurstLottery() end
else
if pedInSameVehicleLast == true then
-- We just got out of the vehicle
lastVehicle = GetVehiclePedIsIn(ped, true)
if cfg.deformationMultiplier ~= -1 then SetVehicleHandlingFloat(lastVehicle, 'CHandlingData', 'fDeformationDamageMult', fDeformationDamageMult) end -- Restore deformation multiplier
SetVehicleHandlingFloat(lastVehicle, 'CHandlingData', 'fBrakeForce', fBrakeForce) -- Restore Brake Force multiplier
if cfg.weaponsDamageMultiplier ~= -1 then SetVehicleHandlingFloat(lastVehicle, 'CHandlingData', 'fWeaponDamageMult', cfg.weaponsDamageMultiplier) end -- Since we are out of the vehicle, we should no longer compensate for bodyDamageFactor
SetVehicleHandlingFloat(lastVehicle, 'CHandlingData', 'fCollisionDamageMult', fCollisionDamageMult) -- Restore the original CollisionDamageMultiplier
SetVehicleHandlingFloat(lastVehicle, 'CHandlingData', 'fEngineDamageMult', fEngineDamageMult) -- Restore the original EngineDamageMultiplier
end
pedInSameVehicleLast = false
end
end
end)
is there a string of code you can add or modify to make it be a time on fixing the car at a mechanic? like 10-20 sec for it to be done?
Does ELS work on v1.1.1?
I could really use some help with this. I changed whitelist to āFalseā but when i pull a vehicle into a marked area to repair, thereās nothing. No prompt and nothing happens if i try to spam. How can I get this to work properly? I just want people to have to pay $xx.xx to repair their vehicles in my server
Great scriiipt! Love it, makes rp so much funnier!
is it possible to make /repair only available when there is no mechanic online?
Everything is possible