summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorM. Kristall <mkpdev@gmail.com>2007-09-16 20:55:44 +0000
committerM. Kristall <mkpdev@gmail.com>2007-09-16 20:55:44 +0000
commit5647cc0a163e3e672931b756562a1ff0a8d33b3e (patch)
tree594d46c68f4fcd26b7cd0cdefd02bd8cd7a1c943
parent559a1fa0b7d47cf4827cd13035a2ac85b70c5487 (diff)
* (bug 3246) votes don't account for players leaving the game
-rw-r--r--src/game/g_client.c1
-rw-r--r--src/game/g_cmds.c52
-rw-r--r--src/game/g_local.h6
-rw-r--r--src/game/g_main.c94
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\"" );