// initialize all player ping times void multi_ping_reset_players() { int idx; // reset the pings for all players for(idx=0;idx<MAX_PLAYERS;idx++){ multi_ping_reset(&Net_players[idx].s_info.ping); } }
// <server> make the given player an observer void multi_respawn_make_observer(net_player *pl) { pl->flags |= (NETINFO_FLAG_OBSERVER | NETINFO_FLAG_OBS_PLAYER); pl->flags &= ~(NETINFO_FLAG_RESPAWNING | NETINFO_FLAG_LIMBO); // MWA 6/3/98 -- don't set to high -- let it default to whatever player chose //pl->p_info.options.obj_update_level = OBJ_UPDATE_HIGH; pl->last_heard_time = timer_get_fixed_seconds(); // reset the ping time for this player multi_ping_reset(&pl->s_info.ping); // timestamp his last_full_update_time pl->s_info.last_full_update_time = timestamp(0); // create an observer object for him multi_obs_create_observer(pl); }
// create a _permanent_ observer player int multi_obs_create_player(int player_num, char* name, net_addr* addr, player* pl) { // blast the player struct memset(&Net_players[player_num], 0, sizeof(net_player)); // Net_players[player_num].flags |= (NETINFO_FLAG_CONNECTED | NETINFO_FLAG_OBSERVER); // DOH!!! The lack of this caused many bugs. Net_players[player_num].flags = (NETINFO_FLAG_DO_NETWORKING | NETINFO_FLAG_OBSERVER); // memcpy(&Net_players[player_num].p_info.addr, addr, sizeof(net_addr)); Net_players[player_num].m_player = pl; // 6/3/98 -- don't set observer to update high...let it be whatever player set it at. //Net_players[player_num].p_info.options.obj_update_level = OBJ_UPDATE_HIGH; // set up the net_player structure memset(pl, 0, sizeof(player)); stuff_netplayer_info(&Net_players[player_num], addr, 0, pl); Net_players[player_num].last_heard_time = timer_get_fixed_seconds(); Net_players[player_num].reliable_socket = INVALID_SOCKET; Net_players[player_num].s_info.kick_timestamp = -1; Net_players[player_num].s_info.voice_token_timestamp = -1; Net_players[player_num].s_info.tracker_security_last = -1; Net_players[player_num].s_info.target_objnum = -1; Net_players[player_num].s_info.accum_buttons = 0; // reset the ping for this player multi_ping_reset(&Net_players[player_num].s_info.ping); // timestamp his last_full_update_time Net_players[player_num].s_info.last_full_update_time = timestamp(0); Net_players[player_num].m_player->objnum = -1; // nil his file xfer handle Net_players[player_num].s_info.xfer_handle = -1; // zero out his object update and control info sequencing data Net_players[player_num].client_cinfo_seq = 0; Net_players[player_num].client_server_seq = 0; // his kick timestamp Net_players[player_num].s_info.kick_timestamp = -1; // nil his data rate timestamp stuff Net_players[player_num].s_info.rate_stamp = -1; Net_players[player_num].s_info.rate_bytes = 0; // nil packet buffer stuff Net_players[player_num].s_info.unreliable_buffer_size = 0; Net_players[player_num].s_info.reliable_buffer_size = 0; // callsign and short callsign strcpy_s(pl->callsign, name); pilot_set_short_callsign(pl, SHORT_CALLSIGN_PIXEL_W); pl->flags |= PLAYER_FLAGS_STRUCTURE_IN_USE; Net_players[player_num].sv_bytes_sent = 0; Net_players[player_num].sv_last_pl = -1; Net_players[player_num].cl_bytes_recvd = 0; Net_players[player_num].cl_last_pl = -1; return 1; }