|
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами:
4483143
Репутация:
183
|
|
Хайповая обнова мужики зацените.
Из мелочей: фикс бага на naked хуках, фикс установки хука на call опкод.
Ну, а теперь к крутым новостям.
Добавил враппер на коллбэки с большим количество аргументов. Допустим мы хотим захукать такую функцию:
C++:
Код:
using
CCoronas_RegisterCorona
=
void
(
__cdecl
*
)
(
unsigned
int
id
,
CEntity
*
attachTo
,
unsigned
char
red
,
unsigned
char
green
,
unsigned
char
blue
,
unsigned
char
alpha
,
const
CVector
&
posn
,
float
radius
,
float
farClip
,
eCoronaType coronaType
,
eCoronaFlareType flaretype
,
bool
enableReflection
,
bool
checkObstacles
,
int
_param_not_used
,
float
angle
,
bool
longDistance
,
float
nearClip
,
unsigned
char
fadeState
,
float
fadeSpeed
,
bool
onlyFromBelow
,
bool
reflectionDelay
)
;
И из этого всего списка нам нужен только параметр fadeSpeed. Если использовать хуки по обычному, тогда придется описывать все аргументы, и это неудобно.
И приходилось делать это вот так:
C++:
Код:
register_corona_hook
.
set_cb
(
[
]
(
const
auto
&
hook
,
unsigned
int
id
,
CEntity
*
attachTo
,
unsigned
char
red
,
unsigned
char
green
,
unsigned
char
blue
,
unsigned
char
alpha
,
const
CVector
&
posn
,
float
radius
,
float
farClip
,
eCoronaType coronaType
,
eCoronaFlareType flaretype
,
bool
enableReflection
,
bool
checkObstacles
,
int
_param_not_used
,
float
angle
,
bool
longDistance
,
float
nearClip
,
unsigned
char
fadeState
,
loat fadeSpeed
,
bool
onlyFromBelow
,
bool
reflectionDelay
)
{
if
(
fade_speed
==
1.0f
)
return
hook
.
get_trampoline
(
)
(
id
,
attachTo
,
red
,
green
,
blue
,
alpha
,
posn
,
radius
,
farClip
,
coronaType
,
flaretype
,
enableReflection
,
checkObstacles
,
_param_not_used
,
angle
,
longDistance
,
nearClip
,
fadeState
,
15.0f
,
onlyFromBelow
,
reflectionDelay
)
;
else
return
hook
.
call_trampoline
(
id
,
attachTo
,
red
,
green
,
blue
,
alpha
,
posn
,
radius
,
farClip
,
coronaType
,
flaretype
,
enableReflection
,
checkObstacles
,
_param_not_used
,
angle
,
longDistance
,
nearClip
,
fadeState
,
fadeSpeed
,
onlyFromBelow
,
reflectionDelay
)
;
}
)
;
Поэтому теперь можно сделать так:
C++:
Код:
register_corona_hook
.
set_cb_wrapped
(
[
]
(
const
auto
&
hook
,
kthook
::
take
&&
v18
,
float
fade_speed
,
kthook
::
take
&&
v20_v21
)
{
if
(
fade_speed
==
1.0f
)
return
hook
.
call_trampoline
(
v18
,
15.0f
,
v20_v21
)
;
else
return
hook
.
call_trampoline
(
v18
,
fade_speed
,
v20_v21
)
;
}
)
;
Т.е. неиспользуемые первые 18 аргументов закидываются в v18, fade_speed закидывается по обычному, и последние 2 аргумента закидываются в v20_v21.
Заметно меньше ручной писанины, сразу видно что происходит, ну и следовательно меньше шанс ошибки. Круто же?
Ну и чтобы вызвать трамплин, нужно вызвать call_trampoline и передать туда все заглушки. В обычных хуках call_trampoline вызвать тоже можно, но компиляция замедлится.
Ну и пока вы побежали ставить лайки и звездочки на гитхаб, я расскажу об ограничениях.
Коллбэк к хуку не может быть шаблонным. Только первый ее аргумент(т.е. объект хука). Попробую это обойти в ближайшее время конечно, но не факт что выйдет
Ну а еще, не забывайте указывать && у kthook::take, иначе все сломается
|