diff options
author | darkvater <darkvater@openttd.org> | 2004-09-12 14:12:33 +0000 |
---|---|---|
committer | darkvater <darkvater@openttd.org> | 2004-09-12 14:12:33 +0000 |
commit | 24512d3da5ffef6e741c4ebf4e381a2ecab56dc1 (patch) | |
tree | 939d8687576f1b23c0590d67aa154929e0b730d6 /network.c | |
parent | 7a6512a6543feff0b551f3ac3cdfe356bc0e4daf (diff) | |
download | openttd-24512d3da5ffef6e741c4ebf4e381a2ecab56dc1.tar.xz |
(svn r212) -Fix: Network-gui fixes (sign_de)
-Fix: any disabled button in a window doesn't receive WE_CLICK events
-Added network.h
Diffstat (limited to 'network.c')
-rw-r--r-- | network.c | 365 |
1 files changed, 177 insertions, 188 deletions
@@ -246,31 +246,6 @@ static size_t _transmit_file_size; static FILE *_recv_file; -typedef struct NetworkGameInfo { - char server_name[40]; // name of the game - char server_revision[8]; // server game version - byte server_lang; // langid - byte players_max; // max players allowed on server - byte players_on; // current count of players on server - uint16 game_date; // current date - char game_password[10]; // should fit ... 10 chars - char map_name[40]; // map which is played ["random" for a randomized map] - uint map_width; // map width / 8 - uint map_height; // map height / 8 - byte map_set; // graphical set -} NetworkGameInfo; - -typedef struct NetworkGameList { - NetworkGameInfo item; - uint32 ip; - uint16 port; - char * _next; -} NetworkGameList; - -static NetworkGameInfo _network_game; -static NetworkGameList * _network_game_list = NULL; - - /* multi os compatible sleep function */ void CSleep(int milliseconds) { #if defined(WIN32) @@ -327,6 +302,7 @@ static void NetworkHandleConnectionLost() _switch_mode = SM_MENU; _switch_mode_errorstr = STR_NETWORK_ERR_LOSTCONNECTION; } + static void NetworkHandleDeSync() { DEBUG(net, 0) ("[NET] Fatal ERROR: network sync error at frame %i", _frame_counter); @@ -354,7 +330,8 @@ static QueuedCommand *AllocQueuedCommand(CommandQueue *nq) return qp; } -static void QueueClear(CommandQueue *nq) { +static void QueueClear(CommandQueue *nq) +{ QueuedCommand *qp; while ((qp=nq->head)) { // unlink it. @@ -676,7 +653,8 @@ static void HandleFilePacket(FilePacketHdr *fp) } } -static void HandleWelcomePacket(WelcomePacket *wp) { +static void HandleWelcomePacket(WelcomePacket *wp) +{ int i; for (i=0; i<MAX_PLAYERS; i++) { _player_seeds[i][0]=wp->player_seeds[i][0]; @@ -1036,7 +1014,6 @@ static void NetworkAcceptClients() // * sync - games are in sync } - static void SendQueuedCommandsToNewClient(ClientState *cs) { // send the commands in the server queue to the new client. @@ -1072,8 +1049,8 @@ static void SendQueuedCommandsToNewClient(ClientState *cs) } - -bool NetworkCheckClientReady() { +bool NetworkCheckClientReady() +{ bool ready_all = true; uint16 count = 0; ClientState *cs; @@ -1095,7 +1072,8 @@ bool NetworkCheckClientReady() { // * TCP Networking * // // ************************** // -unsigned long NetworkResolveHost(const char *hostname) { +unsigned long NetworkResolveHost(const char *hostname) +{ struct hostent* remotehost; if ((hostname[0]<0x30) || (hostname[0]>0x39)) { @@ -1291,6 +1269,7 @@ void NetworkInitialize() QueueClear(&_command_queue); QueueClear(&_ack_queue); _command_queue.last = &_command_queue.head; + _network_game_list = NULL; // invalidate all clients for(cs=_clients; cs != &_clients[MAX_CLIENTS]; cs++) @@ -1298,7 +1277,8 @@ void NetworkInitialize() } -void NetworkClose(bool client) { +void NetworkClose(bool client) +{ ClientState *cs; // invalidate all clients @@ -1312,7 +1292,7 @@ void NetworkClose(bool client) { closesocket(_listensocket); _listensocket= INVALID_SOCKET; DEBUG(net, 1) ("[NET][TCP] closed listener on port %i", _network_server_port); - } + } } void NetworkShutdown() @@ -1331,6 +1311,7 @@ void NetworkStartSync(bool fcreset) DEBUG(net, 3) ("[NET][SYNC] switching to synced game mode"); _networking_sync = true; _frame_counter = 0; + if (fcreset) { _frame_counter_max = 0; _frame_counter_srv = 0; @@ -1339,22 +1320,23 @@ void NetworkStartSync(bool fcreset) _num_future_seed = 0; _sync_seed_1 = _sync_seed_2 = 0; memset(_my_seed_list, 0, sizeof(_my_seed_list)); - } // ********************************* // // * Network Core Console Commands * // // ********************************* // -static _iconsole_var * NetworkConsoleCmdConnect(byte argc, byte* argv[], byte argt[]) { +static _iconsole_var * NetworkConsoleCmdConnect(byte argc, byte* argv[], byte argt[]) +{ if (argc<2) return NULL; - if (argc==2) { + + if (argc == 2) { IConsolePrintF(_iconsole_color_default, "connecting to %s",argv[1]); NetworkCoreConnectGame(argv[1],_network_server_port); - } else if (argc==3) { + } else if (argc == 3) { IConsolePrintF(_iconsole_color_default, "connecting to %s on port %s",argv[1],argv[2]); NetworkCoreConnectGame(argv[1],atoi(argv[2])); - } else if (argc==4) { + } else if (argc == 4) { IConsolePrintF(_iconsole_color_default, "connecting to %s on port %s as player %s",argv[1],argv[2],argv[3]); _network_playas = atoi(argv[3]); NetworkCoreConnectGame(argv[1],atoi(argv[2])); @@ -1401,7 +1383,8 @@ void NetworkUDPListen(bool client) } -void NetworkUDPClose(bool client) { +void NetworkUDPClose(bool client) +{ if (client) { DEBUG(net, 1) ("[NET][UDP] closed listener on port %i", _network_client_port); closesocket(_udp_client_socket); @@ -1413,7 +1396,8 @@ void NetworkUDPClose(bool client) { }; } -void NetworkUDPReceive(bool client) { +void NetworkUDPReceive(bool client) +{ struct sockaddr_in client_addr; #ifndef __MORPHOS__ int client_len; @@ -1465,9 +1449,8 @@ void NetworkUDPReceive(bool client) { } } - - -void NetworkUDPBroadCast(bool client, struct UDPPacket packet) { +void NetworkUDPBroadCast(bool client, struct UDPPacket packet) +{ int i=0, res; struct sockaddr_in out_addr; uint32 bcaddr; @@ -1490,8 +1473,8 @@ void NetworkUDPBroadCast(bool client, struct UDPPacket packet) { } -void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet) { - +void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet) +{ SOCKET udp; if (client) udp=_udp_client_socket; else udp=_udp_server_socket; @@ -1499,7 +1482,8 @@ void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet } -bool NetworkUDPSearchGame(const byte ** _network_detected_serverip, unsigned short * _network_detected_serverport) { +bool NetworkUDPSearchGame(const byte ** _network_detected_serverip, unsigned short * _network_detected_serverport) +{ struct UDPPacket packet; int timeout=3000; @@ -1537,7 +1521,8 @@ bool NetworkUDPSearchGame(const byte ** _network_detected_serverip, unsigned sho // * New Network Core System * // // *************************** // -void NetworkIPListInit() { +void NetworkIPListInit() +{ struct hostent* he = NULL; char hostname[250]; uint32 bcaddr; @@ -1573,103 +1558,98 @@ void NetworkIPListInit() { /* *************************************************** */ -void NetworkCoreInit() { - -DEBUG(net, 3) ("[NET][Core] init()"); -_network_available=true; -_network_client_timeout=300; +void NetworkCoreInit() +{ + DEBUG(net, 3) ("[NET][Core] init()"); + _network_available=true; + _network_client_timeout=300; -// [win32] winsock startup + // [win32] winsock startup -#if defined(WIN32) -{ - WSADATA wsa; - DEBUG(net, 3) ("[NET][Core] using windows socket library"); - if (WSAStartup(MAKEWORD(2,0), &wsa) != 0) { - DEBUG(net, 3) ("[NET][Core] error: WSAStartup failed"); - _network_available=false; - } -} -#else + #if defined(WIN32) + { + WSADATA wsa; + DEBUG(net, 3) ("[NET][Core] using windows socket library"); + if (WSAStartup(MAKEWORD(2,0), &wsa) != 0) { + DEBUG(net, 3) ("[NET][Core] error: WSAStartup failed"); + _network_available=false; + } + } + #else -// [morphos/amigaos] bsd-socket startup + // [morphos/amigaos] bsd-socket startup -#if defined(__MORPHOS__) || defined(__AMIGA__) -{ - DEBUG(misc,3) ("[NET][Core] using bsd socket library"); - if (!(SocketBase = OpenLibrary("bsdsocket.library", 4))) { - DEBUG(net, 3) ("[NET][Core] Couldn't open bsdsocket.library version 4."); - _network_available=false; - } + #if defined(__MORPHOS__) || defined(__AMIGA__) + { + DEBUG(misc,3) ("[NET][Core] using bsd socket library"); + if (!(SocketBase = OpenLibrary("bsdsocket.library", 4))) { + DEBUG(net, 3) ("[NET][Core] Couldn't open bsdsocket.library version 4."); + _network_available=false; + } - #if !defined(__MORPHOS__) - // for usleep() implementation (only required for legacy AmigaOS builds) - if ( (TimerPort = CreateMsgPort()) ) { - if ( (TimerRequest = (struct timerequest *) CreateIORequest(TimerPort, sizeof(struct timerequest))) ) { - if ( OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest *) TimerRequest, 0) == 0 ) { - if ( !(TimerBase = TimerRequest->tr_node.io_Device) ) { - // free ressources... - DEBUG(net, 3) ("[NET][Core] Couldn't initialize timer."); - _network_available=false; + #if !defined(__MORPHOS__) + // for usleep() implementation (only required for legacy AmigaOS builds) + if ( (TimerPort = CreateMsgPort()) ) { + if ( (TimerRequest = (struct timerequest *) CreateIORequest(TimerPort, sizeof(struct timerequest))) ) { + if ( OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest *) TimerRequest, 0) == 0 ) { + if ( !(TimerBase = TimerRequest->tr_node.io_Device) ) { + // free ressources... + DEBUG(net, 3) ("[NET][Core] Couldn't initialize timer."); + _network_available=false; + } } } } - } - #endif + #endif -} -#else + } + #else -// [linux/macos] unix-socket startup + // [linux/macos] unix-socket startup - DEBUG(net, 3) ("[NET][Core] using unix socket library"); + DEBUG(net, 3) ("[NET][Core] using unix socket library"); -#endif + #endif -#endif + #endif -if (_network_available) { - DEBUG(net, 3) ("[NET][Core] OK: multiplayer available"); - // initiate network ip list - NetworkIPListInit(); - IConsoleCmdRegister("connect",NetworkConsoleCmdConnect); - IConsoleVarRegister("net_client_timeout",&_network_client_timeout,ICONSOLE_VAR_UINT16); - IConsoleVarRegister("net_ready_ahead",&_network_ready_ahead,ICONSOLE_VAR_UINT16); - IConsoleVarRegister("net_sync_freq",&_network_sync_freq,ICONSOLE_VAR_UINT16); - } else { - DEBUG(net, 3) ("[NET][Core] FAILED: multiplayer not available"); - } + if (_network_available) { + DEBUG(net, 3) ("[NET][Core] OK: multiplayer available"); + // initiate network ip list + NetworkIPListInit(); + IConsoleCmdRegister("connect",NetworkConsoleCmdConnect); + IConsoleVarRegister("net_client_timeout",&_network_client_timeout,ICONSOLE_VAR_UINT16); + IConsoleVarRegister("net_ready_ahead",&_network_ready_ahead,ICONSOLE_VAR_UINT16); + IConsoleVarRegister("net_sync_freq",&_network_sync_freq,ICONSOLE_VAR_UINT16); + } else + DEBUG(net, 3) ("[NET][Core] FAILED: multiplayer not available"); } /* *************************************************** */ -void NetworkCoreShutdown() { - -DEBUG(net, 3) ("[NET][Core] shutdown()"); - -#if defined(__MORPHOS__) || defined(__AMIGA__) +void NetworkCoreShutdown() { - // free allocated ressources - #if !defined(__MORPHOS__) - if (TimerBase) { CloseDevice((struct IORequest *) TimerRequest); } - if (TimerRequest) { DeleteIORequest(TimerRequest); } - if (TimerPort) { DeleteMsgPort(TimerPort); } - #endif + DEBUG(net, 3) ("[NET][Core] shutdown()"); - if (SocketBase) { - CloseLibrary(SocketBase); + #if defined(__MORPHOS__) || defined(__AMIGA__) + { + // free allocated ressources + #if !defined(__MORPHOS__) + if (TimerBase) { CloseDevice((struct IORequest *) TimerRequest); } + if (TimerRequest) { DeleteIORequest(TimerRequest); } + if (TimerPort) { DeleteMsgPort(TimerPort); } + #endif + + if (SocketBase) { + CloseLibrary(SocketBase); + } } -} -#endif - - -#if defined(WIN32) -{ - WSACleanup(); -} -#endif + #endif + #if defined(WIN32) + { WSACleanup();} + #endif } /* *************************************************** */ @@ -1707,6 +1687,13 @@ bool NetworkCoreConnectGame(const byte* b, unsigned short port) /* *************************************************** */ +bool NetworkCoreConnectGameStruct(NetworkGameList * item) +{ + return NetworkCoreConnectGame(inet_ntoa(*(struct in_addr *) &item->ip),item->port); +} + +/* *************************************************** */ + bool NetworkCoreStartGame() { if (!_network_available) return false; @@ -1741,39 +1728,33 @@ void NetworkCoreDisconnect() /* *************************************************** */ -void NetworkCoreLoop(bool incomming) { - - -if (incomming) { - - // incomming +void NetworkCoreLoop(bool incomming) +{ + if (incomming) { + // incomming + if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true); + if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false); - if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true); - if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false); - - if (_networking) { - NetworkReceive(); - } + if (_networking) + NetworkReceive(); } else { + if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true); + if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false); - if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true); - if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false); - - if (_networking) { - NetworkSend(); - } - + if (_networking) + NetworkSend(); } - } -void NetworkLobbyInit() { +void NetworkLobbyInit() +{ DEBUG(net, 3) ("[NET][Lobby] init()"); NetworkUDPListen(true); } -void NetworkLobbyShutdown() { +void NetworkLobbyShutdown() +{ DEBUG(net, 3) ("[NET][Lobby] shutdown()"); NetworkUDPClose(true); } @@ -1783,46 +1764,52 @@ void NetworkLobbyShutdown() { // * Network Game List Extensions * // // ******************************** // -void NetworkGameListClear() { -NetworkGameList * item; -NetworkGameList * next; +void NetworkGameListClear() +{ + NetworkGameList * item; + NetworkGameList * next; + + DEBUG(net, 4) ("[NET][G-List] cleared server list"); -DEBUG(net, 4) ("[NET][G-List] cleared server list"); + item = _network_game_list; -item = _network_game_list; -while (item != NULL) { - next = (NetworkGameList *) item -> _next; - free (item); - item = next; + while (item != NULL) { + next = (NetworkGameList *) item -> _next; + free (item); + item = next; } -_network_game_list=NULL; -_network_game_count=0; + _network_game_list=NULL; + _network_game_count=0; } -char * NetworkGameListAdd() { -NetworkGameList * item; -NetworkGameList * before; +NetworkGameList * NetworkGameListAdd() +{ + NetworkGameList * item; + NetworkGameList * before; -DEBUG(net, 4) ("[NET][G-List] added server to list"); + DEBUG(net, 4) ("[NET][G-List] added server to list"); -item = _network_game_list; -before = item; -while (item != NULL) { + item = _network_game_list; before = item; - item = (NetworkGameList *) item -> _next; + while (item != NULL) { + before = item; + item = (NetworkGameList *) item -> _next; } -item = malloc(sizeof(NetworkGameList)); -item -> _next = NULL; -if (before == NULL) { - _network_game_list = item; - } else { - before -> _next = (char *) item; - } -_network_game_count++; -return (char *) item; + + item = malloc(sizeof(NetworkGameList)); + item -> _next = NULL; + + if (before == NULL) { + _network_game_list = item; + } else + before -> _next = item; + + _network_game_count++; + return item; } -void NetworkGameListFromLAN() { +void NetworkGameListFromLAN() +{ struct UDPPacket packet; DEBUG(net, 2) ("[NET][G-List] searching server over lan"); NetworkGameListClear(); @@ -1831,35 +1818,37 @@ void NetworkGameListFromLAN() { NetworkUDPBroadCast(true,packet); } -void NetworkGameListFromInternet() { +void NetworkGameListFromInternet() +{ DEBUG(net, 2) ("[NET][G-List] searching servers over internet"); NetworkGameListClear(); // **TODO** masterserver communication [internet protocol list] - } -char * NetworkGameListItem(uint16 index) { -NetworkGameList * item; -NetworkGameList * next; -uint16 cnt = 0; +NetworkGameList * NetworkGameListItem(uint16 index) +{ + NetworkGameList * item; + NetworkGameList * next; + uint16 cnt = 0; -item = _network_game_list; + item = _network_game_list; -while ((item != NULL) && (cnt != index)) { - next = (NetworkGameList *) item -> _next; - item = next; - cnt++; + while ((item != NULL) && (cnt != index)) { + next = (NetworkGameList *) item -> _next; + item = next; + cnt++; } -return (char *) item; + return item; } // *************************** // // * Network Game Extensions * // // *************************** // -void NetworkGameFillDefaults() { +void NetworkGameFillDefaults() +{ NetworkGameInfo * game = &_network_game; #if defined(WITH_REV) extern char _openttd_revision[]; @@ -1887,10 +1876,10 @@ void NetworkGameFillDefaults() { game->server_lang=_dynlang.curr; } -void NetworkGameChangeDate(uint16 newdate) { - if (_networking_server) { +void NetworkGameChangeDate(uint16 newdate) +{ + if (_networking_server) _network_game.game_date = newdate; - } } #else // not ENABLE_NETWORK |