diff --git a/saco/game/hooks.cpp b/saco/game/hooks.cpp index f47ffce..23dfccb 100644 --- a/saco/game/hooks.cpp +++ b/saco/game/hooks.cpp @@ -827,9 +827,65 @@ NUDE CVehicle__Render_Hook() //----------------------------------------------------------- +// todo: implement `CObject` (samp object, holds the material/text data) +class CObject +{ +public: + void FUNC_100A9E30(); + void FUNC_100A9E70(); +}; + +extern CObjectPool *GLOBAL_1014FFAC; // todo: define, lives in another file + +DWORD dwRenderObjectRet = 0; +ENTITY_TYPE *_pRenderEntity; +CObject *_pRenderNetObject; +CPlayerPool *_pRenderPlayerPool; + NUDE CObject__Render_Hook() { - // TODO: CObject__Render_Hook + _asm mov eax, [esp] + _asm mov dwRenderObjectRet, eax + _asm mov _pRenderEntity, ecx + + _asm pushad + + if (_pRenderEntity) wLastRendObj = _pRenderEntity->nModelIndex; + + _pRenderNetObject = NULL; + + if (pNetGame && _pRenderEntity && (_pRenderEntity->dwProcessingFlags & 0x80000000)) + { + if ((_pRenderNetObject = pNetGame->GetObjectPool()->FUNC_100129D0(_pRenderEntity)) != NULL || + ((_pRenderPlayerPool = pNetGame->GetPlayerPool()) != NULL && + (_pRenderNetObject = _pRenderPlayerPool->FUNC_10013B70(_pRenderEntity)) != NULL)) + { + _pRenderNetObject->FUNC_100A9E30(); + } + } + + if (GLOBAL_1014FFAC && _pRenderEntity && (_pRenderEntity->dwProcessingFlags & 0x80000000)) + { + _pRenderNetObject = GLOBAL_1014FFAC->FUNC_100129D0(_pRenderEntity); + if (_pRenderNetObject) _pRenderNetObject->FUNC_100A9E30(); + } + + _asm + { + popad + + // call original CObject::Render + mov eax, 0x59F180 + call eax + + pushad + } + + if (pNetGame && _pRenderNetObject) _pRenderNetObject->FUNC_100A9E70(); + if (GLOBAL_1014FFAC && _pRenderNetObject) _pRenderNetObject->FUNC_100A9E70(); + + _asm popad + _asm retn } //----------------------------------------------------------- diff --git a/saco/net/objectpool.h b/saco/net/objectpool.h index 2a1b1e7..d5bde9c 100644 --- a/saco/net/objectpool.h +++ b/saco/net/objectpool.h @@ -13,4 +13,5 @@ public: void FUNC_10012B90(); // .text:10012B90 void FUNC_10012BD0(); // .text:10012BD0 + class CObject *FUNC_100129D0(ENTITY_TYPE *pEntity); // todo: implement }; diff --git a/saco/net/playerpool.h b/saco/net/playerpool.h index 3dd3f8d..45f9605 100644 --- a/saco/net/playerpool.h +++ b/saco/net/playerpool.h @@ -46,6 +46,8 @@ public: PLAYERID GetLocalPlayerID() { return m_LocalPlayerID; }; + class CObject *FUNC_10013B70(ENTITY_TYPE *pEntity); // todo: implement + CPlayerPool(); };