Грамотная реализация вызова функций
Здесь будет рассмотрен пример грамотной реализации вызова функций используя call_publics.inc (а если точнее, тупо импортирован README)
Имена функций должны начинаться с
test.sp:
Path_SM/gamedata/test.txt:
main.sp:
Имена функций должны начинаться с
@
, как имена сигнатурtest.sp:
C-подобный:
#include <sourcemod>
public void OnPluginStart()
{
func("test");
}
int func(const char[] text)
{
PrintToServer(text);
return 123;
}
INI:
"Games"
{
"*"
{
"Keys"
{
// если в плагине не указан дескриптор целевого плагина, то значение берётся из ключа "plugin"
"plugin" "test.smx"
// имя функции из секции .publics (вместо имени можно использовать идентификатор)
"func" "@.3032.func"
}
}
}
C-подобный:
#include <sourcemod>
// подключение call_publics.inc
#include <call_publics>
// глобальная переменная для возможности вызова функции из любой части кода
PrivateForward hTestFunc;
// глобальная переменная для записи возвращаемого значения функции
int iTestFuncReturn;
// макрос для удобства вызова функции
#define TEST_FUNC(%0) \
Call_StartForward(hTestFunc); \
Call_PushString(%0); \
Call_Finish(iTestFuncReturn)
public void OnAllPluginsLoaded()
{
// создание прототипа функции
hTestFunc = new PrivateForward(ET_Single, Param_String);
// создание объекта CallPublics с данными из Path_SM/gamedata/test.txt
CallPublics hndl = new CallPublics(new GameData("test"));
// добавление функции из CallPublics в hFwd
hndl.AddFunction(hTestFunc, "func");
// больше нигде не используется, удаляем (не используйте CloseHandle()!)
hndl.Close();
// вызов функции
TEST_FUNC("main");
// вывод ответа
PrintToServer("iTestFuncReturn = %d", iTestFuncReturn);
}