Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 2 из 2
  1. #1
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±

    Перехваты, как работают и вопрос еще один

    Здравствуйте.

    1. По какому принципу работают перехваты? Во время работы сервера, они каждый раз перехватывают паблик, или как?
    2. Что будет если я например напишу полностью систему бизнесов в инклуде с помощью перехватов. Как это отразиться на сервере и тд

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    1) Эммм, нет. Ты не знаешь как работает директива #define? Всё на этапе компиляции происходит.

    Например, до перехвата:
      Открыть/закрыть
    PHP код:
    public OnGameModeInit()
    {
        
    //Код
        
    return 1;



    Прописываем перехват
      Открыть/закрыть
    PHP код:
    public OnGameModeInit()
    {
        
    //Код
        #if defined test_OnGameModeInit
            
    return test_OnGameModeInit();
        
    #else
            
    return 1;
        
    #endif
    }
    #if defined _ALS_OnGameModeInit
        #undef OnGameModeInit
    #else
        #define _ALS_OnGameModeInit
    #endif

    #define OnGameModeInit test_OnGameModeInit
    #if defined test_OnGameModeInit
        
    forward test_OnGameModeInit();
    #endif

    public OnGameModeInit()
    {
        
    //Код
        
    return 1;



    И после обработки директив препроцессором код станет таким:
      Открыть/закрыть
    PHP код:
    public OnGameModeInit()
    {
        
    //Код
        
    return test_OnGameModeInit();
    }

    forward test_OnGameModeInit();
    public 
    test_OnGameModeInit()
    {
        
    //Код
        
    return 1;



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

    Если прописать два перехвата
      Открыть/закрыть
    PHP код:
    public OnGameModeInit()
    {
        
    //Код
        #if defined test1_OnGameModeInit
            
    return test1_OnGameModeInit();
        
    #else
            
    return 1;
        
    #endif
    }
    #if defined _ALS_OnGameModeInit
        #undef OnGameModeInit
    #else
        #define _ALS_OnGameModeInit
    #endif

    #define OnGameModeInit test1_OnGameModeInit
    #if defined test1_OnGameModeInit
        
    forward test1_OnGameModeInit();
    #endif

    public OnGameModeInit()
    {
        
    //Код
        #if defined test2_OnGameModeInit
            
    return test2_OnGameModeInit();
        
    #else
            
    return 1;
        
    #endif
    }
    #if defined _ALS_OnGameModeInit
        #undef OnGameModeInit
    #else
        #define _ALS_OnGameModeInit
    #endif

    #define OnGameModeInit test2_OnGameModeInit
    #if defined test2_OnGameModeInit
        
    forward test2_OnGameModeInit();
    #endif

    public OnGameModeInit()
    {
        
    //Код
        
    return 1;


    Код станет таким
      Открыть/закрыть
    PHP код:
    public OnGameModeInit()
    {
        
    //Код
        
    return test1_OnGameModeInit();
    }

    forward test1_OnGameModeInit();
    public 
    test1_OnGameModeInit()
    {
        
    //Код
        
    return test2_OnGameModeInit();
    }

    forward test2_OnGameModeInit();
    public 
    test2_OnGameModeInit()
    {
        
    //Код
        
    return 1;


    То бишь, перехваты просто переименовывают последующую функцию и вызывают её в самом конце, за счёт чего и получается перехват.

    2) Никак. Разница между обычным кодом и кодом с перехватом лишь в том, что происходит вызов перехваченной функции, если обработка кода не прервана до этого. А это ничтожно маленькие затраты, которые нет смысла учитывать с учётом тех плюсов, что дают перехваты. Но, с другой стороны, стоит учитывать, что если в каком-то коллбэке имеется кусок какого-то античита, то твоя система будет обрабатываться до этого кода и учитываться им уже не будет.
    Как по мне, глупо писать целые системы основываясь на перехватах, ибо порядок вызова перехватов не так-то просто контролировать. Если хочешь вынести систему в инклуд, просто создай там своё подобие перехватов (stock с нужным тебе кодом) и вручную пропиши его вызов в нужном месте. Так будет более надёжно
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •