Подскажите, пожалуйста, возможно ли как-то использовать возможности одного плагина в другом без использования Native, Forward и т.д.?
Я знаю, что можно использовать #include "вспомогательный плагин_1.sp"
Но вся проблема в том, что, когда в основном плагине мы инклудим #include "вспомогательный плагин_1.sp", в котором в свою очередь инклудится #include "вспомогательный плагин_2.sp" и при этом, если #include "вспомогательный плагин_2.sp" есть и в основном плагине, то компилятор не сможет скомпилировать плагин. Как в этой ситуации поступить? Спасибо!
Вопрос по #include
#1
Отправлено 31 Июль 2021 - 22:44
#2
Отправлено 02 Август 2021 - 18:44
Подскажите, пожалуйста, возможно ли как-то использовать возможности одного плагина в другом без использования Native, Forward и т.д.?
Я знаю, что можно использовать #include "вспомогательный плагин_1.sp"
Но вся проблема в том, что, когда в основном плагине мы инклудим #include "вспомогательный плагин_1.sp", в котором в свою очередь инклудится #include "вспомогательный плагин_2.sp" и при этом, если #include "вспомогательный плагин_2.sp" есть и в основном плагине, то компилятор не сможет скомпилировать плагин. Как в этой ситуации поступить? Спасибо!
инклуды нужно писать правильно, если это нормальный инклуд то достаточно прописать его корневой файл, дальше он подтянет из себя необходимые функции, так же как мы инклудим #include <sourcemod> подтягиваются базовые необходимые данные для работы плагина, если тебе нужно использовать отдельные функции из инклуда, его нужно правильно переписать чтобы он был независим от других
#3
Отправлено 02 Август 2021 - 18:52
инклуды нужно писать правильно, если это нормальный инклуд то достаточно прописать его корневой файл, дальше он подтянет из себя необходимые функции, так же как мы инклудим #include <sourcemod> подтягиваются базовые необходимые данные для работы плагина, если тебе нужно использовать отдельные функции из инклуда, его нужно правильно переписать чтобы он был независим от других
В том то и дело, что инклуды у меня имеют кольцевую зависимость. То есть почти каждый инклуд зависит друг от друга и при этом главный плагин использует функции всех этих инклудов.
Например:
Инклуд 1 использует: 2 и 3
Инклуд 2 использует: 1 и 3
Инклуд 3 использует: 1
А главный плагин использует все инклуды. И по сути из-за этого кольца невозможна компиляция.
Сделать все в одном инклуде - не вариант. Так как объем кода огромный и ради этого все и затевалось, чтобы это все разделить и сделать читабельнее код.
#4
Отправлено 03 Август 2021 - 1:08
В том то и дело, что инклуды у меня имеют кольцевую зависимость. То есть почти каждый инклуд зависит друг от друга и при этом главный плагин использует функции всех этих инклудов.
Например:
Инклуд 1 использует: 2 и 3
Инклуд 2 использует: 1 и 3
Инклуд 3 использует: 1
А главный плагин использует все инклуды. И по сути из-за этого кольца невозможна компиляция.
Сделать все в одном инклуде - не вариант. Так как объем кода огромный и ради этого все и затевалось, чтобы это все разделить и сделать читабельнее код.
Библиотеки вообще нормально держать в формате .inc (так как .sp используются компилятором) и в папке include/test.inc
И просто добавить в начале кода как подключение библиотеки.
#include "test"
Если хочешь держать в не стандартной папке библиотеки то делаешь так
Например в папке help/test.inc
То надо писать так:
#include "help/test.inc"
Сообщение отредактировал dr_lex: 03 Август 2021 - 1:11
#5
Отправлено 03 Август 2021 - 2:00
Библиотеки вообще нормально держать в формате .inc (так как .sp используются компилятором) и в папке include/test.inc
И просто добавить в начале кода как подключение библиотеки.#include "test"Если хочешь держать в не стандартной папке библиотеки то делаешь так
Например в папке help/test.inc
То надо писать так:#include "help/test.inc"
Спасибо, попробую. Я знаю, так-то, что в inc делают обычно, но, поначалу думал, что разницы никакой не будет
#6
Отправлено 05 Август 2021 - 3:27
Инклуд 1 использует: 2 и 3
Инклуд 2 использует: 1 и 3
Инклуд 3 использует: 1
"Инклуд 1" не может использовать "Инклуд 3", так как они взаимозависимы.
Подскажите, пожалуйста, возможно ли как-то использовать возможности одного плагина в другом без использования Native, Forward и т.д.?
Использовать функционал одного плагина из другого без API можно, но очень больно. Тут в дело вступает некое подобие рефлексии в Sourcemod.
В Sourcemod есть возможность вызывать функции по их указателю. Получить указатель можно по имени функции (https://sourcemod.de...tFunctionByName). На сколько я понял из документации, функция должна быть public. Но для вызова потребуется уже указатель на плагин, если искомая функция не является частью текущего плагина. Указатель на плагин может выковырять из итератора плагинов (функции GetPluginIterator + MorePlugins + ReadPlugin) с проверкой на наличие функции через GetFunctionByName (вернёт INVALID_FUNCTION если такой функции нет в плагине) или напрямую через имя плагина в файловой системе (функция FindPluginByFile. Имя вместе с ".smx").
А дальше вызов функции через Call_StartFunction. Пример в спойлере, подробности по ссылке https://wiki.alliedm...eMod_Scripting)
Но мой тебе совет. Не поленись и напиши себе нормальное forward-native API, а к нему .inc библиотеку для других плагинов. Спасет и нервы и время.
Сообщение отредактировал PawnLomaster: 05 Август 2021 - 6:16
- 8rutu5 это нравится
#7
Отправлено 05 Август 2021 - 6:37
Но вся проблема в том, что, когда в основном плагине мы инклудим #include "вспомогательный плагин_1.sp", в котором в свою очередь инклудится #include "вспомогательный плагин_2.sp" и при этом, если #include "вспомогательный плагин_2.sp" есть и в основном плагине, то компилятор не сможет скомпилировать плагин.
Ах да. Основной вопрос. Говоря совсем просто, то инклуды инклудов учитываются при компиляции. Подобное можно увидеть с самым главным инклудом <sourcemod>. Включая его в основной файл (который .sp), будут включены также и все инклуды в sourcemod.inc (если заглянуть в этот файл, их там достаточно много).
То есть при включении "вспомогательный плагин_1.sp", включается и "вспомогательный плагин_2.sp", и "вспомогательный плагин_2.sp" не надо подключать повторно.
А исходя из этого
Инклуд 1 использует: 2 и 3
Инклуд 2 использует: 1 и 3
Инклуд 3 использует: 1
Достаточно раскидать правильно логику, так как кольцо (без использования директив препроцессора, например #if defined) никогда не скомпилируется. Да и любопытно, как так вообще вышло.
Кстати, директивы препроцессора, скорее всего, будут самым простым способом избежать кольца и, в конце концов, скомпилировать плагин
Сообщение отредактировал PawnLomaster: 05 Август 2021 - 6:52
#8
Отправлено 05 Август 2021 - 19:43
Ах да. Основной вопрос. Говоря совсем просто, то инклуды инклудов учитываются при компиляции. Подобное можно увидеть с самым главным инклудом <sourcemod>. Включая его в основной файл (который .sp), будут включены также и все инклуды в sourcemod.inc (если заглянуть в этот файл, их там достаточно много).
То есть при включении "вспомогательный плагин_1.sp", включается и "вспомогательный плагин_2.sp", и "вспомогательный плагин_2.sp" не надо подключать повторно.
Вот эту часть я уже понял на себе. Вторую часть особо не знал, но погуглив немного разобрался. Оказывается мало написать
#if defined название_инклуда_included #endinput #endif
Надо написать еще:
#define название_инклуда_included
Иначе без второй части, то есть #define - тупо ничего не работает. Ни ошибок, ничего. Просто нет компиляции и все.
После этого заработало даже с кольцевой адресацией инклудов и проблем никаких нет.
Спасибо!
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных