RegisterNetEvent("els:updateElsVehicles") AddEventHandler("els:updateElsVehicles", function(vehicles, patterns) els_Vehicles = vehicles els_patterns = patterns lightPatternPrim = 1 lightPatternSec = 1 advisorPatternSelectedIndex = 1 end) RegisterNetEvent("els:changeLightStage_c") AddEventHandler("els:changeLightStage_c", function(sender, stage, advisor, prim, sec) Citizen.CreateThread(function() local player_s = GetPlayerFromServerId(sender) local ped_s = GetPlayerPed(player_s) if DoesEntityExist(ped_s) and not IsEntityDead(ped_s) then if IsPedInAnyVehicle(ped_s, false) then local vehNetID = GetVehiclePedIsUsing(ped_s) if elsVehs[vehNetID] ~= nil then elsVehs[vehNetID].stage = stage if (stage == 1) then elsVehs[vehNetID].warning = false elsVehs[vehNetID].secondary = true elsVehs[vehNetID].primary = false elseif (stage == 2) then elsVehs[vehNetID].warning = false elsVehs[vehNetID].secondary = true elsVehs[vehNetID].primary = true elseif (stage == 3) then elsVehs[vehNetID].warning = true elsVehs[vehNetID].secondary = true elsVehs[vehNetID].primary = true else elsVehs[vehNetID].warning = false elsVehs[vehNetID].secondary = false elsVehs[vehNetID].primary = false end elsVehs[vehNetID].primPattern = prim elsVehs[vehNetID].secPattern = sec elsVehs[vehNetID].advisorPattern = advisor else elsVehs[vehNetID] = {} elsVehs[vehNetID].stage = stage if (stage == 1) then elsVehs[vehNetID].warning = false elsVehs[vehNetID].secondary = true elsVehs[vehNetID].primary = false elseif (stage == 2) then elsVehs[vehNetID].warning = false elsVehs[vehNetID].secondary = true elsVehs[vehNetID].primary = true elseif (stage == 3) then elsVehs[vehNetID].warning = true elsVehs[vehNetID].secondary = true elsVehs[vehNetID].primary = true else elsVehs[vehNetID].warning = false elsVehs[vehNetID].secondary = false elsVehs[vehNetID].primary = false end elsVehs[vehNetID].primPattern = prim elsVehs[vehNetID].secPattern = sec elsVehs[vehNetID].advisorPattern = advisor end end end return end) end) RegisterNetEvent("els:changePartState_c") AddEventHandler("els:changePartState_c", function(sender, part, newstate) local player_s = GetPlayerFromServerId(sender) local ped_s = GetPlayerPed(player_s) if DoesEntityExist(ped_s) and not IsEntityDead(ped_s) then if IsPedInAnyVehicle(ped_s, false) then local vehNetID = GetVehiclePedIsUsing(ped_s) if elsVehs[vehNetID] == nil then elsVehs[vehNetID] = {} elsVehs[vehNetID].stage = 0 elsVehs[vehNetID].primPattern = 1 elsVehs[vehNetID].secPattern = 1 elsVehs[vehNetID].advisorPattern = 1 end elsVehs[vehNetID][part] = newstate end end end) RegisterNetEvent("els:changeAdvisorPattern_c") AddEventHandler("els:changeAdvisorPattern_c", function(sender, pat) local player_s = GetPlayerFromServerId(sender) local ped_s = GetPlayerPed(player_s) if DoesEntityExist(ped_s) and not IsEntityDead(ped_s) then if IsPedInAnyVehicle(ped_s, false) then local vehNetID = GetVehiclePedIsUsing(ped_s) if elsVehs[vehNetID] ~= nil then elsVehs[vehNetID].advisorPattern = pat else elsVehs[vehNetID] = {} elsVehs[vehNetID].advisorPattern = pat end end end end) RegisterNetEvent("els:changeSecondaryPattern_c") AddEventHandler("els:changeSecondaryPattern_c", function(sender, pat) local player_s = GetPlayerFromServerId(sender) local ped_s = GetPlayerPed(player_s) if DoesEntityExist(ped_s) and not IsEntityDead(ped_s) then if IsPedInAnyVehicle(ped_s, false) then local vehNetID = GetVehiclePedIsUsing(ped_s) if elsVehs[vehNetID] ~= nil then elsVehs[vehNetID].secPattern = pat else elsVehs[vehNetID] = {} elsVehs[vehNetID].secPattern = pat end end end end) RegisterNetEvent("els:changePrimaryPattern_c") AddEventHandler("els:changePrimaryPattern_c", function(sender, pat) local player_s = GetPlayerFromServerId(sender) local ped_s = GetPlayerPed(player_s) if DoesEntityExist(ped_s) and not IsEntityDead(ped_s) then if IsPedInAnyVehicle(ped_s, false) then local vehNetID = GetVehiclePedIsUsing(ped_s) if elsVehs[vehNetID] ~= nil then elsVehs[vehNetID].primPattern = pat else elsVehs[vehNetID] = {} elsVehs[vehNetID].primPattern = pat end end end end) RegisterNetEvent("els:setSirenState_c") AddEventHandler("els:setSirenState_c", function(sender, newstate) local player_s = GetPlayerFromServerId(sender) local ped_s = GetPlayerPed(player_s) if DoesEntityExist(ped_s) and not IsEntityDead(ped_s) then if IsPedInAnyVehicle(ped_s, false) then local veh = GetVehiclePedIsUsing(ped_s) setSirenState(veh, newstate) end end end) RegisterNetEvent("els:setHornState_c") AddEventHandler("els:setHornState_c", function(sender, newstate) local player_s = GetPlayerFromServerId(sender) local ped_s = GetPlayerPed(player_s) if DoesEntityExist(ped_s) and not IsEntityDead(ped_s) then if IsPedInAnyVehicle(ped_s, false) then local veh = GetVehiclePedIsUsing(ped_s) setHornState(veh, newstate) end end end) RegisterNetEvent("els:setSceneLightState_c") AddEventHandler("els:setSceneLightState_c", function(sender) local player_s = GetPlayerFromServerId(sender) local ped_s = GetPlayerPed(player_s) if DoesEntityExist(ped_s) and not IsEntityDead(ped_s) then if IsPedInAnyVehicle(ped_s, false) then local veh = GetVehiclePedIsUsing(ped_s) if(elsVehs[veh] == nil) then changeLightStage(0, 1, 1, 1) end if IsVehicleExtraTurnedOn(veh, 12) then setExtraState(veh, 12, 1) else setExtraState(veh, 12, 0) end end end end) RegisterNetEvent("els:setCruiseLights_c") AddEventHandler("els:setCruiseLights_c", function(sender) local player_s = GetPlayerFromServerId(sender) local ped_s = GetPlayerPed(player_s) if DoesEntityExist(ped_s) and not IsEntityDead(ped_s) then if IsPedInAnyVehicle(ped_s, false) then local veh = GetVehiclePedIsUsing(ped_s) if elsVehs[veh] ~= nil then if elsVehs[veh].cruise then elsVehs[veh].cruise = false else elsVehs[veh].cruise = true end else elsVehs[veh] = {} elsVehs[veh].cruise = true end end end end) RegisterNetEvent("els:setTakedownState_c") AddEventHandler("els:setTakedownState_c", function(sender) local player_s = GetPlayerFromServerId(sender) local ped_s = GetPlayerPed(player_s) if DoesEntityExist(ped_s) and not IsEntityDead(ped_s) then if IsPedInAnyVehicle(ped_s, false) then local veh = GetVehiclePedIsUsing(ped_s) if(elsVehs[veh] == nil) then changeLightStage(0, 1, 1, 1) end if IsVehicleExtraTurnedOn(veh, 11) then setExtraState(veh, 11, 1) else setExtraState(veh, 11, 0) end end end end) function toggleSirenMute(veh, toggle) if DoesEntityExist(veh) and not IsEntityDead(veh) then DisableVehicleImpactExplosionActivation(veh, toggle) end end function setHornState(veh, newstate) if DoesEntityExist(veh) and not IsEntityDead(veh) then if newstate ~= h_horn_state[veh] then if h_soundID_veh[veh] ~= nil then StopSound(h_soundID_veh[veh]) ReleaseSoundId(h_soundID_veh[veh]) h_soundID_veh[veh] = nil end if newstate == 1 then h_soundID_veh[veh] = GetSoundId() PlaySoundFromEntity(h_soundID_veh[veh], getVehicleVCFInfo(veh).sounds.mainHorn.audioString, veh, 0, 0, 0) end h_horn_state[veh] = newstate end end end function setSirenState(veh, newstate) if DoesEntityExist(veh) and not IsEntityDead(veh) then if newstate ~= m_siren_state[veh] then if m_soundID_veh[veh] ~= nil then StopSound(m_soundID_veh[veh]) ReleaseSoundId(m_soundID_veh[veh]) m_soundID_veh[veh] = nil end if newstate == 1 then m_soundID_veh[veh] = GetSoundId() PlaySoundFromEntity(m_soundID_veh[veh], getVehicleVCFInfo(veh).sounds.srnTone1.audioString, veh, 0, 0, 0) toggleSirenMute(veh, true) elseif newstate == 2 then m_soundID_veh[veh] = GetSoundId() PlaySoundFromEntity(m_soundID_veh[veh], getVehicleVCFInfo(veh).sounds.srnTone2.audioString, veh, 0, 0, 0) toggleSirenMute(veh, true) elseif newstate == 3 then m_soundID_veh[veh] = GetSoundId() PlaySoundFromEntity(m_soundID_veh[veh], getVehicleVCFInfo(veh).sounds.srnTone3.audioString, veh, 0, 0, 0) toggleSirenMute(veh, true) else toggleSirenMute(veh, true) end m_siren_state[veh] = newstate end end end function RotAnglesToVec(rot) -- input vector3 local z = math.rad(rot.z) local x = math.rad(rot.x) local num = math.abs(math.cos(x)) return vector3(-math.sin(z)*num, math.cos(z)*num, math.sin(x)) end function changeLightStage(state, advisor, PatternPrim, PatternSec) TriggerServerEvent("els:changeLightStage_s", state, advisor, PatternPrim, PatternSec) end function changeAdvisorPattern(pat) TriggerServerEvent("els:changeAdvisorPattern_s", pat) end function changePrimaryPattern(pat) TriggerServerEvent("els:changePrimaryPattern_s", pat) end function changeSecondaryPattern(pat) TriggerServerEvent("els:changeSecondaryPattern_s", pat) end function checkCar(car) if car then carModel = GetEntityModel(car) carName = GetDisplayNameFromVehicleModel(carModel) return carName end end function checkCarHash(car) if car then for k,v in pairs(els_Vehicles) do if GetEntityModel(car) == GetHashKey(k) then return k end end end end function vehInTable (tab, val) for index in pairs(tab) do if index == val then return true end end return false end function setExtraState(veh, extra, state) if (not IsEntityDead(veh) and DoesEntityExist(veh)) then if els_Vehicles[checkCarHash(veh)].extras[extra] ~= nil then if(els_Vehicles[checkCarHash(veh)].extras[extra].enabled) then if DoesExtraExist(veh, extra) then SetVehicleExtra(veh, extra, state) end end end end end function isVehicleELS(veh) return vehInTable(els_Vehicles, checkCarHash(veh)) end function getVehicleLightStage(veh) if (elsVehs[veh] ~= nil) then return elsVehs[veh].stage end end function Draw(text, r, g, b, alpha, x, y, width, height, ya, center, font) SetTextColour(r, g, b, alpha) SetTextFont(font) SetTextScale(width, height) SetTextWrap(0.0, 1.0) SetTextCentre(center) SetTextDropshadow(0, 0, 0, 0, 0) SetTextEdge(1, 0, 0, 0, 205) BeginTextCommandDisplayText("STRING") AddTextComponentSubstringPlayerName(text) SetUiLayer(ya) EndTextCommandDisplayText(x, y) end function hornCleanup() Citizen.CreateThread(function() for vehicle, state in pairs(h_horn_state) do if state >= 0 then if not DoesEntityExist(vehicle) or IsEntityDead(vehicle) then if h_soundID_veh[vehicle] ~= nil then StopSound(h_soundID_veh[vehicle]) ReleaseSoundId(h_soundID_veh[vehicle]) h_soundID_veh[vehicle] = nil h_horn_state[vehicle] = nil end end end end return end) end function sirenCleanup() Citizen.CreateThread(function() for vehicle, state in pairs(m_siren_state) do if m_soundID_veh[vehicle] ~= nil then if not DoesEntityExist(vehicle) or IsEntityDead(vehicle) then StopSound(m_soundID_veh[vehicle]) ReleaseSoundId(m_soundID_veh[vehicle]) m_soundID_veh[vehicle] = nil m_siren_state[vehicle] = nil end end end for vehicle, state in pairs(d_siren_state) do if d_soundID_veh[vehicle] ~= nil then if not DoesEntityExist(vehicle) or IsEntityDead(vehicle) then StopSound(d_soundID_veh[vehicle]) ReleaseSoundId(d_soundID_veh[vehicle]) d_soundID_veh[vehicle] = nil d_siren_state[vehicle] = nil end end end return end) end function _DrawRect(x, y, width, height, r, g, b, a, ya) SetUiLayer(ya) DrawRect(x, y, width, height, r, g, b, a) end function vehicleLightCleanup() Citizen.CreateThread(function() for vehicle,_ in pairs(elsVehs) do if elsVehs[vehicle] then if not DoesEntityExist(vehicle) or IsEntityDead(vehicle) then if elsVehs[vehicle] ~= nil then elsVehs[vehicle] = nil end end end end return end) end function LghtSoundCleaner() vehicleLightCleanup() hornCleanup() sirenCleanup() end function changePrimaryPatternMath(way) if playButtonPressSounds then PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) end local primMax = getNumberOfPrimaryPatterns(GetVehiclePedIsUsing(GetPlayerPed(-1))) local primMin = 1 local temp = lightPatternPrim temp = temp + way if(temp < primMin) then temp = primMax end if(temp > primMax) then temp = primMin end lightPatternPrim = temp if temp ~= 0 then lightPatternsPrim = temp end changePrimaryPattern(lightPatternsPrim) end function changeSecondaryPatternMath(way) if playButtonPressSounds then PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) end local primMax = getNumberOfSecondaryPatterns(GetVehiclePedIsUsing(GetPlayerPed(-1))) local primMin = 1 local temp = lightPatternSec temp = temp + way if(temp > primMax) then temp = primMin end if(temp < primMin) then temp = primMax end lightPatternSec = temp changeSecondaryPattern(lightPatternSec) end function changeAdvisorPatternMath(way) if playButtonPressSounds then PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) end local primMax = getNumberOfAdvisorPatterns(GetVehiclePedIsUsing(GetPlayerPed(-1))) local primMin = 1 local temp = advisorPatternSelectedIndex temp = temp + way if(temp < primMin) then temp = primMax end if(temp > primMax) then temp = primMin end advisorPatternSelectedIndex = temp changeAdvisorPattern(advisorPatternSelectedIndex) end function setSirenStateButton(state) if playButtonPressSounds then PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) end if m_siren_state[GetVehiclePedIsUsing(GetPlayerPed(-1))] ~= state then TriggerServerEvent("els:setSirenState_s", state) elseif m_siren_state[GetVehiclePedIsUsing(GetPlayerPed(-1))] == state then TriggerServerEvent("els:setSirenState_s", 0) end end function upOneStage() if playButtonPressSounds then PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) end local vehNetID = GetVehiclePedIsUsing(GetPlayerPed(-1)) local newStage = 1 if (elsVehs[vehNetID] ~= nil and elsVehs[vehNetID].stage ~= nil) then newStage = elsVehs[vehNetID].stage + 1 end if newStage == 4 then newStage = 0 end changeLightStage(newStage, advisorPatternSelectedIndex, lightPatternPrim, lightPatternSec) if GetVehicleClass(GetVehiclePedIsUsing(GetPlayerPed(-1))) == 18 then if newStage == getVehicleVCFInfo(GetVehiclePedIsUsing(GetPlayerPed(-1))).misc.dfltsirenltsactivateatlstg then toggleSirenMute(GetVehiclePedIsUsing(GetPlayerPed(-1)), true) SetVehicleSiren(GetVehiclePedIsUsing(GetPlayerPed(-1)), true) else SetVehicleSiren(GetVehiclePedIsUsing(GetPlayerPed(-1)), false) end if(newStage == 0) then SetVehicleSiren(GetVehiclePedIsUsing(GetPlayerPed(-1)), false) TriggerServerEvent("els:setSirenState_s", 0) TriggerServerEvent("els:setDualSirenState_s", 0) TriggerServerEvent("els:setDualSiren_s", false) end end end function downOneStage() if playButtonPressSounds then PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) end local vehNetID = GetVehiclePedIsUsing(GetPlayerPed(-1)) local newStage = 3 if(elsVehs[vehNetID] ~= nil and elsVehs[vehNetID].stage ~= nil) then newStage = elsVehs[vehNetID].stage - 1 end if newStage == -1 then newStage = 3 end changeLightStage(newStage, advisorPatternSelectedIndex, lightPatternPrim, lightPatternSec) if GetVehicleClass(GetVehiclePedIsUsing(GetPlayerPed(-1))) == 18 then if newStage == getVehicleVCFInfo(GetVehiclePedIsUsing(GetPlayerPed(-1))).misc.dfltsirenltsactivateatlstg then toggleSirenMute(GetVehiclePedIsUsing(GetPlayerPed(-1)), true) SetVehicleSiren(GetVehiclePedIsUsing(GetPlayerPed(-1)), true) else SetVehicleSiren(GetVehiclePedIsUsing(GetPlayerPed(-1)), false) end if (newStage == 0) then SetVehicleSiren(GetVehiclePedIsUsing(GetPlayerPed(-1)), false) TriggerServerEvent("els:setSirenState_s", 0) TriggerServerEvent("els:setDualSirenState_s", 0) TriggerServerEvent("els:setDualSiren_s", false) end end end function displayScreenKeyboard(text) HideHudAndRadarThisFrame() DisplayOnscreenKeyboard(1, text, "", "", "", "", "", 60) while UpdateOnscreenKeyboard() == 0 do DisableAllControlActions(0) Wait(0) end if (not GetOnscreenKeyboardResult()) then return nil end return GetOnscreenKeyboardResult() end function formatPatternNumber(num) if num < 10 then return "00" .. tostring(num) elseif num < 100 and num >= 10 then return "0" .. tostring(num) else return tostring(num) end end function getVehicleVCFInfo(veh) return els_Vehicles[checkCarHash(veh)] end