diff options
Diffstat (limited to 'game/server/dod/dod_hltvdirector.cpp')
| -rw-r--r-- | game/server/dod/dod_hltvdirector.cpp | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/game/server/dod/dod_hltvdirector.cpp b/game/server/dod/dod_hltvdirector.cpp new file mode 100644 index 0000000..20a366d --- /dev/null +++ b/game/server/dod/dod_hltvdirector.cpp @@ -0,0 +1,140 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// + +#include "cbase.h" +#include "hltvdirector.h" + +class CDODHLTVDirector : public CHLTVDirector +{ +public: + DECLARE_CLASS( CDODHLTVDirector, CHLTVDirector ); + + const char** GetModEvents(); + void SetHLTVServer( IHLTVServer *hltv ); + void CreateShotFromEvent( CHLTVGameEvent *event ); +}; + +void CDODHLTVDirector::SetHLTVServer( IHLTVServer *hltv ) +{ + BaseClass::SetHLTVServer( hltv ); + + if ( m_pHLTVServer ) + { + // mod specific events the director uses to find interesting shots + ListenForGameEvent( "dod_point_captured" ); + ListenForGameEvent( "dod_capture_blocked" ); + } +} + +void CDODHLTVDirector::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( "dod_point_captured", name ) || + !Q_strcmp( "dod_capture_blocked", name ) ) + { + // try to find a capper or blocker + const char *text = event->m_Event->GetString("blocker"); + int playerIndex = text[0]; + + if ( playerIndex < 1 ) + { + // maybe its a capper ? + text = event->m_Event->GetString("cappers"); + playerIndex = text[0]; + } + + // if we found one, show him + if ( playerIndex > 0 ) + { + // shot player as primary, hostage as secondary target + shot = gameeventmanager->CreateEvent( "hltv_chase", true ); + shot->SetInt( "target1", playerIndex ); + shot->SetInt( "target2", 0 ); + shot->SetFloat( "distance", 96.0f ); + shot->SetInt( "theta", 0 ); + shot->SetInt( "phi", 20 ); + + // shot 2 seconds after event + m_nNextShotTick = MIN( m_nNextShotTick, (event->m_Tick+TIME_TO_TICKS(2.0)) ); + m_iPVSEntity = playerIndex; + } + } + 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** CDODHLTVDirector::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 DoD:S events: + "player_changeclass", + "dod_warmup_begins", + "dod_warmup_ends", + "dod_round_start", + "dod_restart_round", + "dod_ready_restart", + "dod_allies_ready", + "dod_axis_ready", + "dod_round_restart_seconds", + "dod_team_scores", + "dod_round_win", + "dod_tick_points", + "dod_game_over", + "dod_broadcast_audio", + "dod_point_captured", + "dod_capture_blocked", + "dod_top_cappers", + "dod_timer_flash", + "dod_bomb_planted", + NULL + }; + + return s_modevents; +} + +static CDODHLTVDirector 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 |