Counter Strike : Global Offensive Source Code
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.
 
 
 
 
 
 

226 lines
5.4 KiB

//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//
//=============================================================================//
#include "cbase.h"
#include "hltvdirector.h"
#include "igameevents.h"
// NOTE: This has to be the last file included!
#include "tier0/memdbgon.h"
class CCSHLTVDirector : public CHLTVDirector
{
public:
DECLARE_CLASS( CCSHLTVDirector, CHLTVDirector );
const char** GetModEvents();
void AddHLTVServer( IHLTVServer *hltv );
void CreateShotFromEvent( CHLTVGameEvent *event );
};
void CCSHLTVDirector::AddHLTVServer( IHLTVServer *hltv )
{
BaseClass::AddHLTVServer( hltv );
// 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( "bomb_begindefuse" );
ListenForGameEvent( "bomb_beginplant" );
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;
CBaseEntity *player = NULL;
if ( !Q_strcmp( "hostage_rescued", name ) ||
!Q_strcmp( "hostage_hurt", name ) ||
!Q_strcmp( "hostage_follows", name ) ||
!Q_strcmp( "hostage_killed", name ) )
{
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_beginplant", name ) ||
!Q_strcmp( "bomb_begindefuse", name ) )
{
player = UTIL_PlayerByUserId( event->m_Event->GetInt("userid") );
if ( !player )
return;
// chasecam
shot = gameeventmanager->CreateEvent( "hltv_chase", true );
if ( shot )
{
shot->SetInt( "target1", player->entindex() );
shot->SetInt( "target2", 0 );
shot->SetFloat( "distance", 500.0f );
shot->SetInt( "theta", 180 );
shot->SetInt( "phi", 45 );
shot->SetBool( "ineye", true );
// shot 3 seconds after pickup
m_nNextShotTick = MIN( m_nNextShotTick, (event->m_Tick+TIME_TO_TICKS(3.0)) );
m_iPVSEntity = player->entindex();
for ( int i = 0; i < m_HltvServers.Count(); ++i )
{
m_HltvServers[ i ].m_pHLTVServer->BroadcastEvent( shot );
}
gameeventmanager->FreeEvent( shot );
DevMsg("DrcCmd: %s\n", name );
return;
}
}
// let baseclass create a shot
BaseClass::CreateShotFromEvent( event );
}
const char** CCSHLTVDirector::GetModEvents()
{
// game events relayed to spectator clients
static const char *s_modevents[] =
{
"hltv_status",
"hltv_chat",
"player_connect",
"player_connect_full",
"player_disconnect",
"player_team",
"player_info",
"server_cvar",
"player_changename",
"teamplay_broadcast_audio",
"player_death",
"other_death",
"player_hurt",
"player_chat",
"round_start",
"round_end",
// additional CS:S events:
"bomb_planted",
"bomb_defused",
"bomb_beginplant",
"bomb_begindefuse",
"hostage_killed",
"hostage_hurt",
"begin_new_match",
// UI events
"cs_match_end_restart",
"cs_game_disconnected",
"announce_phase_end",
"round_mvp",
"server_spawn",
"player_spawn",
"hltv_status",
"cs_win_panel_round",
"endmatch_cmm_start_reveal_items",
"game_newmap",
"hostage_rescued",
"bomb_exploded",
"bomb_pickup",
"bomb_dropped",
"defuser_pickup",
"defuser_dropped",
"decoy_started",
"decoy_detonate",
"hegrenade_detonate",
"flashbang_detonate",
"smokegrenade_detonate",
"smokegrenade_expired",
"inferno_startburn",
"inferno_expire",
"bot_takeover",
"bomb_beep",
"weapon_fire",
"weapon_fire_on_empty",
"weapon_outofammo",
"weapon_reload",
"weapon_zoom",
"player_footstep",
"player_jump",
"player_blind",
"round_freeze_end",
"cs_win_panel_match",
"cs_pre_restart",
"tournament_reward",
"item_found",
"items_gifted",
"achievement_earned",
"round_announce_warmup",
"round_announce_last_round_half",
"round_announce_final",
"round_announce_match_point",
"round_poststart",
"buytime_ended",
"round_time_warning",
"dm_bonus_weapon_start",
"endmatch_mapvote_selecting_map",
"cs_round_start_beep",
"cs_round_final_beep",
"round_announce_match_start",
"seasoncoin_levelup",
"player_falldamage",
"hostage_rescued_all",
"round_officially_ended",
"round_prestart",
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;
}