void nades_Clear(entity player);
+entity ca_LastPlayer(float tm)
+{
+ entity last_pl = NULL;
+ FOREACH_CLIENT(IS_PLAYER(it) && it.team == tm, {
+ if (!IS_DEAD(it))
+ {
+ if (!last_pl)
+ last_pl = it;
+ else
+ return NULL;
+ }
+ });
+ return last_pl;
+}
+
+
+ int CA_PreventStalemate()
+ {
+ //LOG_INFO("PreventStalemate running");
+ int winnerTeam = 0;
+ int secondTeam = 0;
+
+ for(int i = 1; i <= AVAILABLE_TEAMS; i++)
+ {
+ if(!winnerTeam || Team_GetNumberOfAlivePlayers(Team_GetTeamFromIndex(i)) > Team_GetNumberOfAlivePlayers(Team_GetTeam(winnerTeam)))
+ {
+ secondTeam = winnerTeam;
+ winnerTeam = Team_IndexToTeam(i);
+ }
+ else
+ {
+ if(!secondTeam || Team_GetNumberOfAlivePlayers(Team_GetTeamFromIndex(i)) > Team_GetNumberOfAlivePlayers(Team_GetTeam(secondTeam)))
+ secondTeam = Team_IndexToTeam(i);
+ }
+ }
+
+ if(Team_GetNumberOfAlivePlayers(Team_GetTeam(winnerTeam)) != Team_GetNumberOfAlivePlayers(Team_GetTeam(secondTeam)))
+ {
+ LOG_INFOF("Stalemate broken by alive players. Best team: %s%s (%d)^7 - Trailing team: %s%s (%d)",
+ Team_ColorCode(winnerTeam), Team_ColorName(winnerTeam), Team_GetNumberOfAlivePlayers(Team_GetTeam(winnerTeam)),
+ Team_ColorCode(secondTeam), Team_ColorName(secondTeam), Team_GetNumberOfAlivePlayers(Team_GetTeam(secondTeam)));
+ return winnerTeam;
+ }
+
+ // Equality. Let's check which team has more health now
+ //LOG_INFO("Equality. Checking health now.");
+ winnerTeam = 0;
+ secondTeam = 0;
+ int winnerTeamHealth = 0;
+ int secondTeamHealth = 0;
+ int teamIndex, teamHealth;
+
+ for(int i = 1; i <= AVAILABLE_TEAMS; i++)
+ {
+ teamIndex = i;
+ teamHealth = 0;
+
+ // Add up health for the players in this team
+ FOREACH_CLIENT(IS_PLAYER(it) && Entity_HasValidTeam(it) && it.team == Team_IndexToTeam(teamIndex),
+ {
+ if (IS_DEAD(it))
+ continue;
+ teamHealth += GetResource(it, RES_HEALTH) + GetResource(it, RES_ARMOR);
+ });
+
+ // Set the winner teams
+ if(!winnerTeam || teamHealth > winnerTeamHealth)
+ {
+ secondTeam = winnerTeam;
+ secondTeamHealth = winnerTeamHealth;
+ winnerTeam = Team_IndexToTeam(i);
+ winnerTeamHealth = teamHealth;
+ }
+ else
+ {
+ if(!secondTeam || teamHealth > secondTeamHealth)
+ {
+ secondTeam = Team_IndexToTeam(i);
+ secondTeamHealth = teamHealth;
+ }
+ }
+ }
+
+ if(winnerTeamHealth != secondTeamHealth)
+ {
+ LOG_INFOF("Stalemate broken by team health. Best team: %s%s (%d)^7 - Trailing team: %s%s (%d)",
+ Team_ColorCode(winnerTeam), Team_ColorName(winnerTeam), winnerTeamHealth,
+ Team_ColorCode(secondTeam), Team_ColorName(secondTeam), secondTeamHealth);
+ return winnerTeam;
+ }
+ else
+ return -2; // Equality. Can't avoid the stalemate.
+ }
+
float CA_CheckWinner()
{
+ int winner_team = 0;
+
if(round_handler_GetEndTime() > 0 && round_handler_GetEndTime() - time <= 0)
{
- Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ROUND_OVER);
- Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_OVER);
- Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_ROUND_OVER);
- FOREACH_CLIENT(IS_PLAYER(it), { nades_Clear(it); });
-
- allowed_to_spawn = false;
- if(autocvar_g_ca_round_stop)
- game_stopped = true;
- round_handler_Init(5, autocvar_g_ca_warmup, autocvar_g_ca_round_timelimit);
- return 1;
+ if(autocvar_g_ca_prevent_stalemate)
+ winner_team = CA_PreventStalemate();
+ else
+ winner_team = -2;
}
CA_count_alive_players();
{
Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ROUND_TIED);
Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_TIED);
+ Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_ROUND_TIED);
}
+ else if(winner_team == -2)
+ {
+ Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ROUND_OVER);
+ Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_OVER);
++ Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_ROUND_OVER);
+ }
allowed_to_spawn = false;
- game_stopped = true;
+ if(autocvar_g_ca_round_stop)
+ game_stopped = true;
round_handler_Init(5, autocvar_g_ca_warmup, autocvar_g_ca_round_timelimit);
- FOREACH_CLIENT(IS_PLAYER(it), { nades_Clear(it); });
+ FOREACH_CLIENT(IS_PLAYER(it), {
+ nades_Clear(it);
+
+ // Give perfect medal if everyone in the winner team is alive
+ if(perfect && it.team == winner_team) {
+ Give_Medal(it, PERFECT);
+ }
+
+ // Give accuracy medal for each weapon above 50%
+ entity ra = it.roundaccuracy;
+ for (int w = 0; w <= WEP_LAST - WEP_FIRST; ++w) {
+ if(ra.accuracy_fired[w] > 1 && (ra.accuracy_hit[w] / ra.accuracy_fired[w]) > 0.5) {
+ Give_Medal(it, ACCURACY);
+ }
+ }
+ });
return 1;
}
REGISTER_SP(NEXBALL_GOALS);
REGISTER_SP(NEXBALL_FAULTS);
- REGISTER_SP(ONS_TAKES);
REGISTER_SP(ONS_CAPS);
+ REGISTER_SP(ONS_TAKES);
+
+ REGISTER_SP(SCORE);
+ REGISTER_SP(KILLS);
+ REGISTER_SP(DEATHS);
+ REGISTER_SP(TEAMKILLS);
+ REGISTER_SP(SUICIDES);
+ REGISTER_SP(DMG);
+ REGISTER_SP(DMGTAKEN);
+
+ REGISTER_SP(ELO); // not sortable
+ REGISTER_SP(FPS); // not sortable
+
+ // fields not networked via the score system
+ REGISTER_SP(END);
+
+ REGISTER_SP(PING);
+ REGISTER_SP(PL);
++REGISTER_SP(COUNTRY); //LegendGuard adds new column for country label 05-04-2021
+ REGISTER_SP(NAME);
+ REGISTER_SP(SEPARATOR);
+
+ REGISTER_SP(KDRATIO); // kills / deaths
+ REGISTER_SP(SUM); // kills - deaths
+ REGISTER_SP(FRAGS); // kills - suicides
+
+REGISTER_SP(MEDAL_AIRSHOT);
+REGISTER_SP(MEDAL_DAMAGE);
+REGISTER_SP(MEDAL_ELECTROBITCH);
+REGISTER_SP(MEDAL_EXCELLENT);
+REGISTER_SP(MEDAL_FIRSTBLOOD);
+REGISTER_SP(MEDAL_HEADSHOT);
+REGISTER_SP(MEDAL_HUMILIATION);
+REGISTER_SP(MEDAL_IMPRESSIVE);
+REGISTER_SP(MEDAL_YODA);
+REGISTER_SP(MEDAL_TELEFRAG);
+
+REGISTER_SP(MEDAL_ACCURACY);
+REGISTER_SP(MEDAL_ASSIST);
+REGISTER_SP(MEDAL_CAPTURE);
+REGISTER_SP(MEDAL_DEFENSE);
+REGISTER_SP(MEDAL_PERFECT);
+
+REGISTER_SP(MEDAL_KILLSTREAK_03);
+REGISTER_SP(MEDAL_KILLSTREAK_05);
+REGISTER_SP(MEDAL_KILLSTREAK_10);
+REGISTER_SP(MEDAL_KILLSTREAK_15);
+
+REGISTER_SP(SV_SURVIVALS);
+REGISTER_SP(SV_HUNTS);
#endif
{
if(!t1 || !t2) return (!t2) - !t1;
- vector result = '0 0 0';
- FOREACH(Scores, true, {
- var .float f = scores(it);
- result = ScoreField_Compare(t1, t2, f, scores_flags(it), result, strict);
- });
+ int result = 0;
+ result = ScoreField_Compare(t1, t2, scores_primary, scores_flags_primary, result);
+ // NOTE: if (scores_secondary) doesn't work because it's a field pointer
+ if (result == 0 && scores_flags_secondary)
+ result = ScoreField_Compare(t1, t2, scores_secondary, scores_flags_secondary, result);
- if (result.x == 0 && strict)
- result.x = t1.owner.playerid - t2.owner.playerid;
+ if (result == 0 && strict)
+ {
+ FOREACH(Scores, true, {
+ if (scores_flags(it) & SFL_SORT_PRIO_MASK)
+ continue;
+ if (scores_label(it) == "")
+ continue;
+ var .float f = scores(it);
+ result = ScoreField_Compare(t1, t2, f, scores_flags(it), result);
+ if (result) break;
+ });
+ if (result == 0)
+ result = t1.owner.playerid - t2.owner.playerid;
+ }
- return result.x;
+ return result;
}
+bool Score_NewLeader()
+{
+ if(teamplay) {
+ if (WinningConditionHelper_winnerteam != WinningConditionHelper_winnerteam_last && (WinningConditionHelper_secondteam || WinningConditionHelper_equality))
+ {
+ WinningConditionHelper_winnerteam_last = WinningConditionHelper_winnerteam;
+ return true;
+ }
+ } else {
+ if (WinningConditionHelper_winner != WinningConditionHelper_winner_last && (WinningConditionHelper_second || WinningConditionHelper_equality))
+ {
+ WinningConditionHelper_winner_last = WinningConditionHelper_winner;
+ return true;
+ }
+ }
+ return false;
+}
+
void WinningConditionHelper(entity this)
{
float c;