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
5 years ago
|
//========= 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;
|
||
|
}
|