|
@@ -98,40 +98,40 @@ typedef enum {
|
|
|
NETWORK_ACTION_CHAT_TO_CLIENT,
|
|
|
NETWORK_ACTION_CHAT_TO_PLAYER,
|
|
|
NETWORK_ACTION_GIVE_MONEY,
|
|
|
NETWORK_ACTION_NAME_CHANGE,
|
|
|
} NetworkAction;
|
|
|
|
|
|
typedef enum {
|
|
|
NETWORK_GAME_PASSWORD,
|
|
|
NETWORK_COMPANY_PASSWORD,
|
|
|
} NetworkPasswordType;
|
|
|
|
|
|
// To keep the clients all together
|
|
|
typedef struct ClientState {
|
|
|
typedef struct NetworkClientState {
|
|
|
int socket;
|
|
|
uint16 index;
|
|
|
uint32 last_frame;
|
|
|
uint32 last_frame_server;
|
|
|
byte lag_test; // This byte is used for lag-testing the client
|
|
|
|
|
|
ClientStatus status;
|
|
|
bool writable; // is client ready to write to?
|
|
|
bool quited;
|
|
|
|
|
|
Packet *packet_queue; // Packets that are awaiting delivery
|
|
|
Packet *packet_recv; // Partially received packet
|
|
|
|
|
|
CommandPacket *command_queue; // The command-queue awaiting delivery
|
|
|
} ClientState;
|
|
|
} NetworkClientState;
|
|
|
|
|
|
// What packet types are there
|
|
|
// WARNING: The first 3 packets can NEVER change order again
|
|
|
// it protects old clients from joining newer servers (because SERVER_ERROR
|
|
|
// is the respond to a wrong revision)
|
|
|
typedef enum {
|
|
|
PACKET_SERVER_FULL,
|
|
|
PACKET_CLIENT_JOIN,
|
|
|
PACKET_SERVER_ERROR,
|
|
|
PACKET_CLIENT_COMPANY_INFO,
|
|
|
PACKET_SERVER_COMPANY_INFO,
|
|
|
PACKET_SERVER_CLIENT_INFO,
|
|
@@ -164,62 +164,62 @@ typedef enum {
|
|
|
typedef enum {
|
|
|
DESTTYPE_BROADCAST,
|
|
|
DESTTYPE_PLAYER,
|
|
|
DESTTYPE_CLIENT
|
|
|
} DestType;
|
|
|
|
|
|
CommandPacket *_local_command_queue;
|
|
|
|
|
|
SOCKET _udp_client_socket; // udp client socket
|
|
|
|
|
|
// Here we keep track of the clients
|
|
|
// (and the client uses [0] for his own communication)
|
|
|
ClientState _clients[MAX_CLIENTS];
|
|
|
NetworkClientState _clients[MAX_CLIENTS];
|
|
|
#define DEREF_CLIENT(i) (&_clients[i])
|
|
|
// This returns the NetworkClientInfo from a ClientState
|
|
|
// This returns the NetworkClientInfo from a NetworkClientState
|
|
|
#define DEREF_CLIENT_INFO(cs) (&_network_client_info[cs - _clients])
|
|
|
|
|
|
// Macros to make life a bit more easier
|
|
|
#define DEF_CLIENT_RECEIVE_COMMAND(type) NetworkRecvStatus NetworkPacketReceive_ ## type ## _command(Packet *p)
|
|
|
#define DEF_CLIENT_SEND_COMMAND(type) void NetworkPacketSend_ ## type ## _command(void)
|
|
|
#define DEF_CLIENT_SEND_COMMAND_PARAM(type) void NetworkPacketSend_ ## type ## _command
|
|
|
#define DEF_SERVER_RECEIVE_COMMAND(type) void NetworkPacketReceive_ ## type ## _command(ClientState *cs, Packet *p)
|
|
|
#define DEF_SERVER_SEND_COMMAND(type) void NetworkPacketSend_ ## type ## _command(ClientState *cs)
|
|
|
#define DEF_SERVER_RECEIVE_COMMAND(type) void NetworkPacketReceive_ ## type ## _command(NetworkClientState *cs, Packet *p)
|
|
|
#define DEF_SERVER_SEND_COMMAND(type) void NetworkPacketSend_ ## type ## _command(NetworkClientState *cs)
|
|
|
#define DEF_SERVER_SEND_COMMAND_PARAM(type) void NetworkPacketSend_ ## type ## _command
|
|
|
|
|
|
#define SEND_COMMAND(type) NetworkPacketSend_ ## type ## _command
|
|
|
#define RECEIVE_COMMAND(type) NetworkPacketReceive_ ## type ## _command
|
|
|
|
|
|
#define FOR_ALL_CLIENTS(cs) for (cs = _clients; cs != &_clients[MAX_CLIENTS] && cs->socket != INVALID_SOCKET; cs++)
|
|
|
|
|
|
Packet *NetworkSend_Init(PacketType type);
|
|
|
void NetworkSend_uint8(Packet *packet, uint8 data);
|
|
|
void NetworkSend_uint16(Packet *packet, uint16 data);
|
|
|
void NetworkSend_uint32(Packet *packet, uint32 data);
|
|
|
void NetworkSend_uint64(Packet *packet, uint64 data);
|
|
|
void NetworkSend_string(Packet *packet, const char* data);
|
|
|
void NetworkSend_Packet(Packet *packet, ClientState *cs);
|
|
|
void NetworkSend_Packet(Packet *packet, NetworkClientState *cs);
|
|
|
|
|
|
uint8 NetworkRecv_uint8(Packet *packet);
|
|
|
uint16 NetworkRecv_uint16(Packet *packet);
|
|
|
uint32 NetworkRecv_uint32(Packet *packet);
|
|
|
uint64 NetworkRecv_uint64(Packet *packet);
|
|
|
void NetworkRecv_string(Packet *packet, char* buffer, size_t size);
|
|
|
Packet *NetworkRecv_Packet(ClientState *cs, NetworkRecvStatus *status);
|
|
|
Packet *NetworkRecv_Packet(NetworkClientState *cs, NetworkRecvStatus *status);
|
|
|
|
|
|
bool NetworkSend_Packets(ClientState *cs);
|
|
|
bool NetworkSend_Packets(NetworkClientState *cs);
|
|
|
void NetworkExecuteCommand(CommandPacket *cp);
|
|
|
void NetworkAddCommandQueue(ClientState *cs, CommandPacket *cp);
|
|
|
void NetworkAddCommandQueue(NetworkClientState *cs, CommandPacket *cp);
|
|
|
|
|
|
// from network.c
|
|
|
void CloseClient(ClientState *cs);
|
|
|
void NetworkCloseClient(NetworkClientState *cs);
|
|
|
void CDECL NetworkTextMessage(NetworkAction action, uint16 color, const char *name, const char *str, ...);
|
|
|
void NetworkGetClientName(char *clientname, size_t size, ClientState *cs);
|
|
|
uint NetworkCalculateLag(const ClientState *cs);
|
|
|
void NetworkGetClientName(char *clientname, size_t size, const NetworkClientState *cs);
|
|
|
uint NetworkCalculateLag(const NetworkClientState *cs);
|
|
|
byte NetworkGetCurrentLanguageIndex();
|
|
|
NetworkClientInfo *NetworkFindClientInfoFromIndex(uint16 client_index);
|
|
|
ClientState *NetworkFindClientStateFromIndex(uint16 client_index);
|
|
|
NetworkClientState *NetworkFindClientStateFromIndex(uint16 client_index);
|
|
|
unsigned long NetworkResolveHost(const char *hostname);
|
|
|
|
|
|
#endif /* ENABLE_NETWORK */
|
|
|
|
|
|
#endif // NETWORK_DATA_H
|