diff options
-rw-r--r-- | src/economy.cpp | 1 | ||||
-rw-r--r-- | src/openttd.cpp | 21 | ||||
-rw-r--r-- | src/players.cpp | 5 |
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; } |