changeset 8155:2ca155c0aef1 draft

(svn r11717) -Fix [FS#1590]: make sure invalid players have all shares owned by PLAYER_SPECTATOR
author smatz <smatz@openttd.org>
date Fri, 28 Dec 2007 18:25:30 +0000
parents 5143b10911a1
children 3e4ffe08b4a3
files src/economy.cpp src/openttd.cpp src/players.cpp
diffstat 3 files changed, 25 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -285,6 +285,7 @@
 		/* See if the old_player had shares in other companies */
 		_current_player = old_player;
 		FOR_ALL_PLAYERS(p) {
+			if (!p->is_active) continue;
 			for (i = 0; i < 4; i++) {
 				if (p->share_owners[i] == old_player) {
 					/* Sell his shares */
--- a/src/openttd.cpp
+++ b/src/openttd.cpp
@@ -2239,14 +2239,33 @@
 		}
 	}
 
-	/* Update go to buoy orders because they are just waypoints */
 	if (CheckSavegameVersion(84)) {
+		/* Update go to buoy orders because they are just waypoints */
 		Order *order;
 		FOR_ALL_ORDERS(order) {
 			if (order->type == OT_GOTO_STATION && GetStation(order->dest)->IsBuoy()) {
 				order->flags = 0;
 			}
 		}
+
+		/* Set all share owners to PLAYER_SPECTATOR for
+		 * 1) all inactive players
+		 *     (when inactive players were stored in the savegame - TTD, TTDP and some
+		 *      *really* old revisions of OTTD; else it is already set in InitializePlayers())
+		 * 2) shares that are owned by inactive players or self
+		 *     (caused by cheating players in earlier revisions) */
+		Player *p;
+		FOR_ALL_PLAYERS(p) {
+			if (!p->is_active) {
+				for (uint i = 0; i < 4; i++) { p->share_owners[i] = PLAYER_SPECTATOR; }
+			} else {
+				for (uint i = 0; i < 4; i++) {
+					PlayerID o = p->share_owners[i];
+					if (o == PLAYER_SPECTATOR) continue;
+					if (!IsValidPlayer(o) || o == p->index || !GetPlayer(o)->is_active) p->share_owners[i] = PLAYER_SPECTATOR;
+				}
+			}
+		}
 	}
 
 	return InitializeWindowsAndCaches();
--- a/src/players.cpp
+++ b/src/players.cpp
@@ -544,7 +544,10 @@
 void InitializePlayers()
 {
 	memset(_players, 0, sizeof(_players));
-	for (PlayerID i = PLAYER_FIRST; i != MAX_PLAYERS; i++) _players[i].index = i;
+	for (PlayerID i = PLAYER_FIRST; i != MAX_PLAYERS; i++) {
+		_players[i].index = i;
+		for (uint j = 0; j < 4; j++) _players[i].share_owners[j] = PLAYER_SPECTATOR;
+	}
 	_cur_player_tick_index = 0;
 }