diff options
| author | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
|---|---|---|
| committer | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
| commit | 39ed87570bdb2f86969d4be821c94b722dc71179 (patch) | |
| tree | abc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/client/c_vote_controller.cpp | |
| download | source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip | |
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/client/c_vote_controller.cpp')
| -rw-r--r-- | mp/src/game/client/c_vote_controller.cpp | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/mp/src/game/client/c_vote_controller.cpp b/mp/src/game/client/c_vote_controller.cpp new file mode 100644 index 00000000..109e355c --- /dev/null +++ b/mp/src/game/client/c_vote_controller.cpp @@ -0,0 +1,189 @@ +//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: CS's custom C_VoteController
+//
+// $NoKeywords: $
+//=============================================================================//
+#include "cbase.h"
+#include "c_vote_controller.h"
+#include "shareddefs.h"
+#include "hud.h"
+#include "cdll_client_int.h"
+#include "igameevents.h"
+#include "hud_vote.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+IMPLEMENT_CLIENTCLASS_DT( C_VoteController, DT_VoteController, CVoteController )
+ RecvPropInt( RECVINFO( m_iActiveIssueIndex ), 0, C_VoteController::RecvProxy_VoteType ),
+ RecvPropInt( RECVINFO( m_iOnlyTeamToVote ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_nVoteOptionCount ), RecvPropInt( RECVINFO( m_nVoteOptionCount[0] ), 0, C_VoteController::RecvProxy_VoteOption ) ),
+ RecvPropInt( RECVINFO( m_nPotentialVotes ) ),
+ RecvPropBool( RECVINFO( m_bIsYesNoVote ) )
+END_RECV_TABLE()
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_VoteController::RecvProxy_VoteType( const CRecvProxyData *pData, void *pStruct, void *pOut )
+{
+ C_VoteController *pMe = (C_VoteController *)pStruct;
+ if( pMe->m_iActiveIssueIndex == pData->m_Value.m_Int )
+ return;
+
+ pMe->m_iActiveIssueIndex = pData->m_Value.m_Int;
+ pMe->m_bTypeDirty = true;
+
+ // Since the contents of a new vote are in three parts, we can't directly send an event to the Hud
+ // because we don't really know if we have all three parts yet. So we'll mark dirty, and our think
+ // can notice that and send the event.
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_VoteController::RecvProxy_VoteOption( const CRecvProxyData *pData, void *pStruct, void *pOut )
+{
+ int index = pData->m_pRecvProp->GetOffset() / sizeof(int);
+
+ size_t offset = offsetof( C_VoteController, m_nVoteOptionCount );
+ C_VoteController *pMe = (C_VoteController *)((byte *)pStruct - offset );
+ if( pMe->m_nVoteOptionCount[index] == pData->m_Value.m_Int )
+ return;
+
+ pMe->m_nVoteOptionCount[index] = pData->m_Value.m_Int;
+ pMe->m_bVotesDirty = true;
+ pMe->SetNextClientThink( gpGlobals->curtime + 0.001 );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+C_VoteController::C_VoteController()
+{
+ ResetData();
+
+ ListenForGameEvent( "vote_cast" );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+C_VoteController::~C_VoteController()
+{
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_VoteController::ResetData()
+{
+ m_iActiveIssueIndex = INVALID_ISSUE;
+ m_iOnlyTeamToVote = TEAM_INVALID;
+ for( int index = 0; index < MAX_VOTE_OPTIONS; index++ )
+ {
+ m_nVoteOptionCount[index] = 0;
+ }
+ m_nPotentialVotes = 0;
+ m_bVotesDirty = false;
+ m_bTypeDirty = false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_VoteController::Spawn( void )
+{
+ ResetData();
+ BaseClass::Spawn();
+ SetNextClientThink( gpGlobals->curtime );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_VoteController::ClientThink()
+{
+ BaseClass::ClientThink();
+
+ if( m_bTypeDirty )
+ {
+ m_bTypeDirty = false;
+ m_bVotesDirty = true;
+ }
+
+ if( m_bVotesDirty )
+ {
+ if ( m_nPotentialVotes > 0 )
+ {
+ // Currently hard-coded to MAX_VOTE_COUNT options per issue
+ DevMsg( "Votes: Option1 - %d, Option2 - %d, Option3 - %d, Option4 - %d, Option5 - %d\n",
+ m_nVoteOptionCount[0], m_nVoteOptionCount[1], m_nVoteOptionCount[2], m_nVoteOptionCount[3], m_nVoteOptionCount[4] );
+
+ IGameEvent *event = gameeventmanager->CreateEvent( "vote_changed" );
+ if ( event )
+ {
+ for ( int index = 0; index < MAX_VOTE_OPTIONS; index++ )
+ {
+ char szOption[2];
+ Q_snprintf( szOption, sizeof( szOption ), "%i", index + 1 );
+
+ char szVoteOption[13] = "vote_option";
+ Q_strncat( szVoteOption, szOption, sizeof( szVoteOption ), COPY_ALL_CHARACTERS );
+
+ event->SetInt( szVoteOption, m_nVoteOptionCount[index] );
+ }
+ event->SetInt( "potentialVotes", m_nPotentialVotes );
+ gameeventmanager->FireEventClientSide( event );
+ }
+ }
+
+ m_bVotesDirty = false;
+ }
+
+ SetNextClientThink( gpGlobals->curtime + 0.5f );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_VoteController::FireGameEvent( IGameEvent *event )
+{
+ CHudVote *pHudVote = GET_HUDELEMENT( CHudVote );
+ if ( pHudVote && pHudVote->IsVisible() )
+ {
+ const char *eventName = event->GetName();
+ if ( !eventName )
+ return;
+
+ C_BasePlayer *pLocalPlayer = C_BasePlayer::GetLocalPlayer();
+ if ( !pLocalPlayer )
+ return;
+
+ int team = event->GetInt( "team", TEAM_UNASSIGNED );
+ if ( team > TEAM_UNASSIGNED && team != pLocalPlayer->GetTeamNumber() )
+ return;
+
+ if ( FStrEq( eventName, "vote_cast" ) )
+ {
+ if ( m_bIsYesNoVote )
+ {
+ int vote_option = event->GetInt( "vote_option", TEAM_UNASSIGNED );
+ if( vote_option == VOTE_OPTION2 )
+ {
+ pLocalPlayer->EmitSound( "Vote.Cast.No" );
+ }
+ else if( vote_option == VOTE_OPTION1 )
+ {
+ pLocalPlayer->EmitSound( "Vote.Cast.Yes" );
+ }
+ }
+ else
+ {
+ pLocalPlayer->EmitSound( "Vote.Cast.Yes" );
+ }
+ }
+ }
+}
\ No newline at end of file |