From 339410f9f82a72875a731cb1c90afeb3f8a2ddbe Mon Sep 17 00:00:00 2001 From: Youssef Maged Date: Fri, 11 Sep 2026 03:42:04 +0300 Subject: [PATCH] Fix spinning vehicle tuning models --- Client/game_sa/CBuildingsPoolSA.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Client/game_sa/CBuildingsPoolSA.cpp b/Client/game_sa/CBuildingsPoolSA.cpp index 352126dae57..d621af19e2e 100644 --- a/Client/game_sa/CBuildingsPoolSA.cpp +++ b/Client/game_sa/CBuildingsPoolSA.cpp @@ -85,6 +85,15 @@ CBuilding* CBuildingsPoolSA::AddBuilding(CClientBuilding* pClientBuilding, uint1 if (prevGroup != MODEL_PROPERTIES_GROUP_STATIC) modelInfo->SetObjectPropertiesGroup(MODEL_PROPERTIES_GROUP_STATIC); + // Fix vehicle tuning models (e.g. exh_*) spinning endlessly. Their model info flags get misread as special types (like CRANE) in LoadObjectInstance, + // causing PreRender to rewrite their matrix each frame. + auto* pModelInterface = modelInfo->GetInterface(); + const bool bVehicleTuningPart = pModelInterface && modelInfo->GetModelType() == eModelInfoType::ATOMIC && pModelInterface->bWetRoadReflection; + const auto prevSpecialType = bVehicleTuningPart ? pModelInterface->eSpecialModelType : eModelSpecialType::NONE; + + if (prevSpecialType != eModelSpecialType::NONE) + pModelInterface->eSpecialModelType = eModelSpecialType::NONE; + // Load building SFileObjectInstance instance{}; instance.modelID = modelId; @@ -99,9 +108,11 @@ CBuilding* CBuildingsPoolSA::AddBuilding(CClientBuilding* pClientBuilding, uint1 pBuilding->m_pLod = nullptr; pBuilding->m_iplIndex = 0; - // Restore changed properties group + // Restore changed properties group and special model type if (prevGroup != MODEL_PROPERTIES_GROUP_STATIC) modelInfo->SetObjectPropertiesGroup(prevGroup); + if (prevSpecialType != eModelSpecialType::NONE) + pModelInterface->eSpecialModelType = prevSpecialType; // Always stream model collosion // TODO We can setup collison bounding box and use GTA streamer for it