99 *****************************************************************************/
1010
1111#include " StdInc.h"
12+ #include " ..\game_sa\gamesa_renderware.h"
13+
14+ #define FUNC_CVehicleModelInfo_ResetColors 0x4C8490
15+ static RwTexture** ms_aDirtTextures = (RwTexture**)0xC02BD0 ;
1216
1317static bool __fastcall AreVehicleDoorsUndamageable (CVehicleSAInterface* vehicle)
1418{
@@ -107,6 +111,106 @@ static void _declspec(naked) HOOK_CAEVehicleAudioEntity__Initialise()
107111 }
108112}
109113
114+ static void CVehicleModelInfo_Shutdown ()
115+ {
116+ CVehicleModelInfoSAInterface* mi = nullptr ;
117+ _asm
118+ {
119+ mov mi, ecx
120+ }
121+
122+ if (!mi)
123+ return ;
124+
125+ // Call CBaseModelInfo::Shutdown
126+ ((void (__cdecl*)(void *))0x4C4D50 )(mi);
127+
128+ delete[] mi->m_dirtMaterials ;
129+ mi->m_dirtMaterials = nullptr ;
130+ }
131+
132+ static void SetDirtTextures (CVehicleModelInfoSAInterface* mi, std::uint32_t level)
133+ {
134+ RpMaterial** materials = mi->m_numDirtMaterials > 30 ? mi->m_dirtMaterials : mi->m_staticDirtMaterials ;
135+ for (std::uint32_t i = 0 ; i < mi->m_numDirtMaterials ; i++)
136+ RpMaterialSetTexture (materials[i], ms_aDirtTextures[level]);
137+ }
138+
139+ #define HOOKPOS_CVehicleModelInfo_SetDirtTextures 0x5D5DBB
140+ #define HOOKSIZE_CVehicleModelInfo_SetDirtTextures 6
141+ static constexpr DWORD CONTINUE_CVehicleModelInfo_SetDirtTextures = 0x5D5DE3 ;
142+ static void _declspec (naked) HOOK_CVehicleModelInfo_SetDirtTextures()
143+ {
144+ _asm
145+ {
146+ pushad
147+ push ebx
148+ push esi
149+ call SetDirtTextures
150+ add esp, 8
151+ popad
152+
153+ jmp CONTINUE_CVehicleModelInfo_SetDirtTextures
154+ }
155+ }
156+
157+ static RpMaterial* GetAtomicGeometryMaterialsCB (RpMaterial* material, void * data)
158+ {
159+ RwTexture* texture = material->texture ;
160+ if (!texture)
161+ return nullptr ;
162+
163+ auto cbData = static_cast <std::vector<RpMaterial*>*>(data);
164+ if (texture->name && std::strcmp (texture->name , " vehiclegrunge256" ) == 0 )
165+ cbData->push_back (material);
166+
167+ return material;
168+ }
169+
170+ static bool GetEditableMaterialListCB (RpAtomic* atomic, void * data)
171+ {
172+ RpGeometryForAllMaterials (atomic->geometry , &GetAtomicGeometryMaterialsCB, data);
173+ return true ;
174+ }
175+
176+ static void __fastcall FindEditableMaterialList (CVehicleModelInfoSAInterface* mi)
177+ {
178+ std::vector<RpMaterial*> list;
179+ RpClumpForAllAtomics (reinterpret_cast <RpClump*>(mi->pRwObject ), &GetEditableMaterialListCB, &list);
180+
181+ for (std::uint32_t i = 0 ; i < mi->pVisualInfo ->m_numExtras ; i++)
182+ GetEditableMaterialListCB (mi->pVisualInfo ->m_pExtra [i], &list);
183+
184+ mi->m_numDirtMaterials = list.size ();
185+ if (mi->m_numDirtMaterials > 30 )
186+ {
187+ mi->m_dirtMaterials = new RpMaterial*[mi->m_numDirtMaterials ];
188+ std::copy (list.begin (), list.end (), mi->m_dirtMaterials );
189+ }
190+ else
191+ {
192+ mi->m_dirtMaterials = nullptr ;
193+ std::copy (list.begin (), list.end (), mi->m_staticDirtMaterials );
194+ }
195+
196+ ((void (__thiscall*)(CVehicleModelInfoSAInterface*))FUNC_CVehicleModelInfo_ResetColors)(mi);
197+ }
198+
199+ #define HOOKPOS_CVehicleModelInfo_SetClump 0x4C9648
200+ #define HOOKSIZE_CVehicleModelInfo_SetClump 24
201+ static constexpr DWORD CONTINUE_CVehicleModelInfo_SetClump = 0x4C9660 ;
202+ static void _declspec (naked) HOOK_CVehicleModelInfo_SetClump()
203+ {
204+ _asm
205+ {
206+ pushad
207+ call FindEditableMaterialList
208+ popad
209+
210+ jmp CONTINUE_CVehicleModelInfo_SetClump
211+ }
212+ }
213+
110214// ////////////////////////////////////////////////////////////////////////////////////////
111215//
112216// CMultiplayerSA::InitHooks_Vehicles
@@ -118,4 +222,9 @@ void CMultiplayerSA::InitHooks_Vehicles()
118222{
119223 EZHookInstall (CDamageManager__ProgressDoorDamage);
120224 EZHookInstall (CAEVehicleAudioEntity__Initialise);
225+
226+ // Fix vehicle dirt level
227+ EZHookInstall (CVehicleModelInfo_SetClump);
228+ EZHookInstall (CVehicleModelInfo_SetDirtTextures);
229+ MemCpy ((void *)0x85C5E4 , &CVehicleModelInfo_Shutdown, 4 );
121230}
0 commit comments