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
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;
|
|
}
|