[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » Как Создать Новое Глобальное Событие (CreateGlobalForward Взято с world-source.ru)
Как Создать Новое Глобальное Событие
rootДата: Воскресенье, 03.02.2013, 01:38 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 561
Статус: Offline
Как Создать Новое Глобальное Событие 

Вы уже наверно знаете, что есть немало событий, но есть и возможность создавать свои собственные. В этом уроке мы рассмотрим глобальные события, которые можно использовать в любых других 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 и тд.
 
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » Как Создать Новое Глобальное Событие (CreateGlobalForward Взято с world-source.ru)
  • Страница 1 из 1
  • 1
Поиск: