@@ -24,6 +24,7 @@ std::vector<OnPlayerProcessFn> gPlayerUpdateFns;
2424std::vector<OnPlayerProcessFn> gPlayerUpdatePostFns ;
2525std::vector<SimpleFn> gInitRWFns ;
2626std::vector<LookingForTextureFn> gTextureLookupFns ;
27+ std::vector<SimpleDataFn> gRenderOfTypeFns [RENDEROFTYPE_MAX];
2728
2829/* Saves */
2930std::vector<AdditionalSetting*> gMoreSettings ;
@@ -480,6 +481,57 @@ DECL_HOOK(void*, GetTextureFromDB_HOOKED, const char* texName)
480481 return tex;
481482}
482483
484+ DECL_HOOKv (RenderEffects)
485+ {
486+ RenderEffects ();
487+ int size = gRenderOfTypeFns [ROfType_Effects].size ();
488+ for (int i = 0 ; i < size; ++i)
489+ {
490+ gRenderOfTypeFns [ROfType_Effects][i](NULL );
491+ }
492+ }
493+ DECL_HOOKv (RenderMenu, void * self)
494+ {
495+ RenderMenu (self);
496+ int size = gRenderOfTypeFns [ROfType_Menu].size ();
497+ for (int i = 0 ; i < size; ++i)
498+ {
499+ gRenderOfTypeFns [ROfType_Menu][i](self);
500+ }
501+ }
502+ DECL_HOOKv (RenderPed, void * self)
503+ {
504+ RenderPed (self);
505+ int size = gRenderOfTypeFns [ROfType_Ped].size ();
506+ for (int i = 0 ; i < size; ++i)
507+ {
508+ gRenderOfTypeFns [ROfType_Ped][i](self);
509+ }
510+ }
511+ DECL_HOOKv (RenderVehicle, void * self)
512+ {
513+ RenderVehicle (self);
514+ int size = gRenderOfTypeFns [ROfType_Vehicle].size ();
515+ for (int i = 0 ; i < size; ++i)
516+ {
517+ gRenderOfTypeFns [ROfType_Vehicle][i](self);
518+ }
519+ }
520+ DECL_HOOKv (RenderObject, void * self)
521+ {
522+ RenderObject (self);
523+ int size = gRenderOfTypeFns [ROfType_Object].size ();
524+ for (int i = 0 ; i < size; ++i)
525+ {
526+ gRenderOfTypeFns [ROfType_Object][i](self);
527+ }
528+ }
529+
530+
531+
532+
533+ /* !!! OUR SAUTILS INTERFACE IS BELOW !!! */
534+
483535void SAUtils::InitializeSAUtils ()
484536{
485537 // Freak ya FLA and your sh*t
@@ -527,6 +579,11 @@ void SAUtils::InitializeSAUtils()
527579 HOOKPLT (InitialiseRenderWare, pGameLib + 0x66F2D0 );
528580 HOOKPLT (InitialiseGame_SecondPass, pGameLib + 0x672178 );
529581 HOOKPLT (PlayerProcess, pGameLib + 0x673E84 );
582+ HOOK (RenderEffects, aml->GetSym (pGameHandle, " _Z13RenderEffectsv" ));
583+ HOOK (RenderMenu, aml->GetSym (pGameHandle, " _ZN10MobileMenu6RenderEv" ));
584+ HOOK (RenderPed, aml->GetSym (pGameHandle, " _ZN4CPed6RenderEv" ));
585+ HOOK (RenderVehicle, aml->GetSym (pGameHandle, " _ZN8CVehicle6RenderEv" ));
586+ HOOK (RenderObject, aml->GetSym (pGameHandle, " _ZN7CObject6RenderEv" ));
530587
531588 // Hooked settings functions
532589 aml->Redirect (pGameLib + 0x29E6AA + 0x1 , (uintptr_t )NewScreen_Controls_stub); NewScreen_Controls_backto = pGameLib + 0x29E6D2 + 0x1 ;
@@ -1045,5 +1102,11 @@ int SAUtils::ScriptCommand(const SCRIPT_COMMAND *pScriptCommand, ...)
10451102 return ret;
10461103}
10471104
1105+ void SAUtils::AddOnRenderListener (eRenderOfType typeOf, SimpleDataFn fn)
1106+ {
1107+ if (typeOf >= RENDEROFTYPE_MAX) return ;
1108+ gRenderOfTypeFns [typeOf].push_back (fn);
1109+ }
1110+
10481111static SAUtils sautilsLocal;
10491112ISAUtils* sautils = &sautilsLocal;
0 commit comments