diff options
Diffstat (limited to 'game/server/cstrike/cs_hltvdirector.cpp')
| -rw-r--r-- | game/server/cstrike/cs_hltvdirector.cpp | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/game/server/cstrike/cs_hltvdirector.cpp b/game/server/cstrike/cs_hltvdirector.cpp new file mode 100644 index 0000000..30f451a --- /dev/null +++ b/game/server/cstrike/cs_hltvdirector.cpp @@ -0,0 +1,149 @@ +//========= 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; +}
\ No newline at end of file |