diff --git a/src/features/lights/components/headlight.cpp b/src/features/lights/components/headlight.cpp index 5a97edb1..d8b48e00 100644 --- a/src/features/lights/components/headlight.cpp +++ b/src/features/lights/components/headlight.cpp @@ -89,7 +89,14 @@ bool HeadlightComponent::TryRegisterDummy(CVehicle* pVeh, RwFrame* pFrame, const void HeadlightComponent::Process(CVehicle* pVeh, VehLightData& data) { if (!CanVehicleHaveHeadlights(pVeh)) return; - bool isHeadlightsActive = (pVeh->bLightsOn || CarUtil::IsLightsForcedOn(pVeh) || (Util::IsNightTime() && !Util::IsEngineOff(pVeh))) && !CarUtil::IsLightsForcedOff(pVeh); + bool isAlarmActive = pVeh->m_nAlarmState != 0 && pVeh->m_nAlarmState != 0xFFFF; + bool isAlarmLightOn = isAlarmActive && ((pVeh->m_nAlarmState & 0x100) != 0); + + bool isHeadlightsActive = ((pVeh->bLightsOn || CarUtil::IsLightsForcedOn(pVeh) || (Util::IsNightTime() && !Util::IsEngineOff(pVeh))) || isAlarmLightOn) && !CarUtil::IsLightsForcedOff(pVeh); + if (isAlarmActive && !isAlarmLightOn) { + isHeadlightsActive = false; + } + if (pVeh->IsDriver(FindPlayerPed())) { if (!isHeadlightsActive && data.fLightFactor[eMaterialType::HeadLightLeft] <= 0.001f) { data.bLongLightsOn = false; @@ -101,7 +108,7 @@ void HeadlightComponent::Process(CVehicle* pVeh, VehLightData& data) { AudioMgr::PlaySwitchSound(pVeh); } } else if (pVeh->m_fHealth > 0.0f) { - if (CarUtil::IsLightsForcedOff(pVeh) || (Util::IsEngineOff(pVeh) && !CarUtil::IsLightsForcedOn(pVeh) && !pVeh->bLightsOn)) { + if (CarUtil::IsLightsForcedOff(pVeh) || (Util::IsEngineOff(pVeh) && !CarUtil::IsLightsForcedOn(pVeh) && !pVeh->bLightsOn && !isAlarmActive)) { return; } @@ -128,7 +135,15 @@ void HeadlightComponent::Render(CVehicle* pControlVeh, CVehicle* pTowedVeh, VehL return; } - bool isNightOrOn = (pControlVeh->bLightsOn || CarUtil::IsLightsForcedOn(pControlVeh) || (Util::IsNightTime() && !Util::IsEngineOff(pControlVeh))) && !CarUtil::IsLightsForcedOff(pControlVeh); + bool isAlarmActive = pControlVeh->m_nAlarmState != 0 && pControlVeh->m_nAlarmState != 0xFFFF; + bool isAlarmLightOn = isAlarmActive && ((pControlVeh->m_nAlarmState & 0x100) != 0); + + bool isNightOrOn = ((pControlVeh->bLightsOn || CarUtil::IsLightsForcedOn(pControlVeh) || (Util::IsNightTime() && !Util::IsEngineOff(pControlVeh))) || isAlarmLightOn) && !CarUtil::IsLightsForcedOff(pControlVeh); + if (isAlarmActive && !isAlarmLightOn) { + isNightOrOn = false; + pControlVeh->m_renderLights.m_bLeftFront = false; + pControlVeh->m_renderLights.m_bRightFront = false; + } if (!isNightOrOn || !AreHeadlightsOpen(pControlVeh, data)) return; auto damage = LightDamageState::Get(pControlVeh, pTowedVeh); diff --git a/src/features/lights/manager.cpp b/src/features/lights/manager.cpp index 4db109a3..a59b5563 100644 --- a/src/features/lights/manager.cpp +++ b/src/features/lights/manager.cpp @@ -108,9 +108,11 @@ void LightManager::Render(CVehicle* pControlVeh, CVehicle* pTowedVeh) { m_VehData.Get(pTowedVeh).bLightRenderedThisFrame.fill(false); } + bool isAlarmActive = pControlVeh->m_nAlarmState != 0 && pControlVeh->m_nAlarmState != 0xFFFF; + // Fix for UIF SAMP server https://github.com/user-grinch/ModelExtras/issues/112 - // Don't clear light state when lights are forced on/already on via SAMP - if (((Util::IsEngineOff(pControlVeh) && indState == eIndicatorState::Off) && !CarUtil::IsLightsForcedOn(pControlVeh) && !pControlVeh->bLightsOn) || CarUtil::IsLightsForcedOff(pControlVeh)) { + // Don't clear light state when lights are forced on/already on via SAMP or alarm is active + if (((Util::IsEngineOff(pControlVeh) && indState == eIndicatorState::Off && !isAlarmActive) && !CarUtil::IsLightsForcedOn(pControlVeh) && !pControlVeh->bLightsOn) || CarUtil::IsLightsForcedOff(pControlVeh)) { pControlVeh->bLightsOn = false; pControlVeh->m_renderLights.m_bLeftFront = false; pControlVeh->m_renderLights.m_bRightFront = false; @@ -119,8 +121,8 @@ void LightManager::Render(CVehicle* pControlVeh, CVehicle* pTowedVeh) { } // Fix for park car alarm lights - // Allow through if lights or indicators are explicitly on - if (pControlVeh->m_fHealth <= 0.0f || ((Util::IsEngineOff(pControlVeh) && indState == eIndicatorState::Off) && !CarUtil::IsLightsForcedOn(pControlVeh) && !pControlVeh->bLightsOn)) { + // Allow through if lights, indicators, or alarm are explicitly on + if (pControlVeh->m_fHealth <= 0.0f || ((Util::IsEngineOff(pControlVeh) && indState == eIndicatorState::Off && !isAlarmActive) && !CarUtil::IsLightsForcedOn(pControlVeh) && !pControlVeh->bLightsOn)) { return; }