Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CPedSAInterface* pBulletImpactInitiator;
- CEntitySAInterface* pBulletImpactVictim;
- CVector* pBulletImpactStartPosition;
- CVector* pBulletImpactEndPosition;
- void Aim() {
- struct cactor_info *localped = (struct cactor_info *)(UINT_PTR) * (uint32_t *)ACTOR_POINTER_SELF;
- if (localped) {
- if (*(DWORD*)&pBulletImpactInitiator != *(DWORD*)&localped) return;
- GetClosestCrosshairTarget(&hd.last_ped, hd.WEAPON_SETTINGS[getScriptCurrentWeaponName(localped)].FOV);
- struct cactor_info *ped = (cactor_info*)hd.last_ped;
- if (ped) {
- if (ped == localped) return; //ped self
- CVector myPos;
- ULONG readed;
- myPos = *(CVector*)(0xB6F258 + 0xE0);
- CVector target_bone;
- switch (hd.WEAPON_SETTINGS[getScriptCurrentWeaponName(localped)].BODY_PART) {
- case eAimTar::HEAD:
- GetBonePosition((CPed*)ped, &target_bone, eBone::BONE_HEAD);
- break;
- case eAimTar::BODY:
- GetBonePosition((CPed*)ped, &target_bone, eBone::BONE_SPINE1);
- break;
- case eAimTar::AUTO:
- if (ped->state == 50) //driving
- GetBonePosition((CPed*)ped, &target_bone, eBone::BONE_HEAD);
- else
- GetBonePosition((CPed*)ped, &target_bone, eBone::BONE_SPINE1);
- break;
- }
- target_bone.fZ += 0.03219923;
- //so we have target bone, and now we need CEntitySAInteface...
- *(DWORD*)&pBulletImpactInitiator = (DWORD)localped;
- *(DWORD*)&pBulletImpactVictim = (DWORD)ped;
- pBulletImpactEndPosition = new CVector(target_bone);
- }
- }
- }
- #define HOOKPOS_CWeapon_DoBulletImpact 0x73B550
- DWORD MTAHookAddr;
- DWORD MTADelta;
- void _declspec(naked) BulletImpactHook() {
- _asm
- {
- mov eax, [esp + 4]
- mov pBulletImpactInitiator, eax
- mov eax, [esp + 8]
- mov pBulletImpactVictim, eax
- mov eax, [esp + 12]
- mov pBulletImpactStartPosition, eax
- mov eax, [esp + 16]
- mov pBulletImpactEndPosition, eax
- pushad
- }
- //some actions if need
- Aim();
- _asm
- {
- mov eax, pBulletImpactInitiator
- mov [esp + 4], eax
- mov eax, pBulletImpactVictim
- mov [esp + 8], eax
- mov eax, pBulletImpactStartPosition
- mov [esp + 12], eax
- mov eax, pBulletImpactEndPosition
- mov [esp + 16], eax
- popad
- push 0xFFFFFFFF
- push 0x00848E50
- jmp MTAHookAddr
- }
- }
- void PrintByteArray(BYTE *arr, int size) {
- char *one_byte_with_space = new char[4];
- char *dump = new char[4 * size + 1];
- memset(dump, 0, 4 * size + 1);
- for (int i = 0; i < size; i++) {
- sprintf(one_byte_with_space, "%X ", arr[i]);
- strcat(dump, one_byte_with_space);
- }
- dump[4 * size] = '\0';
- Log(dump);
- delete dump, one_byte_with_space;
- }
- void DumpMemRegion(DWORD addr, int bytes) {
- PrintByteArray((byte*)addr, bytes);
- }
- void SetupBulletImpactHook() {
- //we need to change mta inline hook, namely - jmp delta
- if (*(BYTE*)(HOOKPOS_CWeapon_DoBulletImpact) == 0xE9) {
- DumpMemRegion(HOOKPOS_CWeapon_DoBulletImpact, 20);
- MTADelta = *(DWORD*)(HOOKPOS_CWeapon_DoBulletImpact + 1);
- DumpMemRegion((DWORD)&MTADelta, 4);
- MTAHookAddr = *(DWORD*)(HOOKPOS_CWeapon_DoBulletImpact + 1) + HOOKPOS_CWeapon_DoBulletImpact; //save it for subsequent jump
- DWORD old;
- ULONG bytes = 4;
- ntlib->NtProtectVirtualMemory(GetCurrentProcess(), (PVOID*)(HOOKPOS_CWeapon_DoBulletImpact + 1), &bytes, PAGE_EXECUTE_READWRITE, &old);
- *(DWORD*)(HOOKPOS_CWeapon_DoBulletImpact + 1) = (DWORD)BulletImpactHook - (HOOKPOS_CWeapon_DoBulletImpact + 5);
- ntlib->NtProtectVirtualMemory(GetCurrentProcess(), (PVOID*)(HOOKPOS_CWeapon_DoBulletImpact + 1), &bytes, old, &old);
- DumpMemRegion(HOOKPOS_CWeapon_DoBulletImpact, 20);
- }
- }
- void RemoveBulletImpactHook() {
- if (*(BYTE*)(HOOKPOS_CWeapon_DoBulletImpact) == 0xE9) {
- DWORD old;
- ULONG bytes = 4;
- ntlib->NtProtectVirtualMemory(GetCurrentProcess(), (PVOID*)(HOOKPOS_CWeapon_DoBulletImpact + 1), &bytes, PAGE_EXECUTE_READWRITE, &old);
- *(DWORD*)(HOOKPOS_CWeapon_DoBulletImpact + 1) = MTADelta;
- ntlib->NtProtectVirtualMemory(GetCurrentProcess(), (PVOID*)(HOOKPOS_CWeapon_DoBulletImpact + 1), &bytes, old, &old);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement