forked from Simnation/Main
270 lines
12 KiB
Lua
270 lines
12 KiB
Lua
![]() |
nitro = {}
|
||
|
local vehicles = {}
|
||
|
local particles = {}
|
||
|
local vehicles2 = {}
|
||
|
local particles2 = {}
|
||
|
if Config.EnableNitro then
|
||
|
|
||
|
function CreateVehicleExhaustBackfire(vehicle, scale)
|
||
|
local exhaustNames = {
|
||
|
"exhaust", "exhaust_2", "exhaust_3", "exhaust_4",
|
||
|
"exhaust_5", "exhaust_6", "exhaust_7", "exhaust_8",
|
||
|
"exhaust_9", "exhaust_10", "exhaust_11", "exhaust_12",
|
||
|
"exhaust_13", "exhaust_14", "exhaust_15", "exhaust_16"
|
||
|
}
|
||
|
|
||
|
for _, exhaustName in ipairs(exhaustNames) do
|
||
|
local boneIndex = GetEntityBoneIndexByName(vehicle, exhaustName)
|
||
|
|
||
|
if boneIndex ~= -1 then
|
||
|
local pos = GetWorldPositionOfEntityBone(vehicle, boneIndex)
|
||
|
local off = GetOffsetFromEntityGivenWorldCoords(vehicle, pos.x, pos.y, pos.z)
|
||
|
|
||
|
UseParticleFxAssetNextCall('core')
|
||
|
StartParticleFxNonLoopedOnEntity('veh_backfire', vehicle, off.x, off.y, off.z, 0.0, 0.0, 0.0, scale, false, false, false)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function CreateVehiclePurgeSpray(vehicle, xOffset, yOffset, zOffset, xRot, yRot, zRot, scale)
|
||
|
UseParticleFxAssetNextCall('core')
|
||
|
return StartParticleFxLoopedOnEntity('ent_sht_steam', vehicle, xOffset, yOffset, zOffset, xRot, yRot, zRot, scale, false, false, false)
|
||
|
end
|
||
|
|
||
|
function CreateVehicleLightTrail(vehicle, bone, scale)
|
||
|
UseParticleFxAssetNextCall('core')
|
||
|
local ptfx = StartParticleFxLoopedOnEntityBone('veh_light_red_trail', vehicle, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, bone, scale, false, false, false)
|
||
|
SetParticleFxLoopedEvolution(ptfx, "speed", 1.0, false)
|
||
|
return ptfx
|
||
|
end
|
||
|
|
||
|
function StopVehicleLightTrail(ptfx, duration)
|
||
|
Citizen.CreateThread(function()
|
||
|
local startTime = GetGameTimer()
|
||
|
local endTime = GetGameTimer() + duration
|
||
|
while GetGameTimer() < endTime do
|
||
|
Citizen.Wait(0)
|
||
|
local now = GetGameTimer()
|
||
|
local scale = (endTime - now) / duration
|
||
|
SetParticleFxLoopedScale(ptfx, scale)
|
||
|
SetParticleFxLoopedAlpha(ptfx, scale)
|
||
|
end
|
||
|
StopParticleFxLooped(ptfx)
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
function IsVehicleLightTrailEnabled(vehicle)
|
||
|
return vehicles2[vehicle] == true
|
||
|
end
|
||
|
|
||
|
function SetVehicleLightTrailEnabled(vehicle, enabled)
|
||
|
if IsVehicleLightTrailEnabled(vehicle) == enabled then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if enabled then
|
||
|
local ptfxs = {}
|
||
|
|
||
|
local leftTrail = CreateVehicleLightTrail(vehicle, GetEntityBoneIndexByName(vehicle, "taillight_l"), 1.0)
|
||
|
local rightTrail = CreateVehicleLightTrail(vehicle, GetEntityBoneIndexByName(vehicle, "taillight_r"), 1.0)
|
||
|
|
||
|
table.insert(ptfxs, leftTrail)
|
||
|
table.insert(ptfxs, rightTrail)
|
||
|
|
||
|
vehicles2[vehicle] = true
|
||
|
particles2[vehicle] = ptfxs
|
||
|
else
|
||
|
if particles2[vehicle] and #particles2[vehicle] > 0 then
|
||
|
for _, particleId in ipairs(particles2[vehicle]) do
|
||
|
StopVehicleLightTrail(particleId, 500)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
vehicles2[vehicle] = nil
|
||
|
particles2[vehicle] = nil
|
||
|
end
|
||
|
end
|
||
|
function SetVehicleNitroBoostEnabled(vehicle, enabled)
|
||
|
|
||
|
|
||
|
if IsPedInVehicle(PlayerPedId(), vehicle) then
|
||
|
SetNitroBoostScreenEffectsEnabled(enabled)
|
||
|
end
|
||
|
|
||
|
SetVehicleBoostActive(vehicle, enabled)
|
||
|
end
|
||
|
function IsVehicleNitroPurgeEnabled(vehicle)
|
||
|
return vehicles[vehicle] == true
|
||
|
end
|
||
|
function SetVehicleNitroPurgeEnabled(vehicle, enabled)
|
||
|
if IsVehicleNitroPurgeEnabled(vehicle) == enabled then
|
||
|
return
|
||
|
end
|
||
|
if enabled then
|
||
|
local bone = GetEntityBoneIndexByName(vehicle, 'bonnet')
|
||
|
local pos = GetWorldPositionOfEntityBone(vehicle, bone)
|
||
|
local off = GetOffsetFromEntityGivenWorldCoords(vehicle, pos.x, pos.y, pos.z)
|
||
|
local ptfxs = {}
|
||
|
|
||
|
for i=0,3 do
|
||
|
local leftPurge = CreateVehiclePurgeSpray(vehicle, off.x - 0.5, off.y + 0.05, off.z, 40.0, -20.0, 0.0, 0.5)
|
||
|
local rightPurge = CreateVehiclePurgeSpray(vehicle, off.x + 0.5, off.y + 0.05, off.z, 40.0, 20.0, 0.0, 0.5)
|
||
|
|
||
|
table.insert(ptfxs, leftPurge)
|
||
|
table.insert(ptfxs, rightPurge)
|
||
|
end
|
||
|
|
||
|
vehicles[vehicle] = true
|
||
|
particles[vehicle] = ptfxs
|
||
|
else
|
||
|
if particles[vehicle] and #particles[vehicle] > 0 then
|
||
|
for _, particleId in ipairs(particles[vehicle]) do
|
||
|
StopParticleFxLooped(particleId)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
vehicles[vehicle] = nil
|
||
|
particles[vehicle] = nil
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function SetNitroBoostScreenEffectsEnabled(enabled)
|
||
|
if enabled then
|
||
|
StartScreenEffect('RaceTurbo', 0, false)
|
||
|
SetTimecycleModifier('rply_motionblur')
|
||
|
ShakeGameplayCam('SKY_DIVING_SHAKE', 0.30)
|
||
|
TriggerServerEvent("InteractSound_SV:PlayOnSource", "nitro", 0.5)
|
||
|
else
|
||
|
StopScreenEffect('RaceTurbo')
|
||
|
StopGameplayCamShaking(true)
|
||
|
SetTransitionTimecycleModifier('default', 0.35)
|
||
|
end
|
||
|
end
|
||
|
function GetVehicleInDirection()
|
||
|
|
||
|
local playerCoords = GetEntityCoords(playerPed)
|
||
|
local inDirection = GetOffsetFromEntityInWorldCoords(playerPed, 0.0, 5.0, 0.0)
|
||
|
local rayHandle = StartShapeTestRay(playerCoords, inDirection, 10, playerPed, 0)
|
||
|
local numRayHandle, hit, endCoords, surfaceNormal, entityHit = GetShapeTestResult(rayHandle)
|
||
|
|
||
|
if hit == 1 and GetEntityType(entityHit) == 2 then
|
||
|
return entityHit
|
||
|
end
|
||
|
|
||
|
return nil
|
||
|
end
|
||
|
RegisterNetEvent('codem-blvckhudv2:SetupNitro')
|
||
|
AddEventHandler('codem-blvckhudv2:SetupNitro', function()
|
||
|
local vehicle = GetVehicleInDirection()
|
||
|
if IsPedSittingInAnyVehicle(playerPed) then
|
||
|
Config.Notification(Config.Notifications["cant_install_nitro"]["message"], Config.Notifications["cant_install_nitro"]["type"])
|
||
|
else
|
||
|
if vehicle ~= nil and DoesEntityExist(vehicle) and IsPedOnFoot(playerPed) then
|
||
|
TaskStartScenarioInPlace(playerPed, 'PROP_HUMAN_BUM_BIN', 0, true)
|
||
|
Citizen.CreateThread(function()
|
||
|
Citizen.Wait(5000)
|
||
|
ClearPedTasksImmediately(playerPed)
|
||
|
TriggerServerEvent('codem-blvckhudv2:RemoveItem',Config.NitroItem, 1)
|
||
|
TriggerServerEvent('codem-blvckhudv2:InstallNitro', GetVehicleNumberPlateText(vehicle))
|
||
|
end)
|
||
|
else
|
||
|
Config.Notification(Config.Notifications["no_veh_nearby"]["message"], Config.Notifications["no_veh_nearby"]["type"])
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
RegisterNetEvent('codem-blvckhudv2:UpdateNitroData')
|
||
|
AddEventHandler('codem-blvckhudv2:UpdateNitroData', function(nitroData)
|
||
|
while not response do
|
||
|
Citizen.Wait(0)
|
||
|
end
|
||
|
nitro = nitroData
|
||
|
|
||
|
local playerVeh = GetVehiclePedIsIn(playerPed, false)
|
||
|
if playerVeh ~= 0 and nitro[GetVehicleNumberPlateText(playerVeh)] ~= nil then
|
||
|
SendNUIMessage({ type="set_status", statustype = "nitro", value = nitro[GetVehicleNumberPlateText(playerVeh)]})
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
local isPressing = false
|
||
|
RegisterCommand('+nitro', function()
|
||
|
local playerVeh = GetVehiclePedIsIn(playerPed, false)
|
||
|
isPressing = true
|
||
|
if playerVeh ~= 0 and nitro[GetVehicleNumberPlateText(playerVeh)] ~= nil then
|
||
|
if tonumber(nitro[GetVehicleNumberPlateText(playerVeh)]) > 0 then
|
||
|
if GetPedInVehicleSeat(playerVeh, -1) == playerPed then
|
||
|
while isPressing do
|
||
|
playerVeh = GetVehiclePedIsIn(playerPed, false)
|
||
|
if tonumber(nitro[GetVehicleNumberPlateText(playerVeh)]) <= 0 then
|
||
|
if tonumber(nitro[GetVehicleNumberPlateText(playerVeh)]) < 0 then
|
||
|
nitro[GetVehicleNumberPlateText(playerVeh)] = 0
|
||
|
end
|
||
|
isPressing = false
|
||
|
SetVehicleNitroBoostEnabled(playerVeh, false)
|
||
|
SetVehicleLightTrailEnabled(playerVeh, false)
|
||
|
SetVehicleNitroPurgeEnabled(playerVeh, false)
|
||
|
SetVehicleEnginePowerMultiplier(playerVeh,1.0)
|
||
|
|
||
|
TriggerServerEvent('codem-blvckhudv2:UpdateNitro', GetVehicleNumberPlateText(playerVeh), nitro[GetVehicleNumberPlateText(playerVeh)])
|
||
|
break
|
||
|
|
||
|
end
|
||
|
if playerVeh == 0 then
|
||
|
isPressing = false
|
||
|
SetVehicleEnginePowerMultiplier(playerVeh,1.0)
|
||
|
|
||
|
SetVehicleNitroBoostEnabled(playerVeh, false)
|
||
|
SetVehicleLightTrailEnabled(playerVeh, false)
|
||
|
SetVehicleNitroPurgeEnabled(playerVeh, false)
|
||
|
TriggerServerEvent('codem-blvckhudv2:UpdateNitro', GetVehicleNumberPlateText(playerVeh), nitro[GetVehicleNumberPlateText(playerVeh)])
|
||
|
break
|
||
|
end
|
||
|
if GetPedInVehicleSeat(playerVeh, -1) == playerPed then
|
||
|
local force = Config.NitroForce
|
||
|
nitro[GetVehicleNumberPlateText(playerVeh)] = nitro[GetVehicleNumberPlateText(playerVeh)] - Config.RemoveNitroOnpress
|
||
|
SendNUIMessage({ type="set_status", statustype = "nitro", value = nitro[GetVehicleNumberPlateText(playerVeh)]})
|
||
|
|
||
|
SetVehicleNitroBoostEnabled(playerVeh, true)
|
||
|
SetVehicleLightTrailEnabled(playerVeh, true)
|
||
|
SetVehicleNitroPurgeEnabled(playerVeh, true)
|
||
|
CreateVehicleExhaustBackfire(playerVeh, 1.25)
|
||
|
SetVehicleEnginePowerMultiplier(playerVeh,55.0)
|
||
|
else
|
||
|
SetVehicleNitroBoostEnabled(playerVeh, false)
|
||
|
SetVehicleLightTrailEnabled(playerVeh, false)
|
||
|
SetVehicleNitroPurgeEnabled(playerVeh, false)
|
||
|
SetVehicleEnginePowerMultiplier(playerVeh,1.0)
|
||
|
|
||
|
isPressing = false
|
||
|
TriggerServerEvent('codem-blvckhudv2:UpdateNitro', GetVehicleNumberPlateText(playerVeh), nitro[GetVehicleNumberPlateText(playerVeh)])
|
||
|
|
||
|
break
|
||
|
end
|
||
|
Citizen.Wait(400)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
RegisterCommand('-nitro', function()
|
||
|
local playerVeh = GetVehiclePedIsIn(playerPed, false)
|
||
|
if playerVeh ~= 0 and nitro[GetVehicleNumberPlateText(playerVeh)] ~= nil then
|
||
|
if GetPedInVehicleSeat(playerVeh, -1) == playerPed then
|
||
|
isPressing = false
|
||
|
SetVehicleNitroBoostEnabled(playerVeh, false)
|
||
|
SetVehicleLightTrailEnabled(playerVeh, false)
|
||
|
SetVehicleNitroPurgeEnabled(playerVeh, false)
|
||
|
SetVehicleEnginePowerMultiplier(playerVeh,1.0)
|
||
|
|
||
|
SendNUIMessage({ type="set_status", statustype = "nitro", value = nitro[GetVehicleNumberPlateText(playerVeh)]})
|
||
|
TriggerServerEvent('codem-blvckhudv2:UpdateNitro', GetVehicleNumberPlateText(playerVeh), nitro[GetVehicleNumberPlateText(playerVeh)])
|
||
|
end
|
||
|
else
|
||
|
SendNUIMessage({ type="set_status", statustype = "nitro", value = 0})
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterKeyMapping('+nitro', 'Toggle Nitro', 'keyboard', Config.NitroKey)
|
||
|
|
||
|
|
||
|
end
|