From 22ec6d8f96a7f1588563e3b467a45778b488e58a Mon Sep 17 00:00:00 2001 From: Caner Karaca Date: Thu, 8 Oct 2026 05:25:40 +0300 Subject: [PATCH] fix(lights): sync taillight and pointlight flashing with vehicle alarm state --- src/features/lights/components/headlight.cpp | 8 +++++++- src/features/lights/components/stt_light.cpp | 10 +++++++++- src/features/lights/components/tail_light.cpp | 19 +++++++++++++++++-- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/features/lights/components/headlight.cpp b/src/features/lights/components/headlight.cpp index 38057e47..c229b160 100644 --- a/src/features/lights/components/headlight.cpp +++ b/src/features/lights/components/headlight.cpp @@ -171,7 +171,13 @@ void HeadlightComponent::Render(CVehicle* pControlVeh, CVehicle* pTowedVeh, VehL void HeadlightComponent::ProcessPointLights(CVehicle* pVeh, VehLightData& data) { if (!CanVehicleHaveHeadlights(pVeh)) return; - bool isHeadlightsOn = (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 isHeadlightsOn = (CarUtil::AreLightsOn(pVeh) || isAlarmLightOn); + if (isAlarmActive && !isAlarmLightOn) { + isHeadlightsOn = false; + } if (isHeadlightsOn && AreHeadlightsOpen(pVeh, data)) { float rangeMul = data.bLongLightsOn ? LightsConfig::Get().fHighBeamPointLightMul : 1.0f; diff --git a/src/features/lights/components/stt_light.cpp b/src/features/lights/components/stt_light.cpp index 75286530..9f6b8c8c 100644 --- a/src/features/lights/components/stt_light.cpp +++ b/src/features/lights/components/stt_light.cpp @@ -47,7 +47,15 @@ void STTLightComponent::Render(CVehicle* pControlVeh, CVehicle* pTowedVeh, VehLi bool brakeOn = LightManager::IsBraking(pControlVeh); bool indicatorOn = data.bUsingGlobalIndicators && data.nIndicatorState != eIndicatorState::Off; - bool tailOn = (Util::IsNightTime() || pControlVeh->bLightsOn || CarUtil::IsLightsForcedOn(pControlVeh) || indicatorOn) && !CarUtil::IsLightsForcedOff(pControlVeh); + bool isAlarmActive = pControlVeh->m_nAlarmState != 0 && pControlVeh->m_nAlarmState != 0xFFFF; + bool isAlarmLightOn = isAlarmActive && ((pControlVeh->m_nAlarmState & 0x100) != 0); + + bool tailLightFlag = (CarUtil::AreLightsOn(pControlVeh) || isAlarmLightOn); + if (isAlarmActive && !isAlarmLightOn) { + tailLightFlag = false; + } + + bool tailOn = tailLightFlag || indicatorOn; if (brakeOn || tailOn) { if (isLeftRearOk) { diff --git a/src/features/lights/components/tail_light.cpp b/src/features/lights/components/tail_light.cpp index d9baf302..85967dd0 100644 --- a/src/features/lights/components/tail_light.cpp +++ b/src/features/lights/components/tail_light.cpp @@ -55,7 +55,16 @@ void TailLightComponent::Render(CVehicle* pControlVeh, CVehicle* pTowedVeh, VehL bool isRightRearOk = damage.isRearRightOk; bool indicatorOn = data.bUsingGlobalIndicators && data.nIndicatorState != eIndicatorState::Off; - bool tailLightFlag = (Util::IsNightTime() || pControlVeh->bLightsOn || CarUtil::IsLightsForcedOn(pControlVeh)) && !CarUtil::IsLightsForcedOff(pControlVeh); + bool isAlarmActive = pControlVeh->m_nAlarmState != 0 && pControlVeh->m_nAlarmState != 0xFFFF; + bool isAlarmLightOn = isAlarmActive && ((pControlVeh->m_nAlarmState & 0x100) != 0); + + bool tailLightFlag = (CarUtil::AreLightsOn(pControlVeh) || isAlarmLightOn); + if (isAlarmActive && !isAlarmLightOn) { + tailLightFlag = false; + } + + pControlVeh->m_renderLights.m_bLeftRear = isLeftRearOk && tailLightFlag; + pControlVeh->m_renderLights.m_bRightRear = isRightRearOk && tailLightFlag; bool sttInstalled = LightManager::IsMaterialAvailable(pTowedVeh, {eMaterialType::STTLightLeft, eMaterialType::STTLightRight}); if ((tailLightFlag || indicatorOn) && !sttInstalled) { @@ -102,7 +111,13 @@ void TailLightComponent::Render(CVehicle* pControlVeh, CVehicle* pTowedVeh, VehL } void TailLightComponent::ProcessPointLights(CVehicle* pVeh, VehLightData& data) { - bool isHeadlightsOn = (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 isHeadlightsOn = (CarUtil::AreLightsOn(pVeh) || isAlarmLightOn); + if (isAlarmActive && !isAlarmLightOn) { + isHeadlightsOn = false; + } bool isBraking = LightManager::IsBraking(pVeh); bool isBike = CModelInfo::IsBikeModel(pVeh->m_nModelIndex); bool hasDedicatedBrakeDummy = LightManager::IsDummyAvailable(data, {eMaterialType::BrakeLightLeft, eMaterialType::BrakeLightRight, eMaterialType::STTLightLeft, eMaterialType::STTLightRight, eMaterialType::NABrakeLightLeft, eMaterialType::NABrakeLightRight});