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

    Статус
    Оффлайн
    Регистрация
    26.02.2017
    Адрес
    0x
    Сообщений
    157
    Репутация:
    13 ±

    sampgdk::FindNative

    Привет, собственно интересует вот такой вопросик. Есть функция вызывающая CreateDynamicPickupEx из плагина написанная на sampgdk.
    1. int NLCallNative::CreateDynamicPickupEx(int modelid, int type, float x, float y, float z, float streamdistance, const int worlds[], const int interiors[], const int players[],
    2. const int areas[], int priority, int maxworlds, int maxinteriors, int maxplayers, int maxareas)
    3. {
    4. static AMX_NATIVE Native = sampgdk::FindNative("CreateDynamicPickupEx");
    5. std::string function_format = std::string("iiffffa[") + std::to_string(maxworlds) + std::string("]a[") + std::to_string(maxinteriors) + std::string("]a[")
    6. + std::to_string(maxplayers) + std::string("]a[") + std::to_string(maxareas) + std::string("]iiiii");
    7. if (Native != NULL) return sampgdk::InvokeNative(Native, function_format.c_str(), modelid, type, x, y, z, streamdistance, worlds, interiors, players, areas,
    8. priority, maxworlds, maxinteriors, maxplayers, maxareas);
    9. return 0;
    10. }


    Так же есть хук на эту самую нативку - CreateDynamicPickupEx.
    1. cell AMX_NATIVE_CALL HookedNatives::acc_CreateDynamicPickupEx(AMX * amx, cell * params)
    2. {
    3. int ac_pickupid = NLCallNative::CreateDynamicPickupEx(params[1], params[2], amx_ctof(params[3]), amx_ctof(params[4]), amx_ctof(params[5]), amx_ctof(params[6]),
    4. reinterpret_cast<int *> (params[7]), reinterpret_cast<int *> (params[8]), reinterpret_cast<int *> (params[9]), reinterpret_cast<int *> (params[10]), params[11],
    5. params[12], params[13], params[14], params[15]);
    6.  
    7. return ac_pickupid;
    8. }


    Вопрос в том, как правильно преобразовать из cell в int*, ибо reinterpret_cast<int *> (params[7]) не помогает и данный код вызывает краш.

    Собственно прилагаю еще само объявление нативки из инклуда стримера.
    1. native STREAMER_TAG_PICKUP:CreateDynamicPickupEx(modelid, type, Float:x, Float:y, Float:z, Float:streamdistance = STREAMER_PICKUP_SD, const worlds[] = { -1 }, const interiors[] = { -1 }, const players[] = { -1 }, const STREAMER_TAG_AREA:areas[] = { STREAMER_TAG_AREA:-1 }, priority = 0, maxworlds = sizeof worlds, maxinteriors = sizeof interiors, maxplayers = sizeof players, maxareas = sizeof areas);
    0x

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,975
    Репутация:
    2401 ±
    Цитата Сообщение от Batya_Montes Посмотреть сообщение
    Вопрос в том, как правильно преобразовать из cell в int*, ибо reinterpret_cast<int *> (params[7]) не помогает и данный код вызывает краш.
    Ну а что ещё вы ожидали, конвертируя число в указатель?

    Суть в том, что передаваемые в params[] адреса массивов - это не физические адреса, а виртуальные (т.е. смещения относительно начала блока памяти скрипта, включающего в себя секции данных и стека/кучи). Чтобы сконвертировать их в адреса физические, предусмотрена функция amx_GetAddr().
    1. // Допустим, у нас адрес массива в params[4]; сконвертируем его в физический адрес
    2. // и запишем в переменную addr.
    3. cell *addr;
    4. if (amx_GetAddr(amx, params[4], &addr) != AMX_ERR_NONE)
    5. {
    6. // Если amx_GetAddr() вернула результат, отличный от AMX_ERR_NONE, это может означать
    7. // только одно: в нативку каким-то образом передан неправильный адрес массива
    8. // (обычно подобные ошибки пресекаются ещё при компиляции скрипта - возможно,
    9. // скриптер пытался вызвать функцию через #emit и неправильно передал указатель?)
    10. // Можно начинать паниковать.
    11. return amx_RaiseError(amx, AMX_ERR_NATIVE), 0;
    12. }
    13. // Конверсия прошла успешно, теперь можно выполнять действия с указателем в addr.
    14. *addr = 0;
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

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

    Статус
    Оффлайн
    Регистрация
    26.02.2017
    Адрес
    0x
    Сообщений
    157
    Репутация:
    13 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Ну а что ещё вы ожидали, конвертируя число в указатель?

    Суть в том, что передаваемые в params[] адреса массивов - это не физические адреса, а виртуальные (т.е. смещения относительно начала блока памяти скрипта, включающего в себя секции данных и стека/кучи). Чтобы сконвертировать их в адреса физические, предусмотрена функция amx_GetAddr().
    1. // Допустим, у нас адрес массива в params[4]; сконвертируем его в физический адрес
    2. // и запишем в переменную addr.
    3. cell *addr;
    4. if (amx_GetAddr(amx, params[4], &addr) != AMX_ERR_NONE)
    5. {
    6. // Если amx_GetAddr() вернула результат, отличный от AMX_ERR_NONE, это может означать
    7. // только одно: в нативку каким-то образом передан неправильный адрес массива
    8. // (обычно подобные ошибки пресекаются ещё при компиляции скрипта - возможно,
    9. // скриптер пытался вызвать функцию через #emit и неправильно передал указатель?)
    10. // Можно начинать паниковать.
    11. return amx_RaiseError(amx, AMX_ERR_NATIVE), 0;
    12. }
    13. // Конверсия прошла успешно, теперь можно выполнять действия с указателем в addr.
    14. *addr = 0;
    Попробовал данный метод и в принципе получилось, но из данного массива достается только либо первый, либо последний элемент.

    Пробовал прогнать циклом, но безрезультатно. Как же все таки правильно будет получить весь массив?

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

    UPD: Проблема была в цикле, все прекрасно достается ;)
    Можно закрывать.
    0x

 

 

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

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

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

Ваши права

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