https://github.com/ValveSoftware/source ... .cpp#L1707
THIS contains pointer to CBasePlayer, but how i can get index from it.
'objdump -d server_srv.so' on Linux:
Syntax: Select all
00340980 <_ZN13CGameMovement13AirAccelerateER6Vectorff>:
340980: 55 push %ebp
340981: 89 e5 mov %esp,%ebp
340983: 56 push %esi
340984: 53 push %ebx
340985: 83 ec 30 sub $0x30,%esp
340988: 8b 5d 08 mov 0x8(%ebp),%ebx
34098b: 8b 75 0c mov 0xc(%ebp),%esi
34098e: 8b 43 04 mov 0x4(%ebx),%eax
340991: 80 b8 28 0a 00 00 00 cmpb $0x0,0xa28(%eax)
After analyzing it i concluded that pointer to player is:
Syntax: Select all
%esp + 0x8 + 0x4
or
Syntax: Select all
stack_data[0](%esp + 0x8) + 0x4(int pointer)
becase
Syntax: Select all
cmpb $0x0,0xa28(%eax)
Syntax: Select all
if (player->pl.deadflag)
But in both cases i got the error
Syntax: Select all
ValueError: Conversion from "Pointer" (<_memory.Pointer object at ?>) to "Index" failed.
My Python code:
Syntax: Select all
from memory import Convention
from memory import DataType
from memory import make_function
from memory import find_binary
from memory.hooks import PreHook
from memory import Pointer
from entities.helpers import index_from_pointer
SERVER = find_binary('server')
AIRACCELERATE = SERVER['_ZN13CGameMovement13AirAccelerateER6Vectorff'].make_function(
Convention.THISCALL,
(DataType.POINTER, DataType.POINTER, DataType.FLOAT, DataType.FLOAT),
DataType.VOID
)
@PreHook(AIRACCELERATE)
def pre_airaccelerate(stack_data):
pointer = Pointer(stack_data.registers.esp.address.address + 0x8 + 0x4)
pindex = index_from_pointer(pointer)
pindex = index_from_pointer(stack_data[0] + 0x4)
Yes, i can get the player index from @OnPlayerRunCommand because the code is consistently, RunCommand > ProcessMovement > AirMove > AirAccelerate but it's ugly because there is THIS pointer where a player pointer stored.