From: z411 Date: Thu, 20 Oct 2022 03:18:00 +0000 (-0300) Subject: Merge branch 'master' into z411/bai-server X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=e9cb368a9160fe8373754ac6571abe34faa87bbb;p=xonotic%2Fxonotic-data.pk3dir.git Merge branch 'master' into z411/bai-server --- e9cb368a9160fe8373754ac6571abe34faa87bbb diff --cc qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc index d1608e307,d64ce3604..bbffd0f4b --- a/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc +++ b/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc @@@ -51,36 -45,94 +52,110 @@@ void CA_count_alive_players( 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(); @@@ -111,30 -151,18 +187,36 @@@ { 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; } diff --cc qcsrc/common/scores.qh index 0b132a6b0,3449f2b53..fe89e7247 --- a/qcsrc/common/scores.qh +++ b/qcsrc/common/scores.qh @@@ -86,33 -57,31 +57,57 @@@ REGISTER_SP(LMS_LIVES) 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 diff --cc qcsrc/server/scores.qc index 41bcd53d9,2cedc4ade..9de96ac49 --- a/qcsrc/server/scores.qc +++ b/qcsrc/server/scores.qc @@@ -407,36 -417,30 +417,48 @@@ float PlayerScore_Compare(entity t1, en { 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; diff --cc qcsrc/server/world.qc index 10bc0abaf,4334cb422..207af613e --- a/qcsrc/server/world.qc +++ b/qcsrc/server/world.qc @@@ -2230,10 -2090,9 +2245,11 @@@ void readplayerstartcvars( void readlevelcvars() { + serverflags &= ~SERVERFLAG_ALLOW_FULLBRIGHT; if(cvar("sv_allow_fullbright")) serverflags |= SERVERFLAG_ALLOW_FULLBRIGHT; + if(cvar("sv_forbid_pickuptimer")) + serverflags |= SERVERFLAG_FORBID_PICKUPTIMER; sv_ready_restart_after_countdown = cvar("sv_ready_restart_after_countdown"); diff --cc qcsrc/server/world.qh index 5d82deb6f,48c0e38d4..1908c8d1f --- a/qcsrc/server/world.qh +++ b/qcsrc/server/world.qh @@@ -27,15 -27,8 +27,16 @@@ float autocvar_timelimit_max float autocvar_timelimit_overtime; int autocvar_timelimit_overtimes; float autocvar_timelimit_suddendeath; + bool autocvar_sv_gameplayfix_droptofloorstartsolid; +// z411 +bool autocvar_sv_jingle_end; +string autocvar_sv_jingle_end_list; +float autocvar_sv_jingle_end_volume; + +float fragsleft; +int fragsleft_last; + float checkrules_equality; float checkrules_suddendeathwarning; float checkrules_suddendeathend;