Как Создать Новое Глобальное Событие
Вы уже наверно знаете, что есть немало событий, но есть и возможность создавать свои собственные. В этом уроке мы рассмотрим глобальные события, которые можно использовать в любых других SourceMod плагинах. Ниже список основных часто используемых функций:
Handle:CreateGlobalForward(const String:name[], ExecType:type, ParamType:...);
Код
name - имя события (например, есть player_say, OnMapStart)
type - тип исполнения:
ET_Ignore = 0 - Игнорировать все возвращаемые значения, возвращается 0 (return 0)
ET_Single = 1 - Только вернуть последний Exec, игнорировать все остальные
ET_Event = 2 - Действует как событие
ET_Hook = 3 - Действует как hook
ParamType - список типов переменных, которые будем передавать событию (макс 32):
Param_Any
Param_Cell
Param_Float
Param_String
Param_Array
Param_VarArgs
Param_CellByRef
Param_FloatByRef
Call_StartForward(Handle:forward); - всегда делается перед передачей параметров и вызовом события.
Call_PushCell(value); - передать параметр в событие (целое число)
Call_PushFloat(Float:value); - передать float параметр
Call_PushArray(const any:value[], size); - массив (size = его размер, кол-во элементов внутри)
Call_PushString(const String:value[]); - строку
Call_Finish(&any:result=0); - Последний шаг. Вызываем созданное событие.
Возвращает SP_ERROR_NONE если все ок, или любое другое целое число в случае неудачи.
Вот готовый пример нового созданного события:
Код
#include <sourcemod>
new Handle:h_OnBotKillPlayer;
public OnPluginStart()
{
h_OnBotKillPlayer = CreateGlobalForward("OnBotKillPlayer", ET_Ignore, Param_Cell, Param_Cell, Param_String);
HookEvent("player_death", player_death);
}
public player_death(Handle:event, const String:name[], bool:dontBroadcast)
{
new killer = GetClientOfUserId(GetEventInt(event, "attacker"));
if (killer > 0 && IsFakeClient(killer))
{
new victim = GetClientOfUserId(GetEventInt(event, "userid"));
if (killer != victim && !IsFakeClient(victim))
{
decl String:weapon[25];
GetEventString(event, "weapon", weapon, 25);
Call_StartForward(h_OnBotKillPlayer);
Call_PushCell(killer);
Call_PushCell(victim);
Call_PushString(weapon);
Call_Finish();
}
}
}
// Вот наше событие: бот убивает любого игрока (доступно в любом SM плагине)
public OnBotKillPlayer(bot_client, player_client, const String:weapon[])
{
PrintToChatAll("Бот %N убил игрока %N из %s", bot_client, player_client, weapon);
}
Обратите внимание на то, что порядок параметров в Call_StartForward и команды Call_Push.. должны совпадать. Если мы сразу же делаем Call_PushCell, то это значит, что первый тип параметра равен Param_Cell и тд.