aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/client/hud_vote.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mp/src/game/client/hud_vote.cpp')
-rw-r--r--mp/src/game/client/hud_vote.cpp412
1 files changed, 240 insertions, 172 deletions
diff --git a/mp/src/game/client/hud_vote.cpp b/mp/src/game/client/hud_vote.cpp
index 64d3e76e..319255dd 100644
--- a/mp/src/game/client/hud_vote.cpp
+++ b/mp/src/game/client/hud_vote.cpp
@@ -59,7 +59,7 @@ public:
{
g_pVGuiLocalize->ConvertANSIToUnicode( pPlayerName, m_wszPlayerName, sizeof(m_wszPlayerName) );
SetLifetime( 7 );
- SetText( "#Vote_notification_text" );
+ SetText( "#GameUI_Vote_Notification_Text" );
AddStringToken( "initiator", m_wszPlayerName );
}
virtual bool CanBeTriggered()
@@ -68,7 +68,10 @@ public:
}
virtual void Trigger()
{
- CTFGenericConfirmDialog *pDialog = ShowConfirmDialog( "#Vote_notification_title", "#Vote_notification_text", "#Vote_notification_view", "#cancel", &ConfirmShowVoteSetup );
+ CTFGenericConfirmDialog *pDialog = ShowConfirmDialog( "#GameUI_Vote_Notification_Title",
+ "#GameUI_Vote_Notification_Text",
+ "#GameUI_Vote_Notification_View",
+ "#cancel", &ConfirmShowVoteSetup );
pDialog->SetContext( this );
pDialog->AddStringToken( "initiator", m_wszPlayerName );
// so we aren't deleted
@@ -95,7 +98,7 @@ public:
CHudVote *pHudVote = GET_HUDELEMENT( CHudVote );
if ( pHudVote )
{
- pHudVote->ShowVoteUI();
+ pHudVote->ShowVoteUI( true );
}
}
pNotification->SetIsInUse( false );
@@ -291,6 +294,76 @@ void CVoteSetupDialog::ApplySettings(KeyValues *inResourceData)
}
//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CVoteSetupDialog::InitializeIssueList( void )
+{
+ m_pComboBox->RemoveAll();
+ m_pComboBox->SetVisible( false );
+ SetDialogVariable( "combo_label", "" );
+
+ for ( int index = 0; index < m_VoteIssues.Count(); index++ )
+ {
+ if ( !m_VoteIssues[index].szName || !m_VoteIssues[index].szName[0] )
+ continue;
+
+ bool bActive = m_VoteIssues[index].bIsActive;
+
+ char szIssueLocalized[k_MAX_VOTE_NAME_LENGTH] = { 0 };
+ g_pVGuiLocalize->ConvertUnicodeToANSI( g_pVGuiLocalize->Find( m_VoteIssues[index].szNameString ), szIssueLocalized, sizeof( szIssueLocalized ) );
+
+ if ( !bActive )
+ {
+ char szDisabled[k_MAX_VOTE_NAME_LENGTH] = { 0 };
+ g_pVGuiLocalize->ConvertUnicodeToANSI( g_pVGuiLocalize->Find( "#GameUI_Vote_Disabled" ), szDisabled, sizeof( szDisabled ) );
+ V_strcat_safe( szIssueLocalized, szDisabled );
+ }
+
+ KeyValues *pKeyValues = new KeyValues( "Issue" );
+ pKeyValues->SetString( "Issue", szIssueLocalized );
+ pKeyValues->SetString( "IssueRaw", m_VoteIssues[index].szName );
+ pKeyValues->SetBool( "Active", m_VoteIssues[index].bIsActive );
+ int iId = m_pVoteSetupList->AddItem( 0, pKeyValues );
+ pKeyValues->deleteThis();
+
+ // Setup the list entry style
+ if ( m_hIssueFont != INVALID_FONT )
+ {
+ m_pVoteSetupList->SetItemFont( iId, m_hIssueFont );
+ Color colFG = bActive ? m_IssueFGColor : m_IssueFGColorDisabled;
+ m_pVoteSetupList->SetItemFgColor( iId, colFG );
+ }
+ }
+
+ // Select the first item by default
+ if ( m_pVoteSetupList->GetItemCount() > 0 )
+ {
+ m_pVoteSetupList->SetSelectedItem( 0 );
+ }
+ else
+ {
+ // No active issues
+ char szIssueLocalized[k_MAX_VOTE_NAME_LENGTH] = { 0 };
+ g_pVGuiLocalize->ConvertUnicodeToANSI( g_pVGuiLocalize->Find( "#GameUI_Vote_System_Disabled" ), szIssueLocalized, sizeof( szIssueLocalized ) );
+
+ KeyValues *pKeyValues = new KeyValues( "Issue" );
+ pKeyValues->SetString( "Issue", szIssueLocalized );
+ pKeyValues->SetString( "IssueRaw", "Disabled" );
+ pKeyValues->SetBool( "Active", false );
+ int iId = m_pVoteSetupList->AddItem( 0, pKeyValues );
+ pKeyValues->deleteThis();
+
+ if ( m_hIssueFont != INVALID_FONT )
+ {
+ m_pVoteSetupList->SetItemFont( iId, m_hIssueFont );
+ m_pVoteSetupList->SetItemFgColor( iId, m_IssueFGColor );
+ }
+ }
+
+ UpdateCurrentMap();
+}
+
+//-----------------------------------------------------------------------------
// Purpose: Keep track of the current map
//-----------------------------------------------------------------------------
void CVoteSetupDialog::UpdateCurrentMap( void )
@@ -302,7 +375,7 @@ void CVoteSetupDialog::UpdateCurrentMap( void )
//-----------------------------------------------------------------------------
// Purpose: Feeds Issues from the server to this Dialog
//-----------------------------------------------------------------------------
-void CVoteSetupDialog::AddVoteIssues( CUtlStringList &m_VoteSetupIssues )
+void CVoteSetupDialog::AddVoteIssues( CUtlVector< VoteIssue_t > &m_VoteSetupIssues )
{
m_VoteIssues.RemoveAll();
for ( int index = 0; index < m_VoteSetupIssues.Count(); index++ )
@@ -385,36 +458,7 @@ void CVoteSetupDialog::Activate()
m_pVoteParameterList->SetSectionFgColor( 1, m_HeaderFGColor );
}
- // Populate the Issue list
- for ( int index = 0; index < m_VoteIssues.Count(); index++ )
- {
- const char *pszIssue = m_VoteIssues[index];
- if ( !pszIssue || !pszIssue[0] )
- continue;
-
- KeyValues *pKeyValues = new KeyValues( "Issue" );
- pKeyValues->SetString( "Issue", pszIssue );
- int iId = m_pVoteSetupList->AddItem( 0, pKeyValues );
- pKeyValues->deleteThis();
-
- // Setup the list entry style
- if ( m_hIssueFont != INVALID_FONT )
- {
- m_pVoteSetupList->SetItemFont( iId, m_hIssueFont );
-
- bool bDisabled = V_stristr( pszIssue, "(Disabled on Server)" ); // driller: need to localize
- Color colFG = bDisabled ? m_IssueFGColorDisabled : m_IssueFGColor;
- m_pVoteSetupList->SetItemFgColor( iId, colFG );
- }
- }
-
- // Select the first item by default
- if ( m_pVoteSetupList->GetItemCount() > 0 )
- {
- m_pVoteSetupList->SetSelectedItem( 0 );
- }
-
- UpdateCurrentMap();
+ InitializeIssueList();
}
//-----------------------------------------------------------------------------
@@ -432,15 +476,15 @@ void CVoteSetupDialog::OnClose()
void CVoteSetupDialog::OnCommand(const char *command)
{
// We should have enough data to issue a CallVote command
- if ( V_stricmp( command, "CallVote" ) == 0 )
+ if ( !V_stricmp( command, "CallVote" ) )
{
int iSelectedItem = m_pVoteSetupList->GetSelectedItem();
if ( iSelectedItem >= 0 )
{
- char szVoteCommand[128];
+ char szVoteCommand[k_MAX_VOTE_NAME_LENGTH];
KeyValues *pIssueKeyValues = m_pVoteSetupList->GetItemData( iSelectedItem );
- const char *szIssue = pIssueKeyValues->GetString( "Issue" );
- if ( V_stricmp( "changelevel", szIssue ) == 0 || V_stricmp( "nextlevel", szIssue ) == 0 )
+ const char *szIssueRaw = pIssueKeyValues->GetString( "IssueRaw" );
+ if ( !V_stricmp( "ChangeLevel", szIssueRaw ) || !V_stricmp( "NextLevel", szIssueRaw ) )
{
int nSelectedParam = m_pVoteParameterList->GetSelectedItem();
if ( nSelectedParam >= 0 )
@@ -454,13 +498,13 @@ void CVoteSetupDialog::OnCommand(const char *command)
{
// Which Map?
const char *szMapName = pParameterKeyValues->GetString( "Name" );
- Q_snprintf( szVoteCommand, sizeof( szVoteCommand ), "callvote %s %s\n;", szIssue, szMapName );
+ Q_snprintf( szVoteCommand, sizeof( szVoteCommand ), "callvote %s %s\n;", szIssueRaw, szMapName );
engine->ClientCmd( szVoteCommand );
}
}
}
}
- else if ( V_stricmp( "kick", szIssue ) == 0 )
+ else if ( !V_stricmp( "Kick", szIssueRaw ) )
{
// Get selected Player
int iSelectedParam = m_pVoteParameterList->GetSelectedItem();
@@ -476,7 +520,7 @@ void CVoteSetupDialog::OnCommand(const char *command)
if ( engine->GetPlayerInfo( playerIndex, &playerInfo ) )
{
CBasePlayer *pPlayer = UTIL_PlayerByIndex( playerIndex );
- Q_snprintf( szVoteCommand, sizeof( szVoteCommand ), "callvote %s \"%d %s\"\n;", szIssue, pPlayer->GetUserID(), pReasonString );
+ Q_snprintf( szVoteCommand, sizeof( szVoteCommand ), "callvote %s \"%d %s\"\n;", szIssueRaw, pPlayer->GetUserID(), pReasonString );
engine->ClientCmd( szVoteCommand );
#ifdef TF_CLIENT_DLL
CSteamID steamID;
@@ -495,7 +539,7 @@ void CVoteSetupDialog::OnCommand(const char *command)
}
}
#ifdef TF_CLIENT_DLL
- else if ( V_stricmp( "ChangeMission", szIssue ) == 0 )
+ else if ( !V_stricmp( "ChangeMission", szIssueRaw ) )
{
int nSelectedParam = m_pVoteParameterList->GetSelectedItem();
if ( nSelectedParam >= 0 )
@@ -509,7 +553,7 @@ void CVoteSetupDialog::OnCommand(const char *command)
{
// Which Pop File?
const char *szPopFile = pParameterKeyValues->GetString( "Name" );
- Q_snprintf( szVoteCommand, sizeof( szVoteCommand ), "callvote %s %s\n;", szIssue, szPopFile );
+ Q_snprintf( szVoteCommand, sizeof( szVoteCommand ), "callvote %s %s\n;", szIssueRaw, szPopFile );
engine->ClientCmd( szVoteCommand );
}
}
@@ -519,7 +563,7 @@ void CVoteSetupDialog::OnCommand(const char *command)
else
{
// Non-parameter vote. i.e. callvote scrambleteams
- Q_snprintf( szVoteCommand, sizeof(szVoteCommand), "callvote %s\n;", szIssue );
+ Q_snprintf( szVoteCommand, sizeof(szVoteCommand), "callvote %s\n;", szIssueRaw );
engine->ClientCmd( szVoteCommand );
}
@@ -551,22 +595,23 @@ void CVoteSetupDialog::OnItemSelected( vgui::Panel *panel )
if ( !pIssueKeyValues )
return;
+ CHudVote *pHudVote = GET_HUDELEMENT( CHudVote );
+ if ( !pHudVote )
+ return;
+
// We're rebuilding, so clear state
m_bVoteButtonEnabled = false;
m_pVoteParameterList->ClearSelection();
m_pVoteParameterList->RemoveAll();
- const char *szName = pIssueKeyValues->GetString( "Issue" );
- if ( V_stricmp( "Voting disabled on this Server", szName ) == 0 )
- {
- m_bVoteButtonEnabled = false;
- }
- else if ( V_stristr( szName, "(Disabled on Server)" ) ) // driller: need to localize
+ const char *pszIssueRaw = pIssueKeyValues->GetString( "IssueRaw" );
+ bool bActive = pIssueKeyValues->GetBool( "Active" );
+ if ( !pHudVote->IsVoteSystemActive() || !bActive )
{
m_bVoteButtonEnabled = false;
}
// CHANGELEVEL / NEXTLEVEL
- else if ( V_stricmp( "changelevel", szName ) == 0 || V_stricmp( "nextlevel", szName ) == 0 )
+ else if ( !V_stricmp( "ChangeLevel", pszIssueRaw ) || !V_stricmp( "NextLevel", pszIssueRaw ) )
{
// Feed the mapcycle to the parameters list
for ( int index = 0; index < m_VoteIssuesMapCycle.Count(); index++ )
@@ -598,7 +643,7 @@ void CVoteSetupDialog::OnItemSelected( vgui::Panel *panel )
}
}
// KICK
- else if ( V_stricmp( "kick", szName ) == 0 )
+ else if ( !V_stricmp( "Kick", pszIssueRaw ) )
{
// Feed the player list to the parameters list
int nMaxClients = engine->GetMaxClients();
@@ -656,7 +701,7 @@ void CVoteSetupDialog::OnItemSelected( vgui::Panel *panel )
}
#ifdef TF_CLIENT_DLL
// CHANGE POP FILE
- else if ( V_stricmp( "ChangeMission", szName ) == 0 )
+ else if ( !V_stricmp( "ChangeMission", pszIssueRaw ) )
{
// Feed the popfiles to the parameters list
for ( int index = 0; index < m_VoteIssuesPopFiles.Count(); index++ )
@@ -742,8 +787,8 @@ void CVoteSetupDialog::RefreshIssueParameters()
if ( iSelectedItem >= 0 )
{
KeyValues *pIssueKeyValues = m_pVoteSetupList->GetItemData( iSelectedItem );
- const char *szName = pIssueKeyValues->GetString( "Issue" );
- if ( V_stricmp( "kick", szName ) == 0 )
+ const char *pszIssueRaw = pIssueKeyValues->GetString( "IssueRaw" );
+ if ( !V_stricmp( "Kick", pszIssueRaw ) )
{
if ( m_pVoteParameterList->GetItemCount() > 0 )
{
@@ -786,10 +831,10 @@ void CVoteSetupDialog::RefreshIssueParameters()
m_pVoteParameterList->InvalidateItem( index );
}
-
- m_pVoteParameterList->SetImageList( m_pImageList, false );
}
}
+
+ m_pVoteParameterList->SetImageList( m_pImageList, false );
}
}
@@ -799,9 +844,9 @@ void CVoteSetupDialog::RefreshIssueParameters()
void CVoteSetupDialog::ResetData()
{
m_bVoteButtonEnabled = false;
- m_pVoteSetupList->DeleteAllItems();
- m_pVoteParameterList->DeleteAllItems();
- m_pComboBox->DeleteAllItems();
+ m_pVoteSetupList->RemoveAll();
+ m_pVoteParameterList->RemoveAll();
+ m_pComboBox->RemoveAll();
}
//-----------------------------------------------------------------------------
@@ -863,7 +908,7 @@ void CHudVote::Init( void )
ListenForGameEvent( "vote_options" );
ListenForGameEvent( "vote_cast" );
- SetVoteActive( false );
+ m_bVotingActive = false;
m_flVoteResultCycleTime = -1;
m_flHideTime = -1;
m_bIsYesNoVote = true;
@@ -871,6 +916,8 @@ void CHudVote::Init( void )
m_nVoteChoicesCount = 2; // Yes/No is the default
m_bShowVoteActivePanel = false;
m_iVoteCallerIdx = -1;
+ m_bVoteSystemActive = false;
+ m_nVoteTeamIndex = 0;
HOOK_HUD_MESSAGE( CHudVote, CallVoteFailed );
HOOK_HUD_MESSAGE( CHudVote, VoteStart );
@@ -884,7 +931,7 @@ void CHudVote::Init( void )
//-----------------------------------------------------------------------------
void CHudVote::LevelInit( void )
{
- SetVoteActive( false );
+ m_bVotingActive = false;
m_flVoteResultCycleTime = -1;
m_flHideTime = -1;
m_flPostVotedHideTime = -1;
@@ -901,7 +948,7 @@ int CHudVote::KeyInput( int down, ButtonCode_t keynum, const char *pszCurrentBin
if ( !down )
return 1;
- if ( !m_bVoteActive )
+ if ( !m_bVotingActive )
return 1;
if ( m_bPlayerVoted )
@@ -979,21 +1026,19 @@ void CHudVote::MsgFunc_CallVoteFailed( bf_read &msg )
m_pCallVoteFailed->SetVisible( true );
m_pVoteSetupDialog->SetVisible( false );
- m_flHideTime = gpGlobals->curtime + 4.0;
+ m_flHideTime = gpGlobals->curtime + 4.f;
- char szTime[256];
- wchar_t wszTime[256];
+ char szTime[k_MAX_VOTE_NAME_LENGTH];
+ wchar_t wszTime[k_MAX_VOTE_NAME_LENGTH];
bool bMinutes = ( nTime > 65 );
if ( bMinutes )
{
nTime /= 60;
}
- const char *pszTimeString = ( bMinutes ) ? ( ( nTime < 2 ) ? "#GameUI_vote_failed_recently_min" : "#GameUI_vote_failed_recently_mins" ) : "#GameUI_vote_failed_recently";
Q_snprintf( szTime, sizeof ( szTime), "%i", nTime );
g_pVGuiLocalize->ConvertANSIToUnicode( szTime, wszTime, sizeof( wszTime ) );
- wchar_t wszHeaderString[512];
- wchar_t *pwszHeaderString;
+ wchar_t wszHeaderString[k_MAX_VOTE_NAME_LENGTH];
switch( nReason )
{
@@ -1006,10 +1051,12 @@ void CHudVote::MsgFunc_CallVoteFailed( bf_read &msg )
break;
case VOTE_FAILED_RATE_EXCEEDED:
- g_pVGuiLocalize->ConstructString( wszHeaderString, sizeof(wszHeaderString), g_pVGuiLocalize->Find( "#GameUI_vote_failed_vote_spam" ), 1, wszTime );
- pwszHeaderString = wszHeaderString;
- m_pCallVoteFailed->SetDialogVariable( "FailedReason", pwszHeaderString );
+ {
+ const char *pszTimeString = ( bMinutes ) ? ( ( nTime < 2 ) ? "#GameUI_vote_failed_vote_spam_min" : "#GameUI_vote_failed_vote_spam_mins" ) : "#GameUI_vote_failed_vote_spam";
+ g_pVGuiLocalize->ConstructString( wszHeaderString, sizeof( wszHeaderString ), g_pVGuiLocalize->Find( pszTimeString ), 1, wszTime );
+ m_pCallVoteFailed->SetDialogVariable( "FailedReason", wszHeaderString );
break;
+ }
case VOTE_FAILED_ISSUE_DISABLED:
m_pCallVoteFailed->SetControlString( "FailedReason", "#GameUI_vote_failed_disabled_issue" );
@@ -1028,10 +1075,12 @@ void CHudVote::MsgFunc_CallVoteFailed( bf_read &msg )
break;
case VOTE_FAILED_ON_COOLDOWN:
+ {
+ const char *pszTimeString = ( bMinutes ) ? ( ( nTime < 2 ) ? "#GameUI_vote_failed_recently_min" : "#GameUI_vote_failed_recently_mins" ) : "#GameUI_vote_failed_recently";
g_pVGuiLocalize->ConstructString( wszHeaderString, sizeof( wszHeaderString ), g_pVGuiLocalize->Find( pszTimeString ), 1, wszTime );
- pwszHeaderString = wszHeaderString;
- m_pCallVoteFailed->SetDialogVariable( "FailedReason", pwszHeaderString );
+ m_pCallVoteFailed->SetDialogVariable( "FailedReason", wszHeaderString );
break;
+ }
case VOTE_FAILED_TEAM_CANT_CALL:
m_pCallVoteFailed->SetControlString( "FailedReason", "#GameUI_vote_failed_team_cant_call" );
@@ -1058,10 +1107,12 @@ void CHudVote::MsgFunc_CallVoteFailed( bf_read &msg )
break;
case VOTE_FAILED_CANNOT_KICK_FOR_TIME:
- g_pVGuiLocalize->ConstructString( wszHeaderString, sizeof(wszHeaderString), g_pVGuiLocalize->Find( "#GameUI_vote_failed_cannot_kick_for_time" ), 1, wszTime );
- pwszHeaderString = wszHeaderString;
- m_pCallVoteFailed->SetDialogVariable( "FailedReason", pwszHeaderString );
+ {
+ const char *pszTimeString = ( bMinutes ) ? ( ( nTime < 2 ) ? "#GameUI_vote_failed_cannot_kick_min" : "#GameUI_vote_failed_cannot_kick_mins" ) : "#GameUI_vote_failed_cannot_kick";
+ g_pVGuiLocalize->ConstructString( wszHeaderString, sizeof( wszHeaderString ), g_pVGuiLocalize->Find( pszTimeString ), 1, wszTime );
+ m_pCallVoteFailed->SetDialogVariable( "FailedReason", wszHeaderString );
break;
+ }
case VOTE_FAILED_CANNOT_KICK_DURING_ROUND:
m_pCallVoteFailed->SetControlString( "FailedReason", "#GameUI_vote_failed_round_active" );
@@ -1070,6 +1121,14 @@ void CHudVote::MsgFunc_CallVoteFailed( bf_read &msg )
case VOTE_FAILED_MODIFICATION_ALREADY_ACTIVE:
m_pCallVoteFailed->SetControlString( "FailedReason", "#GameUI_vote_failed_event_already_active" );
break;
+
+ case VOTE_FAILED_VOTE_IN_PROGRESS:
+ m_pCallVoteFailed->SetControlString( "FailedReason", "#GameUI_vote_failed_vote_in_progress" );
+ break;
+
+ case VOTE_FAILED_KICK_LIMIT_REACHED:
+ m_pCallVoteFailed->SetControlString( "FailedReason", "#GameUI_vote_failed_kick_limit" );
+ break;
}
}
@@ -1081,14 +1140,14 @@ void CHudVote::MsgFunc_VoteFailed( bf_read &msg )
if ( IsPlayingDemo() )
return;
- int iTeam = msg.ReadByte();
+ m_nVoteTeamIndex = msg.ReadByte();
vote_create_failed_t nReason = (vote_create_failed_t)msg.ReadByte();
// Visibility of this error is handled by OnThink()
- SetVoteActive( false );
+ m_bVotingActive = false;
m_bVotePassed = false;
- m_flVoteResultCycleTime = gpGlobals->curtime + 2;
- m_flHideTime = gpGlobals->curtime + 5;
+ m_flVoteResultCycleTime = gpGlobals->curtime + 2.f;
+ m_flHideTime = gpGlobals->curtime + 5.f;
switch ( nReason )
{
@@ -1105,11 +1164,10 @@ void CHudVote::MsgFunc_VoteFailed( bf_read &msg )
break;
}
- // driller: this event has no listeners - will eventually hook into stats
IGameEvent *event = gameeventmanager->CreateEvent( "vote_failed" );
if ( event )
{
- event->SetInt( "team", iTeam );
+ event->SetInt( "team", m_nVoteTeamIndex );
gameeventmanager->FireEventClientSide( event );
}
@@ -1117,7 +1175,11 @@ void CHudVote::MsgFunc_VoteFailed( bf_read &msg )
if ( !pLocalPlayer )
return;
- pLocalPlayer->EmitSound("Vote.Failed");
+ bool bShowToPlayer = ( !m_nVoteTeamIndex || pLocalPlayer->GetTeamNumber() == m_nVoteTeamIndex );
+ if ( bShowToPlayer )
+ {
+ pLocalPlayer->EmitSound("Vote.Failed");
+ }
}
//-----------------------------------------------------------------------------
@@ -1133,9 +1195,8 @@ void CHudVote::MsgFunc_VoteStart( bf_read &msg )
return;
// Is this a team-only vote?
- int iTeam = msg.ReadByte();
- uint8 invalidTeam = (uint8)TEAM_INVALID;
- if ( iTeam != invalidTeam && iTeam != pLocalPlayer->GetTeamNumber() )
+ m_nVoteTeamIndex = msg.ReadByte();
+ if ( m_nVoteTeamIndex >= FIRST_GAME_TEAM && m_nVoteTeamIndex != pLocalPlayer->GetTeamNumber() )
return;
// Entity calling the vote
@@ -1163,18 +1224,18 @@ void CHudVote::MsgFunc_VoteStart( bf_read &msg )
}
// DisplayString
- char szIssue[256];
+ char szIssue[k_MAX_VOTE_NAME_LENGTH];
szIssue[0] = 0;
msg.ReadString( szIssue, sizeof(szIssue) );
// DetailString
- char szParam1[256];
+ char szParam1[k_MAX_VOTE_NAME_LENGTH];
szParam1[0] = 0;
msg.ReadString( szParam1, sizeof(szParam1) );
m_bIsYesNoVote = msg.ReadByte();
- SetVoteActive( true );
+ m_bVotingActive = true;
m_pVoteFailed->SetVisible( false );
m_pVotePassed->SetVisible( false );
m_pCallVoteFailed->SetVisible( false );
@@ -1204,25 +1265,23 @@ void CHudVote::MsgFunc_VoteStart( bf_read &msg )
// Display vote caller's name
wchar_t wszCallerName[MAX_PLAYER_NAME_LENGTH];
- wchar_t wszHeaderString[512];
- wchar_t *pwszHeaderString;
+ wchar_t wszHeaderString[k_MAX_VOTE_NAME_LENGTH];
// Player
g_pVGuiLocalize->ConvertANSIToUnicode( pszCallerName, wszCallerName, sizeof( wszCallerName ) );
// String
- g_pVGuiLocalize->ConstructString( wszHeaderString, sizeof(wszHeaderString), g_pVGuiLocalize->Find( "#GameUI_vote_header" ), 1, wszCallerName );
- pwszHeaderString = wszHeaderString;
+ g_pVGuiLocalize->ConstructString( wszHeaderString, sizeof( wszHeaderString ), g_pVGuiLocalize->Find( "#GameUI_vote_header" ), 1, wszCallerName );
// Final
- m_pVoteActive->SetDialogVariable( "header", pwszHeaderString );
+ m_pVoteActive->SetDialogVariable( "header", wszHeaderString );
// Display the Issue
wchar_t *pwcParam;
- wchar_t wcParam[128];
+ wchar_t wcParam[k_MAX_VOTE_NAME_LENGTH];
wchar_t *pwcIssue;
- wchar_t wcIssue[512];
+ wchar_t wcIssue[k_MAX_VOTE_NAME_LENGTH];
if ( Q_strlen( szParam1 ) > 0 )
{
@@ -1252,7 +1311,7 @@ void CHudVote::MsgFunc_VoteStart( bf_read &msg )
if ( m_bIsYesNoVote )
{
// YES / NO UI
- wchar_t wzFinal[512] = L"";
+ wchar_t wzFinal[k_MAX_VOTE_NAME_LENGTH] = L"";
wchar_t *pszText = g_pVGuiLocalize->Find( "#GameUI_vote_yes_pc_instruction" );
if ( pszText )
{
@@ -1294,7 +1353,7 @@ void CHudVote::MsgFunc_VoteStart( bf_read &msg )
// Construct Option name
const char *pszChoiceName = m_VoteSetupChoices[iIndex];
- char szOptionName[256];
+ char szOptionName[k_MAX_VOTE_NAME_LENGTH];
Q_snprintf( szOptionName, sizeof( szOptionName ), "F%i. ", iIndex + 1 );
Q_strncat( szOptionName, pszChoiceName, sizeof( szOptionName ), COPY_ALL_CHARACTERS );
@@ -1320,7 +1379,7 @@ void CHudVote::MsgFunc_VoteStart( bf_read &msg )
{
event->SetString( "issue", szIssue );
event->SetString( "param1", szParam1 );
- event->SetInt( "team", iTeam );
+ event->SetInt( "team", m_nVoteTeamIndex );
event->SetInt( "initiator", m_iVoteCallerIdx );
gameeventmanager->FireEventClientSide( event );
}
@@ -1332,10 +1391,10 @@ void CHudVote::MsgFunc_VoteStart( bf_read &msg )
}
else
{
- ShowVoteUI();
+ m_bShowVoteActivePanel = true;
}
#else
- ShowVoteUI();
+ m_bShowVoteActivePanel = true;
#endif // TF_CLIENT_DLL
}
@@ -1347,24 +1406,24 @@ void CHudVote::MsgFunc_VotePass( bf_read &msg )
if ( IsPlayingDemo() )
return;
- int iTeam = msg.ReadByte();
+ m_nVoteTeamIndex = msg.ReadByte();
// Passed string
- char szResult[256];
+ char szResult[k_MAX_VOTE_NAME_LENGTH];
szResult[0] = 0;
msg.ReadString( szResult, sizeof(szResult) );
// Detail string
- char szParam1[256];
+ char szParam1[k_MAX_VOTE_NAME_LENGTH];
szParam1[0] = 0;
msg.ReadString( szParam1, sizeof(szParam1) );
// Localize
wchar_t *pwcParam;
- wchar_t wcParam[128];
+ wchar_t wcParam[k_MAX_VOTE_NAME_LENGTH];
wchar_t *pwcIssue;
- wchar_t wcIssue[512];
+ wchar_t wcIssue[k_MAX_VOTE_NAME_LENGTH];
if ( Q_strlen( szParam1 ) > 0 )
{
@@ -1390,10 +1449,10 @@ void CHudVote::MsgFunc_VotePass( bf_read &msg )
m_pVotePassed->SetDialogVariable( "passedresult", pwcIssue );
- SetVoteActive( false );
+ m_bVotingActive = false;
m_bVotePassed = true;
- m_flVoteResultCycleTime = gpGlobals->curtime + 2;
- m_flHideTime = gpGlobals->curtime + 5;
+ m_flVoteResultCycleTime = gpGlobals->curtime + 2.f;
+ m_flHideTime = gpGlobals->curtime + 5.f;
// driller: this event has no listeners - will eventually hook into stats
IGameEvent *event = gameeventmanager->CreateEvent( "vote_passed" );
@@ -1401,7 +1460,7 @@ void CHudVote::MsgFunc_VotePass( bf_read &msg )
{
event->SetString( "details", szResult );
event->SetString( "param1", szParam1 );
- event->SetInt( "team", iTeam );
+ event->SetInt( "team", m_nVoteTeamIndex );
gameeventmanager->FireEventClientSide( event );
}
@@ -1434,21 +1493,45 @@ void CHudVote::MsgFunc_VoteSetup( bf_read &msg )
int nIssueCount = msg.ReadByte();
if ( nIssueCount )
{
- for ( int index = 0; index < nIssueCount; index++ )
+ for ( int i = 0; i < nIssueCount; i++ )
{
- char szIssue[256];
- msg.ReadString( szIssue, sizeof(szIssue) );
- if ( !m_VoteSetupIssues.HasElement( szIssue ) )
+ char szIssue[k_MAX_VOTE_NAME_LENGTH];
+ char szIssueString[k_MAX_VOTE_NAME_LENGTH];
+ msg.ReadString( szIssue, sizeof( szIssue ) );
+ msg.ReadString( szIssueString, sizeof( szIssueString ) );
+ bool bIsActive = (bool)msg.ReadByte();
+
+ m_bVoteSystemActive |= bIsActive;
+
+ bool bAdd = true;
+ FOR_EACH_VEC( m_VoteSetupIssues, j )
+ {
+ if ( !V_strcmp( szIssue, m_VoteSetupIssues[j].szName ) )
+ {
+ bAdd = false;
+ break;
+ }
+ }
+
+ if ( bAdd )
{
+ // When empty, assume that we just pre-pend #Vote_ to szIssue (reduces msg size)
+ if ( !szIssueString[0] )
+ {
+ V_sprintf_safe( szIssueString, "#Vote_%s", szIssue );
+ }
+
+ VoteIssue_t issue;
+ V_strcpy_safe( issue.szName, szIssue );
+ V_strcpy_safe( issue.szNameString, szIssueString );
+ issue.bIsActive = bIsActive;
+
// Send it over to the listpanel
- m_VoteSetupIssues.CopyAndAddToTail( szIssue );
+ m_VoteSetupIssues.AddToTail( issue );
}
}
}
- else
- {
- m_VoteSetupIssues.CopyAndAddToTail( "Voting disabled on this Server" );
- }
+
m_pVoteSetupDialog->AddVoteIssues( m_VoteSetupIssues );
// Load up the list of Vote Issue Parameters
@@ -1638,50 +1721,51 @@ void CHudVote::FireGameEvent( IGameEvent *event )
//-----------------------------------------------------------------------------
void CHudVote::OnThink()
{
- // We delay hiding the menu after we cast a vote
- if ( m_bPlayerVoted && m_flPostVotedHideTime > 0 && m_flPostVotedHideTime < gpGlobals->curtime )
- {
- m_pVoteActive->SetVisible( false );
- m_bShowVoteActivePanel = false;
- m_flPostVotedHideTime = -1;
- }
-
- if ( m_flVoteResultCycleTime > 0 && m_flVoteResultCycleTime < gpGlobals->curtime )
+ C_BasePlayer *pLocalPlayer = C_BasePlayer::GetLocalPlayer();
+ if ( pLocalPlayer )
{
- m_pVoteActive->SetVisible( false );
- m_pVoteFailed->SetVisible( !m_bVotePassed );
- m_pVotePassed->SetVisible( m_bVotePassed );
- g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( m_pVoteActive, "HideVoteBackgrounds" );
-
- m_flVoteResultCycleTime = -1;
- m_bPlayerVoted = false;
- m_bVoteActive = false;
- m_bShowVoteActivePanel = false;
- m_iVoteCallerIdx = -1;
- }
+ bool bShowToPlayer = ( !m_nVoteTeamIndex || pLocalPlayer->GetTeamNumber() == m_nVoteTeamIndex );
- if ( m_bVoteActive )
- {
- // driller: Need to rewrite this to handle all vote types (Yes/No and General)
- if ( m_bIsYesNoVote && m_pVoteActive )
+ // We delay hiding the menu after we cast a vote
+ if ( m_bPlayerVoted && m_flPostVotedHideTime > 0 && gpGlobals->curtime > m_flPostVotedHideTime )
{
- char szYesCount[512] = "";
- Q_snprintf( szYesCount, 512, "%d", m_nVoteOptionCount[0] );
-
- char szNoCount[512] = "";
- Q_snprintf( szNoCount, 512, "%d", m_nVoteOptionCount[1] );
+ m_pVoteActive->SetVisible( false );
+ m_bShowVoteActivePanel = false;
+ m_flPostVotedHideTime = -1;
+ }
- m_pVoteActive->SetControlString( "Option1CountLabel", szYesCount );
- m_pVoteActive->SetControlString( "Option2CountLabel", szNoCount );
+ if ( m_flVoteResultCycleTime > 0 && gpGlobals->curtime > m_flVoteResultCycleTime )
+ {
+ m_pVoteActive->SetVisible( false );
+ m_pVoteFailed->SetVisible( !m_bVotePassed && bShowToPlayer );
+ m_pVotePassed->SetVisible( m_bVotePassed && bShowToPlayer );
+ g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( m_pVoteActive, "HideVoteBackgrounds" );
+
+ m_flVoteResultCycleTime = -1;
+ m_bPlayerVoted = false;
+ m_bVotingActive = false;
+ m_bShowVoteActivePanel = false;
+ m_iVoteCallerIdx = -1;
}
- if ( !m_pVoteActive->IsVisible() && m_bShowVoteActivePanel )
+ if ( m_bVotingActive && m_bShowVoteActivePanel )
{
- m_pVoteActive->SetVisible( true );
+ // driller: Need to rewrite this to handle all vote types (Yes/No and General)
+ if ( m_bIsYesNoVote && m_pVoteActive )
+ {
+ char szYesCount[k_MAX_VOTE_NAME_LENGTH] = "";
+ Q_snprintf( szYesCount, sizeof( szYesCount ), "%d", m_nVoteOptionCount[0] );
- C_BasePlayer *pLocalPlayer = C_BasePlayer::GetLocalPlayer();
- if ( pLocalPlayer )
+ char szNoCount[k_MAX_VOTE_NAME_LENGTH] = "";
+ Q_snprintf( szNoCount, sizeof( szNoCount ), "%d", m_nVoteOptionCount[1] );
+
+ m_pVoteActive->SetControlString( "Option1CountLabel", szYesCount );
+ m_pVoteActive->SetControlString( "Option2CountLabel", szNoCount );
+ }
+
+ if ( !m_pVoteActive->IsVisible() && bShowToPlayer )
{
+ m_pVoteActive->SetVisible( true );
pLocalPlayer->EmitSound("Vote.Created");
}
}
@@ -1695,7 +1779,7 @@ void CHudVote::OnThink()
//-----------------------------------------------------------------------------
bool CHudVote::ShouldDraw( void )
{
- return ( m_bVoteActive || m_flHideTime > gpGlobals->curtime );
+ return ( m_bVotingActive || gpGlobals->curtime < m_flHideTime );
}
//-----------------------------------------------------------------------------
@@ -1709,22 +1793,6 @@ bool CHudVote::IsPlayingDemo() const
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
-void CHudVote::SetVoteActive( bool bActive )
-{
- m_bVoteActive = bActive;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-void CHudVote::ShowVoteUI( void )
-{
- m_bShowVoteActivePanel = true;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
bool CHudVote::IsVoteUIActive( void )
{
return m_bShowVoteActivePanel;