type OnLevelAddedPlayerFn = fn(*mut LevelC, *mut PlayerC) -> bool; struct FunctionPtrAddress { addy: OnLevelAddedPlayerFn } lazy_static! { static ref fn_ptrs: FunctionPtrAddress = FunctionPtrAddress { addy: unsafe { std::mem::transmute::(0x10111790) } }; } static_detours! { struct CreateMoveDetour: fn(*mut LevelC, *mut PlayerC) -> bool; } pub fn init_hooks() { let closure_for_on_level_added_player = |level, player| { ui::toast("Not original", "lol"); return (fn_ptrs.addy)(level, player); }; let mut hook = unsafe { CreateMoveDetour.initialize(on_level_added_player_hook, closure_for_on_level_added_player).unwrap() }; unsafe { hook.enable().unwrap(); } on_level_added_player_hook(std::ptr::null_mut(), std::ptr::null_mut()); hook.call(std::ptr::null_mut(), std::ptr::null_mut()); } fn on_level_added_player_hook(level: *mut LevelC, player: *mut PlayerC) -> bool { ui::toast("Original", "lol"); return (fn_ptrs.addy)(level, player); }