X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fscores.qc;h=4c75c9850a510948077c5ad018336c13535ebee7;hb=315ab0f2f959b04e5a10f2d98ab95656eab74ee3;hp=06f25e41adfff58b336986613fddf3c97f14663f;hpb=52e76c4e559d3c4d3f963c2a5feecc226d50e829;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/scores.qc b/qcsrc/server/scores.qc index 06f25e41a..4c75c9850 100644 --- a/qcsrc/server/scores.qc +++ b/qcsrc/server/scores.qc @@ -204,13 +204,13 @@ void ScoreInfo_Init(float teams) Net_LinkEntity(scores_initialized, FALSE, 0, ScoreInfo_SendEntity); } if(teams >= 1) - TeamScore_Spawn(COLOR_TEAM1, "Red"); + TeamScore_Spawn(NUM_TEAM_1, "Red"); if(teams >= 2) - TeamScore_Spawn(COLOR_TEAM2, "Blue"); + TeamScore_Spawn(NUM_TEAM_2, "Blue"); if(teams >= 3) - TeamScore_Spawn(COLOR_TEAM3, "Yellow"); + TeamScore_Spawn(NUM_TEAM_3, "Yellow"); if(teams >= 4) - TeamScore_Spawn(COLOR_TEAM4, "Pink"); + TeamScore_Spawn(NUM_TEAM_4, "Pink"); } /* @@ -248,18 +248,18 @@ float PlayerScore_SendEntity(entity to, float sendflags) return TRUE; } -void PlayerScore_Clear(entity player) +float PlayerScore_Clear(entity player) { entity sk; float i; if(teamscores_entities_count) - return; + return 0; - if(g_lms) return; - if(g_arena || g_ca) return; - if(g_cts) return; // in CTS, you don't lose score by observing - if(g_race && g_race_qualifying) return; // in qualifying, you don't lose score by observing + if(MUTATOR_CALLHOOK(ForbidPlayerScore_Clear)) return 0; + if(g_lms) return 0; + if(g_cts) return 0; // in CTS, you don't lose score by observing + if(g_race && g_race_qualifying) return 0; // in qualifying, you don't lose score by observing sk = player.scorekeeper; for(i = 0; i < MAX_SCORE; ++i) @@ -269,6 +269,8 @@ void PlayerScore_Clear(entity player) sk.SendFlags |= pow(2, i); sk.(scores[i]) = 0; } + + return 1; } void Score_ClearAll() @@ -391,15 +393,15 @@ void WinningConditionHelper() // so to match pure, match for :P0: // to match full, match for :S0: + fullstatus = autocvar_g_full_getstatus_responses; + s = GetGametype(); s = strcat(s, ":", autocvar_g_xonoticversion); s = strcat(s, ":P", ftos(cvar_purechanges_count)); s = strcat(s, ":S", ftos(nJoinAllowed(world))); s = strcat(s, ":F", ftos(serverflags)); s = strcat(s, ":M", modname); - s = strcat(s, "::", GetPlayerScoreString(world, 1)); // make this 1 once we can, note: this doesn't contain any : - - fullstatus = autocvar_g_full_getstatus_responses; + s = strcat(s, "::", GetPlayerScoreString(world, (fullstatus ? 1 : 2))); if(teamscores_entities_count) { @@ -525,12 +527,12 @@ void WinningConditionHelper() s = strcat(s, ":human"); else s = strcat(s, ":bot"); - if(p.classname != "player" && !g_arena && !g_ca && !g_lms) + if(p.classname != "player" && !g_arena && p.caplayer != 1 && !g_lms) s = strcat(s, ":spectator"); } else { - if(p.classname == "player" || g_arena || g_ca || g_lms) + if(p.classname == "player" || g_arena || p.caplayer == 1 || g_lms) s = GetPlayerScoreString(p, 2); else s = "-666"; @@ -620,7 +622,7 @@ string GetTeamScoreString(float tm, float shortString) if(tm == 0) { // label - for(i = 0; i < MAX_SCORE; ++i) + for(i = 0; i < MAX_TEAMSCORE; ++i) if(teamscores_flags[i] & SFL_SORT_PRIO_MASK == SFL_SORT_PRIO_PRIMARY) { f = teamscores_flags[i]; @@ -628,7 +630,7 @@ string GetTeamScoreString(float tm, float shortString) out = strcat(out, GetScoreLogLabel(l, f), ","); } if(shortString < 2) - for(i = 0; i < MAX_SCORE; ++i) + for(i = 0; i < MAX_TEAMSCORE; ++i) if(teamscores_flags[i] & SFL_SORT_PRIO_MASK == SFL_SORT_PRIO_SECONDARY) { f = teamscores_flags[i]; @@ -636,7 +638,7 @@ string GetTeamScoreString(float tm, float shortString) out = strcat(out, GetScoreLogLabel(l, f), ","); } if(shortString < 1) - for(i = 0; i < MAX_SCORE; ++i) + for(i = 0; i < MAX_TEAMSCORE; ++i) if(teamscores_flags[i] & SFL_SORT_PRIO_MASK != SFL_SORT_PRIO_PRIMARY) if(teamscores_flags[i] & SFL_SORT_PRIO_MASK != SFL_SORT_PRIO_SECONDARY) { @@ -665,23 +667,27 @@ string GetTeamScoreString(float tm, float shortString) return out; } -float PlayerTeamScore_Compare(entity p1, entity p2, float strict) +float PlayerTeamScore_Compare(entity p1, entity p2, float teams, float strict) { - if(teamscores_entities_count) + if(teams && teamscores_entities_count) + { if(p1.team != p2.team) { entity t1, t2; float r; t1 = teamscorekeepers[p1.team - 1]; t2 = teamscorekeepers[p2.team - 1]; - r = TeamScore_Compare(t1, t2, strict); + r = TeamScore_Compare(t1, t2, ((teams >= 0) ? 1 : strict)); return r; } + if(teams < 0) + return 0; + } return PlayerScore_Compare(p1.scorekeeper, p2.scorekeeper, strict); } -entity PlayerScore_Sort(.float field, float strict) +entity PlayerScore_Sort(.float field, float teams, float strict, float nospectators) { entity p, plist, pprev, pbest, pbestprev, pfirst, plast; float i, j; @@ -691,8 +697,12 @@ entity PlayerScore_Sort(.float field, float strict) FOR_EACH_CLIENT(p) p.field = 0; - FOR_EACH_PLAYER(p) if(p.scorekeeper) + FOR_EACH_CLIENT(p) if(p.scorekeeper) { + if(nospectators) + if(p.frags == FRAGS_SPECTATOR) + continue; + p.chain = plist; plist = p; } @@ -707,7 +717,7 @@ entity PlayerScore_Sort(.float field, float strict) pbest = plist; for(p = plist; (pprev = p), (p = p.chain); ) { - if(PlayerTeamScore_Compare(p, pbest, strict) > 0) + if(PlayerTeamScore_Compare(p, pbest, teams, strict) > 0) { pbest = p; pbestprev = pprev; @@ -722,10 +732,10 @@ entity PlayerScore_Sort(.float field, float strict) pbest.chain = world; ++i; - if(!plast || PlayerTeamScore_Compare(plast, pbest, 0)) + if(!plast || PlayerTeamScore_Compare(plast, pbest, teams, 0)) j = i; - pbest.field = ++i; + pbest.field = j; if not(pfirst) pfirst = pbest; @@ -785,7 +795,7 @@ void Score_NicePrint_Team(entity to, float t, float w) sk = teamscorekeepers[t - 1]; if(sk) { - s = strcat(s, ColoredTeamName(t)); + s = strcat(s, Team_ColoredFullName(t)); for(i = 0; i < MAX_TEAMSCORE; ++i) if(teamscores_label[i] != "") { @@ -867,7 +877,7 @@ void Score_NicePrint(entity to) ++t; w = bound(6, floor(SCORESWIDTH / t - 1), 9); - p = PlayerScore_Sort(score_dummyfield, 1); + p = PlayerScore_Sort(score_dummyfield, 1, 1, 0); t = -1; if(!teamscores_entities_count)