/** * @brief Handles the end of a match * @param[in] team The winning team number * @param[in] nextmap Is there a follow-up map within the same match ? * @sa G_RunFrame * @sa CL_ParseResults */ static void G_MatchSendResults (int team, bool nextmap) { edict_t *ent, *attacker; int i, j = 0; attacker = NULL; ent = NULL; /* Calculate new scores/skills for the soldiers. */ while ((ent = G_EdictsGetNextLivingActor(ent))) { if (!G_IsAI(ent)) G_UpdateCharacterExperience(ent); else if (ent->team == team) attacker = ent; } /* if aliens won, make sure every soldier that is not in the rescue zone dies */ if (team == TEAM_ALIEN) { ent = NULL; while ((ent = G_EdictsGetNextLivingActor(ent))) if (ent->team != team && !G_ActorIsInRescueZone(ent)) { ent->HP = 0; G_ActorDieOrStun(ent, attacker); } } G_VisMakeEverythingVisible(); /* send results */ G_EventAdd(PM_ALL, EV_RESULTS, -1); gi.WriteByte(MAX_TEAMS); gi.WriteByte(team); gi.WriteByte(nextmap); for (i = 0; i < MAX_TEAMS; i++) { gi.WriteByte(level.num_spawned[i]); gi.WriteByte(level.num_alive[i]); } for (i = 0; i <= MAX_TEAMS; i++) for (j = 0; j < MAX_TEAMS; j++) gi.WriteByte(level.num_kills[i][j]); for (i = 0; i <= MAX_TEAMS; i++) for (j = 0; j < MAX_TEAMS; j++) gi.WriteByte(level.num_stuns[i][j]); /* how many actors */ j = 0; ent = NULL; while ((ent = G_EdictsGetNextActor(ent))) if (!G_IsAI(ent)) j++; /* number of soldiers */ gi.WriteByte(j); if (j) { ent = NULL; while ((ent = G_EdictsGetNextActor(ent))) { if (!G_IsAI(ent)) { G_SendCharacterData(ent); } } } G_EventEnd(); }
/** * @brief Handles the end of a match * @param[in] team The winning team number * @param[in] nextmap Is there a follow-up map within the same match ? * @sa G_RunFrame * @sa CL_ParseResults */ static void G_MatchSendResults (int team, bool nextmap) { Edict* attacker = nullptr; Actor* actor = nullptr; /* Calculate new scores/skills for the soldiers. */ while ((actor = G_EdictsGetNextLivingActor(actor))) { if (!G_IsAI(actor)) G_UpdateCharacterExperience(actor); else if (actor->getTeam() == team) attacker = actor; } /* if aliens won, make sure every soldier that is not in the rescue zone dies */ if (team == TEAM_ALIEN) { actor = nullptr; while ((actor = G_EdictsGetNextLivingActor(actor))) if (actor->getTeam() != team && !actor->isInRescueZone()) { actor->HP = 0; G_ActorDieOrStun(actor, attacker); } } G_VisMakeEverythingVisible(); /* send results */ G_EventAdd(PM_ALL, EV_RESULTS, -1); gi.WriteByte(MAX_TEAMS); gi.WriteByte(team); gi.WriteByte(nextmap); for (int i = 0; i < MAX_TEAMS; i++) { gi.WriteByte(level.num_spawned[i]); gi.WriteByte(level.num_alive[i]); } for (int i = 0; i <= MAX_TEAMS; i++) for (int j = 0; j < MAX_TEAMS; j++) gi.WriteByte(level.num_kills[i][j]); for (int i = 0; i <= MAX_TEAMS; i++) for (int j = 0; j < MAX_TEAMS; j++) gi.WriteByte(level.num_stuns[i][j]); /* how many actors */ int n = 0; actor = nullptr; while ((actor = G_EdictsGetNextActor(actor))) if (!G_IsAI(actor)) n++; /* number of soldiers */ gi.WriteByte(n); if (n) { actor = nullptr; while ((actor = G_EdictsGetNextActor(actor))) { if (!G_IsAI(actor)) { G_SendCharacterData(actor); } } } G_EventEnd(); }