/** * @sa G_ClientConnect */ void G_ClientDisconnect (player_t * player) { #if 0 edict_t *ent = NULL; #endif /* only if the player already sent his began */ if (player->began) { level.numplayers--; gi.ConfigString(CS_PLAYERCOUNT, "%i", level.numplayers); if (level.activeTeam == player->pers.team) G_ClientEndRound(player); /* if no more players are connected - stop the server */ G_MatchEndCheck(); } #if 0 /* now let's remove all the edicts that belongs to this player */ while ((ent = G_EdictsGetNextLivingActor(ent))) { if (ent->pnum == player->num) G_ActorDie(ent, STATE_DEAD, NULL); } G_MatchEndCheck(); #endif player->began = false; player->roundDone = false; player->isReady = false; gi.BroadcastPrintf(PRINT_CONSOLE, "%s disconnected.\n", player->pers.netname); }
/** * @brief Check whether a forced turn end should be executed */ void G_CheckForceEndRound (void) { /* check for roundlimits in multiplayer only */ if (!sv_roundtimelimit->integer || G_IsSinglePlayer()) return; if (!G_MatchIsRunning()) return; if (level.time != ceil(level.time)) return; const int diff = level.roundstartTime + sv_roundtimelimit->integer - level.time; switch (diff) { case 240: gi.BroadcastPrintf(PRINT_HUD, _("4 minutes left until forced turn end.")); return; case 180: gi.BroadcastPrintf(PRINT_HUD, _("3 minutes left until forced turn end.")); return; case 120: gi.BroadcastPrintf(PRINT_HUD, _("2 minutes left until forced turn end.")); return; case 60: gi.BroadcastPrintf(PRINT_HUD, _("1 minute left until forced turn end.")); return; case 30: gi.BroadcastPrintf(PRINT_HUD, _("30 seconds left until forced turn end.")); return; case 15: gi.BroadcastPrintf(PRINT_HUD, _("15 seconds left until forced turn end.")); return; } /* active team still has time left */ if (level.time < level.roundstartTime + sv_roundtimelimit->integer) return; gi.BroadcastPrintf(PRINT_HUD, _("Current active team hit the max round time.")); /* store this in a local variable, as the global variable is changed in G_ClientEndRound */ const int activeTeam = level.activeTeam; /* set all team members to ready (only human players) */ Player* p = nullptr; while ((p = G_PlayerGetNextActiveHuman(p))) { if (p->getTeam() == activeTeam) { G_ClientEndRound(*p); level.nextEndRound = level.framenum; } } level.roundstartTime = level.time; }