static void NET_SV_ParseGameStart(net_packet_t *packet, net_client_t *client) { net_gamesettings_t settings; NET_Log("server: processing game start packet"); // Can only start a game if we are in the waiting start state. if (server_state != SERVER_WAITING_START) { NET_Log("server: error: not in waiting start state, server_state=%d", server_state); return; } if (client == NET_SV_Controller()) { if (!NET_ReadSettings(packet, &settings)) { // Malformed packet NET_Log("server: error: no settings from controller"); return; } // Check the game settings are valid if (!NET_ValidGameSettings(sv_gamemode, sv_gamemission, &settings)) { NET_Log("server: error: invalid game settings"); return; } sv_settings = settings; } client->ready = true; CheckStartGame(); // Update all ready clients with the current state (number of players // ready, etc.). This is used by games that show startup progress // (eg. Hexen's spinal loading) SendAllWaitingData(); }
static void NET_CL_ParseGameStart(net_packet_t *packet) { if (!NET_ReadSettings(packet, &settings)) { return; } if (client_state != CLIENT_STATE_WAITING_START) { return; } if (settings.num_players > NET_MAXPLAYERS || settings.consoleplayer >= (signed int) settings.num_players) { // insane values return; } if ((drone && settings.consoleplayer >= 0) || (!drone && settings.consoleplayer < 0)) { // Invalid player number: must be positive for real players, // negative for drones return; } client_state = CLIENT_STATE_IN_GAME; // Clear the receive window memset(recvwindow, 0, sizeof(recvwindow)); recvwindow_start = 0; memset(&recvwindow_cmd_base, 0, sizeof(recvwindow_cmd_base)); // Clear the send queue memset(&send_queue, 0x00, sizeof(send_queue)); }
static void NET_SV_ParseGameStart(net_packet_t *packet, net_client_t *client) { net_gamesettings_t settings; net_packet_t *startpacket; int nowtime; int i; if (client != NET_SV_Controller()) { // Only the controller can start a new game return; } if (!NET_ReadSettings(packet, &settings)) { // Malformed packet return; } // Check the game settings are valid if (!NET_ValidGameSettings(sv_gamemode, sv_gamemission, &settings)) { return; } if (server_state != SERVER_WAITING_START) { // Can only start a game if we are in the waiting start state. return; } // Assign player numbers NET_SV_AssignPlayers(); // Check if anyone is recording a demo and set lowres_turn if so. settings.lowres_turn = false; for (i=0; i<MAXPLAYERS; ++i) { if (sv_players[i] != NULL && sv_players[i]->recording_lowres) { settings.lowres_turn = true; } } nowtime = I_GetTimeMS(); // Send start packets to each connected node for (i=0; i<MAXNETNODES; ++i) { if (!ClientConnected(&clients[i])) continue; clients[i].last_gamedata_time = nowtime; startpacket = NET_Conn_NewReliable(&clients[i].connection, NET_PACKET_TYPE_GAMESTART); NET_WriteInt8(startpacket, NET_SV_NumPlayers()); NET_WriteInt8(startpacket, clients[i].player_number); NET_WriteSettings(startpacket, &settings); } // Change server state server_state = SERVER_IN_GAME; sv_settings = settings; memset(recvwindow, 0, sizeof(recvwindow)); recvwindow_start = 0; }
static void NET_CL_ParseGameStart(net_packet_t *packet) { net_gamesettings_t settings; unsigned int num_players; signed int player_number; unsigned int i; if (!NET_ReadInt8(packet, &num_players) || !NET_ReadSInt8(packet, &player_number) || !NET_ReadSettings(packet, &settings)) { return; } if (client_state != CLIENT_STATE_WAITING_START) { return; } if (num_players > MAXPLAYERS || player_number >= (signed int) num_players) { // insane values return; } if ((drone && player_number >= 0) || (!drone && player_number < 0)) { // Invalid player number: must be positive for real players, // negative for drones return; } // Start the game if (!drone) { consoleplayer = player_number; } else { consoleplayer = 0; } for (i=0; i<MAXPLAYERS; ++i) { playeringame[i] = i < num_players; } client_state = CLIENT_STATE_IN_GAME; deathmatch = settings.deathmatch; ticdup = settings.ticdup; extratics = settings.extratics; startepisode = settings.episode; startmap = settings.map; startskill = settings.skill; startloadgame = settings.loadgame; lowres_turn = settings.lowres_turn; nomonsters = settings.nomonsters; fastparm = settings.fast_monsters; respawnparm = settings.respawn_monsters; net_cl_new_sync = settings.new_sync != 0; timelimit = settings.timelimit; if (net_cl_new_sync == false) { printf("Syncing netgames like Vanilla Doom.\n"); } if (lowres_turn) { printf("NOTE: Turning resolution is reduced; this is probably " "because there is a client recording a Vanilla demo.\n"); } // Clear the receive window memset(recvwindow, 0, sizeof(recvwindow)); recvwindow_start = 0; memset(&recvwindow_cmd_base, 0, sizeof(recvwindow_cmd_base)); // Clear the send queue memset(&send_queue, 0x00, sizeof(send_queue)); netgame = true; autostart = true; }