PDA

Просмотр полной версии : [Вопрос] Перехват



Desulaid
02.07.2015, 02:52
Я вот тут не могу придумать как было бы правильно перехватить функцию GetPlayerMoney. Она работает вот так


переменная = GetPlayerMoney(playerid);

Мне показалось, что псевдоперехватываемая функция должна совпадать аргументами и такой вариант врят ли будет правильным, но других у меня нету.


stock ac_GetPlayerMoney(playerid, money)
{
money = ac_money[playerid];
return GetPlayerMoney(playerid);
}
#if defined _ALS_GetPlayerMoney
#undef GetPlayerMoney
#else
#define _ALS_GetPlayerMoney
#undif
#define GetPlayerMoney _ALS_GetPlayerMoney

Вопрос: как реализовать такой перехват?

Desulaid
02.07.2015, 10:21
Вот еще один вариант. Может он приближен к истине: :D ?


stock ac_GetPlayerMoney(playerid, money)
{
ac_money[playerid] = GetPlayerMoney(playerid);
return ac_money[playerid] ;
}
#if defined _ALS_GetPlayerMoney
#undef GetPlayerMoney
#else
#define _ALS_GetPlayerMoney
#endif

Daniel_Cortez
02.07.2015, 11:56
Вы уж определитесь, что собираетесь делать. Если ваша функция возвращает 2 значения, а не 1, то зачем пытаться выдать её за оригинал?
Только введёте в заблуждение других, кто будет работать с вашим кодом, да и сами будете путаться, если забудете о своей багофиче.

P.S.: По поводу передачи параметров по ссылке - посмотрите, например, на заголовок функции GetPlayerPos в a_samp.inc

Desulaid
02.07.2015, 12:30
Вы уж определитесь, что собираетесь делать. Если ваша функция возвращает 2 значения, а не 1, то зачем пытаться выдать её за оригинал?
Только введёте в заблуждение других, кто будет работать с вашим кодом, да и сами будете путаться, если забудете о своей багофиче.

P.S.: По поводу передачи параметров по ссылке - посмотрите, например, на заголовок функции GetPlayerPos в a_samp.inc

Может a_players.inc?

Пельмень
02.07.2015, 12:30
return ac_money[playerid]?

Desulaid
02.07.2015, 12:34
И я думал, что функция GetPlayerMoney возвращает одно значение - сумму денег.

- - - Добавлено - - -


return ac_money[playerid]?

Ну я типа "сделал" возвращение полученых денег, которые получил GetPlayerMoney. :sorry:

Пельмень
02.07.2015, 12:39
И я думал, что функция GetPlayerMoney возвращает одно значение - сумму денег.

- - - Добавлено - - -



Ну я типа "сделал" возвращение полученых денег, которые получил GetPlayerMoney. :sorry:


return ac_money[playerid] = GetPlayerMoney(playerid);

Daniel_Cortez
02.07.2015, 13:16
return ac_money[playerid] = GetPlayerMoney(playerid);
В чём смысл античита, который будет не отбирать читерские деньги, а наоборот записывать их у себя?


Ну я типа "сделал" возвращение полученых денег, которые получил GetPlayerMoney. :sorry:
Не пойму, так вы собираетесь возвращать одно значение или два (деньги игрока и кол-во денег, записанное античитом)?
Если два, то лучше оставьте идею с перехватами.
Как я уже и говорил раньше, нет никакого смысла заменять функцию, если она принимает другие аргументы или возвращает другое кол-во значений.

Перехваты сделаны для незаметной подмены функций - перехватил и забыл. С вашим же подходом придётся всё время держать в голове, что GetPlayerMoney - это не функция из SA:MP, а костыль, требующий больше аргументов и возвращающий сразу несколько значений.