События — это информационные уведомления, передаваемые между объектами на сервере. Многие из них также передаются с сервера клиенту. Они определены в .res файлах в папке hl2/resource и папках resource конкретных модов. Для базового списка см. Source2 Game Events .
Важно отметить несколько концепций о событиях:
Они почти всегда информационные. То есть блокирование player_death не остановит смерть игрока. Это может заблокировать сообщение в HUD или консоли или что-то еще незначительное. То, что событие находится в файле ресурсов, не означает, что оно когда-либо вызывается или работает так, как вы ожидаете. Новое : Класс EventInfo предоставляет более чистый способ работы с игровыми событиями, с автоматическим управлением ресурсами и типизированными методами.
С классами (рекомендуется) Без классов
public void RegisterEvents ()
{
HookEvent ( "player_death" , Event_PlayerDeath);
}
public static void Event_PlayerDeath ( string name , nint @event , bool dontBroadcast )
{
EventInfo event = new EventInfo (@event);
// Используйте типизированные методы на экземпляре EventInfo
int victim = event. GetPlayerSlot ( "userid" );
int attacker = event. GetPlayerSlot ( "attacker" );
/* CODE */
}
public void RegisterEvents ()
{
HookEvent ( "player_death" , Event_PlayerDeath);
}
public static void Event_PlayerDeath ( string name , nint event , bool dontBroadcast )
{
// Используйте функции с явным дескриптором события
int victim = GetEventPlayerSlot (event, "userid" );
int attacker = GetEventPlayerSlot (event, "attacker" );
/* CODE */
}
Вы можете привязать слушатели событий в OnPluginStart (или где угодно).
using Plugify ;
using static s2sdk . s2sdk ;
public unsafe class Sample : Plugin
{
public void OnPluginStart ()
{
HookEvent ( "player_death" , ( string name , nint event , bool dontBroadcast ) =>
{
int playerSlot = GetEventPlayerSlot (event, "userid" );
PrintToServer ( "event called. \n " );
return ResultType.Continue;
}, HookMode.Post);
}
}
#include <plg/plugin.hpp>
#include "s2sdk.hpp"
using namespace s2sdk ;
class Sample : public plg :: IPluginEntry {
public:
void OnPluginStart () override {
HookEvent ( "player_death" , []( const plg :: string & name , void* event , bool dontBroadcast ) -> ResultType {
int playerSlot = GetEventPlayerSlot (event, "userid" );
PrintToServer ( "event called. \n " );
return ResultType.Continue;
}, HookMode ::Post);
}
}
from plugify.plugin import Plugin
from plugify.pps import s2sdk as s2
class Sample ( Plugin ):
def plugin_start (self):
s2.HookEvent( "player_death" , lambda name, event, dontBroadcast: (
ResultType.Continue
after (
playerSlot := s2.GetEventPlayerSlot(event, "userid" ),
s2.PrintToServer( "event called. \n " )
)[ 1 ]
), s2.HookMode.Post)
package main
import (
" fmt "
" s2sdk "
" github.com/untrustedmodders/go-plugify "
)
func init () {
plugify. OnPluginStart ( func () {
s2sdk. HookEvent ( "player_death" , func ( name string , event uintptr , dontBroadcast bool ) {
playerSlot := s2sdk. GetEventPlayerSlot (event, "userid" );
s2sdk. PrintToServer ( "event called. \n " );
return s2sdk.ResultType.Continue;
}, s2sdk.HookMode.Post)
})
}
import { Plugin } from 'plugify' ;
import * as s2 from ':s2sdk' ;
export class Sample extends Plugin {
pluginStart () {
s2. HookEvent ( "player_death" , ( name , event , dontBroadcast ) => {
const playerSlot = s2. GetEventPlayerSlot (event, "userid" );
s2. PrintToServer ( "event called. \n " );
return s2.ResultType.Continue;
}, s2.HookMode.Post);
}
}
local plugify = require 'plugify'
local Plugin = plugify. Plugin
local s2 = require 's2sdk'
local Sample = {}
setmetatable (Sample, { __index = Plugin })
function Sample : plugin_start ()
s2 : HookEvent ( "player_death" , function (name, event, dontBroadcast)
local playerSlot = s2 : GetEventPlayerSlot (event, "userid" );
s2 : PrintToServer ( "event called. \n " );
return s2 : ResultType . Continue ;
end , s2. HookMode . Post )
end
local M = {}
M. Sample = Sample
return M
С классами (рекомендуется) Без классов
Доступ к параметрам событий с использованием типизированных методов на экземпляре EventInfo:
// Чтение параметров событий
int playerSlot = event. GetPlayerSlot ( "userid" );
float damage = event. GetFloat ( "damage" );
string weaponName = event. GetString ( "weapon" );
bool headshot = event. GetBool ( "headshot" );
// Получение ссылок на сущности
nint playerController = event. GetPlayerController ( "userid" );
nint playerPawn = event. GetPlayerPawn ( "userid" );
nint entity = event. GetEntity ( "entityid" );
Установка параметров событий столь же проста:
// Установка параметров событий
event. SetInt ( "userid" , 123 );
event. SetFloat ( "damage" , 50.0f );
event. SetString ( "weapon" , "ak47" );
event. SetBool ( "headshot" , true );
// Установка ссылок на сущности
event. SetPlayerController ( "userid" , controllerHandle);
event. SetEntity ( "entityid" , entityHandle);
Доступ к параметрам событий с использованием явных функций с дескриптором события:
// Чтение параметров событий
int playerSlot = GetEventPlayerSlot (event, "userid" );
float damage = GetEventFloat (event, "damage" );
string weaponName = GetEventString (event, "weapon" );
bool headshot = GetEventBool (event, "headshot" );
// Получение ссылок на сущности
nint playerController = GetEventPlayerController (event, "userid" );
nint playerPawn = GetEventPlayerPawn (event, "userid" );
nint entity = GetEventEntity (event, "entityid" );
Установка параметров событий требует явных вызовов функций:
// Установка параметров событий
SetEventInt (event, "userid" , 123 );
SetEventFloat (event, "damage" , 50.0f );
SetEventString (event, "weapon" , "ak47" );
SetEventBool (event, "headshot" , true );
// Установка ссылок на сущности
SetEventPlayerController (event, "userid" , controllerHandle);
SetEventEntity (event, "entityid" , entityHandle);
С классами (рекомендуется) Без классов
Создавайте и запускайте пользовательские события используя класс EventInfo:
// Создание нового события
using ( var customEvent = new EventInfo ( "player_hurt" ))
{
// Установка параметров события
customEvent. SetInt ( "userid" , 1 );
customEvent. SetInt ( "attacker" , 2 );
customEvent. SetInt ( "health" , 50 );
customEvent. SetString ( "weapon" , "ak47" );
// Запуск для всех игроков
customEvent. Fire ();
// Или запуск для конкретного игрока
customEvent. FireToClient (playerSlot);
} // Автоматическая очистка
Создавайте и запускайте пользовательские события используя явные функции:
// Создание нового события
nint customEvent = CreateEvent ( "player_hurt" );
// Установка параметров события
SetEventInt (customEvent, "userid" , 1 );
SetEventInt (customEvent, "attacker" , 2 );
SetEventInt (customEvent, "health" , 50 );
SetEventString (customEvent, "weapon" , "ak47" );
// Запуск для всех игроков
FireEvent (customEvent);
// Или запуск для конкретного игрока
FireEventToClient (customEvent, playerSlot);
// Примечание: Событие автоматически освобождается после запуска
С классами (рекомендуется) Без классов
Предотвращение трансляции события клиентам:
event. SetBroadcast ( false );
Предотвращение трансляции события клиентам:
SetEventBroadcast (event, false );
В хуке pre-события вы можете предотвратить передачу события другим плагинам, вернув ResultType.Handled или ResultType.Stop.
С классами (рекомендуется) Без классов
public void OnPluginStart ()
{
HookEvent ( "player_death" , OnPlayerDeathPre, HookMode.Pre);
}
private static ResultType OnPlayerDeathPre ( string name , nint @event , bool dontBroadcast )
{
EventInfo event = new EventInfo (@event);
int victim = event. GetPlayerSlot ( "userid" );
// Отмена события смерти для игроков-администраторов
if ( IsPlayerAdmin (victim))
{
PrintToServer ( "Prevented admin death event \n " );
return ResultType.Handled;
}
return ResultType.Continue;
}
public void OnPluginStart ()
{
HookEvent ( "player_death" , OnPlayerDeathPre, HookMode.Pre);
}
private static ResultType OnPlayerDeathPre ( string name , nint event , bool dontBroadcast )
{
int victim = GetEventPlayerSlot (event, "userid" );
// Отмена события смерти для игроков-администраторов
if ( IsPlayerAdmin (victim))
{
PrintToServer ( "Prevented admin death event \n " );
return ResultType.Handled;
}
return ResultType.Continue;
}