//initialize the player object position & orientation (at start of game, or new ship) void InitPlayerPosition(int random) { int NewPlayer=0; if (! ((Game_mode & GM_MULTI) && !(Game_mode&GM_MULTI_COOP)) ) // If not deathmatch NewPlayer = Player_num; #ifdef NETWORK else if ((Game_mode & GM_MULTI) && (Netgame.SpawnStyle == SPAWN_STYLE_PREVIEW) && Dead_player_camera != NULL) NewPlayer = previewed_spawn_point; #endif else if (random == 1) { int i, trys=0; fix closest_dist = 0x7ffffff, dist; timer_update(); d_srand((fix)timer_query()); do { trys++; NewPlayer = d_rand() % NumNetPlayerPositions; closest_dist = 0x7fffffff; for (i=0; i<N_players; i++ ) { if ( (i!=Player_num) && (Objects[Players[i].objnum].type == OBJ_PLAYER) ) { dist = find_connected_distance(&Objects[Players[i].objnum].pos, Objects[Players[i].objnum].segnum, &Player_init[NewPlayer].pos, Player_init[NewPlayer].segnum, 15, WID_FLY_FLAG ); // Used to be 5, search up to 15 segments if ( (dist < closest_dist) && (dist >= 0) ) { closest_dist = dist; } } } } while ( (closest_dist<i2f(15*20)) && (trys<MAX_PLAYERS*2) ); } else { // If deathmatch and not random, positions were already determined by sync packet reset_player_object(); reset_cruise(); return; } Assert(NewPlayer >= 0); Assert(NewPlayer < NumNetPlayerPositions); ConsoleObject->pos = Player_init[NewPlayer].pos; ConsoleObject->orient = Player_init[NewPlayer].orient; #ifdef NETWORK if ((Game_mode & GM_MULTI) && (Netgame.SpawnStyle == SPAWN_STYLE_PREVIEW) && Dead_player_camera != NULL) { ConsoleObject->orient = Dead_player_camera->orient; Dead_player_camera = NULL; } #endif obj_relink(ConsoleObject-Objects,Player_init[NewPlayer].segnum); reset_player_object(); reset_cruise(); }
// ----------------------------------------------------------------------------------- // Set the player's position from the globals Secret_return_segment and Secret_return_orient. void set_pos_from_return_segment(void) { int plobjnum = Players[Player_num].objnum; compute_segment_center(&Objects[plobjnum].pos, &Segments[Secret_return_segment]); obj_relink(plobjnum, Secret_return_segment); reset_player_object(); Objects[plobjnum].orient = Secret_return_orient; }
//initialize the player object position & orientation (at start of game, or new ship) void InitPlayerPosition(int random) { int NewPlayer=0; if (! ((Game_mode & GM_MULTI) && !(Game_mode&GM_MULTI_COOP)) ) // If not deathmatch NewPlayer = Player_num; #ifdef NETWORK else if (random == 1) { int i, closest = -1, trys=0; fix closest_dist = 0x7ffffff, dist; d_srand(clock()); do { trys++; NewPlayer = d_rand() % NumNetPlayerPositions; closest = -1; closest_dist = 0x7fffffff; for (i=0; i<N_players; i++ ) { if ( (i!=Player_num) && (Objects[Players[i].objnum].type == OBJ_PLAYER) ) { dist = find_connected_distance(&Objects[Players[i].objnum].pos, Objects[Players[i].objnum].segnum, &Player_init[NewPlayer].pos, Player_init[NewPlayer].segnum, 5, WID_FLY_FLAG ); if ( (dist < closest_dist) && (dist >= 0) ) { closest_dist = dist; closest = i; } } } } while ( (closest_dist<i2f(10*20)) && (trys<MAX_NUM_NET_PLAYERS*2) ); } #endif else { goto done; // If deathmatch and not random, positions were already determined by sync packet } Assert(NewPlayer >= 0); Assert(NewPlayer < NumNetPlayerPositions); ConsoleObject->pos = Player_init[NewPlayer].pos; ConsoleObject->orient = Player_init[NewPlayer].orient; obj_relink(ConsoleObject-Objects,Player_init[NewPlayer].segnum); done: reset_player_object(); reset_cruise(); }
//initialize the player object position & orientation (at start of game, or new ship) InitPlayerPosition(int random) { int NewPlayer; if (! ((Game_mode & GM_MULTI) && !(Game_mode&GM_MULTI_COOP)) ) // If not deathmatch NewPlayer = Player_num; #ifdef NETWORK else if (random == 1) { int i, closest = -1, trys=0; fix closest_dist = 0x7ffffff, dist; srand(clock()); #ifndef NDEBUG if (NumNetPlayerPositions != MAX_NUM_NET_PLAYERS) { mprintf((1, "WARNING: There are only %d start positions!\n")); //Int3(); } #endif do { if (trys > 0) { mprintf((0, "Can't start in location %d because its too close to player %d\n", NewPlayer, closest )); } trys++; NewPlayer = rand() % NumNetPlayerPositions; closest = -1; closest_dist = 0x7fffffff; for (i=0; i<N_players; i++ ) { if ( (i!=Player_num) && (Objects[Players[i].objnum].type == OBJ_PLAYER) ) { dist = find_connected_distance(&Objects[Players[i].objnum].pos, Objects[Players[i].objnum].segnum, &Player_init[NewPlayer].pos, Player_init[NewPlayer].segnum, 5, WID_FLY_FLAG ); // mprintf((0, "Distance from start location %d to player %d is %f.\n", NewPlayer, i, f2fl(dist))); if ( (dist < closest_dist) && (dist >= 0) ) { closest_dist = dist; closest = i; } } } mprintf((0, "Closest from pos %d is %f to plr %d.\n", NewPlayer, f2fl(closest_dist), closest)); } while ( (closest_dist<i2f(10*20)) && (trys<MAX_NUM_NET_PLAYERS*2) ); } #endif else { mprintf((0, "Starting position is not being changed.\n")); goto done; // If deathmatch and not random, positions were already determined by sync packet } Assert(NewPlayer >= 0); Assert(NewPlayer < NumNetPlayerPositions); ConsoleObject->pos = Player_init[NewPlayer].pos; ConsoleObject->orient = Player_init[NewPlayer].orient; mprintf((0, "Re-starting in location %d of %d.\n", NewPlayer+1, NumNetPlayerPositions)); obj_relink(ConsoleObject-Objects,Player_init[NewPlayer].segnum); done: reset_player_object(); reset_cruise(); }