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

    Статус
    Оффлайн
    Регистрация
    13.06.2016
    Адрес
    Одесса, Украина
    Сообщений
    281
    Репутация:
    51 ±

    Перехват функции(параметров больше чем в нативной)

    Доброго времени суток. Сегодня когда делал перехват функции SetPlayerPos столкнулся с проблемой - мне для корректной работы нужно что бы в новосозданной функции принималось больше параметров чем в нативной SetPlayerPos, поэтому когда я делаю define своей функции - компилятор ругается на неверное число параметров. Вот код:
    PHP код:
    stock ac_SetPlayerPos(playeridFloat:xFloat:yFloat:zFloatangleinteriorworld)
    {
        if(
    interior != -1SetPlayerInterior (playeridinterior);
        if(
    world != -1SetPlayerVirtualWorld (playeridworld);
        if(
    angle != -1SetPlayerFacingAngle(playerid,angle);
        else 
    SetCameraBehindPlayer(playerid);
        
    SetPVarFloat(playerid"AirBreak"3);
        
    SetPVarFloat(playerid"OldPosX"x);
        
    SetPVarFloat(playerid"OldPosY"y);
        
    SetPVarFloat(playerid"OldPosZ"z);
        return 
    SetPlayerPos(playerid,x,y,z);
    }
    #if defined _ALS_SetPlayerPos
        #undef SetPlayerPos
    #else
        #define _ALS_SetPlayerPos
    #endif
    #define SetPlayerPos ac_SetPlayerPos 

  2. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    http://pro-pawn.ru/showthread.php?10611
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    2. Перехватчик не должен менять логику работы и предназначение перехватываемой функции.
    Изменение возвращаемых значений допускается только в том случае, если это не нарушает совместимости с оригинальной функцией.
    Например, в античите на HP перехватчик GetPlayerHealth возвращает не то значение, которое возвратит оригинальная функция, а кол-во HP игрока, хранящееся в античите. Но в то же время перехватчик должен возвращать именно HP, а не сумму HP и брони или ещё что-нибудь, что поменяет логику работы функции. Если с помощью перехвата добавить в какую-либо функцию дополнительные параметры, а потом убрать перехватчик, то компилятор будет выдавать ошибки и код не будет компилироваться без перехватчика, т.к. в оригинальной функции тех дополнительных параметров нет.
    Иными словами, работа перехватчика должна быть незаметной для того кода, который использует перехватываемую функцию, как будто того перехватчика и нет.
    Если же вам нужна функция, работающая по-другому - сделайте отдельную функцию, но не нужно путать её с оригиналом с помощью перехвата. Вмешательство в стандартную логику обычно приводит только к проблемам.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. #3
    Аватар для qwezert
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.06.2016
    Адрес
    Одесса, Украина
    Сообщений
    281
    Репутация:
    51 ±
    Понятно, значит придется все таки без перехвата. Спасибо, вопрос закрыт.

  4. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от qwezert Посмотреть сообщение
    Понятно, значит придется все таки без перехвата. Спасибо, вопрос закрыт.
    Можно просто перехватить SetPlayerPos, SetPlayerFacingAngle, SetPlayerInterior и SetPlayerVirtualWorld по отдельности вместо того, чтобы пытаться скрестить ужа и ежа.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. Пользователь сказал cпасибо:
    vovandolg (13.06.2016)
  6. #5
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Можно использовать опциональные параметры в функции, например.

    PHP код:
    stock ac_SetPlayerPos(playeridFloat:xFloat:yFloat:z, {_Float}:angle=-1interior=-1world=-1

  7. Пользователь сказал cпасибо:
    Nexius_Tailer (15.06.2016)
 

 

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

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

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

Ваши права

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