Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Как создать новое Глобальное Событие
_wS_ Дата: Четверг, 15.03.2012, 17:33:43 | Сообщение # 1
Как Создать Новое Глобальное Событие

Вы уже наверно знаете, что есть немало событий, но есть и возможность создавать свои собственные. В этом уроке мы рассмотрим глобальные события, которые можно использовать в любых других 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 и тд.
 
Geny Дата: Пятница, 02.05.2014, 13:29:52 | Сообщение # 2
Сообщений: 110
Репутация: 0 [ +/- ]
Дайте пример а то лично я ниче не понял)))

Нужно создать через 60 секунд после начала раунда.
 
АСИК Дата: Суббота, 25.04.2015, 09:59:42 | Сообщение # 3
Сообщений: 2
Репутация: 0 [ +/- ]
Может ли forward иметь координаты? когда другим плагином вызываешь и он делаешь работу с координатами и какой это параметр? array?
И можно пример кода очень буду рад
прошу не отвечать если предлагаете другое нахождение координат


Сообщение отредактировал АСИК - Суббота, 25.04.2015, 10:02:09
 
_wS_ Дата: Суббота, 25.04.2015, 12:16:53 | Сообщение # 4
..
new Float:v[3] = {1.0, 2.0, 3.0};
Call_PushArray(v, 3);
..

public EventName(const Float:v[3])
{

}
 
  • Страница 1 из 1
  • 1
Поиск: