Mercurial > hg > openttd
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; }