I did it this way:
Code:
typedef int (*GetVersusCompletionFunc)(void *pGameRules, CBaseEntity* pPlayer);
GetVersusCompletionFunc g_pGetVersusCompletion = NULL;
int VersusCompletion::GetVersusCompletion(int client)
{
void *pGameRules;
if (!g_pSDKTools || !(pGameRules = g_pSDKTools->GetGameRules()))
{
g_pSM->LogError(myself, "Failed to find GameRules");
return 0;
}
if(!g_pGetVersusCompletion)
{
if( !g_pGameConf->GetMemSig("CTerrorGameRules_GetVersusCompletion", (void**)&g_pGetVersusCompletion) || !g_pGetVersusCompletion )
{
g_pSM->LogError(myself, "Can't resolve CTerrorGameRules_GetVersusCompletion signature");
return 0;
}
}
CBaseEntity *pPlayer = gamehelpers->ReferenceToEntity(client);
if(!pPlayer) return 0;
return g_pGetVersusCompletion(pGameRules, pPlayer);
}
==>> Crash
Tried to even use BinTools:
Code:
int VersusCompletion::GetVersusCompletion(int client)
{
void *pGameRules;
if (!g_pSDKTools || !(pGameRules = g_pSDKTools->GetGameRules()))
{
g_pSM->LogError(myself, "Failed to find GameRules");
return 0;
}
CBaseEntity *pPlayer = gamehelpers->ReferenceToEntity(client);
if(!pPlayer) return 0;
static ICallWrapper *pWrapper = NULL;
if (!pWrapper)
{
void *addr;
if( !g_pGameConf->GetMemSig("CTerrorGameRules_GetVersusCompletion", (void**)&addr) || !addr )
{
g_pSM->LogError(myself, "Can't resolve CTerrorGameRules_GetVersusCompletion signature");
return 0;
}
PassInfo ret;
ret.flags = PASSFLAG_BYVAL;
ret.size = sizeof(int);
ret.type = PassType_Basic;
PassInfo pass[1];
pass[0].flags = PASSFLAG_BYVAL;
pass[0].size = sizeof(CBaseEntity *);
pass[0].type = PassType_Basic;
pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, &ret, pass, 1);
}
unsigned char vstk[sizeof(void *) + sizeof(CBaseEntity *)];
unsigned char *vptr = vstk;
*(void **)vptr = pGameRules;
vptr += sizeof(void *);
*(CBaseEntity **)vptr = pPlayer;
cell_t retbuffer;
pWrapper->Execute(vstk, &retbuffer);
return retbuffer;
}
==>> Already crash...