X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fscores.qc;h=356b03ccdc03c5dc3cc52fbc91b36bf6f6560e90;hb=1d70346809dd33b32864b3832662878077588e4b;hp=620ce8ce50e3a4a38812ab85b38b8fc1b2c4b195;hpb=b0a06888ff894f9d334f6277b996f98ae8a665a0;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/scores.qc b/qcsrc/server/scores.qc index 620ce8ce5..356b03ccd 100644 --- a/qcsrc/server/scores.qc +++ b/qcsrc/server/scores.qc @@ -1,3 +1,10 @@ +#include "scores.qh" + +#include "command/common.qh" +#include "mutators/all.qh" +#include "../common/playerstats.qh" +#include "../common/teams.qh" + .entity scorekeeper; entity teamscorekeepers[16]; string scores_label[MAX_SCORE]; @@ -14,31 +21,31 @@ vector ScoreField_Compare(entity t1, entity t2, .float field, float fieldflags, { if(!strict && !(fieldflags & SFL_SORT_PRIO_MASK)) // column does not sort return previous; - if((fieldflags & SFL_SORT_PRIO_MASK) < previous_y) + if((fieldflags & SFL_SORT_PRIO_MASK) < previous.y) return previous; - if(t1.field == t2.field) + if (t1.(field) == t2.(field)) return previous; - previous_y = fieldflags & SFL_SORT_PRIO_MASK; + previous.y = fieldflags & SFL_SORT_PRIO_MASK; if(fieldflags & SFL_ZERO_IS_WORST) { - if(t1.field == 0) + if (t1.(field) == 0) { - previous_x = -1; + previous.x = -1; return previous; } - else if(t2.field == 0) + else if (t2.(field) == 0) { - previous_x = +1; + previous.x = +1; return previous; } } - if(fieldflags & SFL_LOWER_IS_BETTER) - previous_x = (t2.field - t1.field); + if (fieldflags & SFL_LOWER_IS_BETTER) + previous.x = (t2.(field) - t1.(field)); else - previous_x = (t1.field - t2.field); + previous.x = (t1.(field) - t2.(field)); return previous; } @@ -47,11 +54,11 @@ vector ScoreField_Compare(entity t1, entity t2, .float field, float fieldflags, * teamscore entities */ -float TeamScore_SendEntity(entity to, float sendflags) +bool TeamScore_SendEntity(entity this, entity to, float sendflags) { float i, p, longflags; - WriteByte(MSG_ENTITY, ENT_CLIENT_TEAMSCORES); + WriteHeader(MSG_ENTITY, ENT_CLIENT_TEAMSCORES); WriteByte(MSG_ENTITY, self.team - 1); longflags = 0; @@ -75,17 +82,16 @@ float TeamScore_SendEntity(entity to, float sendflags) WriteChar(MSG_ENTITY, self.(teamscores[i])); } - return TRUE; + return true; } void TeamScore_Spawn(float t, string name) { - entity ts; - ts = spawn(); - ts.classname = "csqc_score_team"; + entity ts = new(csqc_score_team); + make_pure(ts); ts.netname = name; // not used yet, FIXME ts.team = t; - Net_LinkEntity(ts, FALSE, 0, TeamScore_SendEntity); + Net_LinkEntity(ts, false, 0, TeamScore_SendEntity); teamscorekeepers[t - 1] = ts; ++teamscores_entities_count; PlayerStats_GameReport_AddTeam(t); @@ -136,10 +142,10 @@ float TeamScore_Compare(entity t1, entity t2, float strict) result = ScoreField_Compare(t1, t2, f, teamscores_flags[i], result, strict); } - if (result_x == 0 && strict) - result_x = t1.team - t2.team; + if (result.x == 0 && strict) + result.x = t1.team - t2.team; - return result_x; + return result.x; } /* @@ -178,10 +184,10 @@ void ScoreInfo_SetLabel_TeamScore(float i, string label, float scoreflags) } } -float ScoreInfo_SendEntity(entity to, float sf) +bool ScoreInfo_SendEntity(entity this, entity to, int sf) { float i; - WriteByte(MSG_ENTITY, ENT_CLIENT_SCORES_INFO); + WriteHeader(MSG_ENTITY, ENT_CLIENT_SCORES_INFO); WriteInt24_t(MSG_ENTITY, MapInfo_LoadedGametype); for(i = 0; i < MAX_SCORE; ++i) { @@ -193,7 +199,7 @@ float ScoreInfo_SendEntity(entity to, float sf) WriteString(MSG_ENTITY, teamscores_label[i]); WriteByte(MSG_ENTITY, teamscores_flags[i]); } - return TRUE; + return true; } void ScoreInfo_Init(float teams) @@ -204,9 +210,9 @@ void ScoreInfo_Init(float teams) } else { - scores_initialized = spawn(); - scores_initialized.classname = "ent_client_scoreinfo"; - Net_LinkEntity(scores_initialized, FALSE, 0, ScoreInfo_SendEntity); + scores_initialized = new(ent_client_scoreinfo); + make_pure(scores_initialized); + Net_LinkEntity(scores_initialized, false, 0, ScoreInfo_SendEntity); } if(teams >= 1) TeamScore_Spawn(NUM_TEAM_1, "Red"); @@ -222,11 +228,11 @@ void ScoreInfo_Init(float teams) * per-player score entities */ -float PlayerScore_SendEntity(entity to, float sendflags) +bool PlayerScore_SendEntity(entity this, entity to, float sendflags) { float i, p, longflags; - WriteByte(MSG_ENTITY, ENT_CLIENT_SCORES); + WriteHeader(MSG_ENTITY, ENT_CLIENT_SCORES); WriteByte(MSG_ENTITY, num_for_edict(self.owner)); longflags = 0; @@ -250,7 +256,7 @@ float PlayerScore_SendEntity(entity to, float sendflags) WriteChar(MSG_ENTITY, self.(scores[i])); } - return TRUE; + return true; } float PlayerScore_Clear(entity player) @@ -309,12 +315,12 @@ void Score_ClearAll() void PlayerScore_Attach(entity player) { - entity sk; if(player.scorekeeper) error("player already has a scorekeeper"); - sk = spawn(); + entity sk = new(scorekeeper); + make_pure(sk); sk.owner = player; - Net_LinkEntity(sk, FALSE, 0, PlayerScore_SendEntity); + Net_LinkEntity(sk, false, 0, PlayerScore_SendEntity); player.scorekeeper = sk; } @@ -328,14 +334,15 @@ void PlayerScore_Detach(entity player) float PlayerScore_Add(entity player, float scorefield, float score) { - entity s; + bool mutator_returnvalue = MUTATOR_CALLHOOK(AddPlayerScore, scorefield, score); + score = ret_float; if(gameover) - if(!(g_lms && scorefield == SP_LMS_RANK)) // allow writing to this field in intermission as it is needed for newly joining players + if(!mutator_returnvalue) score = 0; if(!scores_initialized) return 0; // FIXME remove this when everything uses this system - s = player.scorekeeper; + entity s = player.scorekeeper; if(!s) { if(gameover) @@ -373,10 +380,10 @@ float PlayerScore_Compare(entity t1, entity t2, float strict) result = ScoreField_Compare(t1, t2, f, scores_flags[i], result, strict); } - if (result_x == 0 && strict) - result_x = num_for_edict(t1.owner) - num_for_edict(t2.owner); + if (result.x == 0 && strict) + result.x = num_for_edict(t1.owner) - num_for_edict(t2.owner); - return result_x; + return result.x; } void WinningConditionHelper() @@ -529,15 +536,17 @@ void WinningConditionHelper() s = strcat(s, ":human"); else s = strcat(s, ":bot"); - if(!IS_PLAYER(p) && p.caplayer != 1 && !g_lms) + if(!IS_PLAYER(p) && !MUTATOR_CALLHOOK(GetPlayerStatus, p, s)) s = strcat(s, ":spectator"); + s = strcat(s, ret_string); } else { - if(IS_PLAYER(p) || p.caplayer == 1 || g_lms) + if(IS_PLAYER(p) || MUTATOR_CALLHOOK(GetPlayerStatus, p, s)) s = GetPlayerScoreString(p, 2); else s = "-666"; + s = strcat(s, ret_string); } if(p.clientstatus) @@ -697,7 +706,7 @@ entity PlayerScore_Sort(.float field, float teams, float strict, float nospectat plist = world; FOR_EACH_CLIENT(p) - p.field = 0; + p.(field) = 0; FOR_EACH_CLIENT(p) if(p.scorekeeper) { @@ -737,7 +746,7 @@ entity PlayerScore_Sort(.float field, float teams, float strict, float nospectat if(!plast || PlayerTeamScore_Compare(plast, pbest, teams, 0)) j = i; - pbest.field = j; + pbest.(field) = j; if (!pfirst) pfirst = pbest; @@ -773,8 +782,8 @@ float TeamScore_GetCompareValue(float t) return s; } -#define NAMEWIDTH 22 -#define SCORESWIDTH 58 +const float NAMEWIDTH = 22; +const float SCORESWIDTH = 58; // TODO put this somewhere in common? string Score_NicePrint_ItemColor(float vflags) { @@ -833,7 +842,7 @@ void Score_NicePrint_Player(entity to, entity p, float w) sk = p.scorekeeper; s = strcat(s, p.netname); - for(;;) + for (;;) { i = strlennocol(s) - NAMEWIDTH; if(i > 0)