Skip to content

Commit d0ba08a

Browse files
committed
moar calbeks
1 parent 27027d2 commit d0ba08a

3 files changed

Lines changed: 84 additions & 0 deletions

File tree

isautils.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ typedef void (*OnButtonPressedFn) (uintptr_t screen); // "screen" is just
1010
typedef void (*OnPlayerProcessFn) (uintptr_t info); // "info" is a pointer of CPlayerInfo
1111
typedef void* (*LookingForTextureFn)(const char* name);
1212
typedef void (*SimpleFn)();
13+
typedef void (*SimpleDataFn)(void* data);
1314

1415
#define MAX_IMG_ARCHIVES 32 // Def. is 6
1516

@@ -92,6 +93,18 @@ enum eWidgetState : unsigned char
9293
WIDGETSTATE_MAX
9394
};
9495

96+
enum eRenderOfType : unsigned char
97+
{
98+
ROfType_Effects = 0,
99+
ROfType_Menu,
100+
ROfType_Hud,
101+
ROfType_Ped,
102+
ROfType_Vehicle,
103+
ROfType_Object,
104+
105+
RENDEROFTYPE_MAX
106+
};
107+
95108
class ISAUtils
96109
{
97110
public:
@@ -426,6 +439,13 @@ class ISAUtils
426439
* \return A possibly returned value
427440
*/
428441
virtual int ScriptCommand(const SCRIPT_COMMAND *pScriptCommand, ...) = 0;
442+
443+
/** Add a listener to "Render" function of something
444+
*
445+
* \param typeOf What are listening to? See eRenderOfType
446+
* \param fn Function that will be called
447+
*/
448+
virtual void AddOnRenderListener(eRenderOfType typeOf, SimpleDataFn fn) = 0;
429449
};
430450

431451
#endif // _SAUTILS_INTERFACE

sautils.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ std::vector<OnPlayerProcessFn> gPlayerUpdateFns;
2424
std::vector<OnPlayerProcessFn> gPlayerUpdatePostFns;
2525
std::vector<SimpleFn> gInitRWFns;
2626
std::vector<LookingForTextureFn> gTextureLookupFns;
27+
std::vector<SimpleDataFn> gRenderOfTypeFns[RENDEROFTYPE_MAX];
2728

2829
/* Saves */
2930
std::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+
483535
void 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+
10481111
static SAUtils sautilsLocal;
10491112
ISAUtils* sautils = &sautilsLocal;

sautils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ class SAUtils : public ISAUtils
116116
int AddClickableItem(eTypeOfSettings typeOf, const char* name, int initVal = 0, int minVal = 0, int maxVal = 0, const char** switchesArray = NULL, OnSettingChangedFn fnOnValueChange = NULL, void* data = NULL); // +data
117117
int AddSliderItem(eTypeOfSettings typeOf, const char* name, int initVal = 0, int minVal = 0, int maxVal = 0, OnSettingChangedFn fnOnValueChange = NULL, OnSettingDrawedFn fnOnValueDraw = NULL, void* data = NULL); // +data
118118
int ScriptCommand(const SCRIPT_COMMAND *pScriptCommand, ...);
119+
void AddOnRenderListener(eRenderOfType typeOf, SimpleDataFn fn);
119120

120121
public:
121122
eLoadedGame m_eLoadedGame;

0 commit comments

Comments
 (0)