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

    Статус
    Онлайн
    Регистрация
    09.03.2018
    Сообщений
    215
    Репутация:
    13 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Функция ReplaceNative() перед подменой сохраняет адрес функции-оригинала, чтобы в дальнейшем её можно было вызвать из подменной функции. В main.cpp есть пример.
    То есть, чтобы использовать функцию в плагине, необходимо её перехватить? И так-же с вызовом каллбеков (OnPlayerConnect)?
    Ибо подключил sampgdk но почему-то ничего не вызывается (по крайне мере каллбеки).

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,144
    Репутация:
    2517 ±
    Цитата Сообщение от execution Посмотреть сообщение
    То есть, чтобы использовать функцию в плагине, необходимо её перехватить?
    Нет, это просто я не так понял вопрос (сначала подумал, что речь идёт о вызове перехваченной функции, когда, видимо, на самом деле имелся в виду просто вызов нативных функций).
    Соль в том, что интерпретатор может раскрыть адрес нативной функции только если она используется в скрипте (AMX) - если нет, то его никак не узнаешь. Это ограничение можно обойти, создав фейковый экземпляр AMX, в котором используются нужные нативки, инициализировать его, вытащить оставленные интерпретатором адреса нативок из таблицы используемых нативных функций, затем деинициализировать и удалить экземпляр AMX. Так сделано в sampgdk и примерно так же я мог бы сделать и в этом шаблоне, вот только вопрос: стоит ли оно того?

    Цитата Сообщение от execution Посмотреть сообщение
    И так-же с вызовом каллбеков (OnPlayerConnect)?
    Я не делал никаких надстроек для вызова public-функций.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Онлайн
    Регистрация
    09.03.2018
    Сообщений
    215
    Репутация:
    13 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Так сделано в sampgdk и примерно так же я мог бы сделать и в этом шаблоне, вот только вопрос: стоит ли оно того?
    А подключать sampgdk возможно? Дело в том, что почему-то оно не хочет работать.

    1. PLUGIN_EXPORT bool PLUGIN_CALL OnPlayerConnect(int playerid)
    2. {
    3. SendClientMessage(playerid, -1, " ");
    4. return 1;
    5. }


    При использовании SendClientMessage, выдаёт:
    1. LNK2019 ссылка на неразрешенный внешний символ __imp__sampgdk_SendClientMessage в функции [email protected] anticheat C:\Users\execution\Desktop\Anticheat\samp-plugin-template-master\build\main.obj 1
    2. LNK1120 неразрешенных внешних элементов: 1 anticheat C:\Users\execution\Desktop\Anticheat\samp-plugin-template-master\build\Debug\anticheat.dll 1

    А если не использовать функцию, скомпилируется, но PLUGIN_EXPORT bool PLUGIN_CALL OnPlayerConnect(int playerid) - не вызывается.
    Смотрел как использовали другие и, например, в плагине streamer incongito всё нормально работает
    Последний раз редактировалось execution; 13.10.2020 в 12:03.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,144
    Репутация:
    2517 ±
    Каким образом подключаешь sampgdk? Если только включением заголовочного файла, то этого недостаточно: нужно также добавить подключить его в CMakeLists.txt с помощью add_subdirectory(), чтобы скомпилировать и включить в проект реализации функций sampgdk.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Онлайн
    Регистрация
    09.03.2018
    Сообщений
    215
    Репутация:
    13 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Каким образом подключаешь sampgdk? Если только включением заголовочного файла, то этого недостаточно: нужно также добавить подключить его в CMakeLists.txt с помощью add_subdirectory(), чтобы скомпилировать и включить в проект реализации функций sampgdk.
    Почему-то у меня теперь проект не компилируется. (cmd.exe завершился к кодом 1)

    Пробовал такие варианты (закинул sampgdk.h, sampgdk.h на всякий случай и в бинарник и в соурсник)

    1. add_subdirectory(sampgdk)
    2. add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/sampgdk.h)
    3. add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/sampgdk)


    В set(PLUGIN_SRC так-же указал.

    p.s. качать всю папку sampgdk нет необходимости. Достаточно sampgdk.c, sampgdk.h, верно?
    Последний раз редактировалось execution; 16.10.2020 в 10:30.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,144
    Репутация:
    2517 ±
    Цитата Сообщение от execution Посмотреть сообщение
    1. add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/sampgdk.h)
    Зачем здесь ".h"? В посте выше я не просто так оставил ссылку - там буквально в самом начале написано, что нужно указать директорию, в которой есть CMakeLists.txt того проекта, который нужно подключить к своему ("The source_dir specifies the directory in which the source CMakeLists.txt and code files are located").

    Цитата Сообщение от execution Посмотреть сообщение
    p.s. качать всю папку sampgdk нет необходимости. Достаточно sampgdk.c, sampgdk.h, верно?
    Если не разбираешься, лучше взять всю папку (насколько я понял, можно только удалить подпапки "doc" и "plugins", остальное может понадобиться).

    UPD: Попробовал подключить sampgdk самостоятельно, в CMakeLists.txt после секции "Settings" добавил следующее:
    Код:
    set(SAMPSDK_DIR "${CMAKE_CURRENT_SOURCE_DIR}/SDK" CACHE PATH "" FORCE)
    set(SAMPSDK_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/SDK" CACHE PATH "" FORCE)
    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/sampgdk)
    set(PLUGIN_LINK_DEPENDENCIES ${PLUGIN_LINK_DEPENDENCIES} "sampgdk")
    Но даже после этого нужно установить:
    • Python - в README от sampgdk сказано, что подойдёт версию 2.7, однако модуль PLY (см. далее) требует минимум Python 3.6;
    • пакетный менеджер pip - если верить этой странице, нужно скачать установочный скрипт и выполнить его командой "python get-pip.py"; после установки отобразится путь, в который установился pip, этот путь нужно добавить в системную переменную PATH;
    • модуль "ply" ("pip install ply"; но сначала нужно перезапустить командную строку, чтобы загрузить обновлённую переменную PATH с добавленным путём установки pip).
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. Пользователь сказал cпасибо:
    execution (16.10.2020)
  8. #27
    Аватар для execution
    Пользователь

    Статус
    Онлайн
    Регистрация
    09.03.2018
    Сообщений
    215
    Репутация:
    13 ±
    Странно. Скачав папку sampgdk и добавил доп. настройки в CMake (который ты скинул), выдаёт ошибку:

    LNK1104 не удается открыть файл "sampgdk\Debug\sampgdk4d.lib"

    Это возможно отключить/обойти, или я что-то не так сделал?

    Python 3.8 есть. Так-же хотел уточнить, т.к. в интернете не нашёл эту информацию: Что необходимо указывать в PLUGIN_LINK_DEPENDENCIES и PLUGIN_COMPILE_DEFINITIONS?

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,144
    Репутация:
    2517 ±
    Цитата Сообщение от execution Посмотреть сообщение
    Странно. Скачав папку sampgdk и добавил доп. настройки в CMake (который ты скинул), выдаёт ошибку:

    LNK1104 не удается открыть файл "sampgdk\Debug\sampgdk4d.lib"

    Это возможно отключить/обойти, или я что-то не так сделал?
    Скорее всего, что-то не так сделал, у меня компилировалось без проблем.

    Цитата Сообщение от execution Посмотреть сообщение
    Python 3.8 есть. Так-же хотел уточнить, т.к. в интернете не нашёл эту информацию: Что необходимо указывать в PLUGIN_LINK_DEPENDENCIES и PLUGIN_COMPILE_DEFINITIONS?
    PLUGIN_LINK_DEPENDENCIES - список зависимостей (библиотек), с которыми должен линковаться плагин. В отрывке кода из поста выше на последней строке как раз есть добавление "sampgdk" в список.
    PLUGIN_COMPILE_DEFINITIONS - для указания через командную строку макросов (пример: "-D<имя макроса>=[значение]"), которые могут пригодиться при использовании сторонних библиотек.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  10. Пользователь сказал cпасибо:
    execution (20.10.2020)
  11. #29
    Аватар для execution
    Пользователь

    Статус
    Онлайн
    Регистрация
    09.03.2018
    Сообщений
    215
    Репутация:
    13 ±
    На самом деле странно. Даже скачал всё заново и сделал всё по инструкции - всё равно тоже самое:

    main.cpp
      Открыть/закрыть
    1. #include <cstddef>
    2.  
    3. #include "SDK/amx/amx.h"
    4. #include "SDK/plugincommon.h"
    5. #include "pluginconfig.h"
    6. #include "pluginutils.h"
    7. #include "sampgdk.h"


    CMakeLists.txt (добавил лишь твои инструкции а также sampgdk.h/c в set(PLUGIN_SRC)
      Открыть/закрыть
    1. #==============================================================================#
    2. # SA-MP plugin template v1.1 #
    3. # #
    4. # Copyright (c) 2017-2018, Stanislav Gromov #
    5. # #
    6. # Permission to use, copy, modify, and/or distribute this software for any #
    7. # purpose with or without fee is hereby granted, provided that the above #
    8. # copyright notice and this permission notice appear in all copies. #
    9. # #
    10. # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES #
    11. # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF #
    12. # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR #
    13. # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES #
    14. # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN #
    15. # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF #
    16. # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #
    17. #==============================================================================#
    18.  
    19. cmake_minimum_required(VERSION 3.0)
    20. include(CheckIncludeFiles)
    21.  
    22. #==============================================================================#
    23. # Settings #
    24. #==============================================================================#
    25. set(PLUGIN_NAME "anticheat")
    26. set(PLUGIN_VERSION_MAJOR 0)
    27. set(PLUGIN_VERSION_MINOR 0)
    28. set(PLUGIN_VERSION_BUILD 1)
    29.  
    30. set(PLUGIN_SUPPORTS_PROCESSTICK FALSE)
    31. set(PLUGIN_SRC
    32. "main.cpp"
    33. )
    34. set(PLUGIN_LINK_DEPENDENCIES "")
    35. set(PLUGIN_COMPILE_DEFINITIONS "")
    36. #==============================================================================#
    37.  
    38. set(SAMPSDK_DIR "${CMAKE_CURRENT_SOURCE_DIR}/SDK" CACHE PATH "" FORCE)
    39. set(SAMPSDK_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/SDK" CACHE PATH "" FORCE)
    40. add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/sampgdk)
    41. set(PLUGIN_LINK_DEPENDENCIES ${PLUGIN_LINK_DEPENDENCIES} "sampgdk")
    42.  
    43. project(${PLUGIN_NAME}
    44. LANGUAGES CXX
    45. VERSION ${PLUGIN_VERSION_MAJOR}.${PLUGIN_VERSION_MINOR}.${PLUGIN_VERSION_BUILD}
    46. )
    47.  
    48. # Check include files availability
    49. set(REQUIRED_INCLUDE_FILES
    50. "inttypes.h"
    51. "stdint.h"
    52. "alloca.h"
    53. )
    54. foreach(INCLUDE_FILE ${REQUIRED_INCLUDE_FILES})
    55. string(REGEX REPLACE "\\.|/" "_" DEFINITION_NAME "HAVE_${INCLUDE_FILE}")
    56. string(TOUPPER ${DEFINITION_NAME} DEFINITION_NAME)
    57. check_include_files("${INCLUDE_FILE}" ${DEFINITION_NAME})
    58. if(${DEFINITION_NAME})
    59. set(PLUGIN_COMPILE_DEFINITIONS ${PLUGIN_COMPILE_DEFINITIONS} "${DEFINITION_NAME}=1")
    60. endif()
    61. endforeach()
    62.  
    63. string(TOLOWER ${PLUGIN_NAME} PLUGIN_NAME_LOWERCASE)
    64. configure_file("plugin.inc.in" "${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_NAME_LOWERCASE}.inc")
    65. include_directories(${CMAKE_CURRENT_SOURCE_DIR})
    66. include_directories(${CMAKE_CURRENT_BINARY_DIR})
    67.  
    68. set(PLUGIN_SRC
    69. "${PLUGIN_SRC}"
    70. "SDK/amx/amx.h"
    71. "SDK/plugincommon.h"
    72. "SDK/amxplugin.cpp"
    73. "${CMAKE_CURRENT_BINARY_DIR}/pluginconfig.h"
    74. "pluginutils.h"
    75. "pluginutils.cpp"
    76. "sampgdk.h"
    77. "sampgdk.c"
    78. )
    79. if(UNIX)
    80. set(PLUGIN_SRC
    81. "${PLUGIN_SRC}"
    82. "SDK/amx/sclinux.h"
    83. )
    84. set(PLUGIN_COMPILE_DEFINITIONS ${PLUGIN_COMPILE_DEFINITIONS} "LINUX")
    85. endif()
    86. if(MINGW)
    87. set(PLUGIN_COMPILE_DEFINITIONS ${PLUGIN_COMPILE_DEFINITIONS} "HAVE_STDINT_H=1" "__need_size_t")
    88. endif()
    89.  
    90. # Make sure the target is 32-bit
    91. if(NOT CMAKE_SIZEOF_VOID_P EQUAL 4)
    92. if(CMAKE_COMPILER_IS_GNUCXX)
    93. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
    94. endif()
    95. endif()
    96.  
    97. set(PLUGIN_SUPPORTS_FLAGS "SUPPORTS_VERSION | SUPPORTS_AMX_NATIVES")
    98. if(PLUGIN_SUPPORTS_PROCESSTICK)
    99. set(PLUGIN_SUPPORTS_FLAGS "${PLUGIN_SUPPORTS_FLAGS} | SUPPORTS_PROCESS_TICK")
    100. endif()
    101. configure_file("pluginconfig.h.in" "${CMAKE_CURRENT_BINARY_DIR}/pluginconfig.h")
    102.  
    103. add_library(${PLUGIN_NAME_LOWERCASE} SHARED ${PLUGIN_SRC})
    104. target_link_libraries(${PLUGIN_NAME_LOWERCASE} ${PLUGIN_LINK_DEPENDENCIES})
    105. set_property(TARGET ${PLUGIN_NAME_LOWERCASE} APPEND_STRING PROPERTY "COMPILE_DEFINITIONS" ${PLUGIN_COMPILE_DEFINITIONS})
    106. set_property(TARGET ${PLUGIN_NAME_LOWERCASE} PROPERTY PREFIX "")
    107. if(MSVC)
    108. set(STR_PLUGIN_DEF_PROCESSTICK "")
    109. if(PLUGIN_SUPPORTS_PROCESSTICK)
    110. set(STR_PLUGIN_DEF_PROCESSTICK "ProcessTick")
    111. endif()
    112. configure_file("plugin.def.in" "${CMAKE_CURRENT_BINARY_DIR}/plugin.def")
    113. set_property(TARGET ${PLUGIN_NAME_LOWERCASE}
    114. APPEND_STRING PROPERTY LINK_FLAGS "/DEF:\"${CMAKE_CURRENT_BINARY_DIR}/plugin.def\""
    115. )
    116. endif()
    117. if(MINGW)
    118. set_property(TARGET ${PLUGIN_NAME_LOWERCASE}
    119. APPEND_STRING PROPERTY LINK_FLAGS "-Wl,-k"
    120. )
    121. endif()
    122. add_custom_command(
    123. TARGET "${PLUGIN_NAME_LOWERCASE}" POST_BUILD
    124. COMMAND ${CMAKE_COMMAND} -E copy_if_different
    125. ${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_NAME_LOWERCASE}.inc
    126. ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>/${PLUGIN_NAME_LOWERCASE}.inc
    127. )
    128.  
    129. install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_NAME_LOWERCASE}.inc" DESTINATION "include")
    130. install(TARGETS ${PLUGIN_NAME_LOWERCASE}
    131. LIBRARY DESTINATION "plugins"
    132. RUNTIME DESTINATION "plugins"
    133. )
    134. if(WIN32)
    135. set(CPACK_GENERATOR "ZIP")
    136. elseif(UNIX)
    137. set(CPACK_GENERATOR "TGZ")
    138. endif()
    139. set(CPACK_PACKAGE_NAME "${PLUGIN_NAME_LOWERCASE}")
    140. set(CPACK_PACKAGE_VERSION_MAJOR ${PLUGIN_VERSION_MAJOR})
    141. set(CPACK_PACKAGE_VERSION_MINOR ${PLUGIN_VERSION_MINOR})
    142. set(CPACK_PACKAGE_VERSION_PATCH ${PLUGIN_VERSION_BUILD})
    143. include(CPack)


    Папку sampgdk и sampgdk.h/c закинул в source.
    Последний раз редактировалось execution; 20.10.2020 в 11:15.

 

 
Страница 3 из 3 ПерваяПервая 1 2 3

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

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

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

Ваши права

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