summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2007-12-28 18:25:30 +0000
committersmatz <smatz@openttd.org>2007-12-28 18:25:30 +0000
commit108ab3b91066ec1f97770401ba31f0afb681e794 (patch)
treeca35c0f55d6809f32b3fbf9c31c826a29d785ac7 /src
parentc87f20ff37e710575246ee31902c9a7b2235e111 (diff)
downloadopenttd-108ab3b91066ec1f97770401ba31f0afb681e794.tar.xz
(svn r11717) -Fix [FS#1590]: make sure invalid players have all shares owned by PLAYER_SPECTATOR
Diffstat (limited to 'src')
-rw-r--r--src/economy.cpp1
-rw-r--r--src/openttd.cpp21
-rw-r--r--src/players.cpp5
3 files changed, 25 insertions, 2 deletions
diff --git a/src/economy.cpp b/src/economy.cpp
index d05950ea3..862d97089 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -285,6 +285,7 @@ void ChangeOwnershipOfPlayerItems(PlayerID old_player, PlayerID new_player)
/* 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 */
diff --git a/src/openttd.cpp b/src/openttd.cpp
index 1bdb75a6b..8ae851f53 100644
--- a/src/openttd.cpp
+++ b/src/openttd.cpp
@@ -2239,14 +2239,33 @@ bool AfterLoadGame()
}
}
- /* 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();
diff --git a/src/players.cpp b/src/players.cpp
index 2443966e7..430a7811e 100644
--- a/src/players.cpp
+++ b/src/players.cpp
@@ -544,7 +544,10 @@ static void MaybeStartNewPlayer()
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;
}