/* * G_ClientBegin * * Called when a client has finished connecting, and is ready * to be placed into the game. This will happen every level load. */ void G_ClientBegin(g_edict_t *ent) { char welcome[256]; int player_num = ent - g_game.edicts - 1; ent->client = g_game.clients + player_num; G_InitEdict(ent); G_InitClientLocals(ent->client); VectorClear(ent->client->cmd_angles); ent->client->persistent.first_frame = g_level.frame_num; // force spectator if match or rounds if (g_level.match || g_level.rounds) ent->client->persistent.spectator = true; else if (g_level.teams || g_level.ctf) { if (g_auto_join->value) G_AddClientToTeam(ent, G_SmallestTeam()->name); else ent->client->persistent.spectator = true; } // spawn them in G_ClientRespawn(ent, true); if (g_level.intermission_time) { G_ClientToIntermission(ent); } else { memset(welcome, 0, sizeof(welcome)); snprintf(welcome, sizeof(welcome), "^2Welcome to ^7http://quake2world.net\n" "^2Gameplay is ^1%s\n", G_GameplayName(g_level.gameplay)); if (g_level.teams) strncat(welcome, "^2Teams are enabled\n", sizeof(welcome)); if (g_level.ctf) strncat(welcome, "^2CTF is enabled\n", sizeof(welcome)); if (g_voting->value) strncat(welcome, "^2Voting is allowed\n", sizeof(welcome)); gi.ClientCenterPrint(ent, "%s", welcome); } // make sure all view stuff is valid G_ClientEndFrame(ent); srand(time(NULL)); // set random seed }
/* * @brief */ void G_EndClientFrames(void) { // finalize the player_state_t for this frame for (int32_t i = 0; i < sv_max_clients->integer; i++) { g_entity_t *ent = g_game.entities + 1 + i; if (!ent->in_use || !ent->client) continue; G_ClientEndFrame(ent); } }