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

    Статус
    Оффлайн
    Регистрация
    27.02.2020
    Сообщений
    26
    Репутация:
    3 ±

    Вызов нативной функции

    Приветствую. Как я заметил, с нативными функциями дело обстоит немного не так, как с колбэками.
    Функция amx_Exec работает неправильно на нативные функции. Как я понял, она(нативная функция) даже не вызывается, так как в аргумент
    1. cell *retval
    возвращается мусорное значение.

    У меня примерно такой код
    1. if(amx_FindNative(this->info.amx, funcname, &idx) != AMX_ERR_NONE) return 0; // funcname = CreateDynamicObject
    2.  
    3. float value = 0.0;
    4.  
    5. amx_Push(this->info.amx, amx_ftoc(value)); // rz
    6. amx_Push(this->info.amx, amx_ftoc(value)); // ry
    7. amx_Push(this->info.amx, amx_ftoc(value)); // rx
    8. amx_Push(this->info.amx, amx_ftoc(value)); // z
    9. amx_Push(this->info.amx, amx_ftoc(value)); // y
    10. amx_Push(this->info.amx, amx_ftoc(value)); // x
    11.  
    12. amx_Push(this->info.amx, static_cast<cell>(522)); // objectid
    13.  
    14. amx_Exec(this->info.amx, &ret_val, idx); // В ret_val возвращается мусорное значение.


    Стример само собой подключен, функция используется 1 раз в OnGameModeInit() для того, чтобы плагин, соответственно, нашёл её.


    Также есть второй вопрос. Какое предназначение имеет функция amx_Cleanup?

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от oukibt Посмотреть сообщение
    Функция amx_Exec работает неправильно на нативные функции.
    Так она и не должна работать с нативными функциями, она предназначена только для public-функций. Нативные и public-функции находятся в разных таблицах и имеют раздельную нумерацию.

    Остальное по нахождению и вызову нативок расписано здесь: https://pro-pawn.ru/showthread.php?1...ll=1#post82762
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. Пользователь сказал cпасибо:
    oukibt (27.02.2021)
  4. #3
    Аватар для oukibt
    Пользователь

    Статус
    Оффлайн
    Регистрация
    27.02.2020
    Сообщений
    26
    Репутация:
    3 ±
    Я установил себе модифицированную версию SDK, но здесь "func" не является членом класса, соответственно, возникает ошибка


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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Если немного напрячься и перейти к объявлению AMX_FUNCSTUB


    1. typedef struct tagAMX_FUNCSTUB {
    2. ucell address PACKED;
    3. char name[sEXPMAX+1];
    4. } AMX_FUNCSTUB;

    то можно заметить поле "address" - это и есть адрес функции, нужно только привести его к типу AMX_NATIVE перед присвоением к func.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. #5
    Аватар для oukibt
    Пользователь

    Статус
    Оффлайн
    Регистрация
    27.02.2020
    Сообщений
    26
    Репутация:
    3 ±
    С этим вроде разобрался, но я так и не получил ответ на главный вопрос, возможно, ошибка моя, и я неправильно донёс его суть.

    Как вызвать из плагина функцию другого плагина? Я хочу получить что-то на подобии этого

    1. cell idx;
    2. if(amx_FindNative(amx, "DestroyDynamicObject", &idx) != AMX_ERR_NONE) return printf("Invalid native\n");
    3. cell args[] = { 50 }, // id объекта
    4. ret_value;
    5. amx_CallNativeFunction(amx, idx, args, &ret_value);
    Последний раз редактировалось oukibt; 28.02.2021 в 11:20.

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

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

  8. #7
    Аватар для oukibt
    Пользователь

    Статус
    Оффлайн
    Регистрация
    27.02.2020
    Сообщений
    26
    Репутация:
    3 ±
    Так и не понял как это сделать. Поискал в интернете темы про вызов функций по адресу, получился вот такой код. Функция даже кое-как вызывалась, но я ловил ошибку.
    "*** Streamer Plugin: DestroyDynamicObject: Expecting 1 parameter(s), but found 23237640."

    1. native CallNative();
    2.  
    3. {
    4. CreateDynamicObject(50, 0, 0, 0, 0, 0, 0);
    5. new id = CreateDynamicObject(50, 0, 0, 0, 0, 0, 0);
    6. DestroyDynamicObject(id);
    7. CallNative();
    8. return 1;
    9. }


    1. cell AMX_NATIVE_CALL CallNative(AMX *amx, cell *params)
    2. {
    3. cell idx;
    4. if (amx_FindNative(amx, "DestroyDynamicObject", &idx) != AMX_ERR_NONE) return printf("Invalid native\n");
    5. AMX_HEADER *hdr = (AMX_HEADER*) amx->base;
    6. AMX_FUNCSTUB *func_stub = GETENTRY(hdr, natives, idx);
    7.  
    8. typedef AMX_NATIVE func(cell);
    9. func* DestroyDynamicObject = (func*)func_stub->address;
    10. DestroyDynamicObject(1);
    11. return 1;
    12. }
    Последний раз редактировалось oukibt; 28.02.2021 в 17:25.

 

 

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

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

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

Ваши права

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