W1nStoN

Разбираем перехват функций

2 posts in this topic

Доброго времени суток, пользователи pawno-rus. В этом уроке я хотел бы показать, как использовать перехват функций.
Перехват, в основных случаях, делают для обхода функции CallLocalFunction, потому что она очень медленная. 
P.S. Об этом говориться в одной из тем AloneAmigo. 

Спойлер

//допустим мы перехватываем функцию SetPlayerPos
stock SetPlayerPosEx(playerid, Float:X,Float:Y,Float:Z) //SetPlayerPosEx - название перехватчика
{
        //Функции,которые вам необходимо вызывать вместе с SetPlayerPos
        //Допустим записать координаты, для анти-чита на телепорт
        return SetPlayerPos(playerid, X,Y,Z); //Вызываем перехватываемую функцию
        
}
#if defined _ALS_SetPlayerPos // Проверяем, если функция уже перехвачена, то...
        #undef SetPlayerPos // Раздефайневаем/удаляем функцию. Также, если вы уже использовали перехват с префиксом _ALS_,то старый перехват тоже удалится
#else // Если функция с префиксом _ALS_ еще не перехвачена...
        #define _ALS_SetPlayerPos // Перехватываем функцию
#endif //Заканчиваем перехват
#define SetPlayerPos SetPlayerPosEx // Даем знать, что теперь функция SetPlayerPos будет использоваться, как SetPlayerPosEx

 

 

Таким образом, вы перехватили функцию SetPlayerPos и теперь при использовании ее - она будет заменяться на SetPlayerPosEx, в исключении тела перехватчика.
 
Рассмотрим перехват коллбеков:
Спойлер

//к примеру возьмем OnGameModeInit
public OnGameModeInit() // Сам паблик
{
        // Код, для которого происходит перехват
        #if defined test_OnGameModeInit // Проверяем, если паблик перехвачен, то...
                test_OnGameModeInit(); // вызываем перехватчик
        #endif // завершаем 
         return 1;
}
// Дальше в основном аналог перехвата нативных функций.
#if defined _ALS_OnGameModeInit //Если паблик с префиксом _ALS_ уже перехвачена, то..
    #undef OnGameModeInit // удаляем/раздефайневаем старый паблик
#else // если паблик с префиксом _ALS_ еще не перехвачен, то
    #define _ALS_OnGameModeInit // перехватываем паблик
#endif //завершаем перехват
#define OnGameModeInit test_OnGameModeInit // Теперь перехват паблик будет вызываться, при использовании test_OnGameModeInit
#if defined test_OnGameModeInit // Проверим, создан ли перехват
forward test_OnGameModeInit(); // Создаем форвард для перехватчика
#endif //Завершаем
//Теперь при использовании test_OnGameModeInit() - будет вызываться паблик OnGameModeInit

 

 

Спасибо за внимание!
Автор урока: @W1nStoN (sound)

 

Edited by W1nStoN

Share this post


Link to post
Share on other sites

АВТОМАТИЧЕСКИ СФОРМИРОВАННОЕ СООБЩЕНИЕ:

Данная тема была перемещена модерацией или администрацией портала PAWNO-RUS.RU! 

Перемещена из: "Скриптинг PAWN > Готовые решения"

Перемещена в: "Скриптинг PAWN > Уроки"

 

С уважением, ваш Бот! 

Если вы НЕ согласны с переносом данной темы в раздел "Скриптинг PAWN > Уроки", пожалуйтесь на это сообщение в жалобе указав причины вашего недовольства. Спасибо. 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • mihailpopov
      By mihailpopov
      Привет всем форумчане, есть вопрос у меня имеется инвентарь в формате psd. Как подключить его к моду? 
    • Boomi4
      By Boomi4
      Не могу запустить сервер. Туповат в этом.
      Как я понял Плагин mysql_debian_static не запускается и от него уже все проблемы.
      Если есть решения подскажите пожалуйста.