OvidiuS icon

MakeEntityHook

OvidiuS | PRO | 02/02/13 02:12:26 AM UTC | 0 ⭐ | 275 👁️ | Never ⏰ | []
C++ |

1.71 KB

|

None

|

0 👍

/

0 👎

    void RegisterWeapon( edict_t *pEdict, char * strWeapon )
    {
            pEdict = CREATE_ENTITY();
     
            CALL_GAME_ENTITY(PLID, strWeapon, &pEdict->v);
           
            if (pEdict->pvPrivateData == NULL)
            {
                    REMOVE_ENTITY(pEdict);
                   
                    return;
            }
     
    #ifdef _WIN32
            void **vtable = *((void***)((char*)pEdict->pvPrivateData));
    #elif __linux__
            void **vtable = *((void***)(((char*)pEdict->pvPrivateData) + 0x94));
    #endif
     
            REMOVE_ENTITY(pEdict);
           
            if(vtable == NULL)
                    return;
           
            int **ivtable = (int **)vtable;
           
            pOrigFuncDeploy = (void *)ivtable[VirtFuncDeploy];
            pOrigFuncAmmoIndex = (void *)ivtable[VirtFuncAmmoIndex];
           
    #ifdef _WIN32
            DWORD OldFlags;
     
            VirtualProtect(&ivtable[VirtFuncDeploy], sizeof(int *), PAGE_READWRITE, &OldFlags);
            VirtualProtect(&ivtable[VirtFuncAmmoIndex], sizeof(int *), PAGE_READWRITE, &OldFlags);
    #elif __linux__
            mprotect(&ivtable[VirtFuncDeploy], sizeof(int*), PROT_READ | PROT_WRITE);
            mprotect(&ivtable[VirtFuncAmmoIndex], sizeof(int*), PROT_READ | PROT_WRITE);
    #endif
     
     
            ivtable[VirtFuncDeploy] = (int *)HookDeploy;
            ivtable[VirtFuncAmmoIndex] = (int *)HookPrimaryAmmoIndex;
    }
     
    void MakeHookEntity()
    {
            edict_t* usp = NULL;
            edict_t* knife = NULL;
     
            RegisterWeapon( usp, "weapon_usp" );
            RegisterWeapon( knife, "weapon_knife" );
    }

Comments