Best way to hook something on player
Posted: Sat Jul 26, 2014 9:54 am
I'm trying to hook several actions like WeaponCanUse, TakeDamage, etc (all from SDKHooks) on a player. And after some time of suffering I got this (for some reason it works...):
I have a feeling, that it's not the simplest way to do a hook. Am I right? And no signatures, please! :)
Syntax: Select all
from core import PLATFORM
from entities.helpers import index_from_pointer
from events import Event
from filters.players import PlayerIter
from memory import Convention, Argument, Return
from memory.hooks import HookType
from players.helpers import pointer_from_userid
funcs = {}
@Event
def player_activate(event):
userid = event.get_int('userid')
hook_weapon_can_use(userid)
def hook_weapon_can_use(userid):
funcs[userid] = pointer_from_userid(userid).make_virtual_function(
259 if PLATFORM == 'windows' else 260,
Convention.THISCALL,
(Argument.POINTER, Argument.POINTER, Argument.POINTER),
Return.INT
)
funcs[userid].add_hook(HookType.POST, on_weapon_can_use)
print('Hooked: ' + str(userid))
@Event
def player_disconnect(event):
userid = event.get_int('userid')
funcs[userid].remove_hook(HookType.POST, on_weapon_can_use)
print('Unhooked: ' + str(userid))
def load():
for userid in PlayerIter(return_types=['userid']):
hook_weapon_can_use(userid[0])
def unload():
for userid in PlayerIter(return_types=['userid']):
funcs[userid[0]].remove_hook(HookType.POST, on_weapon_can_use)
print('Unhooked: ' + str(userid[0]))
def on_weapon_can_use(first, second):
print('on_weapon_can_use')
print(index_from_pointer(first[0]))
print(index_from_pointer(first[1]))
print(second)
I have a feeling, that it's not the simplest way to do a hook. Am I right? And no signatures, please! :)