about summary refs log tree commit diff
path: root/src/game/server/gamecontroller.cpp
diff options
context:
space:
mode:
authorDominik Geyer <dominik.geyer@gmx.de>2008-10-19 18:38:23 +0000
committerDominik Geyer <dominik.geyer@gmx.de>2008-10-19 18:38:23 +0000
commit0b4c01ff0a8463575a65de9f72fe5dc2faf478ac (patch)
treed44e3e9abb1ed3373e37ad8d2d54df98e3a48a23 /src/game/server/gamecontroller.cpp
parent164d9c637dbd1d7f49667c784cf88e337c5a5ea2 (diff)
downloadzcatch-0b4c01ff0a8463575a65de9f72fe5dc2faf478ac.tar.gz
zcatch-0b4c01ff0a8463575a65de9f72fe5dc2faf478ac.zip
fix: only do balancing is teams are uneven; fix: check balance on disconnect; added check for balance after rcon-teamset; used patch from Oy with some modification
Diffstat (limited to 'src/game/server/gamecontroller.cpp')
-rw-r--r--src/game/server/gamecontroller.cpp56
1 files changed, 30 insertions, 26 deletions
diff --git a/src/game/server/gamecontroller.cpp b/src/game/server/gamecontroller.cpp
index 4ca84baf..ea76e897 100644
--- a/src/game/server/gamecontroller.cpp
+++ b/src/game/server/gamecontroller.cpp
@@ -377,37 +377,41 @@ void GAMECONTROLLER::tick()
 			}
 		}
 		
-		int m = (t[0] > t[1]) ? 0 : 1;
-		int num_balance = abs(t[0]-t[1]) / 2;
-		
-		do
+		// are teams unbalanced?
+		if(abs(t[0]-t[1]) >= 2)
 		{
-			PLAYER *p = 0;
-			int pd = tscore[m];
-			for(int i = 0; i < MAX_CLIENTS; i++)
+			int m = (t[0] > t[1]) ? 0 : 1;
+			int num_balance = abs(t[0]-t[1]) / 2;
+			
+			do
 			{
-				if(!game.players[i])
-					continue;
-				
-				// remember the player who would cause lowest score-difference
-				if(game.players[i]->team == m && (!p || abs((tscore[m^1]+game.players[i]->score) - (tscore[m]-game.players[i]->score)) < pd))
+				PLAYER *p = 0;
+				int pd = tscore[m];
+				for(int i = 0; i < MAX_CLIENTS; i++)
 				{
-					p = game.players[i];
-					pd = abs((tscore[m^1]+p->score) - (tscore[m]-p->score));
+					if(!game.players[i])
+						continue;
+					
+					// remember the player who would cause lowest score-difference
+					if(game.players[i]->team == m && (!p || abs((tscore[m^1]+game.players[i]->score) - (tscore[m]-game.players[i]->score)) < pd))
+					{
+						p = game.players[i];
+						pd = abs((tscore[m^1]+p->score) - (tscore[m]-p->score));
+					}
 				}
-			}
-			
-			// move the player to other team without losing his score
-			// TODO: change in player::set_team needed: player won't lose score on team-change
-			int score_before = p->score;
-			p->set_team(m^1);
-			p->score = score_before;
+				
+				// move the player to other team without losing his score
+				// TODO: change in player::set_team needed: player won't lose score on team-change
+				int score_before = p->score;
+				p->set_team(m^1);
+				p->score = score_before;
+				
+				p->respawn();
+				p->force_balanced = true;
+			} while (--num_balance);
 			
-			p->respawn();
-			p->force_balanced = true;
-		} while (--num_balance);
-		
-		force_balanced = true;
+			force_balanced = true;
+		}
 		unbalanced_tick = -1;
 	}