diff options
author | M. Kristall <mkpdev@gmail.com> | 2007-09-16 20:55:44 +0000 |
---|---|---|
committer | M. Kristall <mkpdev@gmail.com> | 2007-09-16 20:55:44 +0000 |
commit | 5647cc0a163e3e672931b756562a1ff0a8d33b3e (patch) | |
tree | 594d46c68f4fcd26b7cd0cdefd02bd8cd7a1c943 | |
parent | 559a1fa0b7d47cf4827cd13035a2ac85b70c5487 (diff) |
* (bug 3246) votes don't account for players leaving the game
-rw-r--r-- | src/game/g_client.c | 1 | ||||
-rw-r--r-- | src/game/g_cmds.c | 52 | ||||
-rw-r--r-- | src/game/g_local.h | 6 | ||||
-rw-r--r-- | src/game/g_main.c | 94 |
4 files changed, 118 insertions, 35 deletions
diff --git a/src/game/g_client.c b/src/game/g_client.c index 041821a2..03c0fc50 100644 --- a/src/game/g_client.c +++ b/src/game/g_client.c @@ -1662,6 +1662,7 @@ void ClientDisconnect( int clientNum ) G_admin_namelog_update( ent->client, qtrue ); G_LeaveTeam( ent ); + G_Vote( ent, qfalse ); // stop any following clients for( i = 0; i < level.maxclients; i++ ) diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c index e362b40c..f93779f2 100644 --- a/src/game/g_cmds.c +++ b/src/game/g_cmds.c @@ -544,6 +544,8 @@ void G_LeaveTeam( gentity_t *self ) else return; + G_TeamVote( self, qfalse ); + for( i = 0; i < level.num_entities; i++ ) { ent = &g_entities[ i ]; @@ -1171,6 +1173,7 @@ void Cmd_CallVote_f( gentity_t *ent ) level.voteTime = level.time; level.voteYes = 1; level.voteNo = 0; + ent->client->pers.vote = qtrue; for( i = 0 ; i < level.maxclients ; i++ ) level.clients[i].ps.eFlags &= ~EF_VOTED; @@ -1179,8 +1182,8 @@ void Cmd_CallVote_f( gentity_t *ent ) trap_SetConfigstring( CS_VOTE_TIME, va( "%i", level.voteTime ) ); trap_SetConfigstring( CS_VOTE_STRING, level.voteDisplayString ); - trap_SetConfigstring( CS_VOTE_YES, va( "%i", level.voteYes ) ); - trap_SetConfigstring( CS_VOTE_NO, va( "%i", level.voteNo ) ); + trap_SetConfigstring( CS_VOTE_YES, "1" ) ); + trap_SetConfigstring( CS_VOTE_NO, "0" ); } /* @@ -1206,22 +1209,11 @@ void Cmd_Vote_f( gentity_t *ent ) trap_SendServerCommand( ent-g_entities, "print \"Vote cast\n\"" ); - ent->client->ps.eFlags |= EF_VOTED; - trap_Argv( 1, msg, sizeof( msg ) ); + ent->client->pers.vote = ( tolower( msg[ 0 ] ) == 'y' || msg[ 0 ] == '1' ); + G_Vote( ent, qtrue ); - if( msg[ 0 ] == 'y' || msg[ 1 ] == 'Y' || msg[ 1 ] == '1' ) - { - level.voteYes++; - trap_SetConfigstring( CS_VOTE_YES, va( "%i", level.voteYes ) ); - } - else - { - level.voteNo++; - trap_SetConfigstring( CS_VOTE_NO, va( "%i", level.voteNo ) ); - } - - // a majority will be determined in G_CheckVote, which will also account + // a majority will be determined in CheckVote, which will also account // for players entering or leaving } @@ -1415,6 +1407,7 @@ void Cmd_CallTeamVote_f( gentity_t *ent ) level.teamVoteTime[ cs_offset ] = level.time; level.teamVoteYes[ cs_offset ] = 1; level.teamVoteNo[ cs_offset ] = 0; + ent->client->pers.teamVote = qtrue; for( i = 0 ; i < level.maxclients ; i++ ) { @@ -1424,10 +1417,12 @@ void Cmd_CallTeamVote_f( gentity_t *ent ) ent->client->ps.eFlags |= EF_TEAMVOTED; - trap_SetConfigstring( CS_TEAMVOTE_TIME + cs_offset, va( "%i", level.teamVoteTime[ cs_offset ] ) ); - trap_SetConfigstring( CS_TEAMVOTE_STRING + cs_offset, level.teamVoteDisplayString[ cs_offset ] ); - trap_SetConfigstring( CS_TEAMVOTE_YES + cs_offset, va( "%i", level.teamVoteYes[ cs_offset ] ) ); - trap_SetConfigstring( CS_TEAMVOTE_NO + cs_offset, va( "%i", level.teamVoteNo[ cs_offset ] ) ); + trap_SetConfigstring( CS_TEAMVOTE_TIME + cs_offset, + va( "%i", level.teamVoteTime[ cs_offset ] ) ); + trap_SetConfigstring( CS_TEAMVOTE_STRING + cs_offset, + level.teamVoteDisplayString[ cs_offset ] ); + trap_SetConfigstring( CS_TEAMVOTE_YES + cs_offset, "1" ); + trap_SetConfigstring( CS_TEAMVOTE_NO + cs_offset, "0" ); } @@ -1458,22 +1453,11 @@ void Cmd_TeamVote_f( gentity_t *ent ) trap_SendServerCommand( ent-g_entities, "print \"Team vote cast\n\"" ); - ent->client->ps.eFlags |= EF_TEAMVOTED; - trap_Argv( 1, msg, sizeof( msg ) ); + ent->client->pers.teamVote = ( tolower( msg[ 0 ] ) == 'y' || msg[ 0 ] == '1' ); + G_TeamVote( ent, qtrue ); - if( msg[ 0 ] == 'y' || msg[ 1 ] == 'Y' || msg[ 1 ] == '1' ) - { - level.teamVoteYes[ cs_offset ]++; - trap_SetConfigstring( CS_TEAMVOTE_YES + cs_offset, va( "%i", level.teamVoteYes[ cs_offset ] ) ); - } - else - { - level.teamVoteNo[ cs_offset ]++; - trap_SetConfigstring( CS_TEAMVOTE_NO + cs_offset, va( "%i", level.teamVoteNo[ cs_offset ] ) ); - } - - // a majority will be determined in TeamCheckVote, which will also account + // a majority will be determined in CheckTeamVote, which will also account // for players entering or leaving } diff --git a/src/game/g_local.h b/src/game/g_local.h index fd423bea..c806086c 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -347,6 +347,10 @@ typedef struct int savedScore; int savedCredit; + // votes + qboolean vote; + qboolean teamVote; + vec3_t lastDeathLocation; char guid[ 33 ]; char ip[ 16 ]; @@ -946,6 +950,8 @@ void QDECL G_LogPrintf( const char *fmt, ... ); void SendScoreboardMessageToAllClients( void ); void QDECL G_Printf( const char *fmt, ... ); void QDECL G_Error( const char *fmt, ... ); +void G_Vote( gentity_t *ent, qboolean voting ); +void G_TeamVote( gentity_t *ent, qboolean voting ); void CheckVote( void ); void CheckTeamVote( int teamnum ); void LogExit( const char *string ); diff --git a/src/game/g_main.c b/src/game/g_main.c index 1ddee7eb..f6d4768b 100644 --- a/src/game/g_main.c +++ b/src/game/g_main.c @@ -1924,6 +1924,98 @@ void CheckExitRules( void ) } } +/* +================== +G_Vote +================== +*/ +void G_Vote( gentity_t *ent, qboolean voting ) +{ + if( !level.voteTime ) + return; + + if( voting ) + { + if( ent->client->ps.eFlags & EF_VOTED ) + return; + ent->client->ps.eFlags |= EF_VOTED; + } + else + { + if( !( ent->client->ps.eFlags & EF_VOTED ) ) + return; + ent->client->ps.eFlags &= ~EF_VOTED; + } + + if( ent->client->pers.vote ) + { + if( voting ) + level.voteYes++; + else + level.voteYes--; + trap_SetConfigstring( CS_VOTE_YES, va( "%d", level.voteYes ) ); + } + else + { + if( voting ) + level.voteNo++; + else + level.voteNo--; + trap_SetConfigstring( CS_VOTE_NO, va( "%d", level.voteNo ) ); + } +} + +/* +================== +G_TeamVote +================== +*/ +void G_CountTeamVote( gentity_t *ent, qboolean voting ) +{ + int cs_offset; + + if( ent->client->pers.teamSelection == PTE_HUMANS ) + cs_offset = 0; + else if( ent->client->pers.teamSelection == PTE_ALIENS ) + cs_offset = 1; + else + return; + + if( !level.teamVoteTime[ cs_offset ] ) + return; + + if( voting ) + { + if( ent->client->ps.eFlags & EF_TEAMVOTED ) + return; + ent->client->ps.eFlags |= EF_TEAMVOTED; + } + else + { + if( !( ent->client->ps.eFlags & EF_TEAMVOTED ) ) + return; + ent->client->ps.eFlags &= ~EF_TEAMVOTED; + } + + if( ent->client->pers.teamVote ) + { + if( voting ) + level.teamVoteYes[ cs_offset ]++; + else + level.teamVoteYes[ cs_offset ]--; + trap_SetConfigstring( CS_TEAMVOTE_YES + cs_offset, + va( "%d", level.teamVoteYes[ cs_offset ] ) ); + } + else + { + if( voting ) + level.teamVoteNo[ cs_offset ]++; + else + level.teamVoteNo[ cs_offset ]--; + trap_SetConfigstring( CS_TEAMVOTE_NO + cs_offset, + va( "%d", level.teamVoteNo[ cs_offset ] ) ); + } +} /* @@ -1979,7 +2071,7 @@ void CheckVote( void ) trap_SendServerCommand( -1, "print \"Vote passed\n\"" ); level.voteExecuteTime = level.time + 3000; } - else if( level.voteNo >= level.numVotingClients / 2 ) + else if( level.voteNo >= ceil( (float)level.numVotingClients / 2 ) ) { // same behavior as a timeout trap_SendServerCommand( -1, "print \"Vote failed\n\"" ); |