network/network_server.c
author celestar
Wed, 03 Jan 2007 08:32:17 +0000
branchcustombridgeheads
changeset 5642 bfa6074e2833
permissions -rw-r--r--
(svn r7789) [cbh] - Sync with r7720:7758 from trunk
5642
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     1
/* $Id$ */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     2
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     3
#ifdef ENABLE_NETWORK
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     4
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     5
#include "../stdafx.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     6
#include "../openttd.h" // XXX StringID
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     7
#include "../debug.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     8
#include "../string.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     9
#include "../strings.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    10
#include "network_data.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    11
#include "core/tcp.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    12
#include "../train.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    13
#include "../date.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    14
#include "../table/strings.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    15
#include "../functions.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    16
#include "network_server.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    17
#include "network_udp.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    18
#include "../console.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    19
#include "../command.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    20
#include "../saveload.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    21
#include "../vehicle.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    22
#include "../station.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    23
#include "../variables.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    24
#include "../genworld.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    25
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    26
// This file handles all the server-commands
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    27
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    28
static void NetworkHandleCommandQueue(NetworkClientState* cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    29
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    30
// **********
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    31
// Sending functions
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    32
//   DEF_SERVER_SEND_COMMAND has parameter: NetworkClientState *cs
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    33
// **********
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    34
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    35
DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_CLIENT_INFO)(NetworkClientState *cs, NetworkClientInfo *ci)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    36
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    37
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    38
	// Packet: SERVER_CLIENT_INFO
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    39
	// Function: Sends info about a client
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    40
	// Data:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    41
	//    uint16:  The index of the client (always unique on a server. 1 = server)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    42
	//    uint8:  As which player the client is playing
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    43
	//    String: The name of the client
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    44
	//    String: The unique id of the client
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    45
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    46
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    47
	if (ci->client_index != NETWORK_EMPTY_INDEX) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    48
		Packet *p = NetworkSend_Init(PACKET_SERVER_CLIENT_INFO);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    49
		NetworkSend_uint16(p, ci->client_index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    50
		NetworkSend_uint8 (p, ci->client_playas);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    51
		NetworkSend_string(p, ci->client_name);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    52
		NetworkSend_string(p, ci->unique_id);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    53
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    54
		NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    55
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    56
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    57
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    58
DEF_SERVER_SEND_COMMAND(PACKET_SERVER_COMPANY_INFO)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    59
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    60
//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    61
	// Packet: SERVER_COMPANY_INFO
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    62
	// Function: Sends info about the companies
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    63
	// Data:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    64
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    65
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    66
	int i;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    67
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    68
	Player *player;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    69
	Packet *p;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    70
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    71
	byte active = ActivePlayerCount();
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    72
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    73
	if (active == 0) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    74
		p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    75
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    76
		NetworkSend_uint8 (p, NETWORK_COMPANY_INFO_VERSION);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    77
		NetworkSend_uint8 (p, active);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    78
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    79
		NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    80
		return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    81
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    82
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    83
	NetworkPopulateCompanyInfo();
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    84
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    85
	FOR_ALL_PLAYERS(player) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    86
		if (!player->is_active) continue;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    87
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    88
		p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    89
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    90
		NetworkSend_uint8 (p, NETWORK_COMPANY_INFO_VERSION);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    91
		NetworkSend_uint8 (p, active);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    92
		NetworkSend_uint8 (p, player->index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    93
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    94
		NetworkSend_string(p, _network_player_info[player->index].company_name);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    95
		NetworkSend_uint32(p, _network_player_info[player->index].inaugurated_year);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    96
		NetworkSend_uint64(p, _network_player_info[player->index].company_value);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    97
		NetworkSend_uint64(p, _network_player_info[player->index].money);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    98
		NetworkSend_uint64(p, _network_player_info[player->index].income);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    99
		NetworkSend_uint16(p, _network_player_info[player->index].performance);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   100
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   101
		/* Send 1 if there is a passord for the company else send 0 */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   102
		if (_network_player_info[player->index].password[0] != '\0') {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   103
			NetworkSend_uint8(p, 1);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   104
		} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   105
			NetworkSend_uint8(p, 0);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   106
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   107
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   108
		for (i = 0; i < NETWORK_VEHICLE_TYPES; i++) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   109
			NetworkSend_uint16(p, _network_player_info[player->index].num_vehicle[i]);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   110
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   111
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   112
		for (i = 0; i < NETWORK_STATION_TYPES; i++) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   113
			NetworkSend_uint16(p, _network_player_info[player->index].num_station[i]);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   114
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   115
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   116
		if (_network_player_info[player->index].players[0] == '\0') {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   117
			NetworkSend_string(p, "<none>");
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   118
		} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   119
			NetworkSend_string(p, _network_player_info[player->index].players);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   120
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   121
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   122
		NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   123
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   124
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   125
	p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   126
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   127
	NetworkSend_uint8 (p, NETWORK_COMPANY_INFO_VERSION);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   128
	NetworkSend_uint8 (p, 0);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   129
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   130
	NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   131
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   132
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   133
DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR)(NetworkClientState *cs, NetworkErrorCode error)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   134
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   135
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   136
	// Packet: SERVER_ERROR
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   137
	// Function: The client made an error
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   138
	// Data:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   139
	//    uint8:  ErrorID (see network_data.h, NetworkErrorCode)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   140
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   141
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   142
	char str[100];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   143
	Packet *p = NetworkSend_Init(PACKET_SERVER_ERROR);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   144
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   145
	NetworkSend_uint8(p, error);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   146
	NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   147
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   148
	GetNetworkErrorMsg(str, error, lastof(str));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   149
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   150
	// Only send when the current client was in game
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   151
	if (cs->status > STATUS_AUTH) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   152
		NetworkClientState *new_cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   153
		char client_name[NETWORK_CLIENT_NAME_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   154
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   155
		NetworkGetClientName(client_name, sizeof(client_name), cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   156
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   157
		DEBUG(net, 1, "'%s' made an error and has been disconnected. Reason: '%s'", client_name, str);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   158
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   159
		NetworkTextMessage(NETWORK_ACTION_LEAVE, 1, false, client_name, "%s", str);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   160
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   161
		FOR_ALL_CLIENTS(new_cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   162
			if (new_cs->status > STATUS_AUTH && new_cs != cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   163
				// Some errors we filter to a more general error. Clients don't have to know the real
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   164
				//  reason a joining failed.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   165
				if (error == NETWORK_ERROR_NOT_AUTHORIZED || error == NETWORK_ERROR_NOT_EXPECTED || error == NETWORK_ERROR_WRONG_REVISION)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   166
					error = NETWORK_ERROR_ILLEGAL_PACKET;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   167
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   168
				SEND_COMMAND(PACKET_SERVER_ERROR_QUIT)(new_cs, cs->index, error);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   169
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   170
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   171
	} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   172
		DEBUG(net, 1, "Client %d made an error and has been disconnected. Reason: '%s'", cs->index, str);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   173
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   174
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   175
	cs->has_quit = true;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   176
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   177
	// Make sure the data get's there before we close the connection
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   178
	NetworkSend_Packets(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   179
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   180
	// The client made a mistake, so drop his connection now!
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   181
	NetworkCloseClient(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   182
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   183
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   184
DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_NEED_PASSWORD)(NetworkClientState *cs, NetworkPasswordType type)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   185
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   186
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   187
	// Packet: SERVER_NEED_PASSWORD
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   188
	// Function: Indication to the client that the server needs a password
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   189
	// Data:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   190
	//    uint8:  Type of password
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   191
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   192
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   193
	Packet *p = NetworkSend_Init(PACKET_SERVER_NEED_PASSWORD);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   194
	NetworkSend_uint8(p, type);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   195
	NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   196
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   197
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   198
DEF_SERVER_SEND_COMMAND(PACKET_SERVER_WELCOME)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   199
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   200
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   201
	// Packet: SERVER_WELCOME
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   202
	// Function: The client is joined and ready to receive his map
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   203
	// Data:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   204
	//    uint16:  Own ClientID
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   205
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   206
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   207
	Packet *p;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   208
	const NetworkClientState *new_cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   209
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   210
	// Invalid packet when status is AUTH or higher
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   211
	if (cs->status >= STATUS_AUTH) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   212
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   213
	cs->status = STATUS_AUTH;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   214
	_network_game_info.clients_on++;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   215
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   216
	p = NetworkSend_Init(PACKET_SERVER_WELCOME);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   217
	NetworkSend_uint16(p, cs->index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   218
	NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   219
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   220
		// Transmit info about all the active clients
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   221
	FOR_ALL_CLIENTS(new_cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   222
		if (new_cs != cs && new_cs->status > STATUS_AUTH)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   223
			SEND_COMMAND(PACKET_SERVER_CLIENT_INFO)(cs, DEREF_CLIENT_INFO(new_cs));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   224
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   225
	// Also send the info of the server
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   226
	SEND_COMMAND(PACKET_SERVER_CLIENT_INFO)(cs, NetworkFindClientInfoFromIndex(NETWORK_SERVER_INDEX));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   227
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   228
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   229
DEF_SERVER_SEND_COMMAND(PACKET_SERVER_WAIT)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   230
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   231
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   232
	// Packet: PACKET_SERVER_WAIT
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   233
	// Function: The client can not receive the map at the moment because
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   234
	//             someone else is already receiving the map
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   235
	// Data:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   236
	//    uint8:  Clients awaiting map
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   237
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   238
	int waiting = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   239
	NetworkClientState *new_cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   240
	Packet *p;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   241
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   242
	// Count how many players are waiting in the queue
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   243
	FOR_ALL_CLIENTS(new_cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   244
		if (new_cs->status == STATUS_MAP_WAIT) waiting++;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   245
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   246
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   247
	p = NetworkSend_Init(PACKET_SERVER_WAIT);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   248
	NetworkSend_uint8(p, waiting);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   249
	NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   250
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   251
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   252
// This sends the map to the client
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   253
DEF_SERVER_SEND_COMMAND(PACKET_SERVER_MAP)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   254
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   255
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   256
	// Packet: SERVER_MAP
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   257
	// Function: Sends the map to the client, or a part of it (it is splitted in
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   258
	//   a lot of multiple packets)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   259
	// Data:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   260
	//    uint8:  packet-type (MAP_PACKET_START, MAP_PACKET_NORMAL and MAP_PACKET_END)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   261
	//  if MAP_PACKET_START:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   262
	//    uint32: The current FrameCounter
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   263
	//  if MAP_PACKET_NORMAL:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   264
	//    piece of the map (till max-size of packet)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   265
	//  if MAP_PACKET_END:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   266
	//    uint32: seed0 of player
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   267
	//    uint32: seed1 of player
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   268
	//      last 2 are repeated MAX_PLAYERS time
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   269
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   270
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   271
	static FILE *file_pointer;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   272
	static uint sent_packets; // How many packets we did send succecfully last time
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   273
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   274
	if (cs->status < STATUS_AUTH) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   275
		// Illegal call, return error and ignore the packet
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   276
		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_AUTHORIZED);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   277
		return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   278
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   279
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   280
	if (cs->status == STATUS_AUTH) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   281
		char filename[256];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   282
		Packet *p;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   283
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   284
		// Make a dump of the current game
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   285
		snprintf(filename, lengthof(filename), "%s%snetwork_server.tmp",  _paths.autosave_dir, PATHSEP);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   286
		if (SaveOrLoad(filename, SL_SAVE) != SL_OK) error("network savedump failed");
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   287
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   288
		file_pointer = fopen(filename, "rb");
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   289
		fseek(file_pointer, 0, SEEK_END);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   290
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   291
		// Now send the _frame_counter and how many packets are coming
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   292
		p = NetworkSend_Init(PACKET_SERVER_MAP);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   293
		NetworkSend_uint8(p, MAP_PACKET_START);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   294
		NetworkSend_uint32(p, _frame_counter);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   295
		NetworkSend_uint32(p, ftell(file_pointer));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   296
		NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   297
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   298
		fseek(file_pointer, 0, SEEK_SET);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   299
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   300
		sent_packets = 4; // We start with trying 4 packets
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   301
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   302
		cs->status = STATUS_MAP;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   303
		/* Mark the start of download */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   304
		cs->last_frame = _frame_counter;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   305
		cs->last_frame_server = _frame_counter;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   306
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   307
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   308
	if (cs->status == STATUS_MAP) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   309
		uint i;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   310
		int res;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   311
		for (i = 0; i < sent_packets; i++) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   312
			Packet *p = NetworkSend_Init(PACKET_SERVER_MAP);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   313
			NetworkSend_uint8(p, MAP_PACKET_NORMAL);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   314
			res = (int)fread(p->buffer + p->size, 1, SEND_MTU - p->size, file_pointer);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   315
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   316
			if (ferror(file_pointer)) error("Error reading temporary network savegame!");
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   317
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   318
			p->size += res;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   319
			NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   320
			if (feof(file_pointer)) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   321
				// Done reading!
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   322
				Packet *p = NetworkSend_Init(PACKET_SERVER_MAP);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   323
				NetworkSend_uint8(p, MAP_PACKET_END);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   324
				NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   325
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   326
				// Set the status to DONE_MAP, no we will wait for the client
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   327
				//  to send it is ready (maybe that happens like never ;))
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   328
				cs->status = STATUS_DONE_MAP;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   329
				fclose(file_pointer);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   330
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   331
				{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   332
					NetworkClientState *new_cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   333
					bool new_map_client = false;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   334
					// Check if there is a client waiting for receiving the map
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   335
					//  and start sending him the map
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   336
					FOR_ALL_CLIENTS(new_cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   337
						if (new_cs->status == STATUS_MAP_WAIT) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   338
							// Check if we already have a new client to send the map to
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   339
							if (!new_map_client) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   340
								// If not, this client will get the map
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   341
								new_cs->status = STATUS_AUTH;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   342
								new_map_client = true;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   343
								SEND_COMMAND(PACKET_SERVER_MAP)(new_cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   344
							} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   345
								// Else, send the other clients how many clients are in front of them
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   346
								SEND_COMMAND(PACKET_SERVER_WAIT)(new_cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   347
							}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   348
						}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   349
					}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   350
				}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   351
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   352
				// There is no more data, so break the for
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   353
				break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   354
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   355
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   356
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   357
		// Send all packets (forced) and check if we have send it all
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   358
		NetworkSend_Packets(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   359
		if (cs->packet_queue == NULL) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   360
			// All are sent, increase the sent_packets
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   361
			sent_packets *= 2;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   362
		} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   363
			// Not everything is sent, decrease the sent_packets
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   364
			if (sent_packets > 1) sent_packets /= 2;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   365
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   366
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   367
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   368
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   369
DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_JOIN)(NetworkClientState *cs, uint16 client_index)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   370
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   371
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   372
	// Packet: SERVER_JOIN
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   373
	// Function: A client is joined (all active clients receive this after a
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   374
	//     PACKET_CLIENT_MAP_OK) Mostly what directly follows is a
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   375
	//     PACKET_SERVER_CLIENT_INFO
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   376
	// Data:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   377
	//    uint16:  Client-Index
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   378
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   379
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   380
	Packet *p = NetworkSend_Init(PACKET_SERVER_JOIN);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   381
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   382
	NetworkSend_uint16(p, client_index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   383
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   384
	NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   385
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   386
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   387
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   388
DEF_SERVER_SEND_COMMAND(PACKET_SERVER_FRAME)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   389
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   390
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   391
	// Packet: SERVER_FRAME
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   392
	// Function: Sends the current frame-counter to the client
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   393
	// Data:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   394
	//    uint32: Frame Counter
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   395
	//    uint32: Frame Counter Max (how far may the client walk before the server?)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   396
	//    [uint32: general-seed-1]
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   397
	//    [uint32: general-seed-2]
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   398
	//      (last two depends on compile-settings, and are not default settings)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   399
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   400
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   401
	Packet *p = NetworkSend_Init(PACKET_SERVER_FRAME);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   402
	NetworkSend_uint32(p, _frame_counter);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   403
	NetworkSend_uint32(p, _frame_counter_max);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   404
#ifdef ENABLE_NETWORK_SYNC_EVERY_FRAME
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   405
	NetworkSend_uint32(p, _sync_seed_1);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   406
#ifdef NETWORK_SEND_DOUBLE_SEED
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   407
	NetworkSend_uint32(p, _sync_seed_2);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   408
#endif
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   409
#endif
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   410
	NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   411
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   412
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   413
DEF_SERVER_SEND_COMMAND(PACKET_SERVER_SYNC)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   414
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   415
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   416
	// Packet: SERVER_SYNC
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   417
	// Function: Sends a sync-check to the client
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   418
	// Data:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   419
	//    uint32: Frame Counter
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   420
	//    uint32: General-seed-1
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   421
	//    [uint32: general-seed-2]
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   422
	//      (last one depends on compile-settings, and are not default settings)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   423
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   424
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   425
	Packet *p = NetworkSend_Init(PACKET_SERVER_SYNC);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   426
	NetworkSend_uint32(p, _frame_counter);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   427
	NetworkSend_uint32(p, _sync_seed_1);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   428
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   429
#ifdef NETWORK_SEND_DOUBLE_SEED
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   430
	NetworkSend_uint32(p, _sync_seed_2);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   431
#endif
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   432
	NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   433
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   434
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   435
DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_COMMAND)(NetworkClientState *cs, CommandPacket *cp)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   436
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   437
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   438
	// Packet: SERVER_COMMAND
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   439
	// Function: Sends a DoCommand to the client
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   440
	// Data:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   441
	//    uint8:  PlayerID (0..MAX_PLAYERS-1)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   442
	//    uint32: CommandID (see command.h)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   443
	//    uint32: P1 (free variables used in DoCommand)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   444
	//    uint32: P2
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   445
	//    uint32: Tile
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   446
	//    string: text
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   447
	//    uint8:  CallBackID (see callback_table.c)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   448
	//    uint32: Frame of execution
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   449
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   450
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   451
	Packet *p = NetworkSend_Init(PACKET_SERVER_COMMAND);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   452
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   453
	NetworkSend_uint8(p, cp->player);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   454
	NetworkSend_uint32(p, cp->cmd);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   455
	NetworkSend_uint32(p, cp->p1);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   456
	NetworkSend_uint32(p, cp->p2);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   457
	NetworkSend_uint32(p, cp->tile);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   458
	NetworkSend_string(p, cp->text);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   459
	NetworkSend_uint8(p, cp->callback);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   460
	NetworkSend_uint32(p, cp->frame);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   461
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   462
	NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   463
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   464
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   465
DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_CHAT)(NetworkClientState *cs, NetworkAction action, uint16 client_index, bool self_send, const char *msg)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   466
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   467
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   468
	// Packet: SERVER_CHAT
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   469
	// Function: Sends a chat-packet to the client
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   470
	// Data:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   471
	//    uint8:  ActionID (see network_data.h, NetworkAction)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   472
	//    uint16:  Client-index
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   473
	//    String: Message (max MAX_TEXT_MSG_LEN)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   474
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   475
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   476
	Packet *p = NetworkSend_Init(PACKET_SERVER_CHAT);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   477
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   478
	NetworkSend_uint8(p, action);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   479
	NetworkSend_uint16(p, client_index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   480
	NetworkSend_uint8(p, self_send);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   481
	NetworkSend_string(p, msg);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   482
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   483
	NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   484
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   485
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   486
DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR_QUIT)(NetworkClientState *cs, uint16 client_index, NetworkErrorCode errorno)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   487
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   488
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   489
	// Packet: SERVER_ERROR_QUIT
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   490
	// Function: One of the clients made an error and is quiting the game
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   491
	//      This packet informs the other clients of that.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   492
	// Data:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   493
	//    uint16:  Client-index
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   494
	//    uint8:  ErrorID (see network_data.h, NetworkErrorCode)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   495
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   496
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   497
	Packet *p = NetworkSend_Init(PACKET_SERVER_ERROR_QUIT);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   498
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   499
	NetworkSend_uint16(p, client_index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   500
	NetworkSend_uint8(p, errorno);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   501
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   502
	NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   503
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   504
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   505
DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_QUIT)(NetworkClientState *cs, uint16 client_index, const char *leavemsg)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   506
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   507
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   508
	// Packet: SERVER_ERROR_QUIT
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   509
	// Function: A client left the game, and this packets informs the other clients
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   510
	//      of that.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   511
	// Data:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   512
	//    uint16:  Client-index
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   513
	//    String: leave-message
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   514
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   515
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   516
	Packet *p = NetworkSend_Init(PACKET_SERVER_QUIT);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   517
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   518
	NetworkSend_uint16(p, client_index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   519
	NetworkSend_string(p, leavemsg);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   520
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   521
	NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   522
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   523
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   524
DEF_SERVER_SEND_COMMAND(PACKET_SERVER_SHUTDOWN)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   525
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   526
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   527
	// Packet: SERVER_SHUTDOWN
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   528
	// Function: Let the clients know that the server is closing
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   529
	// Data:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   530
	//     <none>
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   531
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   532
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   533
	Packet *p = NetworkSend_Init(PACKET_SERVER_SHUTDOWN);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   534
	NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   535
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   536
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   537
DEF_SERVER_SEND_COMMAND(PACKET_SERVER_NEWGAME)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   538
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   539
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   540
	// Packet: PACKET_SERVER_NEWGAME
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   541
	// Function: Let the clients know that the server is loading a new map
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   542
	// Data:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   543
	//     <none>
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   544
	//
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   545
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   546
	Packet *p = NetworkSend_Init(PACKET_SERVER_NEWGAME);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   547
	NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   548
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   549
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   550
DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_RCON)(NetworkClientState *cs, uint16 color, const char *command)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   551
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   552
	Packet *p = NetworkSend_Init(PACKET_SERVER_RCON);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   553
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   554
	NetworkSend_uint16(p, color);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   555
	NetworkSend_string(p, command);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   556
	NetworkSend_Packet(p, cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   557
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   558
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   559
// **********
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   560
// Receiving functions
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   561
//   DEF_SERVER_RECEIVE_COMMAND has parameter: NetworkClientState *cs, Packet *p
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   562
// **********
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   563
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   564
DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMPANY_INFO)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   565
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   566
	SEND_COMMAND(PACKET_SERVER_COMPANY_INFO)(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   567
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   568
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   569
DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   570
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   571
	char name[NETWORK_CLIENT_NAME_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   572
	char unique_id[NETWORK_NAME_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   573
	NetworkClientInfo *ci;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   574
	byte playas;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   575
	NetworkLanguage client_lang;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   576
	char client_revision[NETWORK_REVISION_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   577
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   578
	NetworkRecv_string(cs, p, client_revision, sizeof(client_revision));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   579
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   580
#if defined(WITH_REV) || defined(WITH_REV_HACK)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   581
	// Check if the client has revision control enabled
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   582
	if (strcmp(NOREV_STRING, client_revision) != 0 &&
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   583
			strcmp(_network_game_info.server_revision, client_revision) != 0) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   584
		// Different revisions!!
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   585
		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_WRONG_REVISION);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   586
		return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   587
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   588
#endif
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   589
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   590
	NetworkRecv_string(cs, p, name, sizeof(name));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   591
	playas = NetworkRecv_uint8(cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   592
	client_lang = NetworkRecv_uint8(cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   593
	NetworkRecv_string(cs, p, unique_id, sizeof(unique_id));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   594
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   595
	if (cs->has_quit) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   596
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   597
	// join another company does not affect these values
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   598
	switch (playas) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   599
		case PLAYER_NEW_COMPANY: /* New company */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   600
			if (ActivePlayerCount() >= _network_game_info.companies_max) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   601
				SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_FULL);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   602
				return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   603
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   604
			break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   605
		case PLAYER_SPECTATOR: /* Spectator */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   606
			if (NetworkSpectatorCount() >= _network_game_info.spectators_max) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   607
				SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_FULL);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   608
				return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   609
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   610
			break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   611
		default: /* Join another company (companies 1-8 (index 0-7)) */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   612
			if (!IsValidPlayer(playas)) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   613
				SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_PLAYER_MISMATCH);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   614
				return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   615
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   616
			break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   617
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   618
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   619
	// We need a valid name.. make it Player
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   620
	if (*name == '\0') ttd_strlcpy(name, "Player", sizeof(name));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   621
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   622
	if (!NetworkFindName(name)) { // Change name if duplicate
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   623
		// We could not create a name for this player
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   624
		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NAME_IN_USE);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   625
		return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   626
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   627
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   628
	ci = DEREF_CLIENT_INFO(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   629
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   630
	ttd_strlcpy(ci->client_name, name, sizeof(ci->client_name));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   631
	ttd_strlcpy(ci->unique_id, unique_id, sizeof(ci->unique_id));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   632
	ci->client_playas = playas;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   633
	ci->client_lang = client_lang;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   634
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   635
	// We now want a password from the client
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   636
	//  else we do not allow him in!
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   637
	if (_network_game_info.use_password) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   638
		SEND_COMMAND(PACKET_SERVER_NEED_PASSWORD)(cs, NETWORK_GAME_PASSWORD);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   639
	} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   640
		if (IsValidPlayer(ci->client_playas) && _network_player_info[ci->client_playas].password[0] != '\0') {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   641
			SEND_COMMAND(PACKET_SERVER_NEED_PASSWORD)(cs, NETWORK_COMPANY_PASSWORD);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   642
		} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   643
			SEND_COMMAND(PACKET_SERVER_WELCOME)(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   644
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   645
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   646
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   647
	/* Make sure companies to which people try to join are not autocleaned */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   648
	if (IsValidPlayer(playas)) _network_player_info[playas].months_empty = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   649
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   650
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   651
DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_PASSWORD)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   652
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   653
	NetworkPasswordType type;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   654
	char password[NETWORK_PASSWORD_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   655
	const NetworkClientInfo *ci;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   656
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   657
	type = NetworkRecv_uint8(cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   658
	NetworkRecv_string(cs, p, password, sizeof(password));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   659
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   660
	if (cs->status == STATUS_INACTIVE && type == NETWORK_GAME_PASSWORD) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   661
		// Check game-password
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   662
		if (strcmp(password, _network_game_info.server_password) != 0) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   663
			// Password is invalid
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   664
			SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_WRONG_PASSWORD);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   665
			return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   666
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   667
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   668
		ci = DEREF_CLIENT_INFO(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   669
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   670
		if (IsValidPlayer(ci->client_playas) && _network_player_info[ci->client_playas].password[0] != '\0') {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   671
			SEND_COMMAND(PACKET_SERVER_NEED_PASSWORD)(cs, NETWORK_COMPANY_PASSWORD);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   672
			return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   673
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   674
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   675
		// Valid password, allow user
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   676
		SEND_COMMAND(PACKET_SERVER_WELCOME)(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   677
		return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   678
	} else if (cs->status == STATUS_INACTIVE && type == NETWORK_COMPANY_PASSWORD) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   679
		ci = DEREF_CLIENT_INFO(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   680
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   681
		if (strcmp(password, _network_player_info[ci->client_playas].password) != 0) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   682
			// Password is invalid
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   683
			SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_WRONG_PASSWORD);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   684
			return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   685
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   686
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   687
		SEND_COMMAND(PACKET_SERVER_WELCOME)(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   688
		return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   689
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   690
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   691
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   692
	SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   693
	return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   694
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   695
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   696
DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_GETMAP)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   697
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   698
	const NetworkClientState *new_cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   699
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   700
	// The client was never joined.. so this is impossible, right?
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   701
	//  Ignore the packet, give the client a warning, and close his connection
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   702
	if (cs->status < STATUS_AUTH || cs->has_quit) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   703
		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_AUTHORIZED);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   704
		return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   705
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   706
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   707
	// Check if someone else is receiving the map
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   708
	FOR_ALL_CLIENTS(new_cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   709
		if (new_cs->status == STATUS_MAP) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   710
			// Tell the new client to wait
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   711
			cs->status = STATUS_MAP_WAIT;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   712
			SEND_COMMAND(PACKET_SERVER_WAIT)(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   713
			return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   714
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   715
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   716
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   717
	// We receive a request to upload the map.. give it to the client!
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   718
	SEND_COMMAND(PACKET_SERVER_MAP)(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   719
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   720
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   721
DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_MAP_OK)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   722
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   723
	// Client has the map, now start syncing
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   724
	if (cs->status == STATUS_DONE_MAP && !cs->has_quit) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   725
		char client_name[NETWORK_CLIENT_NAME_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   726
		NetworkClientState *new_cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   727
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   728
		NetworkGetClientName(client_name, sizeof(client_name), cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   729
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   730
		NetworkTextMessage(NETWORK_ACTION_JOIN, 1, false, client_name, "");
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   731
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   732
		// Mark the client as pre-active, and wait for an ACK
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   733
		//  so we know he is done loading and in sync with us
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   734
		cs->status = STATUS_PRE_ACTIVE;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   735
		NetworkHandleCommandQueue(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   736
		SEND_COMMAND(PACKET_SERVER_FRAME)(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   737
		SEND_COMMAND(PACKET_SERVER_SYNC)(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   738
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   739
		// This is the frame the client receives
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   740
		//  we need it later on to make sure the client is not too slow
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   741
		cs->last_frame = _frame_counter;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   742
		cs->last_frame_server = _frame_counter;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   743
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   744
		FOR_ALL_CLIENTS(new_cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   745
			if (new_cs->status > STATUS_AUTH) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   746
				SEND_COMMAND(PACKET_SERVER_CLIENT_INFO)(new_cs, DEREF_CLIENT_INFO(cs));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   747
				SEND_COMMAND(PACKET_SERVER_JOIN)(new_cs, cs->index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   748
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   749
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   750
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   751
		if (_network_pause_on_join) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   752
			/* Now pause the game till the client is in sync */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   753
			DoCommandP(0, 1, 0, NULL, CMD_PAUSE);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   754
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   755
			NetworkServer_HandleChat(NETWORK_ACTION_SERVER_MESSAGE, DESTTYPE_BROADCAST, 0, "Game paused (incoming client)", NETWORK_SERVER_INDEX);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   756
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   757
	} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   758
		// Wrong status for this packet, give a warning to client, and close connection
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   759
		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   760
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   761
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   762
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   763
/** Enforce the command flags.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   764
 * Eg a server-only command can only be executed by a server, etc.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   765
 * @param *cp the commandpacket that is going to be checked
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   766
 * @param *ci client information for debugging output to console
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   767
 */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   768
static bool CheckCommandFlags(const CommandPacket *cp, const NetworkClientInfo *ci)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   769
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   770
	byte flags = GetCommandFlags(cp->cmd);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   771
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   772
	if (flags & CMD_SERVER && ci->client_index != NETWORK_SERVER_INDEX) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   773
		IConsolePrintF(_icolour_err, "WARNING: server only command from client %d (IP: %s), kicking...", ci->client_index, GetPlayerIP(ci));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   774
		return false;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   775
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   776
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   777
	if (flags & CMD_OFFLINE) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   778
		IConsolePrintF(_icolour_err, "WARNING: offline only command from client %d (IP: %s), kicking...", ci->client_index, GetPlayerIP(ci));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   779
		return false;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   780
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   781
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   782
	return true;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   783
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   784
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   785
/** The client has done a command and wants us to handle it
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   786
 * @param *cs the connected client that has sent the command
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   787
 * @param *p the packet in which the command was sent
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   788
 */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   789
DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   790
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   791
	NetworkClientState *new_cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   792
	const NetworkClientInfo *ci;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   793
	byte callback;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   794
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   795
	CommandPacket *cp = malloc(sizeof(CommandPacket));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   796
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   797
	// The client was never joined.. so this is impossible, right?
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   798
	//  Ignore the packet, give the client a warning, and close his connection
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   799
	if (cs->status < STATUS_DONE_MAP || cs->has_quit) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   800
		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   801
		return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   802
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   803
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   804
	cp->player = NetworkRecv_uint8(cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   805
	cp->cmd    = NetworkRecv_uint32(cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   806
	cp->p1     = NetworkRecv_uint32(cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   807
	cp->p2     = NetworkRecv_uint32(cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   808
	cp->tile   = NetworkRecv_uint32(cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   809
	NetworkRecv_string(cs, p, cp->text, lengthof(cp->text));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   810
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   811
	callback = NetworkRecv_uint8(cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   812
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   813
	if (cs->has_quit) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   814
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   815
	ci = DEREF_CLIENT_INFO(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   816
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   817
	/* Check if cp->cmd is valid */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   818
	if (!IsValidCommand(cp->cmd)) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   819
		IConsolePrintF(_icolour_err, "WARNING: invalid command from client %d (IP: %s).", ci->client_index, GetPlayerIP(ci));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   820
		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   821
		return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   822
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   823
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   824
	if (!CheckCommandFlags(cp, ci)) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   825
		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_KICKED);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   826
		return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   827
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   828
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   829
	/** Only CMD_PLAYER_CTRL is always allowed, for the rest, playas needs
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   830
	 * to match the player in the packet. If it doesn't, the client has done
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   831
	 * something pretty naughty (or a bug), and will be kicked
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   832
	 */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   833
	if (!(cp->cmd == CMD_PLAYER_CTRL && cp->p1 == 0) && ci->client_playas != cp->player) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   834
		IConsolePrintF(_icolour_err, "WARNING: player %d (IP: %s) tried to execute a command as player %d, kicking...",
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   835
		               ci->client_playas + 1, GetPlayerIP(ci), cp->player + 1);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   836
		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_PLAYER_MISMATCH);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   837
		return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   838
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   839
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   840
	/** @todo CMD_PLAYER_CTRL with p1 = 0 announces a new player to the server. To give the
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   841
	 * player the correct ID, the server injects p2 and executes the command. Any other p1
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   842
	 * is prohibited. Pretty ugly and should be redone together with its function.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   843
	 * @see CmdPlayerCtrl() players.c:655
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   844
	 */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   845
	if (cp->cmd == CMD_PLAYER_CTRL) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   846
		if (cp->p1 != 0) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   847
			SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_CHEATER);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   848
			return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   849
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   850
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   851
		/* XXX - Execute the command as a valid player. Normally this would be done by a
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   852
		 * spectator, but that is not allowed any commands. So do an impersonation. The drawback
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   853
		 * of this is that the first company's last_built_tile is also updated... */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   854
		cp->player = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   855
		cp->p2 = cs - _clients; // XXX - UGLY! p2 is mis-used to get the client-id in CmdPlayerCtrl
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   856
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   857
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   858
	// The frame can be executed in the same frame as the next frame-packet
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   859
	//  That frame just before that frame is saved in _frame_counter_max
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   860
	cp->frame = _frame_counter_max + 1;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   861
	cp->next  = NULL;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   862
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   863
	// Queue the command for the clients (are send at the end of the frame
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   864
	//   if they can handle it ;))
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   865
	FOR_ALL_CLIENTS(new_cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   866
		if (new_cs->status >= STATUS_MAP) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   867
			// Callbacks are only send back to the client who sent them in the
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   868
			//  first place. This filters that out.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   869
			cp->callback = (new_cs != cs) ? 0 : callback;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   870
			NetworkAddCommandQueue(new_cs, cp);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   871
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   872
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   873
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   874
	cp->callback = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   875
	// Queue the command on the server
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   876
	if (_local_command_queue == NULL) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   877
		_local_command_queue = cp;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   878
	} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   879
		// Find last packet
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   880
		CommandPacket *c = _local_command_queue;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   881
		while (c->next != NULL) c = c->next;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   882
		c->next = cp;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   883
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   884
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   885
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   886
DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ERROR)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   887
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   888
	// This packets means a client noticed an error and is reporting this
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   889
	//  to us. Display the error and report it to the other clients
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   890
	NetworkClientState *new_cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   891
	char str[100];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   892
	char client_name[NETWORK_CLIENT_NAME_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   893
	NetworkErrorCode errorno = NetworkRecv_uint8(cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   894
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   895
	// The client was never joined.. thank the client for the packet, but ignore it
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   896
	if (cs->status < STATUS_DONE_MAP || cs->has_quit) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   897
		cs->has_quit = true;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   898
		return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   899
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   900
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   901
	NetworkGetClientName(client_name, sizeof(client_name), cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   902
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   903
	GetNetworkErrorMsg(str, errorno, lastof(str));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   904
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   905
	DEBUG(net, 2, "'%s' reported an error and is closing its connection (%s)", client_name, str);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   906
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   907
	NetworkTextMessage(NETWORK_ACTION_LEAVE, 1, false, client_name, "%s", str);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   908
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   909
	FOR_ALL_CLIENTS(new_cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   910
		if (new_cs->status > STATUS_AUTH) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   911
			SEND_COMMAND(PACKET_SERVER_ERROR_QUIT)(new_cs, cs->index, errorno);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   912
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   913
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   914
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   915
	cs->has_quit = true;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   916
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   917
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   918
DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_QUIT)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   919
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   920
	// The client wants to leave. Display this and report it to the other
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   921
	//  clients.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   922
	NetworkClientState *new_cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   923
	char str[100];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   924
	char client_name[NETWORK_CLIENT_NAME_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   925
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   926
	// The client was never joined.. thank the client for the packet, but ignore it
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   927
	if (cs->status < STATUS_DONE_MAP || cs->has_quit) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   928
		cs->has_quit = true;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   929
		return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   930
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   931
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   932
	NetworkRecv_string(cs, p, str, lengthof(str));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   933
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   934
	NetworkGetClientName(client_name, sizeof(client_name), cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   935
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   936
	NetworkTextMessage(NETWORK_ACTION_LEAVE, 1, false, client_name, "%s", str);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   937
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   938
	FOR_ALL_CLIENTS(new_cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   939
		if (new_cs->status > STATUS_AUTH) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   940
			SEND_COMMAND(PACKET_SERVER_QUIT)(new_cs, cs->index, str);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   941
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   942
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   943
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   944
	cs->has_quit = true;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   945
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   946
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   947
DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ACK)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   948
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   949
	uint32 frame = NetworkRecv_uint32(cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   950
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   951
	/* The client is trying to catch up with the server */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   952
	if (cs->status == STATUS_PRE_ACTIVE) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   953
		/* The client is not yet catched up? */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   954
		if (frame + DAY_TICKS < _frame_counter) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   955
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   956
		/* Now he is! Unpause the game */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   957
		cs->status = STATUS_ACTIVE;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   958
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   959
		if (_network_pause_on_join) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   960
			DoCommandP(0, 0, 0, NULL, CMD_PAUSE);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   961
			NetworkServer_HandleChat(NETWORK_ACTION_SERVER_MESSAGE, DESTTYPE_BROADCAST, 0, "Game unpaused (client connected)", NETWORK_SERVER_INDEX);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   962
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   963
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   964
		CheckMinPlayers();
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   965
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   966
		/* Execute script for, e.g. MOTD */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   967
		IConsoleCmdExec("exec scripts/on_server_connect.scr 0");
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   968
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   969
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   970
	// The client received the frame, make note of it
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   971
	cs->last_frame = frame;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   972
	// With those 2 values we can calculate the lag realtime
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   973
	cs->last_frame_server = _frame_counter;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   974
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   975
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   976
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   977
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   978
void NetworkServer_HandleChat(NetworkAction action, DestType desttype, int dest, const char *msg, uint16 from_index)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   979
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   980
	NetworkClientState *cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   981
	const NetworkClientInfo *ci, *ci_own, *ci_to;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   982
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   983
	switch (desttype) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   984
	case DESTTYPE_CLIENT:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   985
		/* Are we sending to the server? */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   986
		if (dest == NETWORK_SERVER_INDEX) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   987
			ci = NetworkFindClientInfoFromIndex(from_index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   988
			/* Display the text locally, and that is it */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   989
			if (ci != NULL)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   990
				NetworkTextMessage(action, GetDrawStringPlayerColor(ci->client_playas), false, ci->client_name, "%s", msg);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   991
		} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   992
			/* Else find the client to send the message to */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   993
			FOR_ALL_CLIENTS(cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   994
				if (cs->index == dest) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   995
					SEND_COMMAND(PACKET_SERVER_CHAT)(cs, action, from_index, false, msg);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   996
					break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   997
				}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   998
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   999
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1000
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1001
		// Display the message locally (so you know you have sent it)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1002
		if (from_index != dest) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1003
			if (from_index == NETWORK_SERVER_INDEX) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1004
				ci = NetworkFindClientInfoFromIndex(from_index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1005
				ci_to = NetworkFindClientInfoFromIndex(dest);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1006
				if (ci != NULL && ci_to != NULL)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1007
					NetworkTextMessage(action, GetDrawStringPlayerColor(ci->client_playas), true, ci_to->client_name, "%s", msg);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1008
			} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1009
				FOR_ALL_CLIENTS(cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1010
					if (cs->index == from_index) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1011
						SEND_COMMAND(PACKET_SERVER_CHAT)(cs, action, dest, true, msg);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1012
						break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1013
					}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1014
				}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1015
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1016
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1017
		break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1018
	case DESTTYPE_TEAM: {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1019
		bool show_local = true; // If this is false, the message is already displayed
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1020
														// on the client who did sent it.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1021
		/* Find all clients that belong to this player */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1022
		ci_to = NULL;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1023
		FOR_ALL_CLIENTS(cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1024
			ci = DEREF_CLIENT_INFO(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1025
			if (ci->client_playas == dest) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1026
				SEND_COMMAND(PACKET_SERVER_CHAT)(cs, action, from_index, false, msg);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1027
				if (cs->index == from_index) show_local = false;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1028
				ci_to = ci; // Remember a client that is in the company for company-name
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1029
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1030
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1031
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1032
		ci = NetworkFindClientInfoFromIndex(from_index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1033
		ci_own = NetworkFindClientInfoFromIndex(NETWORK_SERVER_INDEX);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1034
		if (ci != NULL && ci_own != NULL && ci_own->client_playas == dest) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1035
			NetworkTextMessage(action, GetDrawStringPlayerColor(ci->client_playas), false, ci->client_name, "%s", msg);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1036
			if (from_index == NETWORK_SERVER_INDEX) show_local = false;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1037
			ci_to = ci_own;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1038
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1039
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1040
		/* There is no such player */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1041
		if (ci_to == NULL) break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1042
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1043
		// Display the message locally (so you know you have sent it)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1044
		if (ci != NULL && show_local) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1045
			if (from_index == NETWORK_SERVER_INDEX) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1046
				char name[NETWORK_NAME_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1047
				StringID str = IsValidPlayer(ci_to->client_playas) ? GetPlayer(ci_to->client_playas)->name_1 : STR_NETWORK_SPECTATORS;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1048
				GetString(name, str, lastof(name));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1049
				NetworkTextMessage(action, GetDrawStringPlayerColor(ci_own->client_playas), true, name, "%s", msg);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1050
			} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1051
				FOR_ALL_CLIENTS(cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1052
					if (cs->index == from_index) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1053
						SEND_COMMAND(PACKET_SERVER_CHAT)(cs, action, ci_to->client_index, true, msg);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1054
					}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1055
				}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1056
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1057
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1058
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1059
		break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1060
	default:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1061
		DEBUG(net, 0, "[server] received unknown chat destination type %d. Doing broadcast instead", desttype);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1062
		/* fall-through to next case */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1063
	case DESTTYPE_BROADCAST:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1064
		FOR_ALL_CLIENTS(cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1065
			SEND_COMMAND(PACKET_SERVER_CHAT)(cs, action, from_index, false, msg);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1066
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1067
		ci = NetworkFindClientInfoFromIndex(from_index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1068
		if (ci != NULL)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1069
			NetworkTextMessage(action, GetDrawStringPlayerColor(ci->client_playas), false, ci->client_name, "%s", msg);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1070
		break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1071
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1072
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1073
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1074
DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_CHAT)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1075
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1076
	NetworkAction action = NetworkRecv_uint8(cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1077
	DestType desttype = NetworkRecv_uint8(cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1078
	int dest = NetworkRecv_uint8(cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1079
	char msg[MAX_TEXT_MSG_LEN];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1080
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1081
	NetworkRecv_string(cs, p, msg, MAX_TEXT_MSG_LEN);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1082
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1083
	NetworkServer_HandleChat(action, desttype, dest, msg, cs->index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1084
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1085
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1086
DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_SET_PASSWORD)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1087
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1088
	char password[NETWORK_PASSWORD_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1089
	const NetworkClientInfo *ci;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1090
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1091
	NetworkRecv_string(cs, p, password, sizeof(password));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1092
	ci = DEREF_CLIENT_INFO(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1093
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1094
	if (IsValidPlayer(ci->client_playas)) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1095
		ttd_strlcpy(_network_player_info[ci->client_playas].password, password, sizeof(_network_player_info[0].password));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1096
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1097
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1098
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1099
DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_SET_NAME)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1100
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1101
	char client_name[NETWORK_CLIENT_NAME_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1102
	NetworkClientInfo *ci;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1103
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1104
	NetworkRecv_string(cs, p, client_name, sizeof(client_name));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1105
	ci = DEREF_CLIENT_INFO(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1106
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1107
	if (cs->has_quit) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1108
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1109
	if (ci != NULL) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1110
		// Display change
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1111
		if (NetworkFindName(client_name)) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1112
			NetworkTextMessage(NETWORK_ACTION_NAME_CHANGE, 1, false, ci->client_name, "%s", client_name);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1113
			ttd_strlcpy(ci->client_name, client_name, sizeof(ci->client_name));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1114
			NetworkUpdateClientInfo(ci->client_index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1115
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1116
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1117
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1118
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1119
DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_RCON)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1120
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1121
	char pass[NETWORK_PASSWORD_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1122
	char command[NETWORK_RCONCOMMAND_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1123
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1124
	if (_network_game_info.rcon_password[0] == '\0') return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1125
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1126
	NetworkRecv_string(cs, p, pass, sizeof(pass));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1127
	NetworkRecv_string(cs, p, command, sizeof(command));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1128
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1129
	if (strcmp(pass, _network_game_info.rcon_password) != 0) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1130
		DEBUG(net, 0, "[rcon] wrong password from client-id %d", cs->index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1131
		return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1132
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1133
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1134
	DEBUG(net, 0, "[rcon] client-id %d executed: '%s'", cs->index, command);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1135
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1136
	_redirect_console_to_client = cs->index;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1137
	IConsoleCmdExec(command);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1138
	_redirect_console_to_client = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1139
	return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1140
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1141
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1142
// The layout for the receive-functions by the server
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1143
typedef void NetworkServerPacket(NetworkClientState *cs, Packet *p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1144
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1145
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1146
// This array matches PacketType. At an incoming
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1147
//  packet it is matches against this array
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1148
//  and that way the right function to handle that
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1149
//  packet is found.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1150
static NetworkServerPacket* const _network_server_packet[] = {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1151
	NULL, /*PACKET_SERVER_FULL,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1152
	NULL, /*PACKET_SERVER_BANNED,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1153
	RECEIVE_COMMAND(PACKET_CLIENT_JOIN),
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1154
	NULL, /*PACKET_SERVER_ERROR,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1155
	RECEIVE_COMMAND(PACKET_CLIENT_COMPANY_INFO),
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1156
	NULL, /*PACKET_SERVER_COMPANY_INFO,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1157
	NULL, /*PACKET_SERVER_CLIENT_INFO,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1158
	NULL, /*PACKET_SERVER_NEED_PASSWORD,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1159
	RECEIVE_COMMAND(PACKET_CLIENT_PASSWORD),
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1160
	NULL, /*PACKET_SERVER_WELCOME,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1161
	RECEIVE_COMMAND(PACKET_CLIENT_GETMAP),
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1162
	NULL, /*PACKET_SERVER_WAIT,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1163
	NULL, /*PACKET_SERVER_MAP,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1164
	RECEIVE_COMMAND(PACKET_CLIENT_MAP_OK),
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1165
	NULL, /*PACKET_SERVER_JOIN,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1166
	NULL, /*PACKET_SERVER_FRAME,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1167
	NULL, /*PACKET_SERVER_SYNC,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1168
	RECEIVE_COMMAND(PACKET_CLIENT_ACK),
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1169
	RECEIVE_COMMAND(PACKET_CLIENT_COMMAND),
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1170
	NULL, /*PACKET_SERVER_COMMAND,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1171
	RECEIVE_COMMAND(PACKET_CLIENT_CHAT),
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1172
	NULL, /*PACKET_SERVER_CHAT,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1173
	RECEIVE_COMMAND(PACKET_CLIENT_SET_PASSWORD),
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1174
	RECEIVE_COMMAND(PACKET_CLIENT_SET_NAME),
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1175
	RECEIVE_COMMAND(PACKET_CLIENT_QUIT),
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1176
	RECEIVE_COMMAND(PACKET_CLIENT_ERROR),
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1177
	NULL, /*PACKET_SERVER_QUIT,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1178
	NULL, /*PACKET_SERVER_ERROR_QUIT,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1179
	NULL, /*PACKET_SERVER_SHUTDOWN,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1180
	NULL, /*PACKET_SERVER_NEWGAME,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1181
	NULL, /*PACKET_SERVER_RCON,*/
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1182
	RECEIVE_COMMAND(PACKET_CLIENT_RCON),
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1183
};
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1184
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1185
// If this fails, check the array above with network_data.h
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1186
assert_compile(lengthof(_network_server_packet) == PACKET_END);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1187
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1188
// This update the company_info-stuff
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1189
void NetworkPopulateCompanyInfo(void)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1190
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1191
	char password[NETWORK_PASSWORD_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1192
	const Player *p;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1193
	const Vehicle *v;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1194
	const Station *s;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1195
	const NetworkClientState *cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1196
	const NetworkClientInfo *ci;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1197
	uint i;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1198
	uint16 months_empty;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1199
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1200
	FOR_ALL_PLAYERS(p) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1201
		if (!p->is_active) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1202
			memset(&_network_player_info[p->index], 0, sizeof(NetworkPlayerInfo));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1203
			continue;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1204
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1205
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1206
		// Clean the info but not the password
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1207
		ttd_strlcpy(password, _network_player_info[p->index].password, sizeof(password));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1208
		months_empty = _network_player_info[p->index].months_empty;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1209
		memset(&_network_player_info[p->index], 0, sizeof(NetworkPlayerInfo));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1210
		_network_player_info[p->index].months_empty = months_empty;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1211
		ttd_strlcpy(_network_player_info[p->index].password, password, sizeof(_network_player_info[p->index].password));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1212
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1213
		// Grap the company name
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1214
		SetDParam(0, p->name_1);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1215
		SetDParam(1, p->name_2);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1216
		GetString(_network_player_info[p->index].company_name, STR_JUST_STRING, lastof(_network_player_info[p->index].company_name));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1217
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1218
		// Check the income
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1219
		if (_cur_year - 1 == p->inaugurated_year) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1220
			// The player is here just 1 year, so display [2], else display[1]
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1221
			for (i = 0; i < lengthof(p->yearly_expenses[2]); i++) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1222
				_network_player_info[p->index].income -= p->yearly_expenses[2][i];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1223
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1224
		} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1225
			for (i = 0; i < lengthof(p->yearly_expenses[1]); i++) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1226
				_network_player_info[p->index].income -= p->yearly_expenses[1][i];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1227
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1228
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1229
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1230
		// Set some general stuff
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1231
		_network_player_info[p->index].inaugurated_year = p->inaugurated_year;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1232
		_network_player_info[p->index].company_value = p->old_economy[0].company_value;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1233
		_network_player_info[p->index].money = p->money64;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1234
		_network_player_info[p->index].performance = p->old_economy[0].performance_history;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1235
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1236
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1237
	// Go through all vehicles and count the type of vehicles
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1238
	FOR_ALL_VEHICLES(v) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1239
		if (!IsValidPlayer(v->owner)) continue;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1240
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1241
		switch (v->type) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1242
			case VEH_Train:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1243
				if (IsFrontEngine(v)) _network_player_info[v->owner].num_vehicle[0]++;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1244
				break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1245
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1246
			case VEH_Road:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1247
				if (v->cargo_type != CT_PASSENGERS) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1248
					_network_player_info[v->owner].num_vehicle[1]++;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1249
				} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1250
					_network_player_info[v->owner].num_vehicle[2]++;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1251
				}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1252
				break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1253
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1254
			case VEH_Aircraft:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1255
				if (v->subtype <= 2) _network_player_info[v->owner].num_vehicle[3]++;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1256
				break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1257
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1258
			case VEH_Ship:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1259
				_network_player_info[v->owner].num_vehicle[4]++;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1260
				break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1261
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1262
			case VEH_Special:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1263
			case VEH_Disaster:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1264
				break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1265
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1266
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1267
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1268
	// Go through all stations and count the types of stations
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1269
	FOR_ALL_STATIONS(s) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1270
		if (IsValidPlayer(s->owner)) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1271
			NetworkPlayerInfo *npi = &_network_player_info[s->owner];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1272
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1273
			if (s->facilities & FACIL_TRAIN)      npi->num_station[0]++;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1274
			if (s->facilities & FACIL_TRUCK_STOP) npi->num_station[1]++;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1275
			if (s->facilities & FACIL_BUS_STOP)   npi->num_station[2]++;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1276
			if (s->facilities & FACIL_AIRPORT)    npi->num_station[3]++;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1277
			if (s->facilities & FACIL_DOCK)       npi->num_station[4]++;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1278
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1279
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1280
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1281
	ci = NetworkFindClientInfoFromIndex(NETWORK_SERVER_INDEX);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1282
	// Register local player (if not dedicated)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1283
	if (ci != NULL && IsValidPlayer(ci->client_playas))
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1284
		ttd_strlcpy(_network_player_info[ci->client_playas].players, ci->client_name, sizeof(_network_player_info[0].players));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1285
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1286
	FOR_ALL_CLIENTS(cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1287
		char client_name[NETWORK_CLIENT_NAME_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1288
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1289
		NetworkGetClientName(client_name, sizeof(client_name), cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1290
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1291
		ci = DEREF_CLIENT_INFO(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1292
		if (ci != NULL && IsValidPlayer(ci->client_playas)) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1293
			if (strlen(_network_player_info[ci->client_playas].players) != 0)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1294
				ttd_strlcat(_network_player_info[ci->client_playas].players, ", ", lengthof(_network_player_info[0].players));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1295
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1296
			ttd_strlcat(_network_player_info[ci->client_playas].players, client_name, lengthof(_network_player_info[0].players));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1297
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1298
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1299
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1300
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1301
// Send a packet to all clients with updated info about this client_index
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1302
void NetworkUpdateClientInfo(uint16 client_index)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1303
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1304
	NetworkClientState *cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1305
	NetworkClientInfo *ci = NetworkFindClientInfoFromIndex(client_index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1306
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1307
	if (ci == NULL) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1308
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1309
	FOR_ALL_CLIENTS(cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1310
		SEND_COMMAND(PACKET_SERVER_CLIENT_INFO)(cs, ci);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1311
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1312
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1313
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1314
/* Check if we want to restart the map */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1315
static void NetworkCheckRestartMap(void)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1316
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1317
	if (_network_restart_game_year != 0 && _cur_year >= _network_restart_game_year) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1318
		DEBUG(net, 0, "Auto-restarting map. Year %d reached", _cur_year);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1319
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1320
		StartNewGameWithoutGUI(GENERATE_NEW_SEED);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1321
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1322
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1323
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1324
/* Check if the server has autoclean_companies activated
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1325
    Two things happen:
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1326
      1) If a company is not protected, it is closed after 1 year (for example)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1327
      2) If a company is protected, protection is disabled after 3 years (for example)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1328
           (and item 1. happens a year later) */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1329
static void NetworkAutoCleanCompanies(void)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1330
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1331
	const NetworkClientState *cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1332
	const NetworkClientInfo *ci;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1333
	const Player *p;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1334
	bool clients_in_company[MAX_PLAYERS];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1335
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1336
	if (!_network_autoclean_companies) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1337
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1338
	memset(clients_in_company, 0, sizeof(clients_in_company));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1339
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1340
	/* Detect the active companies */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1341
	FOR_ALL_CLIENTS(cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1342
		ci = DEREF_CLIENT_INFO(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1343
		if (IsValidPlayer(ci->client_playas)) clients_in_company[ci->client_playas] = true;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1344
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1345
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1346
	if (!_network_dedicated) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1347
		ci = NetworkFindClientInfoFromIndex(NETWORK_SERVER_INDEX);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1348
		if (IsValidPlayer(ci->client_playas)) clients_in_company[ci->client_playas] = true;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1349
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1350
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1351
	/* Go through all the comapnies */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1352
	FOR_ALL_PLAYERS(p) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1353
		/* Skip the non-active once */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1354
		if (!p->is_active || p->is_ai) continue;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1355
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1356
		if (!clients_in_company[p->index]) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1357
			/* The company is empty for one month more */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1358
			_network_player_info[p->index].months_empty++;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1359
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1360
			/* Is the company empty for autoclean_unprotected-months, and is there no protection? */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1361
			if (_network_player_info[p->index].months_empty > _network_autoclean_unprotected && _network_player_info[p->index].password[0] == '\0') {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1362
				/* Shut the company down */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1363
				DoCommandP(0, 2, p->index, NULL, CMD_PLAYER_CTRL);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1364
				IConsolePrintF(_icolour_def, "Auto-cleaned company #%d", p->index + 1);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1365
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1366
			/* Is the compnay empty for autoclean_protected-months, and there is a protection? */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1367
			if (_network_player_info[p->index].months_empty > _network_autoclean_protected && _network_player_info[p->index].password[0] != '\0') {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1368
				/* Unprotect the company */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1369
				_network_player_info[p->index].password[0] = '\0';
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1370
				IConsolePrintF(_icolour_def, "Auto-removed protection from company #%d", p->index+1);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1371
				_network_player_info[p->index].months_empty = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1372
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1373
		} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1374
			/* It is not empty, reset the date */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1375
			_network_player_info[p->index].months_empty = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1376
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1377
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1378
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1379
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1380
// This function changes new_name to a name that is unique (by adding #1 ...)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1381
//  and it returns true if that succeeded.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1382
bool NetworkFindName(char new_name[NETWORK_CLIENT_NAME_LENGTH])
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1383
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1384
	NetworkClientState *new_cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1385
	bool found_name = false;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1386
	byte number = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1387
	char original_name[NETWORK_CLIENT_NAME_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1388
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1389
	// We use NETWORK_CLIENT_NAME_LENGTH in here, because new_name is really a pointer
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1390
	ttd_strlcpy(original_name, new_name, NETWORK_CLIENT_NAME_LENGTH);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1391
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1392
	while (!found_name) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1393
		const NetworkClientInfo *ci;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1394
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1395
		found_name = true;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1396
		FOR_ALL_CLIENTS(new_cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1397
			ci = DEREF_CLIENT_INFO(new_cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1398
			if (strcmp(ci->client_name, new_name) == 0) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1399
				// Name already in use
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1400
				found_name = false;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1401
				break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1402
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1403
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1404
		// Check if it is the same as the server-name
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1405
		ci = NetworkFindClientInfoFromIndex(NETWORK_SERVER_INDEX);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1406
		if (ci != NULL) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1407
			if (strcmp(ci->client_name, new_name) == 0) found_name = false; // name already in use
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1408
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1409
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1410
		if (!found_name) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1411
			// Try a new name (<name> #1, <name> #2, and so on)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1412
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1413
			// Stop if we tried for more than 50 times..
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1414
			if (number++ > 50) break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1415
			snprintf(new_name, NETWORK_CLIENT_NAME_LENGTH, "%s #%d", original_name, number);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1416
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1417
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1418
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1419
	return found_name;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1420
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1421
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1422
// Reads a packet from the stream
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1423
bool NetworkServer_ReadPackets(NetworkClientState *cs)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1424
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1425
	Packet *p;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1426
	NetworkRecvStatus res;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1427
	while ((p = NetworkRecv_Packet(cs, &res)) != NULL) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1428
		byte type = NetworkRecv_uint8(cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1429
		if (type < PACKET_END && _network_server_packet[type] != NULL && !cs->has_quit) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1430
			_network_server_packet[type](cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1431
		} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1432
			DEBUG(net, 0, "[server] received invalid packet type %d", type);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1433
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1434
		free(p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1435
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1436
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1437
	return true;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1438
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1439
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1440
// Handle the local command-queue
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1441
static void NetworkHandleCommandQueue(NetworkClientState* cs)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1442
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1443
	CommandPacket *cp;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1444
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1445
	while ( (cp = cs->command_queue) != NULL) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1446
		SEND_COMMAND(PACKET_SERVER_COMMAND)(cs, cp);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1447
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1448
		cs->command_queue = cp->next;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1449
		free(cp);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1450
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1451
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1452
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1453
// This is called every tick if this is a _network_server
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1454
void NetworkServer_Tick(bool send_frame)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1455
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1456
	NetworkClientState *cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1457
#ifndef ENABLE_NETWORK_SYNC_EVERY_FRAME
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1458
	bool send_sync = false;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1459
#endif
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1460
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1461
#ifndef ENABLE_NETWORK_SYNC_EVERY_FRAME
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1462
	if (_frame_counter >= _last_sync_frame + _network_sync_freq) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1463
		_last_sync_frame = _frame_counter;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1464
		send_sync = true;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1465
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1466
#endif
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1467
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1468
	// Now we are done with the frame, inform the clients that they can
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1469
	//  do their frame!
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1470
	FOR_ALL_CLIENTS(cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1471
		// Check if the speed of the client is what we can expect from a client
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1472
		if (cs->status == STATUS_ACTIVE) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1473
			// 1 lag-point per day
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1474
			int lag = NetworkCalculateLag(cs) / DAY_TICKS;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1475
			if (lag > 0) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1476
				if (lag > 3) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1477
					// Client did still not report in after 4 game-day, drop him
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1478
					//  (that is, the 3 of above, + 1 before any lag is counted)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1479
					IConsolePrintF(_icolour_err,"Client #%d is dropped because the client did not respond for more than 4 game-days", cs->index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1480
					NetworkCloseClient(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1481
					continue;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1482
				}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1483
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1484
				// Report once per time we detect the lag
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1485
				if (cs->lag_test == 0) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1486
					IConsolePrintF(_icolour_warn,"[%d] Client #%d is slow, try increasing *net_frame_freq to a higher value!", _frame_counter, cs->index);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1487
					cs->lag_test = 1;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1488
				}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1489
			} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1490
				cs->lag_test = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1491
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1492
		} else if (cs->status == STATUS_PRE_ACTIVE) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1493
			int lag = NetworkCalculateLag(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1494
			if (lag > _network_max_join_time) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1495
				IConsolePrintF(_icolour_err,"Client #%d is dropped because it took longer than %d ticks for him to join", cs->index, _network_max_join_time);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1496
				NetworkCloseClient(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1497
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1498
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1499
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1500
		if (cs->status >= STATUS_PRE_ACTIVE) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1501
			// Check if we can send command, and if we have anything in the queue
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1502
			NetworkHandleCommandQueue(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1503
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1504
			// Send an updated _frame_counter_max to the client
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1505
			if (send_frame) SEND_COMMAND(PACKET_SERVER_FRAME)(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1506
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1507
#ifndef ENABLE_NETWORK_SYNC_EVERY_FRAME
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1508
			// Send a sync-check packet
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1509
			if (send_sync) SEND_COMMAND(PACKET_SERVER_SYNC)(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1510
#endif
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1511
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1512
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1513
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1514
	/* See if we need to advertise */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1515
	NetworkUDPAdvertise();
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1516
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1517
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1518
void NetworkServerYearlyLoop(void)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1519
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1520
	NetworkCheckRestartMap();
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1521
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1522
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1523
void NetworkServerMonthlyLoop(void)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1524
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1525
	NetworkAutoCleanCompanies();
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1526
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1527
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
  1528
#endif /* ENABLE_NETWORK */