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