(svn r1023) -Fix: [Network] [ 1083692 ] You can no longer buy out a company in MP

because of the lag between commands (anyway, I hope)
This commit is contained in:
truelight 2004-12-12 14:00:25 +00:00
parent e027fa76b1
commit 397bd915a3
2 changed files with 12 additions and 3 deletions

View File

@ -1466,6 +1466,8 @@ static void DoAcquireCompany(Player *p)
DeletePlayerWindows(pi); DeletePlayerWindows(pi);
} }
extern int GetAmountOwnedBy(Player *p, byte owner);
int32 CmdBuyShareInCompany(int x, int y, uint32 flags, uint32 p1, uint32 p2) int32 CmdBuyShareInCompany(int x, int y, uint32 flags, uint32 p1, uint32 p2)
{ {
Player *p; Player *p;
@ -1476,6 +1478,13 @@ int32 CmdBuyShareInCompany(int x, int y, uint32 flags, uint32 p1, uint32 p2)
SET_EXPENSES_TYPE(EXPENSES_OTHER); SET_EXPENSES_TYPE(EXPENSES_OTHER);
p = DEREF_PLAYER(p1); p = DEREF_PLAYER(p1);
/* Those lines are here for network-protection (clients can be slow) */
if (GetAmountOwnedBy(p, OWNER_SPECTATOR) == 0)
return 0;
/* We can not buy out a real player in networking */
if (GetAmountOwnedBy(p, OWNER_SPECTATOR) == 1 && !p->is_ai)
return 0;
cost = CalculateCompanyValue(p) >> 2; cost = CalculateCompanyValue(p) >> 2;
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
b = p->share_owners; b = p->share_owners;

View File

@ -443,7 +443,7 @@ static void DrawPlayerVehiclesAmount(int player)
} }
} }
static int GetAmountOwnedBy(Player *p, byte owner) int GetAmountOwnedBy(Player *p, byte owner)
{ {
return (p->share_owners[0] == owner) + return (p->share_owners[0] == owner) +
(p->share_owners[1] == owner) + (p->share_owners[1] == owner) +
@ -489,10 +489,10 @@ static void PlayerCompanyWndProc(Window *w, WindowEvent *e)
SetDParam(2, GetPlayerNameString((byte)w->window_number, 3)); SetDParam(2, GetPlayerNameString((byte)w->window_number, 3));
dis = 0; dis = 0;
if (GetAmountOwnedBy(p, 0xFF) == 0) dis |= 1 << 9; if (GetAmountOwnedBy(p, OWNER_SPECTATOR) == 0) dis |= 1 << 9;
// Also disable the buy button if 25% is not-owned by someone // Also disable the buy button if 25% is not-owned by someone
// and the player is not an AI // and the player is not an AI
if (GetAmountOwnedBy(p, 0xFF) == 1 && !p->is_ai) dis |= 1 << 9; if (GetAmountOwnedBy(p, OWNER_SPECTATOR) == 1 && !p->is_ai) dis |= 1 << 9;
if (GetAmountOwnedBy(p, _local_player) == 0) dis |= 1 << 10; if (GetAmountOwnedBy(p, _local_player) == 0) dis |= 1 << 10;
w->disabled_state = dis; w->disabled_state = dis;