network_client.c
author celestar
Mon, 03 Apr 2006 14:25:32 +0000
changeset 3431 0d7fa19d0b4a
parent 3121 2e50f731567a
child 3437 2768c018e5f7
permissions -rw-r--r--
(svn r4259) -[multistop] Fix/Feature/Codechange:
1) Improved the road vehicle allocation (aka slotting) for multistop. Stops can now accept unlimited, er... 256, vehicles.
2) Removed the "wait for stop" feature, because it did not work in practise.
3) Slotting now ignores unreachable stations. Uses NPF at the moment because the old pathfinder cannot do it (yet)
4) Now matter how many vehicles approach a station, they will always be distributed evenly over existing stops.
5) Hopefully the last fundamental change to multistop
2186
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     1
/* $Id$ */
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     2
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
     3
#include "stdafx.h"
1299
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents: 1026
diff changeset
     4
#include "debug.h"
1317
f382f1b439c7 (svn r1821) Move generic string handling functions to string.[ch] and introduce stre{cpy,cat}, see string.h for their semantics
tron
parents: 1309
diff changeset
     5
#include "string.h"
1309
dab90d4cbf2d (svn r1813) Declare functions implemented in strings.c in their own shiny new header (though i think some of these function don't belong into strings.c)
tron
parents: 1299
diff changeset
     6
#include "strings.h"
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
     7
#include "network_data.h"
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
     8
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
     9
#ifdef ENABLE_NETWORK
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    10
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    11
#include "table/strings.h"
2163
637ec3c361f5 (svn r2673) Include functions.h directly, not globally via openttd.h
tron
parents: 2162
diff changeset
    12
#include "functions.h"
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    13
#include "network_client.h"
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    14
#include "network_gamelist.h"
2162
c1ded3bd3d0c (svn r2672) Move saving/loading related declarations to saveload.h
tron
parents: 2159
diff changeset
    15
#include "saveload.h"
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    16
#include "command.h"
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    17
#include "gfx.h"
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    18
#include "window.h"
1026
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
    19
#include "console.h"
2159
3b634157c3b2 (svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents: 2078
diff changeset
    20
#include "variables.h"
2684
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
    21
#include "ai/ai.h"
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    22
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    23
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    24
// This file handles all the client-commands
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    25
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    26
716
40a349345f82 (svn r1168) -Cleanup: [Network] Cleaned the network code a bit. Added 'const'
truelight
parents: 684
diff changeset
    27
extern const char _openttd_revision[];
40a349345f82 (svn r1168) -Cleanup: [Network] Cleaned the network code a bit. Added 'const'
truelight
parents: 684
diff changeset
    28
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    29
// So we don't make too much typos ;)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    30
#define MY_CLIENT DEREF_CLIENT(0)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    31
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    32
static uint32 last_ack_frame;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    33
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    34
// **********
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    35
// Sending functions
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    36
//   DEF_CLIENT_SEND_COMMAND has no parameters
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    37
// **********
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    38
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    39
DEF_CLIENT_SEND_COMMAND(PACKET_CLIENT_COMPANY_INFO)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    40
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    41
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    42
	// Packet: CLIENT_COMPANY_INFO
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    43
	// Function: Request company-info (in detail)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    44
	// Data:
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    45
	//    <none>
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    46
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    47
	Packet *p;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    48
	_network_join_status = NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    49
	InvalidateWindow(WC_NETWORK_STATUS_WINDOW, 0);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    50
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    51
	p = NetworkSend_Init(PACKET_CLIENT_COMPANY_INFO);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    52
	NetworkSend_Packet(p, MY_CLIENT);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    53
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    54
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    55
DEF_CLIENT_SEND_COMMAND(PACKET_CLIENT_JOIN)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    56
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    57
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    58
	// Packet: CLIENT_JOIN
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    59
	// Function: Try to join the server
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    60
	// Data:
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    61
	//    String: OpenTTD Revision (norev000 if no revision)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    62
	//    String: Player Name (max NETWORK_NAME_LENGTH)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    63
	//    uint8:  Play as Player id (1..MAX_PLAYERS)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    64
	//    uint8:  Language ID
602
9bbe42a9e3ed (svn r1026) -Add: [Network] Added unique id, so in network, each client has an
truelight
parents: 571
diff changeset
    65
	//    String: Unique id to find the player back in server-listing
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    66
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    67
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    68
	Packet *p;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    69
	_network_join_status = NETWORK_JOIN_STATUS_AUTHORIZING;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    70
	InvalidateWindow(WC_NETWORK_STATUS_WINDOW, 0);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    71
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    72
	p = NetworkSend_Init(PACKET_CLIENT_JOIN);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    73
	NetworkSend_string(p, _openttd_revision);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    74
	NetworkSend_string(p, _network_player_name); // Player name
662
029d67bd54e6 (svn r1096) -Fix: [Network] PlayAs is now registered correctly
truelight
parents: 659
diff changeset
    75
	NetworkSend_uint8(p, _network_playas); // PlayAs
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    76
	NetworkSend_uint8(p, NETLANG_ANY); // Language
602
9bbe42a9e3ed (svn r1026) -Add: [Network] Added unique id, so in network, each client has an
truelight
parents: 571
diff changeset
    77
	NetworkSend_string(p, _network_unique_id);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    78
	NetworkSend_Packet(p, MY_CLIENT);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    79
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    80
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    81
DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_PASSWORD)(NetworkPasswordType type, const char *password)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    82
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    83
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    84
	// Packet: CLIENT_PASSWORD
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    85
	// Function: Send a password to the server to authorize
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    86
	// Data:
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    87
	//    uint8:  NetworkPasswordType
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    88
	//    String: Password
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    89
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    90
	Packet *p = NetworkSend_Init(PACKET_CLIENT_PASSWORD);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    91
	NetworkSend_uint8(p, type);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    92
	NetworkSend_string(p, password);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    93
	NetworkSend_Packet(p, MY_CLIENT);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    94
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    95
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    96
DEF_CLIENT_SEND_COMMAND(PACKET_CLIENT_GETMAP)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    97
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    98
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    99
	// Packet: CLIENT_GETMAP
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   100
	// Function: Request the map from the server
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   101
	// Data:
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   102
	//    <none>
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   103
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   104
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   105
	Packet *p = NetworkSend_Init(PACKET_CLIENT_GETMAP);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   106
	NetworkSend_Packet(p, MY_CLIENT);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   107
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   108
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   109
DEF_CLIENT_SEND_COMMAND(PACKET_CLIENT_MAP_OK)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   110
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   111
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   112
	// Packet: CLIENT_MAP_OK
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   113
	// Function: Tell the server that we are done receiving/loading the map
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   114
	// Data:
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   115
	//    <none>
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   116
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   117
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   118
	Packet *p = NetworkSend_Init(PACKET_CLIENT_MAP_OK);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   119
	NetworkSend_Packet(p, MY_CLIENT);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   120
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   121
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   122
DEF_CLIENT_SEND_COMMAND(PACKET_CLIENT_ACK)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   123
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   124
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   125
	// Packet: CLIENT_ACK
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   126
	// Function: Tell the server we are done with this frame
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   127
	// Data:
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   128
	//    uint32: current FrameCounter of the client
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   129
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   130
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   131
	Packet *p = NetworkSend_Init(PACKET_CLIENT_ACK);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   132
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   133
	NetworkSend_uint32(p, _frame_counter);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   134
	NetworkSend_Packet(p, MY_CLIENT);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   135
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   136
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   137
// Send a command packet to the server
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   138
DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_COMMAND)(CommandPacket *cp)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   139
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   140
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   141
	// Packet: CLIENT_COMMAND
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   142
	// Function: Send a DoCommand to the Server
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   143
	// Data:
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   144
	//    uint8:  PlayerID (0..MAX_PLAYERS-1)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   145
	//    uint32: CommandID (see command.h)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   146
	//    uint32: P1 (free variables used in DoCommand)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   147
	//    uint32: P2
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   148
	//    uint32: Tile
1820
9b6458526480 (svn r2324) Introduce _cmd_text for passing strings with a command instead of abusing _decode_parameters as text buffer. This should prevent several possible buffer overruns and is a bit cleaner to use. As bonus it reduces the size of most command packets by 79 bytes.
tron
parents: 1797
diff changeset
   149
	//    string: text
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   150
	//    uint8:  CallBackID (see callback_table.c)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   151
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   152
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   153
	Packet *p = NetworkSend_Init(PACKET_CLIENT_COMMAND);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   154
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   155
	NetworkSend_uint8(p, cp->player);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   156
	NetworkSend_uint32(p, cp->cmd);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   157
	NetworkSend_uint32(p, cp->p1);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   158
	NetworkSend_uint32(p, cp->p2);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   159
	NetworkSend_uint32(p, (uint32)cp->tile);
1820
9b6458526480 (svn r2324) Introduce _cmd_text for passing strings with a command instead of abusing _decode_parameters as text buffer. This should prevent several possible buffer overruns and is a bit cleaner to use. As bonus it reduces the size of most command packets by 79 bytes.
tron
parents: 1797
diff changeset
   160
	NetworkSend_string(p, cp->text);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   161
	NetworkSend_uint8(p, cp->callback);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   162
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   163
	NetworkSend_Packet(p, MY_CLIENT);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   164
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   165
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   166
// Send a chat-packet over the network
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   167
DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_CHAT)(NetworkAction action, DestType desttype, int dest, const char *msg)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   168
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   169
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   170
	// Packet: CLIENT_CHAT
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   171
	// Function: Send a chat-packet to the serve
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   172
	// Data:
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   173
	//    uint8:  ActionID (see network_data.h, NetworkAction)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   174
	//    uint8:  Destination Type (see network_data.h, DestType);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   175
	//    uint8:  Destination Player (1..MAX_PLAYERS)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   176
	//    String: Message (max MAX_TEXT_MSG_LEN)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   177
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   178
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   179
	Packet *p = NetworkSend_Init(PACKET_CLIENT_CHAT);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   180
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   181
	NetworkSend_uint8(p, action);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   182
	NetworkSend_uint8(p, desttype);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   183
	NetworkSend_uint8(p, dest);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   184
	NetworkSend_string(p, msg);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   185
	NetworkSend_Packet(p, MY_CLIENT);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   186
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   187
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   188
// Send an error-packet over the network
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   189
DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_ERROR)(NetworkErrorCode errorno)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   190
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   191
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   192
	// Packet: CLIENT_ERROR
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   193
	// Function: The client made an error and is quiting the game
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   194
	// Data:
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   195
	//    uint8:  ErrorID (see network_data.h, NetworkErrorCode)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   196
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   197
	Packet *p = NetworkSend_Init(PACKET_CLIENT_ERROR);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   198
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   199
	NetworkSend_uint8(p, errorno);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   200
	NetworkSend_Packet(p, MY_CLIENT);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   201
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   202
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   203
DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_SET_PASSWORD)(const char *password)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   204
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   205
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   206
	// Packet: PACKET_CLIENT_SET_PASSWORD
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   207
	// Function: Set the password for the clients current company
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   208
	// Data:
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   209
	//    String: Password
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   210
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   211
	Packet *p = NetworkSend_Init(PACKET_CLIENT_SET_PASSWORD);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   212
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   213
	NetworkSend_string(p, password);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   214
	NetworkSend_Packet(p, MY_CLIENT);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   215
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   216
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   217
DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_SET_NAME)(const char *name)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   218
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   219
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   220
	// Packet: PACKET_CLIENT_SET_NAME
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   221
	// Function: Gives the player a new name
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   222
	// Data:
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   223
	//    String: Name
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   224
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   225
	Packet *p = NetworkSend_Init(PACKET_CLIENT_SET_NAME);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   226
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   227
	NetworkSend_string(p, name);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   228
	NetworkSend_Packet(p, MY_CLIENT);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   229
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   230
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   231
// Send an quit-packet over the network
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   232
DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_QUIT)(const char *leavemsg)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   233
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   234
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   235
	// Packet: CLIENT_QUIT
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   236
	// Function: The client is quiting the game
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   237
	// Data:
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   238
	//    String: leave-message
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   239
	//
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   240
	Packet *p = NetworkSend_Init(PACKET_CLIENT_QUIT);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   241
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   242
	NetworkSend_string(p, leavemsg);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   243
	NetworkSend_Packet(p, MY_CLIENT);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   244
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   245
1026
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   246
DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_RCON)(const char *pass, const char *command)
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   247
{
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   248
	Packet *p = NetworkSend_Init(PACKET_CLIENT_RCON);
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   249
	NetworkSend_string(p, pass);
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   250
	NetworkSend_string(p, command);
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   251
	NetworkSend_Packet(p, MY_CLIENT);
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   252
}
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   253
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   254
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   255
// **********
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   256
// Receiving functions
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   257
//   DEF_CLIENT_RECEIVE_COMMAND has parameter: Packet *p
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   258
// **********
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   259
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   260
extern bool SafeSaveOrLoad(const char *filename, int mode, int newgm);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   261
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   262
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_FULL)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   263
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   264
	// We try to join a server which is full
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   265
	_switch_mode_errorstr = STR_NETWORK_ERR_SERVER_FULL;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   266
	DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   267
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   268
	return NETWORK_RECV_STATUS_SERVER_FULL;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   269
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   270
841
8f0a68c6f43b (svn r1322) -Add: banning system (mostly tnx to guru3)
truelight
parents: 779
diff changeset
   271
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_BANNED)
8f0a68c6f43b (svn r1322) -Add: banning system (mostly tnx to guru3)
truelight
parents: 779
diff changeset
   272
{
8f0a68c6f43b (svn r1322) -Add: banning system (mostly tnx to guru3)
truelight
parents: 779
diff changeset
   273
	// We try to join a server where we are banned
8f0a68c6f43b (svn r1322) -Add: banning system (mostly tnx to guru3)
truelight
parents: 779
diff changeset
   274
	_switch_mode_errorstr = STR_NETWORK_ERR_SERVER_BANNED;
8f0a68c6f43b (svn r1322) -Add: banning system (mostly tnx to guru3)
truelight
parents: 779
diff changeset
   275
	DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
8f0a68c6f43b (svn r1322) -Add: banning system (mostly tnx to guru3)
truelight
parents: 779
diff changeset
   276
8f0a68c6f43b (svn r1322) -Add: banning system (mostly tnx to guru3)
truelight
parents: 779
diff changeset
   277
	return NETWORK_RECV_STATUS_SERVER_BANNED;
8f0a68c6f43b (svn r1322) -Add: banning system (mostly tnx to guru3)
truelight
parents: 779
diff changeset
   278
}
8f0a68c6f43b (svn r1322) -Add: banning system (mostly tnx to guru3)
truelight
parents: 779
diff changeset
   279
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   280
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_COMPANY_INFO)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   281
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   282
	byte company_info_version;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   283
	int i;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   284
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   285
	company_info_version = NetworkRecv_uint8(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   286
1013
8080f9db9057 (svn r1513) -Fix: glitch in revision 1510
truelight
parents: 1011
diff changeset
   287
	if (!MY_CLIENT->quited && company_info_version == NETWORK_COMPANY_INFO_VERSION) {
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   288
		byte total;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   289
		byte current;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   290
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   291
		total = NetworkRecv_uint8(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   292
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   293
		// There is no data at all..
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   294
		if (total == 0)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   295
			return NETWORK_RECV_STATUS_CLOSE_QUERY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   296
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   297
		current = NetworkRecv_uint8(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   298
		if (current >= MAX_PLAYERS)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   299
			return NETWORK_RECV_STATUS_CLOSE_QUERY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   300
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   301
		NetworkRecv_string(MY_CLIENT, p, _network_player_info[current].company_name, sizeof(_network_player_info[current].company_name));
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   302
		_network_player_info[current].inaugurated_year = NetworkRecv_uint8(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   303
		_network_player_info[current].company_value = NetworkRecv_uint64(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   304
		_network_player_info[current].money = NetworkRecv_uint64(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   305
		_network_player_info[current].income = NetworkRecv_uint64(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   306
		_network_player_info[current].performance = NetworkRecv_uint16(MY_CLIENT, p);
1011
2587838541bf (svn r1510) -Add: Improved Network Lobby GUI: (bociusz)
truelight
parents: 959
diff changeset
   307
		_network_player_info[current].use_password = NetworkRecv_uint8(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   308
		for (i = 0; i < NETWORK_VEHICLE_TYPES; i++)
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   309
			_network_player_info[current].num_vehicle[i] = NetworkRecv_uint16(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   310
		for (i = 0; i < NETWORK_STATION_TYPES; i++)
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   311
			_network_player_info[current].num_station[i] = NetworkRecv_uint16(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   312
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   313
		NetworkRecv_string(MY_CLIENT, p, _network_player_info[current].players, sizeof(_network_player_info[current].players));
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   314
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   315
		InvalidateWindow(WC_NETWORK_WINDOW, 0);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   316
734
018e549265ed (svn r1186) -Fix: [Network] You can now join a company on a server where a company
truelight
parents: 722
diff changeset
   317
		return NETWORK_RECV_STATUS_OKAY;
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   318
	}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   319
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   320
	return NETWORK_RECV_STATUS_CLOSE_QUERY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   321
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   322
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   323
// This packet contains info about the client (playas and name)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   324
//  as client we save this in NetworkClientInfo, linked via 'index'
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   325
//  which is always an unique number on a server.
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   326
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CLIENT_INFO)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   327
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   328
	NetworkClientInfo *ci;
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   329
	uint16 index = NetworkRecv_uint16(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   330
	byte playas = NetworkRecv_uint8(MY_CLIENT, p);
662
029d67bd54e6 (svn r1096) -Fix: [Network] PlayAs is now registered correctly
truelight
parents: 659
diff changeset
   331
	char name[NETWORK_NAME_LENGTH];
029d67bd54e6 (svn r1096) -Fix: [Network] PlayAs is now registered correctly
truelight
parents: 659
diff changeset
   332
	char unique_id[NETWORK_NAME_LENGTH];
029d67bd54e6 (svn r1096) -Fix: [Network] PlayAs is now registered correctly
truelight
parents: 659
diff changeset
   333
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   334
	NetworkRecv_string(MY_CLIENT, p, name, sizeof(name));
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   335
	NetworkRecv_string(MY_CLIENT, p, unique_id, sizeof(unique_id));
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   336
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   337
	if (MY_CLIENT->quited)
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   338
		return NETWORK_RECV_STATUS_CONN_LOST;
662
029d67bd54e6 (svn r1096) -Fix: [Network] PlayAs is now registered correctly
truelight
parents: 659
diff changeset
   339
029d67bd54e6 (svn r1096) -Fix: [Network] PlayAs is now registered correctly
truelight
parents: 659
diff changeset
   340
	/* Do we receive a change of data? Most likely we changed playas */
2684
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   341
	if (index == _network_own_client_index) {
662
029d67bd54e6 (svn r1096) -Fix: [Network] PlayAs is now registered correctly
truelight
parents: 659
diff changeset
   342
		_network_playas = playas;
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   343
2702
e4663e88c530 (svn r3246) -Fix: small glitch in ai_network_client code (network_client.c)
truelight
parents: 2684
diff changeset
   344
		/* Are we a ai-network-client? Are we not joining as a SPECTATOR (playas == 0, means SPECTATOR) */
e4663e88c530 (svn r3246) -Fix: small glitch in ai_network_client code (network_client.c)
truelight
parents: 2684
diff changeset
   345
		if (_ai.network_client && playas != 0) {
2684
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   346
			if (_ai.network_playas == OWNER_SPECTATOR)
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   347
				AI_StartNewAI(playas - 1);
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   348
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   349
			_ai.network_playas = playas - 1;
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   350
		}
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   351
	}
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   352
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   353
	ci = NetworkFindClientInfoFromIndex(index);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   354
	if (ci != NULL) {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   355
		if (playas == ci->client_playas && strcmp(name, ci->client_name) != 0) {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   356
			// Client name changed, display the change
2373
f06403621870 (svn r2899) -Fix: Several format string vulnerabilities and buffer overflows in the network code
tron
parents: 2293
diff changeset
   357
			NetworkTextMessage(NETWORK_ACTION_NAME_CHANGE, 1, false, ci->client_name, "%s", name);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   358
		} else if (playas != ci->client_playas) {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   359
			// The player changed from client-player..
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   360
			// Do not display that for now
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   361
		}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   362
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   363
		ci->client_playas = playas;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   364
		ttd_strlcpy(ci->client_name, name, sizeof(ci->client_name));
662
029d67bd54e6 (svn r1096) -Fix: [Network] PlayAs is now registered correctly
truelight
parents: 659
diff changeset
   365
722
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   366
		InvalidateWindow(WC_CLIENT_LIST, 0);
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   367
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   368
		return NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   369
	}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   370
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   371
	// We don't have this index yet, find an empty index, and put the data there
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   372
	ci = NetworkFindClientInfoFromIndex(NETWORK_EMPTY_INDEX);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   373
	if (ci != NULL) {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   374
		ci->client_index = index;
662
029d67bd54e6 (svn r1096) -Fix: [Network] PlayAs is now registered correctly
truelight
parents: 659
diff changeset
   375
		ci->client_playas = playas;
029d67bd54e6 (svn r1096) -Fix: [Network] PlayAs is now registered correctly
truelight
parents: 659
diff changeset
   376
029d67bd54e6 (svn r1096) -Fix: [Network] PlayAs is now registered correctly
truelight
parents: 659
diff changeset
   377
		ttd_strlcpy(ci->client_name, name, sizeof(ci->client_name));
029d67bd54e6 (svn r1096) -Fix: [Network] PlayAs is now registered correctly
truelight
parents: 659
diff changeset
   378
		ttd_strlcpy(ci->unique_id, unique_id, sizeof(ci->unique_id));
029d67bd54e6 (svn r1096) -Fix: [Network] PlayAs is now registered correctly
truelight
parents: 659
diff changeset
   379
722
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   380
		InvalidateWindow(WC_CLIENT_LIST, 0);
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   381
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   382
		return NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   383
	}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   384
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   385
	// Here the program should never ever come.....
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   386
	return NETWORK_RECV_STATUS_MALFORMED_PACKET;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   387
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   388
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   389
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_ERROR)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   390
{
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   391
	NetworkErrorCode error = NetworkRecv_uint8(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   392
2879
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   393
	switch (error) {
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   394
		/* We made an error in the protocol, and our connection is closed.... */
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   395
		case NETWORK_ERROR_NOT_AUTHORIZED:
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   396
		case NETWORK_ERROR_NOT_EXPECTED:
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   397
		case NETWORK_ERROR_PLAYER_MISMATCH:
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   398
			_switch_mode_errorstr = STR_NETWORK_ERR_SERVER_ERROR;
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   399
			break;
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   400
		case NETWORK_ERROR_FULL:
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   401
			_switch_mode_errorstr = STR_NETWORK_ERR_SERVER_FULL;
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   402
			break;
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   403
		case NETWORK_ERROR_WRONG_REVISION:
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   404
			_switch_mode_errorstr = STR_NETWORK_ERR_WRONG_REVISION;
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   405
			break;
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   406
		case NETWORK_ERROR_WRONG_PASSWORD:
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   407
			_switch_mode_errorstr = STR_NETWORK_ERR_WRONG_PASSWORD;
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   408
			break;
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   409
		case NETWORK_ERROR_KICKED:
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   410
			_switch_mode_errorstr = STR_NETWORK_ERR_KICKED;
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   411
			break;
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   412
		case NETWORK_ERROR_CHEATER:
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   413
			_switch_mode_errorstr = STR_NETWORK_ERR_CHEATER;
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   414
			break;
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   415
		default:
d270cb37c0ec (svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Darkvater
parents: 2817
diff changeset
   416
			_switch_mode_errorstr = STR_NETWORK_ERR_LOSTCONNECTION;
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   417
	}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   418
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   419
	DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   420
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   421
	return NETWORK_RECV_STATUS_SERVER_ERROR;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   422
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   423
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   424
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_NEED_PASSWORD)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   425
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   426
	NetworkPasswordType type;
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   427
	type = NetworkRecv_uint8(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   428
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   429
	if (type == NETWORK_GAME_PASSWORD) {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   430
		ShowNetworkNeedGamePassword();
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   431
		return NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   432
	} else if (type == NETWORK_COMPANY_PASSWORD) {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   433
		ShowNetworkNeedCompanyPassword();
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   434
		return NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   435
	}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   436
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   437
	return NETWORK_RECV_STATUS_MALFORMED_PACKET;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   438
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   439
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   440
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_WELCOME)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   441
{
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   442
	_network_own_client_index = NetworkRecv_uint16(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   443
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   444
	// Start receiving the map
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   445
	SEND_COMMAND(PACKET_CLIENT_GETMAP)();
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   446
	return NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   447
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   448
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   449
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_WAIT)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   450
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   451
	_network_join_status = NETWORK_JOIN_STATUS_WAITING;
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   452
	_network_join_waiting = NetworkRecv_uint8(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   453
	InvalidateWindow(WC_NETWORK_STATUS_WINDOW, 0);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   454
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   455
	// We are put on hold for receiving the map.. we need GUI for this ;)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   456
	DEBUG(net, 1)("[NET] The server is currently busy sending the map to someone else.. please hold..." );
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   457
	DEBUG(net, 1)("[NET]  There are %d clients in front of you", _network_join_waiting);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   458
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   459
	return NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   460
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   461
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   462
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_MAP)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   463
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   464
	static char filename[256];
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   465
	static FILE *file_pointer;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   466
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   467
	byte maptype;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   468
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   469
	maptype = NetworkRecv_uint8(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   470
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   471
	if (MY_CLIENT->quited)
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   472
		return NETWORK_RECV_STATUS_CONN_LOST;
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   473
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   474
	// First packet, init some stuff
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   475
	if (maptype == MAP_PACKET_START) {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   476
		// The name for the temp-map
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   477
		sprintf(filename, "%s%snetwork_client.tmp",  _path.autosave_dir, PATHSEP);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   478
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   479
		file_pointer = fopen(filename, "wb");
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   480
		if (file_pointer == NULL) {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   481
			_switch_mode_errorstr = STR_NETWORK_ERR_SAVEGAMEERROR;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   482
			return NETWORK_RECV_STATUS_SAVEGAME;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   483
		}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   484
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   485
		_frame_counter = _frame_counter_server = _frame_counter_max = NetworkRecv_uint32(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   486
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   487
		_network_join_status = NETWORK_JOIN_STATUS_DOWNLOADING;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   488
		_network_join_kbytes = 0;
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   489
		_network_join_kbytes_total = NetworkRecv_uint32(MY_CLIENT, p) / 1024;
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   490
		InvalidateWindow(WC_NETWORK_STATUS_WINDOW, 0);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   491
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   492
		// The first packet does not contain any more data
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   493
		return NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   494
	}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   495
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   496
	if (maptype == MAP_PACKET_NORMAL) {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   497
		// We are still receiving data, put it to the file
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   498
		fwrite(p->buffer + p->pos, 1, p->size - p->pos, file_pointer);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   499
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   500
		_network_join_kbytes = ftell(file_pointer) / 1024;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   501
		InvalidateWindow(WC_NETWORK_STATUS_WINDOW, 0);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   502
	}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   503
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   504
	// Check if this was the last packet
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   505
	if (maptype == MAP_PACKET_END) {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   506
		fclose(file_pointer);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   507
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   508
		_network_join_status = NETWORK_JOIN_STATUS_PROCESSING;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   509
		InvalidateWindow(WC_NETWORK_STATUS_WINDOW, 0);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   510
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   511
		// The map is done downloading, load it
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   512
		// Load the map
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   513
		if (!SafeSaveOrLoad(filename, SL_LOAD, GM_NORMAL)) {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   514
			DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   515
			_switch_mode_errorstr = STR_NETWORK_ERR_SAVEGAMEERROR;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   516
			return NETWORK_RECV_STATUS_SAVEGAME;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   517
		}
1500
228f77e88adf (svn r2004) - Fix: [ 1149487 ] Autosave ignoring settings
Darkvater
parents: 1317
diff changeset
   518
228f77e88adf (svn r2004) - Fix: [ 1149487 ] Autosave ignoring settings
Darkvater
parents: 1317
diff changeset
   519
		_opt_ptr = &_opt; // during a network game you are always in-game
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   520
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   521
		// Say we received the map and loaded it correctly!
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   522
		SEND_COMMAND(PACKET_CLIENT_MAP_OK)();
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   523
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   524
		if (_network_playas == 0 || _network_playas > MAX_PLAYERS ||
1962
51ee4f459268 (svn r2468) -Codechange: Got rid of DEREF_PLAYER and replaced it by GetPlayer
celestar
parents: 1820
diff changeset
   525
				!GetPlayer(_network_playas - 1)->is_active) {
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   526
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   527
			if (_network_playas == OWNER_SPECTATOR) {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   528
				// The client wants to be a spectator..
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   529
				_local_player = OWNER_SPECTATOR;
670
7c58dc46609c (svn r1108) -Fix: [Network] Fixed problem around slow clients:
truelight
parents: 662
diff changeset
   530
				DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   531
			} else {
1797
a19c4181f1b7 (svn r2301) - CodeChange: prettyify ChangeOwnerShipOfPlayerItems() a bit
Darkvater
parents: 1500
diff changeset
   532
				/* We have arrived and ready to start playing; send a command to make a new player;
a19c4181f1b7 (svn r2301) - CodeChange: prettyify ChangeOwnerShipOfPlayerItems() a bit
Darkvater
parents: 1500
diff changeset
   533
				 * the server will give us a client-id and let us in */
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   534
				_local_player = 0;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   535
				NetworkSend_Command(0, 0, 0, CMD_PLAYER_CTRL, NULL);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   536
				_local_player = OWNER_SPECTATOR;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   537
			}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   538
		} else {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   539
			// take control over an existing company
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   540
			_local_player = _network_playas - 1;
2293
a71c210076be (svn r2817) -Codechange: [autoreplace]: moved autoreplace and autorenew to serverside
bjarni
parents: 2186
diff changeset
   541
			_patches.autorenew = GetPlayer(_local_player)->engine_renew;
a71c210076be (svn r2817) -Codechange: [autoreplace]: moved autoreplace and autorenew to serverside
bjarni
parents: 2186
diff changeset
   542
			_patches.autorenew_months = GetPlayer(_local_player)->engine_renew_months;
a71c210076be (svn r2817) -Codechange: [autoreplace]: moved autoreplace and autorenew to serverside
bjarni
parents: 2186
diff changeset
   543
			_patches.autorenew_money = GetPlayer(_local_player)->engine_renew_money;
684
425b1741fd45 (svn r1125) -Fix: [Network] You can now safely join a company again
truelight
parents: 670
diff changeset
   544
			DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   545
		}
2684
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   546
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   547
		/* Check if we are an ai-network-client, and if so, disable GUI */
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   548
		if (_ai.network_client) {
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   549
			_ai.network_playas = _local_player;
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   550
			_local_player      = OWNER_SPECTATOR;
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   551
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   552
			if (_ai.network_playas != OWNER_SPECTATOR) {
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   553
				/* If we didn't join the game as a spectator, activate the AI */
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   554
				AI_StartNewAI(_ai.network_playas);
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   555
			}
8aba54c245cc (svn r3226) -Fix: GPMI implementation had minor glitches
truelight
parents: 2373
diff changeset
   556
		}
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   557
	}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   558
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   559
	return NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   560
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   561
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   562
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_FRAME)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   563
{
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   564
	_frame_counter_server = NetworkRecv_uint32(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   565
	_frame_counter_max = NetworkRecv_uint32(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   566
#ifdef ENABLE_NETWORK_SYNC_EVERY_FRAME
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   567
	// Test if the server supports this option
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   568
	//  and if we are at the frame the server is
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   569
	if (p->pos < p->size) {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   570
		_sync_frame = _frame_counter_server;
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   571
		_sync_seed_1 = NetworkRecv_uint32(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   572
#ifdef NETWORK_SEND_DOUBLE_SEED
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   573
		_sync_seed_2 = NetworkRecv_uint32(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   574
#endif
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   575
	}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   576
#endif
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   577
	DEBUG(net, 7)("[NET] Received FRAME %d",_frame_counter_server);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   578
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   579
	// Let the server know that we received this frame correctly
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   580
	//  We do this only once per day, to save some bandwidth ;)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   581
	if (!_network_first_time && last_ack_frame < _frame_counter) {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   582
		last_ack_frame = _frame_counter + DAY_TICKS;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   583
		DEBUG(net,6)("[NET] Sent ACK at %d", _frame_counter);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   584
		SEND_COMMAND(PACKET_CLIENT_ACK)();
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   585
	}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   586
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   587
	return NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   588
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   589
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   590
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_SYNC)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   591
{
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   592
	_sync_frame = NetworkRecv_uint32(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   593
	_sync_seed_1 = NetworkRecv_uint32(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   594
#ifdef NETWORK_SEND_DOUBLE_SEED
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   595
	_sync_seed_2 = NetworkRecv_uint32(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   596
#endif
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   597
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   598
	return NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   599
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   600
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   601
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_COMMAND)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   602
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   603
	CommandPacket *cp = malloc(sizeof(CommandPacket));
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   604
	cp->player = NetworkRecv_uint8(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   605
	cp->cmd = NetworkRecv_uint32(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   606
	cp->p1 = NetworkRecv_uint32(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   607
	cp->p2 = NetworkRecv_uint32(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   608
	cp->tile = NetworkRecv_uint32(MY_CLIENT, p);
1820
9b6458526480 (svn r2324) Introduce _cmd_text for passing strings with a command instead of abusing _decode_parameters as text buffer. This should prevent several possible buffer overruns and is a bit cleaner to use. As bonus it reduces the size of most command packets by 79 bytes.
tron
parents: 1797
diff changeset
   609
	NetworkRecv_string(MY_CLIENT, p, cp->text, sizeof(cp->text));
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   610
	cp->callback = NetworkRecv_uint8(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   611
	cp->frame = NetworkRecv_uint32(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   612
	cp->next = NULL;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   613
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   614
	// The server did send us this command..
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   615
	//  queue it in our own queue, so we can handle it in the upcoming frame!
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   616
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   617
	if (_local_command_queue == NULL) {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   618
		_local_command_queue = cp;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   619
	} else {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   620
		// Find last packet
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   621
		CommandPacket *c = _local_command_queue;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   622
		while (c->next != NULL) c = c->next;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   623
		c->next = cp;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   624
	}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   625
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   626
	return NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   627
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   628
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   629
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CHAT)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   630
{
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   631
	NetworkAction action = NetworkRecv_uint8(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   632
	char msg[MAX_TEXT_MSG_LEN];
774
258c11431acb (svn r1240) -Fix: OpenTTD once again compiles if ENABLE_NETWORK is disabled.
darkvater
parents: 748
diff changeset
   633
	NetworkClientInfo *ci = NULL, *ci_to;
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   634
	uint16 index;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   635
	char name[NETWORK_NAME_LENGTH];
722
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   636
	bool self_send;
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   637
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   638
	index = NetworkRecv_uint16(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   639
	self_send = NetworkRecv_uint8(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   640
	NetworkRecv_string(MY_CLIENT, p, msg, MAX_TEXT_MSG_LEN);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   641
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   642
	ci_to = NetworkFindClientInfoFromIndex(index);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   643
	if (ci_to == NULL) return NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   644
722
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   645
	/* Do we display the action locally? */
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   646
	if (self_send) {
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   647
		switch (action) {
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   648
			case NETWORK_ACTION_CHAT_CLIENT:
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   649
				/* For speak to client we need the client-name */
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   650
				snprintf(name, sizeof(name), "%s", ci_to->client_name);
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   651
				ci = NetworkFindClientInfoFromIndex(_network_own_client_index);
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   652
				break;
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   653
			case NETWORK_ACTION_CHAT_PLAYER:
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   654
			case NETWORK_ACTION_GIVE_MONEY:
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   655
				/* For speak to player or give money, we need the player-name */
779
1abefd084ffb (svn r1246) -Fix: [ 1090099 ] Company-messages did crash the game, because
truelight
parents: 774
diff changeset
   656
				if (ci_to->client_playas > MAX_PLAYERS)
1abefd084ffb (svn r1246) -Fix: [ 1090099 ] Company-messages did crash the game, because
truelight
parents: 774
diff changeset
   657
					return NETWORK_RECV_STATUS_OKAY; // This should never happen
1962
51ee4f459268 (svn r2468) -Codechange: Got rid of DEREF_PLAYER and replaced it by GetPlayer
celestar
parents: 1820
diff changeset
   658
				GetString(name, GetPlayer(ci_to->client_playas-1)->name_1);
722
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   659
				ci = NetworkFindClientInfoFromIndex(_network_own_client_index);
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   660
				break;
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   661
			default:
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   662
				/* This should never happen */
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   663
				NOT_REACHED();
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   664
				break;
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   665
		}
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   666
	} else {
722
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   667
		/* Display message from somebody else */
602
9bbe42a9e3ed (svn r1026) -Add: [Network] Added unique id, so in network, each client has an
truelight
parents: 571
diff changeset
   668
		snprintf(name, sizeof(name), "%s", ci_to->client_name);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   669
		ci = ci_to;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   670
	}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   671
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   672
	if (ci != NULL)
722
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   673
		NetworkTextMessage(action, GetDrawStringPlayerColor(ci->client_playas-1), self_send, name, "%s", msg);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   674
	return NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   675
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   676
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   677
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_ERROR_QUIT)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   678
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   679
	int errorno;
722
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   680
	char str[100];
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   681
	uint16 index;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   682
	NetworkClientInfo *ci;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   683
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   684
	index = NetworkRecv_uint16(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   685
	errorno = NetworkRecv_uint8(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   686
722
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   687
	GetString(str, STR_NETWORK_ERR_CLIENT_GENERAL + errorno);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   688
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   689
	ci = NetworkFindClientInfoFromIndex(index);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   690
	if (ci != NULL) {
2373
f06403621870 (svn r2899) -Fix: Several format string vulnerabilities and buffer overflows in the network code
tron
parents: 2293
diff changeset
   691
		NetworkTextMessage(NETWORK_ACTION_LEAVE, 1, false, ci->client_name, "%s", str);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   692
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   693
		// The client is gone, give the NetworkClientInfo free
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   694
		ci->client_index = NETWORK_EMPTY_INDEX;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   695
	}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   696
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   697
	InvalidateWindow(WC_CLIENT_LIST, 0);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   698
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   699
	return NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   700
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   701
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   702
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_QUIT)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   703
{
722
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   704
	char str[100];
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   705
	uint16 index;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   706
	NetworkClientInfo *ci;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   707
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   708
	index = NetworkRecv_uint16(MY_CLIENT, p);
2373
f06403621870 (svn r2899) -Fix: Several format string vulnerabilities and buffer overflows in the network code
tron
parents: 2293
diff changeset
   709
	NetworkRecv_string(MY_CLIENT, p, str, lengthof(str));
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   710
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   711
	ci = NetworkFindClientInfoFromIndex(index);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   712
	if (ci != NULL) {
2373
f06403621870 (svn r2899) -Fix: Several format string vulnerabilities and buffer overflows in the network code
tron
parents: 2293
diff changeset
   713
		NetworkTextMessage(NETWORK_ACTION_LEAVE, 1, false, ci->client_name, "%s", str);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   714
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   715
		// The client is gone, give the NetworkClientInfo free
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   716
		ci->client_index = NETWORK_EMPTY_INDEX;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   717
	} else {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   718
		DEBUG(net, 0)("[NET] Error - unknown client (%d) is leaving the game", index);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   719
	}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   720
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   721
	InvalidateWindow(WC_CLIENT_LIST, 0);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   722
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   723
	// If we come here it means we could not locate the client.. strange :s
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   724
	return NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   725
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   726
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   727
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_JOIN)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   728
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   729
	uint16 index;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   730
	NetworkClientInfo *ci;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   731
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   732
	index = NetworkRecv_uint16(MY_CLIENT, p);
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   733
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   734
	ci = NetworkFindClientInfoFromIndex(index);
722
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   735
	if (ci != NULL)
d0b031be5232 (svn r1174) -Fix: [Network] All strings can now be translated (no more hardcoded strings)
truelight
parents: 717
diff changeset
   736
		NetworkTextMessage(NETWORK_ACTION_JOIN, 1, false, ci->client_name, "");
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   737
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   738
	InvalidateWindow(WC_CLIENT_LIST, 0);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   739
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   740
	return NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   741
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   742
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   743
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_SHUTDOWN)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   744
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   745
	_switch_mode_errorstr = STR_NETWORK_SERVER_SHUTDOWN;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   746
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   747
	return NETWORK_RECV_STATUS_SERVER_ERROR;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   748
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   749
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   750
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_NEWGAME)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   751
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   752
	// To trottle the reconnects a bit, every clients waits
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   753
	//  his _local_player value before reconnecting
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   754
	// OWNER_SPECTATOR is currently 255, so to avoid long wait periods
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   755
	//  set the max to 10.
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   756
	_network_reconnect = min(_local_player + 1, 10);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   757
	_switch_mode_errorstr = STR_NETWORK_SERVER_REBOOT;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   758
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   759
	return NETWORK_RECV_STATUS_SERVER_ERROR;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   760
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   761
1026
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   762
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_RCON)
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   763
{
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   764
	char rcon_out[NETWORK_RCONCOMMAND_LENGTH];
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   765
	uint16 color_code;
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   766
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   767
	color_code = NetworkRecv_uint16(MY_CLIENT, p);
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   768
	NetworkRecv_string(MY_CLIENT, p, rcon_out, sizeof(rcon_out));
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   769
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   770
	IConsolePrint(color_code, rcon_out);
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   771
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   772
	return NETWORK_RECV_STATUS_OKAY;
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   773
}
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   774
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   775
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   776
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   777
// The layout for the receive-functions by the client
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   778
typedef NetworkRecvStatus NetworkClientPacket(Packet *p);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   779
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   780
// This array matches PacketType. At an incoming
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   781
//  packet it is matches against this array
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   782
//  and that way the right function to handle that
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   783
//  packet is found.
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   784
static NetworkClientPacket* const _network_client_packet[] = {
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   785
	RECEIVE_COMMAND(PACKET_SERVER_FULL),
841
8f0a68c6f43b (svn r1322) -Add: banning system (mostly tnx to guru3)
truelight
parents: 779
diff changeset
   786
	RECEIVE_COMMAND(PACKET_SERVER_BANNED),
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   787
	NULL, /*PACKET_CLIENT_JOIN,*/
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   788
	RECEIVE_COMMAND(PACKET_SERVER_ERROR),
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   789
	NULL, /*PACKET_CLIENT_COMPANY_INFO,*/
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   790
	RECEIVE_COMMAND(PACKET_SERVER_COMPANY_INFO),
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   791
	RECEIVE_COMMAND(PACKET_SERVER_CLIENT_INFO),
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   792
	RECEIVE_COMMAND(PACKET_SERVER_NEED_PASSWORD),
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   793
	NULL, /*PACKET_CLIENT_PASSWORD,*/
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   794
	RECEIVE_COMMAND(PACKET_SERVER_WELCOME),
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   795
	NULL, /*PACKET_CLIENT_GETMAP,*/
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   796
	RECEIVE_COMMAND(PACKET_SERVER_WAIT),
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   797
	RECEIVE_COMMAND(PACKET_SERVER_MAP),
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   798
	NULL, /*PACKET_CLIENT_MAP_OK,*/
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   799
	RECEIVE_COMMAND(PACKET_SERVER_JOIN),
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   800
	RECEIVE_COMMAND(PACKET_SERVER_FRAME),
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   801
	RECEIVE_COMMAND(PACKET_SERVER_SYNC),
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   802
	NULL, /*PACKET_CLIENT_ACK,*/
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   803
	NULL, /*PACKET_CLIENT_COMMAND,*/
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   804
	RECEIVE_COMMAND(PACKET_SERVER_COMMAND),
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   805
	NULL, /*PACKET_CLIENT_CHAT,*/
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   806
	RECEIVE_COMMAND(PACKET_SERVER_CHAT),
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   807
	NULL, /*PACKET_CLIENT_SET_PASSWORD,*/
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   808
	NULL, /*PACKET_CLIENT_SET_NAME,*/
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   809
	NULL, /*PACKET_CLIENT_QUIT,*/
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   810
	NULL, /*PACKET_CLIENT_ERROR,*/
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   811
	RECEIVE_COMMAND(PACKET_SERVER_QUIT),
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   812
	RECEIVE_COMMAND(PACKET_SERVER_ERROR_QUIT),
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   813
	RECEIVE_COMMAND(PACKET_SERVER_SHUTDOWN),
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   814
	RECEIVE_COMMAND(PACKET_SERVER_NEWGAME),
1026
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   815
	RECEIVE_COMMAND(PACKET_SERVER_RCON),
5b2681cad645 (svn r1527) -Add: RCon (Remote Connection). A server can set:
truelight
parents: 1013
diff changeset
   816
	NULL, /*PACKET_CLIENT_RCON,*/
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   817
};
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   818
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   819
// If this fails, check the array above with network_data.h
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   820
assert_compile(lengthof(_network_client_packet) == PACKET_END);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   821
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   822
// Is called after a client is connected to the server
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   823
void NetworkClient_Connected(void)
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   824
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   825
	// Set the frame-counter to 0 so nothing happens till we are ready
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   826
	_frame_counter = 0;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   827
	_frame_counter_server = 0;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   828
	last_ack_frame = 0;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   829
	// Request the game-info
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   830
	SEND_COMMAND(PACKET_CLIENT_JOIN)();
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   831
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   832
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   833
// Reads the packets from the socket-stream, if available
716
40a349345f82 (svn r1168) -Cleanup: [Network] Cleaned the network code a bit. Added 'const'
truelight
parents: 684
diff changeset
   834
NetworkRecvStatus NetworkClient_ReadPackets(NetworkClientState *cs)
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   835
{
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   836
	Packet *p;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   837
	NetworkRecvStatus res = NETWORK_RECV_STATUS_OKAY;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   838
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   839
	while (res == NETWORK_RECV_STATUS_OKAY && (p = NetworkRecv_Packet(cs, &res)) != NULL) {
903
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   840
		byte type = NetworkRecv_uint8(MY_CLIENT, p);
f860c7234167 (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 841
diff changeset
   841
		if (type < PACKET_END && _network_client_packet[type] != NULL && !MY_CLIENT->quited) {
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   842
			res = _network_client_packet[type](p);
2026
02dfa0aa2c2f (svn r2535) Tabs
tron
parents: 1962
diff changeset
   843
		} else {
543
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   844
			res = NETWORK_RECV_STATUS_MALFORMED_PACKET;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   845
			DEBUG(net, 0)("[NET][client] Received invalid packet type %d", type);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   846
		}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   847
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   848
		free(p);
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   849
	}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   850
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   851
	return res;
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   852
}
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   853
e3b43338096b (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   854
#endif /* ENABLE_NETWORK */