You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
3.7 KiB
149 lines
3.7 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
// |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "hltvdirector.h" |
|
#include "igameevents.h" |
|
|
|
class CCSHLTVDirector : public CHLTVDirector |
|
{ |
|
public: |
|
DECLARE_CLASS( CCSHLTVDirector, CHLTVDirector ); |
|
|
|
const char** GetModEvents(); |
|
void SetHLTVServer( IHLTVServer *hltv ); |
|
void CreateShotFromEvent( CHLTVGameEvent *event ); |
|
|
|
}; |
|
|
|
void CCSHLTVDirector::SetHLTVServer( IHLTVServer *hltv ) |
|
{ |
|
BaseClass::SetHLTVServer( hltv ); |
|
|
|
if ( m_pHLTVServer ) |
|
{ |
|
// mod specific events the director uses to find interesting shots |
|
ListenForGameEvent( "hostage_rescued" ); |
|
ListenForGameEvent( "hostage_killed" ); |
|
ListenForGameEvent( "hostage_hurt" ); |
|
ListenForGameEvent( "hostage_follows" ); |
|
ListenForGameEvent( "bomb_pickup" ); |
|
ListenForGameEvent( "bomb_dropped" ); |
|
ListenForGameEvent( "bomb_exploded" ); |
|
ListenForGameEvent( "bomb_defused" ); |
|
ListenForGameEvent( "bomb_planted" ); |
|
ListenForGameEvent( "vip_escaped" ); |
|
ListenForGameEvent( "vip_killed" ); |
|
} |
|
} |
|
|
|
void CCSHLTVDirector::CreateShotFromEvent( CHLTVGameEvent *event ) |
|
{ |
|
// show event at least for 2 more seconds after it occured |
|
const char *name = event->m_Event->GetName(); |
|
IGameEvent *shot = NULL; |
|
|
|
if ( !Q_strcmp( "hostage_rescued", name ) || |
|
!Q_strcmp( "hostage_hurt", name ) || |
|
!Q_strcmp( "hostage_follows", name ) || |
|
!Q_strcmp( "hostage_killed", name ) ) |
|
{ |
|
CBaseEntity *player = UTIL_PlayerByUserId( event->m_Event->GetInt("userid") ); |
|
|
|
if ( !player ) |
|
return; |
|
|
|
// shot player as primary, hostage as secondary target |
|
shot = gameeventmanager->CreateEvent( "hltv_chase", true ); |
|
shot->SetInt( "target1", player->entindex() ); |
|
shot->SetInt( "target2", event->m_Event->GetInt("hostage") ); |
|
shot->SetFloat( "distance", 96.0f ); |
|
shot->SetInt( "theta", 40 ); |
|
shot->SetInt( "phi", 20 ); |
|
|
|
// shot 2 seconds after event |
|
m_nNextShotTick = MIN( m_nNextShotTick, (event->m_Tick+TIME_TO_TICKS(2.0)) ); |
|
m_iPVSEntity = player->entindex(); |
|
} |
|
|
|
else if ( !Q_strcmp( "bomb_pickup", name ) || |
|
!Q_strcmp( "bomb_dropped", name ) || |
|
!Q_strcmp( "bomb_planted", name ) || |
|
!Q_strcmp( "bomb_defused", name ) ) |
|
{ |
|
CBaseEntity *player = UTIL_PlayerByUserId( event->m_Event->GetInt("userid") ); |
|
|
|
if ( !player ) |
|
return; |
|
|
|
shot = gameeventmanager->CreateEvent( "hltv_chase", true ); |
|
shot->SetInt( "target1", player->entindex() ); |
|
shot->SetInt( "target2", 0 ); |
|
shot->SetFloat( "distance", 64.0f ); |
|
shot->SetInt( "theta", 200 ); |
|
shot->SetInt( "phi", 10 ); |
|
|
|
// shot 2 seconds after pickup |
|
m_nNextShotTick = MIN( m_nNextShotTick, (event->m_Tick+TIME_TO_TICKS(2.0)) ); |
|
m_iPVSEntity = player->entindex(); |
|
} |
|
else |
|
{ |
|
// let baseclass create a shot |
|
BaseClass::CreateShotFromEvent( event ); |
|
|
|
return; |
|
} |
|
|
|
if ( shot ) |
|
{ |
|
m_pHLTVServer->BroadcastEvent( shot ); |
|
gameeventmanager->FreeEvent( shot ); |
|
DevMsg("DrcCmd: %s\n", name ); |
|
} |
|
} |
|
|
|
const char** CCSHLTVDirector::GetModEvents() |
|
{ |
|
// game events relayed to spectator clients |
|
static const char *s_modevents[] = |
|
{ |
|
"hltv_status", |
|
"hltv_chat", |
|
"player_connect", |
|
"player_disconnect", |
|
"player_team", |
|
"player_info", |
|
"server_cvar", |
|
"player_death", |
|
"player_chat", |
|
"round_start", |
|
"round_end", |
|
// additional CS:S events: |
|
"bomb_planted", |
|
"bomb_defused", |
|
"hostage_killed", |
|
"hostage_hurt", |
|
NULL |
|
}; |
|
|
|
return s_modevents; |
|
} |
|
|
|
static CCSHLTVDirector s_HLTVDirector; // singleton |
|
|
|
EXPOSE_SINGLE_INTERFACE_GLOBALVAR(CHLTVDirector, IHLTVDirector, INTERFACEVERSION_HLTVDIRECTOR, s_HLTVDirector ); |
|
|
|
CHLTVDirector* HLTVDirector() |
|
{ |
|
return &s_HLTVDirector; |
|
} |
|
|
|
IGameSystem* HLTVDirectorSystem() |
|
{ |
|
return &s_HLTVDirector; |
|
} |