Main/resources/[tools]/Codem-BlackHUDV2/client/nitro.lua
2025-06-07 08:51:21 +02:00

269 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