From: Rudolf Polzer Date: Mon, 22 Nov 2010 13:43:05 +0000 (+0100) Subject: accuracy: csqc updates to match the svqc stuff X-Git-Tag: xonotic-v0.1.0preview~109^2~4 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=0fbd36780017efb29e5f6329159fe0d919c0b45f;p=xonotic%2Fxonotic-data.pk3dir.git accuracy: csqc updates to match the svqc stuff --- diff --git a/qcsrc/client/Main.qc b/qcsrc/client/Main.qc index ced8061ba..40bed8d10 100644 --- a/qcsrc/client/Main.qc +++ b/qcsrc/client/Main.qc @@ -848,11 +848,6 @@ void Ent_ClientData() if(newspectatee_status != spectatee_status) { float i; - // clear the weapon accuracy stats - for(i = WEP_FIRST; i <= WEP_LAST; ++i) { - weapon_hits[i] = 0; - weapon_fired[i] = 0; - } // clear race stuff race_laptime = 0; @@ -904,6 +899,30 @@ void Ent_RandomSeed() psrandom(s); } +void Ent_ReadAccuracy(void) +{ + float sf, f, w, b; + sf = ReadInt24_t(); + if(sf == 0) + { + for(w = 0; w <= WEP_LAST - WEP_FIRST; ++w) + weapon_accuracy[w] = -1; + return; + } + + for(w = 0, f = 1; w <= WEP_LAST - WEP_FIRST; ++w, f *= 2) + { + if(sf & f) + { + b = ReadByte(); + if(b == 0) + weapon_accuracy[w] = -1; + else + weapon_accuracy[w] = (b - 1.0) / 254.0; + } + } +} + // CSQC_Ent_Update : Called every frame that the server has indicated an update to the SSQC / CSQC entity has occured. // The only parameter reflects if the entity is "new" to the client, meaning it just came into the client's PVS. void Ent_RadarLink(); @@ -967,6 +986,7 @@ void(float bIsNewEntity) CSQC_Ent_Update = case ENT_CLIENT_HOOK: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_HOOK); break; case ENT_CLIENT_LGBEAM: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_LGBEAM); break; case ENT_CLIENT_GAUNTLET: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_GAUNTLET); break; + case ENT_CLIENT_ACCURACY: Ent_ReadAccuracy(); break; default: error(strcat("unknown entity type in CSQC_Ent_Update: ", ftos(self.enttype), "\n")); break; diff --git a/qcsrc/client/hud.qc b/qcsrc/client/hud.qc index f77f1c1c1..01dc01663 100644 --- a/qcsrc/client/hud.qc +++ b/qcsrc/client/hud.qc @@ -1692,18 +1692,10 @@ void HUD_Weapons(void) } float show_accuracy; - float weapon_stats, weapon_number; + float weapon_stats; if(cvar("hud_panel_weapons_accuracy") && acc_levels) { show_accuracy = true; - // hits - weapon_stats = getstati(STAT_DAMAGE_HITS); - weapon_number = weapon_stats & 63; - weapon_hits[weapon_number-WEP_FIRST] = floor(weapon_stats / 64); - // fired - weapon_stats = getstati(STAT_DAMAGE_FIRED); - weapon_number = weapon_stats & 63; - weapon_fired[weapon_number-WEP_FIRST] = floor(weapon_stats / 64); if (acc_col_x[0] == -1) for (i = 0; i < acc_levels; ++i) acc_col[i] = stov(cvar_string(strcat("accuracy_color", ftos(i)))); @@ -1726,13 +1718,9 @@ void HUD_Weapons(void) // draw the weapon accuracy if(show_accuracy) { - float weapon_hit, weapon_damage; - weapon_damage = weapon_fired[self.weapon-WEP_FIRST]; - if(weapon_damage) + weapon_stats = weapon_accuracy[self.weapon-WEP_FIRST]; + if(weapon_stats >= 0) { - weapon_hit = weapon_hits[self.weapon-WEP_FIRST]; - weapon_stats = floor(100 * weapon_hit / weapon_damage); - // find the max level lower than weapon_stats float j; j = acc_levels-1; diff --git a/qcsrc/client/hud.qh b/qcsrc/client/hud.qh index b661e30ff..bbb57d91f 100644 --- a/qcsrc/client/hud.qh +++ b/qcsrc/client/hud.qh @@ -15,8 +15,7 @@ float highlightedAction; // 0 = nothing, 1 = move, 2 = resize const float BORDER_MULTIPLIER = 0.25; float scoreboard_bottom; -float weapon_hits[WEP_MAXCOUNT]; -float weapon_fired[WEP_MAXCOUNT]; +float weapon_accuracy[WEP_MAXCOUNT]; #define MAX_ACCURACY_LEVELS 10 float acc_lev[MAX_ACCURACY_LEVELS]; diff --git a/qcsrc/client/scoreboard.qc b/qcsrc/client/scoreboard.qc index ec17dfca7..b1be9dc2a 100644 --- a/qcsrc/client/scoreboard.qc +++ b/qcsrc/client/scoreboard.qc @@ -941,15 +941,7 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) if(getstati(STAT_SWITCHWEAPON) == WEP_MINSTANEX) g_minstagib = 1; // TODO: real detection for minstagib? - float weapon_hit, weapon_damage, weapon_stats, weapon_number; - // hits - weapon_stats = getstati(STAT_DAMAGE_HITS); - weapon_number = weapon_stats & 63; - weapon_hits[weapon_number-WEP_FIRST] = floor(weapon_stats / 64); - // fired - weapon_stats = getstati(STAT_DAMAGE_FIRED); - weapon_number = weapon_stats & 63; - weapon_fired[weapon_number-WEP_FIRST] = floor(weapon_stats / 64); + float weapon_stats, weapon_number; if (!acc_levels) rgb = '1 1 1'; @@ -964,22 +956,18 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) continue; if ((i == WEP_NEX && g_minstagib) || i == WEP_PORTO || (i == WEP_MINSTANEX && !g_minstagib) || i == WEP_TUBA) // skip port-o-launch, nex || minstanex and tuba continue; - weapon_hit = weapon_hits[i-WEP_FIRST]; - weapon_damage = weapon_fired[i-WEP_FIRST]; + weapon_stats = weapon_accuracy[i-WEP_FIRST]; float weapon_alpha; - if(weapon_damage) - { - weapon_stats = bound(0, floor(100 * weapon_hit / weapon_damage), 100); + if(weapon_stats >= 0) weapon_alpha = scoreboard_alpha_fg; - } else weapon_alpha = 0.2 * scoreboard_alpha_fg; // weapon icon drawpic_aspect_skin(pos, strcat("weapon", self.netname), '1 0 0' * weapon_width + '0 1 0' * weapon_height, '1 1 1', weapon_alpha, DRAWFLAG_NORMAL); // the accuracy - if(weapon_damage) { + if(weapon_stats >= 0) { weapons_with_stats += 1; average_accuracy += weapon_stats; // store sum of all accuracies in average_accuracy @@ -989,13 +977,6 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) float padding; padding = (weapon_width - stringwidth(s, FALSE, '1 0 0' * fontsize)) / 2; // center the accuracy value - weapon_damage = weapon_fired[self.weapon-WEP_FIRST]; - if(weapon_damage) - { - weapon_hit = weapon_hits[self.weapon-WEP_FIRST]; - weapon_stats = floor(100 * weapon_hit / weapon_damage); - } - if (acc_levels) { // find the max level lower than weapon_stats @@ -1298,183 +1279,3 @@ void HUD_DrawScoreboard() scoreboard_bottom = pos_y + 2 * hud_fontsize_y; } - -void HUD_DrawAccuracyStats_Description_Hitscan(vector position) -{ - drawstring(position + '0 3 0' * hud_fontsize_y, "Shots fired:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - drawstring(position + '0 5 0' * hud_fontsize_y, "Shots hit:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - drawstring(position + '0 7 0' * hud_fontsize_y, "Accuracy:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - drawstring(position + '0 9 0' * hud_fontsize_y, "Shots missed:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); -} - -void HUD_DrawAccuracyStats_Description_Splash(vector position) -{ - drawstring(position + '0 3 0' * hud_fontsize_y, "Maximum damage:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - drawstring(position + '0 5 0' * hud_fontsize_y, "Actual damage:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - drawstring(position + '0 7 0' * hud_fontsize_y, "Accuracy:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - drawstring(position + '0 9 0' * hud_fontsize_y, "Damage wasted:", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); -} - -void HUD_DrawAccuracyStats() -{ - float i, count_hitscan, count_splash, row; // count is the number of 'colums' - float weapon_hit, weapon_damage, weapon_stats; - float left_border; // position where the weapons start, the description is in the border - vector fill_colour, fill_size; - vector pos; - vector border_colour; - - float col_margin = 20; // pixels between the columns - float row_margin = 20; // pixels between the rows - - fill_size_x = 5 * hud_fontsize_x; // width of the background - fill_size_y = 10 * hud_fontsize_y; // height of the background - - drawfont = hud_bigfont; - pos_x = 0; - pos_y = SCOREBOARD_OFFSET; - pos_z = 0; - drawstringcenter(pos, "Weapon Accuracy", 2 * hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - - left_border = col_margin + 11 * hud_fontsize_x; - - drawfont = hud_font; - - if(warmup_stage) - { - pos_y += 40; - if(mod(time, 1) >= 0.4) - drawstringcenter(pos, "Stats are not tracked during warmup stage", hud_fontsize, '1 1 0', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - - return; - } - - if(gametype == GAME_RACE || gametype == GAME_CTS) - { - pos_y += 40; - if(mod(time, 1) >= 0.4) - drawstringcenter(pos, "Stats are not tracked in Race/CTS", hud_fontsize, '1 1 0', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - - return; - } - - float top_border_hitscan = SCOREBOARD_OFFSET + 55; // position where the hitscan row starts: pixels down the screen - HUD_DrawAccuracyStats_Description_Hitscan('1 0 0' * col_margin + '0 1 0' * top_border_hitscan); - - float top_border_splash = SCOREBOARD_OFFSET + 175; // position where the splash row starts: pixels down the screen - HUD_DrawAccuracyStats_Description_Splash('1 0 0' * col_margin + '0 1 0' * top_border_splash); - - for(i = WEP_FIRST; i <= WEP_LAST; ++i) - { - self = get_weaponinfo(i); - if not(self.weapons) - continue; - weapon_hit = weapon_hits[i-WEP_FIRST]; - weapon_damage = weapon_fired[i-WEP_FIRST]; - border_colour = (i == activeweapon) ? '1 1 1' : '0 0 0'; // white or black border - - if (weapon_damage) { - if (self.spawnflags & WEP_TYPE_SPLASH) { - weapon_stats = bound(0, floor(100 * weapon_hit / weapon_damage), 100); - - fill_colour_x = 1 - 0.015 * weapon_stats; - fill_colour_y = 1 - 0.015 * (100 - weapon_stats); - - // how the background colour is calculated - // % red green red_2 green_2 - // 0 1 0 1 - % * 0.015 1 - (100 - %) * 0.015 - // 10 0.85 0 1 - % * 0.015 1 - (100 - %) * 0.015 - // 20 0.70 0 1 - % * 0.015 1 - (100 - %) * 0.015 - // 30 0.55 0 1 - % * 0.015 1 - (100 - %) * 0.015 - // 40 0.40 0.10 1 - % * 0.015 1 - (100 - %) * 0.015 - // 50 0.25 0.25 1 - % * 0.015 1 - (100 - %) * 0.015 - // 60 0.10 0.40 1 - % * 0.015 1 - (100 - %) * 0.015 - // 70 0 0.55 1 - % * 0.015 1 - (100 - %) * 0.015 - // 80 0 0.70 1 - % * 0.015 1 - (100 - %) * 0.015 - // 90 0 0.85 1 - % * 0.015 1 - (100 - %) * 0.015 - // 100 0 1 1 - % * 0.015 1 - (100 - %) * 0.015 - - if ((left_border + count_splash * (fill_size_x + col_margin) + fill_size_x) >= vid_conwidth) - { - count_splash = 0; - ++row; - HUD_DrawAccuracyStats_Description_Splash('1 0 0' * col_margin + '0 1 0' * (top_border_splash + row * (fill_size_y + row_margin))); - } - - pos_x = left_border + count_splash * (fill_size_x + col_margin); - pos_y = top_border_splash + row * (fill_size_y + row_margin); - - // background - drawpic(pos, "gfx/scoreboard/accuracy_bg", fill_size , fill_colour, scoreboard_alpha_bg, DRAWFLAG_NORMAL); - drawborderlines(autocvar_scoreboard_border_thickness, pos, fill_size, border_colour, scoreboard_alpha_bg, DRAWFLAG_NORMAL); - - // the weapon - drawpic(pos, strcat("gfx/weapons/weapon", self.netname), '1 0.5 0' * fill_size_x , '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - - // the amount of shots fired or max damage - drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 3 0' * hud_fontsize_y, ftos(weapon_damage), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - - // the amount of hits or actual damage - drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 5 0' * hud_fontsize_y, ftos(weapon_hit), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - - // the accuracy - drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 7 0' * hud_fontsize_y, strcat(ftos(weapon_stats),"%"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - - // the amount of shots missed or damage wasted - drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 9 0' * hud_fontsize_y, ftos(max(0, weapon_damage - weapon_hit)), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - - ++count_splash; - } else if (self.spawnflags & WEP_TYPE_HITSCAN) { - weapon_stats = bound(0, floor(100 * weapon_hit / weapon_damage), 100); - - fill_colour_x = 1 - 0.015 * weapon_stats; - fill_colour_y = 1 - 0.015 * (100 - weapon_stats); - - // how the background colour is calculated - // % red green red_2 green_2 - // 0 1 0 1 - % * 0.015 1 - (100 - %) * 0.015 - // 10 0.850 0 1 - % * 0.015 1 - (100 - %) * 0.015 - // 20 0.70 0 1 - % * 0.015 1 - (100 - %) * 0.015 - // 30 0.55 0 1 - % * 0.015 1 - (100 - %) * 0.015 - // 40 0.40 0.10 1 - % * 0.015 1 - (100 - %) * 0.015 - // 50 0.25 0.25 1 - % * 0.015 1 - (100 - %) * 0.015 - // 60 0.10 0.40 1 - % * 0.015 1 - (100 - %) * 0.015 - // 70 0 0.55 1 - % * 0.015 1 - (100 - %) * 0.015 - // 80 0 0.70 1 - % * 0.015 1 - (100 - %) * 0.015 - // 90 0 0.85 1 - % * 0.015 1 - (100 - %) * 0.015 - // 100 0 1 1 - % * 0.015 1 - (100 - %) * 0.015 - - if ((left_border + count_hitscan * (fill_size_x + col_margin) + fill_size_x + cvar("stats_right_margin")) >= vid_conwidth) - { - count_hitscan = 0; - ++row; - HUD_DrawAccuracyStats_Description_Hitscan('1 0 0' * col_margin + '0 1 0' * (top_border_hitscan + row * (fill_size_y + row_margin))); - } - - pos_x = left_border + count_hitscan * (fill_size_x + col_margin); - pos_y = top_border_hitscan + row * (fill_size_y + row_margin); - - // background - drawpic(pos, "gfx/scoreboard/accuracy_bg", fill_size , fill_colour, scoreboard_alpha_bg, DRAWFLAG_NORMAL); - drawborderlines(autocvar_scoreboard_border_thickness, pos, fill_size, border_colour, scoreboard_alpha_bg, DRAWFLAG_NORMAL); - - // the weapon - drawpic(pos, strcat("gfx/weapons/weapon", self.netname), '1 0.5 0' * fill_size_x , '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - - // the amount of shots fired or max damage - drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 3 0' * hud_fontsize_y, ftos(weapon_damage), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - - // the amount of hits or actual damage - drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 5 0' * hud_fontsize_y, ftos(weapon_hit), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - - // the accuracy - drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 7 0' * hud_fontsize_y, strcat(ftos(weapon_stats),"%"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - - // the amount of shots missed or damage wasted - drawstringright(pos + '4.5 0 0' * hud_fontsize_x + '0 9 0' * hud_fontsize_y, ftos(max(0, weapon_damage - weapon_hit)), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - - ++count_hitscan; - } - } - } -}