/* * @brief Pumps the command cycle, sending the most recently gathered movement * to the server. */ void Cl_SendCmd(void) { mem_buf_t buf; byte data[128]; if (cls.state <= CL_CONNECTING) return; if (cls.state == CL_CONNECTED) { // send any reliable messages and / or don't timeout if (cls.net_chan.message.size || cls.real_time - cls.net_chan.last_sent > 1000) Netchan_Transmit(&cls.net_chan, NULL, 0); return; } // send a user info update if needed if (cvar_user_info_modified) { Net_WriteByte(&cls.net_chan.message, CL_CMD_USER_INFO); Net_WriteString(&cls.net_chan.message, Cvar_UserInfo()); cvar_user_info_modified = false; } // finalize the current command Cl_FinalizeCmd(); // and write it out Mem_InitBuffer(&buf, data, sizeof(data)); Net_WriteByte(&buf, CL_CMD_MOVE); // let the server know what the last frame we got was, so the next // message can be delta compressed if (!cl.frame.valid || (cls.demo_file && Fs_Tell(cls.demo_file) == 0)) Net_WriteLong(&buf, -1); // no compression else Net_WriteLong(&buf, cl.frame.frame_num); // send this and the previous two cmds in the message, so // if the last packet was dropped, it can be recovered static user_cmd_t null_cmd; cl_cmd_t *cmd = &cl.cmds[(cls.net_chan.outgoing_sequence - 2) & CMD_MASK]; Net_WriteDeltaUserCmd(&buf, &null_cmd, &cmd->cmd); user_cmd_t *old_cmd = &cmd->cmd; cmd = &cl.cmds[(cls.net_chan.outgoing_sequence - 1) & CMD_MASK]; Net_WriteDeltaUserCmd(&buf, old_cmd, &cmd->cmd); old_cmd = &cmd->cmd; cmd = &cl.cmds[(cls.net_chan.outgoing_sequence) & CMD_MASK]; Net_WriteDeltaUserCmd(&buf, old_cmd, &cmd->cmd); // deliver the message Netchan_Transmit(&cls.net_chan, buf.data, buf.size); cl.packet_counter++; // initialize the next command Cl_InitCmd(); }
/** * @brief Sends the user info string to the server over the reliable channel. */ static void Cl_WriteUserInfoCommand(void) { if (cvar_user_info_modified) { cvar_user_info_modified = false; Net_WriteByte(&cls.net_chan.message, CL_CMD_USER_INFO); Net_WriteString(&cls.net_chan.message, Cvar_UserInfo()); } }
/* * @brief We have gotten a challenge from the server, so try and connect. */ static void Cl_SendConnect(void) { net_addr_t addr; memset(&addr, 0, sizeof(addr)); if (!Net_StringToNetaddr(cls.server_name, &addr)) { Com_Print("Bad server address\n"); cls.connect_time = 0; return; } if (addr.port == 0) // use default port addr.port = htons(PORT_SERVER); Netchan_OutOfBandPrint(NS_UDP_CLIENT, &addr, "connect %i %i %u \"%s\"\n", PROTOCOL_MAJOR, qport->integer, cls.challenge, Cvar_UserInfo()); cvar_user_info_modified = false; }