diff --git a/resources/Lux_ELS/client.lua b/resources/Lux_ELS/client.lua index 4acae7f1f..627a83394 100644 --- a/resources/Lux_ELS/client.lua +++ b/resources/Lux_ELS/client.lua @@ -55,13 +55,11 @@ local eModelsWithFireSrn = "exp", "f750", "ferrara", - "pengine" + "pengine", "prescue", "brush", "enladder", "bat3", - - } -- models listed below will use AMBULANCE_WARNING as auxiliary siren diff --git a/resources/Lux_ELS/client.lua.bak b/resources/Lux_ELS/client.lua.bak new file mode 100644 index 000000000..6dcd6a85d --- /dev/null +++ b/resources/Lux_ELS/client.lua.bak @@ -0,0 +1,643 @@ +--[[ +--------------------------------------------------- +LUXART VEHICLE CONTROL (FOR FIVEM) +--------------------------------------------------- +Last revision: MAY 01 2017 (VERS. 1.01) +Coded by Lt.Caine +--------------------------------------------------- +NOTES + LVC will automatically apply to all emergency vehicles (vehicle class 18) +--------------------------------------------------- +CONTROLS + Right indicator: = (Next Custom Radio Track) + Left indicator: - (Previous Custom Radio Track) + Hazard lights: ] + Toggle emergency lights: Q (Text Chat Team) + Airhorn: E (Horn) + Toggle siren: 1 (Previous Radio Station) + Manual siren / Change siren tone: R (Next Radio Station) + Auxiliary siren: Z +--------------------------------------------------- +]] + +local count_bcast_timer = 0 +local delay_bcast_timer = 200 + +local count_sndclean_timer = 0 +local delay_sndclean_timer = 400 + +local actv_ind_timer = false +local count_ind_timer = 0 +local delay_ind_timer = 180 + +local actv_lxsrnmute_temp = false +local srntone_temp = 0 +local dsrn_mute = true + +local state_indic = {} +local state_lxsiren = {} +local state_pwrcall = {} +local state_airmanu = {} + +local ind_state_o = 0 +local ind_state_l = 1 +local ind_state_r = 2 +local ind_state_h = 3 + +local snd_lxsiren = {} +local snd_pwrcall = {} +local snd_airmanu = {} + +-- these models will use their real wail siren, as determined by their assigned audio hash in vehicles.meta +local eModelsWithFireSrn = +{ + "FIRETRUK", + "exp", + "f750", + "ferrara", + "pengine" + "prescue", + "brush", + "enladder", + "bat3", +} + +-- models listed below will use AMBULANCE_WARNING as auxiliary siren +-- unlisted models will instead use the default wail as the auxiliary siren +local eModelsWithPcall = +{ + "AMBULANCE", + "FIRETRUK", + "LGUARD", +} + + +--------------------------------------------------------------------- +function ShowDebug(text) + SetNotificationTextEntry("STRING") + AddTextComponentString(text) + DrawNotification(false, false) +end + +--------------------------------------------------------------------- +function useFiretruckSiren(veh) + local model = GetEntityModel(veh) + for i = 1, #eModelsWithFireSrn, 1 do + if model == GetHashKey(eModelsWithFireSrn[i]) then + return true + end + end + return false +end + +--------------------------------------------------------------------- +function usePowercallAuxSrn(veh) + local model = GetEntityModel(veh) + for i = 1, #eModelsWithPcall, 1 do + if model == GetHashKey(eModelsWithPcall[i]) then + return true + end + end + return false +end + +--------------------------------------------------------------------- +function CleanupSounds() + if count_sndclean_timer > delay_sndclean_timer then + count_sndclean_timer = 0 + for k, v in pairs(state_lxsiren) do + if v > 0 then + if not DoesEntityExist(k) or IsEntityDead(k) then + if snd_lxsiren[k] ~= nil then + StopSound(snd_lxsiren[k]) + ReleaseSoundId(snd_lxsiren[k]) + snd_lxsiren[k] = nil + state_lxsiren[k] = nil + end + end + end + end + for k, v in pairs(state_pwrcall) do + if v == true then + if not DoesEntityExist(k) or IsEntityDead(k) then + if snd_pwrcall[k] ~= nil then + StopSound(snd_pwrcall[k]) + ReleaseSoundId(snd_pwrcall[k]) + snd_pwrcall[k] = nil + state_pwrcall[k] = nil + end + end + end + end + for k, v in pairs(state_airmanu) do + if v == true then + if not DoesEntityExist(k) or IsEntityDead(k) or IsVehicleSeatFree(k, -1) then + if snd_airmanu[k] ~= nil then + StopSound(snd_airmanu[k]) + ReleaseSoundId(snd_airmanu[k]) + snd_airmanu[k] = nil + state_airmanu[k] = nil + end + end + end + end + else + count_sndclean_timer = count_sndclean_timer + 1 + end +end + +--------------------------------------------------------------------- +function TogIndicStateForVeh(veh, newstate) + if DoesEntityExist(veh) and not IsEntityDead(veh) then + if newstate == ind_state_o then + SetVehicleIndicatorLights(veh, 0, false) -- R + SetVehicleIndicatorLights(veh, 1, false) -- L + elseif newstate == ind_state_l then + SetVehicleIndicatorLights(veh, 0, false) -- R + SetVehicleIndicatorLights(veh, 1, true) -- L + elseif newstate == ind_state_r then + SetVehicleIndicatorLights(veh, 0, true) -- R + SetVehicleIndicatorLights(veh, 1, false) -- L + elseif newstate == ind_state_h then + SetVehicleIndicatorLights(veh, 0, true) -- R + SetVehicleIndicatorLights(veh, 1, true) -- L + end + state_indic[veh] = newstate + end +end + +--------------------------------------------------------------------- +function TogMuteDfltSrnForVeh(veh, toggle) + if DoesEntityExist(veh) and not IsEntityDead(veh) then + DisableVehicleImpactExplosionActivation(veh, toggle) + end +end + +--------------------------------------------------------------------- +function SetLxSirenStateForVeh(veh, newstate) + if DoesEntityExist(veh) and not IsEntityDead(veh) then + if newstate ~= state_lxsiren[veh] then + + if snd_lxsiren[veh] ~= nil then + StopSound(snd_lxsiren[veh]) + ReleaseSoundId(snd_lxsiren[veh]) + snd_lxsiren[veh] = nil + end + + if newstate == 1 then + if useFiretruckSiren(veh) then + TogMuteDfltSrnForVeh(veh, false) + else + snd_lxsiren[veh] = GetSoundId() + PlaySoundFromEntity(snd_lxsiren[veh], "VEHICLES_HORNS_SIREN_1", veh, 0, 0, 0) + TogMuteDfltSrnForVeh(veh, true) + end + + elseif newstate == 2 then + snd_lxsiren[veh] = GetSoundId() + PlaySoundFromEntity(snd_lxsiren[veh], "VEHICLES_HORNS_SIREN_2", veh, 0, 0, 0) + TogMuteDfltSrnForVeh(veh, true) + + elseif newstate == 3 then + snd_lxsiren[veh] = GetSoundId() + if useFiretruckSiren(veh) then + PlaySoundFromEntity(snd_lxsiren[veh], "VEHICLES_HORNS_AMBULANCE_WARNING", veh, 0, 0, 0) + else + PlaySoundFromEntity(snd_lxsiren[veh], "VEHICLES_HORNS_POLICE_WARNING", veh, 0, 0, 0) + end + TogMuteDfltSrnForVeh(veh, true) + + else + TogMuteDfltSrnForVeh(veh, true) + + end + + state_lxsiren[veh] = newstate + end + end +end + +--------------------------------------------------------------------- +function TogPowercallStateForVeh(veh, toggle) + if DoesEntityExist(veh) and not IsEntityDead(veh) then + if toggle == true then + if snd_pwrcall[veh] == nil then + snd_pwrcall[veh] = GetSoundId() + if usePowercallAuxSrn(veh) then + PlaySoundFromEntity(snd_pwrcall[veh], "VEHICLES_HORNS_AMBULANCE_WARNING", veh, 0, 0, 0) + else + PlaySoundFromEntity(snd_pwrcall[veh], "VEHICLES_HORNS_SIREN_1", veh, 0, 0, 0) + end + end + else + if snd_pwrcall[veh] ~= nil then + StopSound(snd_pwrcall[veh]) + ReleaseSoundId(snd_pwrcall[veh]) + snd_pwrcall[veh] = nil + end + end + state_pwrcall[veh] = toggle + end +end + +--------------------------------------------------------------------- +function SetAirManuStateForVeh(veh, newstate) + if DoesEntityExist(veh) and not IsEntityDead(veh) then + if newstate ~= state_airmanu[veh] then + + if snd_airmanu[veh] ~= nil then + StopSound(snd_airmanu[veh]) + ReleaseSoundId(snd_airmanu[veh]) + snd_airmanu[veh] = nil + end + + if newstate == 1 then + snd_airmanu[veh] = GetSoundId() + if useFiretruckSiren(veh) then + PlaySoundFromEntity(snd_airmanu[veh], "VEHICLES_HORNS_FIRETRUCK_WARNING", veh, 0, 0, 0) + else + PlaySoundFromEntity(snd_airmanu[veh], "SIRENS_AIRHORN", veh, 0, 0, 0) + end + + elseif newstate == 2 then + snd_airmanu[veh] = GetSoundId() + PlaySoundFromEntity(snd_airmanu[veh], "VEHICLES_HORNS_SIREN_1", veh, 0, 0, 0) + + elseif newstate == 3 then + snd_airmanu[veh] = GetSoundId() + PlaySoundFromEntity(snd_airmanu[veh], "VEHICLES_HORNS_SIREN_2", veh, 0, 0, 0) + + end + + state_airmanu[veh] = newstate + end + end +end + + +--------------------------------------------------------------------- +RegisterNetEvent("lvc_TogIndicState_c") +AddEventHandler("lvc_TogIndicState_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 ped_s ~= GetPlayerPed(-1) then + if IsPedInAnyVehicle(ped_s, false) then + local veh = GetVehiclePedIsUsing(ped_s) + TogIndicStateForVeh(veh, newstate) + end + end + end +end) + +--------------------------------------------------------------------- +RegisterNetEvent("lvc_TogDfltSrnMuted_c") +AddEventHandler("lvc_TogDfltSrnMuted_c", function(sender, toggle) + local player_s = GetPlayerFromServerId(sender) + local ped_s = GetPlayerPed(player_s) + if DoesEntityExist(ped_s) and not IsEntityDead(ped_s) then + if ped_s ~= GetPlayerPed(-1) then + if IsPedInAnyVehicle(ped_s, false) then + local veh = GetVehiclePedIsUsing(ped_s) + TogMuteDfltSrnForVeh(veh, toggle) + end + end + end +end) + +--------------------------------------------------------------------- +RegisterNetEvent("lvc_SetLxSirenState_c") +AddEventHandler("lvc_SetLxSirenState_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 ped_s ~= GetPlayerPed(-1) then + if IsPedInAnyVehicle(ped_s, false) then + local veh = GetVehiclePedIsUsing(ped_s) + SetLxSirenStateForVeh(veh, newstate) + end + end + end +end) + +--------------------------------------------------------------------- +RegisterNetEvent("lvc_TogPwrcallState_c") +AddEventHandler("lvc_TogPwrcallState_c", function(sender, toggle) + local player_s = GetPlayerFromServerId(sender) + local ped_s = GetPlayerPed(player_s) + if DoesEntityExist(ped_s) and not IsEntityDead(ped_s) then + if ped_s ~= GetPlayerPed(-1) then + if IsPedInAnyVehicle(ped_s, false) then + local veh = GetVehiclePedIsUsing(ped_s) + TogPowercallStateForVeh(veh, toggle) + end + end + end +end) + +--------------------------------------------------------------------- +RegisterNetEvent("lvc_SetAirManuState_c") +AddEventHandler("lvc_SetAirManuState_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 ped_s ~= GetPlayerPed(-1) then + if IsPedInAnyVehicle(ped_s, false) then + local veh = GetVehiclePedIsUsing(ped_s) + SetAirManuStateForVeh(veh, newstate) + end + end + end +end) + + + +--------------------------------------------------------------------- +Citizen.CreateThread(function() + while true do + + CleanupSounds() + + ----- IS IN VEHICLE ----- + local playerped = GetPlayerPed(-1) + if IsPedInAnyVehicle(playerped, false) then + + ----- IS DRIVER ----- + local veh = GetVehiclePedIsUsing(playerped) + if GetPedInVehicleSeat(veh, -1) == playerped then + + DisableControlAction(0, 84, true) -- INPUT_VEH_PREV_RADIO_TRACK + DisableControlAction(0, 83, true) -- INPUT_VEH_NEXT_RADIO_TRACK + + if state_indic[veh] ~= ind_state_o and state_indic[veh] ~= ind_state_l and state_indic[veh] ~= ind_state_r and state_indic[veh] ~= ind_state_h then + state_indic[veh] = ind_state_o + end + + -- INDIC AUTO CONTROL + if actv_ind_timer == true then + if state_indic[veh] == ind_state_l or state_indic[veh] == ind_state_r then + if GetEntitySpeed(veh) < 6 then + count_ind_timer = 0 + else + if count_ind_timer > delay_ind_timer then + count_ind_timer = 0 + actv_ind_timer = false + state_indic[veh] = ind_state_o + PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) + TogIndicStateForVeh(veh, state_indic[veh]) + count_bcast_timer = delay_bcast_timer + else + count_ind_timer = count_ind_timer + 1 + end + end + end + end + + + --- IS EMERG VEHICLE --- + if GetVehicleClass(veh) == 18 then + + local actv_manu = false + local actv_horn = false + + DisableControlAction(0, 86, true) -- INPUT_VEH_HORN + DisableControlAction(0, 20, true) -- INPUT_CELLPHONE_UP + --DisableControlAction(0, 173, true) -- INPUT_CELLPHONE_DOWN + --DisableControlAction(0, 174, true) -- INPUT_CELLPHONE_LEFT + --DisableControlAction(0, 175, true) -- INPUT_CELLPHONE_RIGHT + DisableControlAction(0, 140, true) -- INPUT_VEH_NEXT_RADIO + DisableControlAction(0, 157, true) -- INPUT_VEH_PREV_RADIO + DisableControlAction(0, 19, true) -- INPUT_CHARACTER_WHEEL + DisableControlAction(0, 85, true) -- INPUT_VEH_RADIO_WHEEL + DisableControlAction(0, 80, true) -- INPUT_VEH_CIN_CAM + + SetVehRadioStation(veh, "OFF") + SetVehicleRadioEnabled(veh, false) + + if state_lxsiren[veh] ~= 1 and state_lxsiren[veh] ~= 2 and state_lxsiren[veh] ~= 3 then + state_lxsiren[veh] = 0 + end + if state_pwrcall[veh] ~= true then + state_pwrcall[veh] = false + end + if state_airmanu[veh] ~= 1 and state_airmanu[veh] ~= 2 and state_airmanu[veh] ~= 3 then + state_airmanu[veh] = 0 + end + + if useFiretruckSiren(veh) and state_lxsiren[veh] == 1 then + TogMuteDfltSrnForVeh(veh, false) + dsrn_mute = false + else + TogMuteDfltSrnForVeh(veh, true) + dsrn_mute = true + end + + if not IsVehicleSirenOn(veh) and state_lxsiren[veh] > 0 then + PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) + SetLxSirenStateForVeh(veh, 0) + count_bcast_timer = delay_bcast_timer + end + if not IsVehicleSirenOn(veh) and state_pwrcall[veh] == true then + PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) + TogPowercallStateForVeh(veh, false) + count_bcast_timer = delay_bcast_timer + end + + ----- CONTROLS ----- + if not IsPauseMenuActive() then + + -- TOG DFLT SRN LIGHTS + if IsDisabledControlJustReleased(0, 85) or IsDisabledControlJustReleased(0, 52) then + if IsVehicleSirenOn(veh) then + PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) + SetVehicleSiren(veh, false) + else + PlaySoundFrontend(-1, "NAV_LEFT_RIGHT", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) + SetVehicleSiren(veh, true) + count_bcast_timer = delay_bcast_timer + end + + -- TOG LX SIREN + elseif IsDisabledControlJustReleased(0, 19) or IsDisabledControlJustReleased(0, 157) then + local cstate = state_lxsiren[veh] + if cstate == 0 then + if IsVehicleSirenOn(veh) then + PlaySoundFrontend(-1, "NAV_LEFT_RIGHT", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) -- on + SetLxSirenStateForVeh(veh, 1) + count_bcast_timer = delay_bcast_timer + end + else + PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) -- off + SetLxSirenStateForVeh(veh, 0) + count_bcast_timer = delay_bcast_timer + end + + -- POWERCALL + elseif IsDisabledControlJustReleased(0, 20) then + if state_pwrcall[veh] == true then + PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) + TogPowercallStateForVeh(veh, false) + count_bcast_timer = delay_bcast_timer + else + if IsVehicleSirenOn(veh) then + PlaySoundFrontend(-1, "NAV_LEFT_RIGHT", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) + TogPowercallStateForVeh(veh, true) + count_bcast_timer = delay_bcast_timer + end + end + + end + + -- BROWSE LX SRN TONES + if state_lxsiren[veh] > 0 then + if IsDisabledControlJustReleased(0, 80) or IsDisabledControlJustReleased(0, 140) then + if IsVehicleSirenOn(veh) then + local cstate = state_lxsiren[veh] + local nstate = 1 + PlaySoundFrontend(-1, "NAV_LEFT_RIGHT", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) -- on + if cstate == 1 then + nstate = 2 + elseif cstate == 2 then + nstate = 3 + else + nstate = 1 + end + SetLxSirenStateForVeh(veh, nstate) + count_bcast_timer = delay_bcast_timer + end + end + end + + -- MANU + if state_lxsiren[veh] < 1 then + if IsDisabledControlPressed(0, 80) or IsDisabledControlPressed(0, 140) then + actv_manu = true + else + actv_manu = false + end + else + actv_manu = false + end + + -- HORN + if IsDisabledControlPressed(0, 86) then + actv_horn = true + else + actv_horn = false + end + + end + + ---- ADJUST HORN / MANU STATE ---- + local hmanu_state_new = 0 + if actv_horn == true and actv_manu == false then + hmanu_state_new = 1 + elseif actv_horn == false and actv_manu == true then + hmanu_state_new = 2 + elseif actv_horn == true and actv_manu == true then + hmanu_state_new = 3 + end + if hmanu_state_new == 1 then + if not useFiretruckSiren(veh) then + if state_lxsiren[veh] > 0 and actv_lxsrnmute_temp == false then + srntone_temp = state_lxsiren[veh] + SetLxSirenStateForVeh(veh, 0) + actv_lxsrnmute_temp = true + end + end + else + if not useFiretruckSiren(veh) then + if actv_lxsrnmute_temp == true then + SetLxSirenStateForVeh(veh, srntone_temp) + actv_lxsrnmute_temp = false + end + end + end + if state_airmanu[veh] ~= hmanu_state_new then + SetAirManuStateForVeh(veh, hmanu_state_new) + count_bcast_timer = delay_bcast_timer + end + end + + + --- IS ANY LAND VEHICLE --- + if GetVehicleClass(veh) ~= 14 and GetVehicleClass(veh) ~= 15 and GetVehicleClass(veh) ~= 16 and GetVehicleClass(veh) ~= 21 then + + ----- CONTROLS ----- + if not IsPauseMenuActive() then + + -- IND L + if IsDisabledControlJustReleased(0, 84) then -- INPUT_VEH_PREV_RADIO_TRACK + local cstate = state_indic[veh] + if cstate == ind_state_l then + state_indic[veh] = ind_state_o + actv_ind_timer = false + PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) + else + state_indic[veh] = ind_state_l + actv_ind_timer = true + PlaySoundFrontend(-1, "NAV_LEFT_RIGHT", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) + end + TogIndicStateForVeh(veh, state_indic[veh]) + count_ind_timer = 0 + count_bcast_timer = delay_bcast_timer + -- IND R + elseif IsDisabledControlJustReleased(0, 83) then -- INPUT_VEH_NEXT_RADIO_TRACK + local cstate = state_indic[veh] + if cstate == ind_state_r then + state_indic[veh] = ind_state_o + actv_ind_timer = false + PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) + else + state_indic[veh] = ind_state_r + actv_ind_timer = true + PlaySoundFrontend(-1, "NAV_LEFT_RIGHT", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) + end + TogIndicStateForVeh(veh, state_indic[veh]) + count_ind_timer = 0 + count_bcast_timer = delay_bcast_timer + -- IND H + elseif IsControlJustReleased(0, 197) then -- INPUT_FRONTEND_CANCEL / Backspace + if GetLastInputMethod(0) then -- last input was with kb + local cstate = state_indic[veh] + if cstate == ind_state_h then + state_indic[veh] = ind_state_o + PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) + else + state_indic[veh] = ind_state_h + PlaySoundFrontend(-1, "NAV_LEFT_RIGHT", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1) + end + TogIndicStateForVeh(veh, state_indic[veh]) + actv_ind_timer = false + count_ind_timer = 0 + count_bcast_timer = delay_bcast_timer + end + end + + end + + + ----- AUTO BROADCAST VEH STATES ----- + if count_bcast_timer > delay_bcast_timer then + count_bcast_timer = 0 + --- IS EMERG VEHICLE --- + if GetVehicleClass(veh) == 18 then + TriggerServerEvent("lvc_TogDfltSrnMuted_s", dsrn_mute) + TriggerServerEvent("lvc_SetLxSirenState_s", state_lxsiren[veh]) + TriggerServerEvent("lvc_TogPwrcallState_s", state_pwrcall[veh]) + TriggerServerEvent("lvc_SetAirManuState_s", state_airmanu[veh]) + end + --- IS ANY OTHER VEHICLE --- + TriggerServerEvent("lvc_TogIndicState_s", state_indic[veh]) + else + count_bcast_timer = count_bcast_timer + 1 + end + + end + + end + end + + Citizen.Wait(0) + end +end)