bool autocvar_hud_panel_scoreboard_itemstats = true;
bool autocvar_hud_panel_scoreboard_itemstats_doublerows = false;
-bool autocvar_hud_panel_scoreboard_itemstats_filter = true;
+int autocvar_hud_panel_scoreboard_itemstats_filter = 1;
+int autocvar_hud_panel_scoreboard_itemstats_filter_mask = 12;
float autocvar_hud_panel_scoreboard_itemstats_showdelay = 2.2; // slightly more delayed than accuracy
float autocvar_hud_panel_scoreboard_itemstats_showdelay_minpos = 0.75;
float Scoreboard_ComparePlayerScores(entity left, entity right)
{
- float vl, vr, r;
- vl = entcs_GetTeam(left.sv_entnum);
- vr = entcs_GetTeam(right.sv_entnum);
-
- if(!left.gotscores)
- vl = NUM_SPECTATOR;
- if(!right.gotscores)
- vr = NUM_SPECTATOR;
+ int vl = (left.gotscores) ? entcs_GetTeam(left.sv_entnum) : NUM_SPECTATOR;
+ int vr = (right.gotscores) ? entcs_GetTeam(right.sv_entnum) : NUM_SPECTATOR;
if(vl > vr)
return true;
}
entity fld = NULL;
+ int r;
for (int i = -2; i < SB_EXTRA_SORTING_FIELDS; ++i)
{
if (i < 0)
float Scoreboard_CompareTeamScores(entity left, entity right)
{
- int i, r;
-
if(left.team == NUM_SPECTATOR)
return 1;
if(right.team == NUM_SPECTATOR)
return 0;
- r = Scoreboard_CompareScore(left.teamscores(ts_primary), right.teamscores(ts_primary), teamscores_flags(ts_primary));
- if (r >= 0)
- return r;
-
- r = Scoreboard_CompareScore(left.teamscores(ts_secondary), right.teamscores(ts_secondary), teamscores_flags(ts_secondary));
- if (r >= 0)
- return r;
-
- for(i = 0; i < MAX_TEAMSCORE; ++i)
+ int fld_idx = -1;
+ int r;
+ for(int i = -2; i < MAX_TEAMSCORE; ++i)
{
- r = Scoreboard_CompareScore(left.teamscores(i), right.teamscores(i), teamscores_flags(i));
- if (r >= 0)
- return r;
+ if (i < 0)
+ {
+ if (fld_idx == -1) fld_idx = ts_primary;
+ else if (ts_secondary == ts_primary) continue;
+ else fld_idx = ts_secondary;
+ }
+ else
+ {
+ fld_idx = i;
+ if (fld_idx == ts_primary || fld_idx == ts_secondary) continue;
+ }
+
+ r = Scoreboard_CompareScore(left.teamscores(fld_idx), right.teamscores(fld_idx), teamscores_flags(fld_idx));
+ if (r >= 0) return r;
}
if (left.team < right.team)
cvar_set("scoreboard_columns", SCOREBOARD_DEFAULT_COLUMNS);
argc = tokenizebyseparator(strcat("0 1 ", SCOREBOARD_DEFAULT_COLUMNS), " ");
}
- else if(argv(2) == "all")
+ else if(argv(2) == "all" || argv(2) == "ALL")
{
- string s = "ping pl name |"; // scores without a label
+ string s = "ping pl name |"; // scores without label (not really scores)
+ if(argv(2) == "ALL")
+ {
+ // scores without label
+ s = strcat(s, " ", "sum");
+ s = strcat(s, " ", "kdratio");
+ s = strcat(s, " ", "frags");
+ }
FOREACH(Scores, true, {
if(it != ps_primary)
if(it != ps_secondary)
return end_pos;
}
-.bool uninteresting;
-STATIC_INIT(default_order_items_label)
+bool is_item_filtered(entity it)
{
- IL_EACH(default_order_items, true, {
- if(!(it.instanceOfPowerup
- || it == ITEM_HealthMega || it == ITEM_HealthBig
- || it == ITEM_ArmorMega || it == ITEM_ArmorBig
- ))
+ if (!autocvar_hud_panel_scoreboard_itemstats_filter)
+ return false;
+ int mask = autocvar_hud_panel_scoreboard_itemstats_filter_mask;
+ if (mask <= 0)
+ return false;
+ if (it.instanceOfArmor || it.instanceOfHealth)
+ {
+ int ha_mask = floor(mask) % 10;
+ switch (ha_mask)
{
- it.uninteresting = true;
+ default: return false;
+ case 4: if (it == ITEM_HealthMega || it == ITEM_ArmorMega) return true; // else fallthrough
+ case 3: if (it == ITEM_HealthBig || it == ITEM_ArmorBig) return true; // else fallthrough
+ case 2: if (it == ITEM_HealthMedium || it == ITEM_ArmorMedium) return true; // else fallthrough
+ case 1: if (it == ITEM_HealthSmall || it == ITEM_ArmorSmall) return true; // else fallthrough
}
- });
+ }
+ if (it.instanceOfAmmo)
+ {
+ int ammo_mask = floor(mask / 10) % 10;
+ return (ammo_mask == 1);
+ }
+ return false;
}
vector Scoreboard_ItemStats_Draw(vector pos, vector rgb, vector bg_size)
IL_EACH(default_order_items, true, {
int q = g_inventory.inv_items[it.m_id];
//q = 1; // debug: display all items
- if (autocvar_hud_panel_scoreboard_itemstats_filter && it.uninteresting)
+ if (is_item_filtered(it))
++uninteresting_cnt;
else if (!q)
++disowned_cnt;
vector tmpos = pos;
int column = 0;
- IL_EACH(default_order_items, !(autocvar_hud_panel_scoreboard_itemstats_filter && it.uninteresting), {
+ IL_EACH(default_order_items, !is_item_filtered(it), {
int n = g_inventory.inv_items[it.m_id];
//n = 1 + floor(i * 3 + 4.8) % 7; // debug: display a value for each item
if (n <= 0) continue;
if (!have_item_stats)
{
IL_EACH(default_order_items, true, {
- if (!(autocvar_hud_panel_scoreboard_itemstats_filter && it.uninteresting))
+ if (!is_item_filtered(it))
{
int q = g_inventory.inv_items[it.m_id];
//q = 1; // debug: display all items