/** * @brief Set the rescue zone data * @param[out] actor The actor to set the rescue zone flag for * @param[in] inRescueZone @c true if the actor is in the rescue zone, @c false otherwise */ void G_ActorSetInRescueZone (Edict* actor, bool inRescueZone) { if (inRescueZone == G_ActorIsInRescueZone(actor)) return; if (inRescueZone) G_ClientPrintf(actor->getPlayer(), PRINT_HUD, _("Soldier entered the rescue zone.")); else G_ClientPrintf(actor->getPlayer(), PRINT_HUD, _("Soldier left the rescue zone.")); actor->inRescueZone = inRescueZone; }
/** * @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(); }