#define SAMP_HOOKENTER_HANDLE_RPC 0x3743D
#define SAMP_HOOKENTER_HANDLE_RPC2 0x373C9
#define SAMP_HOOKEXIT_HANDLE_RPC 0x37443
#define SAMP_HOOKEXIT_HANDLE_RPC2 0x37451
void HandleRPCPacketFunc(unsigned char id, RPCParameters *rpcParams, void(*callback) (RPCParameters *))
{
if (rpcParams != nullptr && rpcParams->numberOfBitsOfData >= 8)
{
BitStream bsData(rpcParams->input, rpcParams->numberOfBitsOfData / 8, false);
switch (id)
{
case RPC_DeathMessage:
{
pSAMP->addMessageToChat(-1, "plugin ONE");
int16_t plaerid, killerid;
int8_t resaon;
bsData.ResetReadPointer();
bsData.Read(killerid);
bsData.Read(plaerid);
bsData.Read(resaon);
break;
}
}
}
callback(rpcParams);
}
void _declspec (naked) hook_handle_rpc_packet(void)
{
static RPCParameters *pRPCParams = nullptr;
static RPCNode *pRPCNode = nullptr;
static DWORD dwTmp = 0;
__asm pushad;
__asm mov pRPCParams, eax;
__asm mov pRPCNode, edi;
HandleRPCPacketFunc(pRPCNode->uniqueIdentifier, pRPCParams, pRPCNode->staticFunctionPointer);
dwTmp = pSAMP->getSAMPAddr() + SAMP_HOOKEXIT_HANDLE_RPC;
__asm popad;
__asm add esp, 4
__asm jmp dwTmp;
}
void _declspec (naked) hook_handle_rpc_packet2(void)
{
static RPCParameters *pRPCParams = nullptr;
static RPCNode *pRPCNode = nullptr;
static DWORD dwTmp = 0;
__asm pushad;
__asm mov pRPCParams, ecx;
__asm mov pRPCNode, edi;
HandleRPCPacketFunc(pRPCNode->uniqueIdentifier, pRPCParams, pRPCNode->staticFunctionPointer);
dwTmp = pSAMP->getSAMPAddr() + SAMP_HOOKEXIT_HANDLE_RPC2;
__asm popad;
__asm jmp dwTmp;
}
void InstallAllHooks()
{
static int iSAMPHooksInstalled;
if (!iSAMPHooksInstalled)
{
if (pSAMP->getInfo() == NULL)
return;
/*
https://github.com/sr-tream/UniLib/blob/master/UniLib/CHooks.hpp
*/
HookRPC1 = new CHookJmp(pSAMP->getSAMPAddr() + SAMP_HOOKENTER_HANDLE_RPC, hook_handle_rpc_packet, 6); //
HookRPC2 = new CHookJmp(pSAMP->getSAMPAddr() + SAMP_HOOKENTER_HANDLE_RPC2, hook_handle_rpc_packet2, 8);
iSAMPHooksInstalled = 1;
}
}