X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fclient%2FView.qc;h=0381845ffdd2366898185e85d0a6ac1344329d19;hp=07b21d98af5af92e34f278808b3a919048666f40;hb=02990abeb6b6bba0059e812a1b78e67f6febffba;hpb=e2fa5a6fc3e04ef71f32fd6a55b14d3ac1cd1aa0 diff --git a/qcsrc/client/View.qc b/qcsrc/client/View.qc index 07b21d98af..0381845ffd 100644 --- a/qcsrc/client/View.qc +++ b/qcsrc/client/View.qc @@ -338,7 +338,7 @@ void CSQC_common_hud(void); void PostInit(void); void CSQC_Demo_Camera(); -float HUD_WouldDrawScoreboard (); +float HUD_WouldDrawScoreboard(); float view_set; float camera_mode; float reticle_type; @@ -347,6 +347,7 @@ void CSQC_SPIDER_HUD(); void CSQC_RAPTOR_HUD(); vector freeze_pmove_org, freeze_input_angles; +entity nightvision_noise, nightvision_noise2; void CSQC_UpdateView(float w, float h) { @@ -381,7 +382,7 @@ void CSQC_UpdateView(float w, float h) input_angles = warpzone_fixview_cl_viewangles; view_angles = warpzone_fixview_angles; - if(cvar("cl_lockview") || autocvar__hud_configure) + if(cvar("cl_lockview") || (autocvar__hud_configure && spectatee_status <= 0)) { pmove_org = freeze_pmove_org; input_angles = view_angles = freeze_input_angles; @@ -467,7 +468,6 @@ void CSQC_UpdateView(float w, float h) } } - hud_accuracy_hud = cvar_or("hud_accuracy_hud", 1); ColorTranslateMode = cvar("cl_stripcolorcodes"); activeweapon = getstati(STAT_SWITCHWEAPON); f = cvar("teamplay"); @@ -533,8 +533,6 @@ void CSQC_UpdateView(float w, float h) } // Draw the Crosshair - float scoreboard_active; - scoreboard_active = HUD_WouldDrawScoreboard(); R_SetView(VF_DRAWCROSSHAIR, 0); //Make sure engine crosshairs are always hidden // Draw the Engine Status Bar (the default Quake HUD) @@ -565,12 +563,64 @@ void CSQC_UpdateView(float w, float h) // next R_RenderScene call drawstring('0 0 0', "", '1 1 0', '1 1 1', 0, 0); + if(cvar("r_fakelight") >= 2 || cvar("r_fullbright")) + { + // apply night vision effect + vector rgb, tc_00, tc_01, tc_10, tc_11; + float a; + + if(!nightvision_noise) + { + nightvision_noise = spawn(); + nightvision_noise.classname = "nightvision_noise"; + } + if(!nightvision_noise2) + { + nightvision_noise2 = spawn(); + nightvision_noise2.classname = "nightvision_noise2"; + } + + // color tint in yellow + drawfill('0 0 0', cvar("vid_conwidth") * '1 0 0' + cvar("vid_conheight") * '0 1 0', '0.5 1 0.3', 1, DRAWFLAG_MODULATE); + + // draw BG + a = Noise_Pink(nightvision_noise, frametime * 1.5) * 0.05 + 0.15; + rgb = '1 1 1'; + tc_00 = '0 0 0' + '0.2 0 0' * sin(time * 0.3) + '0 0.3 0' * cos(time * 0.7); + tc_01 = '0 2.25 0' + '0.6 0 0' * cos(time * 1.2) - '0 0.3 0' * sin(time * 2.2); + tc_10 = '1.5 0 0' - '0.2 0 0' * sin(time * 0.5) + '0 0.5 0' * cos(time * 1.7); + //tc_11 = '1 1 0' + '0.6 0 0' * sin(time * 0.6) + '0 0.3 0' * cos(time * 0.1); + tc_11 = tc_01 + tc_10 - tc_00; + R_BeginPolygon("gfx/nightvision-bg.tga", DRAWFLAG_ADDITIVE); + R_PolygonVertex('0 0 0', tc_00, rgb, a); + R_PolygonVertex(cvar("vid_conwidth") * '1 0 0', tc_10, rgb, a); + R_PolygonVertex(cvar("vid_conwidth") * '1 0 0' + cvar("vid_conheight") * '0 1 0', tc_11, rgb, a); + R_PolygonVertex(cvar("vid_conheight") * '0 1 0', tc_01, rgb, a); + R_EndPolygon(); + + // draw FG + a = Noise_Pink(nightvision_noise2, frametime * 0.1) * 0.05 + 0.12; + rgb = '0.3 0.6 0.4' + '0.1 0.4 0.2' * Noise_White(nightvision_noise2, frametime); + tc_00 = '0 0 0' + '1 0 0' * Noise_White(nightvision_noise2, frametime) + '0 1 0' * Noise_White(nightvision_noise2, frametime); + tc_01 = tc_00 + '0 3 0' * (1 + Noise_White(nightvision_noise2, frametime) * 0.2); + tc_10 = tc_00 + '2 0 0' * (1 + Noise_White(nightvision_noise2, frametime) * 0.3); + tc_11 = tc_01 + tc_10 - tc_00; + R_BeginPolygon("gfx/nightvision-fg.tga", DRAWFLAG_ADDITIVE); + R_PolygonVertex('0 0 0', tc_00, rgb, a); + R_PolygonVertex(cvar("vid_conwidth") * '1 0 0', tc_10, rgb, a); + R_PolygonVertex(cvar("vid_conwidth") * '1 0 0' + cvar("vid_conheight") * '0 1 0', tc_11, rgb, a); + R_PolygonVertex(cvar("vid_conheight") * '0 1 0', tc_01, rgb, a); + R_EndPolygon(); + } + // Draw the aiming reticle for weapons that use it // reticle_type is changed to the item we are zooming / aiming with, to decide which reticle to use // It must be a persisted float for fading out to work properly (you let go of the zoom button for // the view to go back to normal, so reticle_type would become 0 as we fade out) if(spectatee_status || getstati(STAT_HEALTH) <= 0) reticle_type = 0; // prevent reticle from showing during the respawn zoom effect or for spectators + else if(activeweapon == WEP_NEX && (button_zoom || zoomscript_caught) || activeweapon == WEP_CAMPINGRIFLE && (button_zoom || zoomscript_caught) || activeweapon == WEP_MINSTANEX && (button_zoom || zoomscript_caught)) + reticle_type = 2; // nex zoom else if(button_zoom || zoomscript_caught) reticle_type = 1; // normal zoom else if(activeweapon == WEP_NEX && button_attack2 || activeweapon == WEP_CAMPINGRIFLE && button_attack2) @@ -630,12 +680,12 @@ void CSQC_UpdateView(float w, float h) self.draw2d(); self = e; + scoreboard_active = HUD_WouldDrawScoreboard(); + float hud; hud = getstati(STAT_HUD); if(hud == HUD_SPIDERBOT) - { CSQC_SPIDER_HUD(); - } else if(hud == HUD_WAKIZASHI) CSQC_WAKIZASHI_HUD(); else if(hud == HUD_RAPTOR) @@ -648,6 +698,18 @@ void CSQC_UpdateView(float w, float h) // crosshair goes VERY LAST if(!scoreboard_active && !camera_active && intermission != 2) { + string wcross_style; + float wcross_alpha, wcross_resolution; + wcross_style = cvar_string("crosshair"); + if (wcross_style == "0") + return; + wcross_resolution = cvar("crosshair_size"); + if (wcross_resolution == 0) + return; + wcross_alpha = cvar("crosshair_color_alpha"); + if (wcross_alpha == 0) + return; + // TrueAim check float shottype; float bullets, ring_scale; @@ -673,24 +735,26 @@ void CSQC_UpdateView(float w, float h) else shottype = SHOTTYPE_HITWORLD; - string wcross_style; - wcross_style = cvar_string("crosshair"); - if (wcross_style != "0") { vector wcross_color, wcross_size; string wcross_wep, wcross_name; - float wcross_alpha, wcross_scale, wcross_blur, wcross_resolution; + float wcross_scale, wcross_blur; wcross_color_x = cvar("crosshair_color_red"); wcross_color_y = cvar("crosshair_color_green"); wcross_color_z = cvar("crosshair_color_blue"); - wcross_alpha = cvar("crosshair_color_alpha"); - wcross_resolution = cvar("crosshair_size"); if (cvar("crosshair_per_weapon")) { e = get_weaponinfo(activeweapon); if (e && e.netname != "") { wcross_wep = e.netname; + wcross_resolution *= cvar(strcat("crosshair_", wcross_wep, "_size")); + if (wcross_resolution == 0) + return; + wcross_alpha *= cvar(strcat("crosshair_", wcross_wep, "_color_alpha")); + if (wcross_alpha == 0) + return; + wcross_style = cvar_string(strcat("crosshair_", wcross_wep)); if(wcross_style == "") wcross_style = e.netname; @@ -701,9 +765,6 @@ void CSQC_UpdateView(float w, float h) wcross_color_y = cvar(strcat("crosshair_", wcross_wep, "_color_green")); wcross_color_z = cvar(strcat("crosshair_", wcross_wep, "_color_blue")); } - - wcross_alpha *= cvar(strcat("crosshair_", wcross_wep, "_color_alpha")); - wcross_resolution *= cvar(strcat("crosshair_", wcross_wep, "_size")); } } @@ -721,7 +782,7 @@ void CSQC_UpdateView(float w, float h) if(shottype == SHOTTYPE_HITENEMY) wcross_scale *= cvar("crosshair_hittest"); // is not queried if hittest is 0 - if(shottype == SHOTTYPE_HITTEAM) + else if(shottype == SHOTTYPE_HITTEAM) wcross_scale /= cvar("crosshair_hittest"); // is not queried if hittest is 0 f = cvar("crosshair_effect_speed"); @@ -773,17 +834,27 @@ void CSQC_UpdateView(float w, float h) wcross_scale *= 1 - cvar("_menu_alpha"); wcross_alpha *= 1 - cvar("_menu_alpha"); + ring_scale = cvar("crosshair_ring_size"); + + wcross_size = drawgetimagesize(wcross_name) * wcross_scale; + + float nex_charge; + nex_charge = getstatf(STAT_NEX_CHARGE); + // ring around crosshair representing bullets left in camping rifle clip - if (activeweapon == WEP_CAMPINGRIFLE) + if (activeweapon == WEP_CAMPINGRIFLE && cr_maxbullets) { - ring_scale = cvar("crosshair_campingrifle_ring_size"); - bullets = bound(0, getstati(STAT_BULLETS_LOADED), 4); - } - else - bullets = 0; + bullets = getstati(STAT_BULLETS_LOADED); + f = bound(0, bullets / cr_maxbullets, 1); -#define CROSSHAIR_DRAW_RING(i,j,sz,wcross_name,wcross_alpha) \ - drawpic(wcross_origin - ('0.5 0 0' * (sz * wcross_size_x * ring_scale + i * wcross_blur) + '0 0.5 0' * (sz * wcross_size_y * ring_scale + j * wcross_blur)), strcat("gfx/rifle_ring_", ftos(bullets)), sz * wcross_size * ring_scale, wcross_color, wcross_alpha, DRAWFLAG_NORMAL) + a = cvar("crosshair_campingrifle_bulletcounter_alpha"); + DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring.tga", f, wcross_color, wcross_alpha * a, DRAWFLAG_ADDITIVE); + } + else if (activeweapon == WEP_NEX && nex_charge) // ring around crosshair representing velocity-dependent damage for the nex + { + a = cvar("crosshair_nexvelocity_alpha"); + DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring.tga", nex_charge, wcross_color, wcross_alpha * a, DRAWFLAG_ADDITIVE); + } #define CROSSHAIR_DO_BLUR(M,sz,wcross_name,wcross_alpha) \ do \ @@ -820,11 +891,11 @@ void CSQC_UpdateView(float w, float h) } wcross_size = drawgetimagesize(wcross_name) * wcross_scale; - if(bullets) - { - CROSSHAIR_DO_BLUR(CROSSHAIR_DRAW_RING, wcross_resolution, wcross_name, wcross_alpha); - } CROSSHAIR_DRAW(wcross_resolution, wcross_name, wcross_alpha * f); + + if(cvar("crosshair_dot")) + CROSSHAIR_DRAW(wcross_resolution * cvar("crosshair_dot_size"), "gfx/crosshairdot.tga", wcross_alpha * f * cvar("crosshair_dot_alpha")); + wcross_name_alpha_goal_prev = f; } } @@ -889,11 +960,6 @@ void CSQC_UpdateView(float w, float h) // let's reset the view back to normal for the end R_SetView(VF_MIN, '0 0 0'); R_SetView(VF_SIZE, '1 0 0' * w + '0 1 0' * h); - - // be safe against triggerbots until everyone has the fixed engine - // this call is meant to overwrite the trace globals by something - // unsuspicious - traceline('0 0 0', '0 0 0', MOVE_WORLDONLY, world); } #define spider_h "gfx/vehicles/hud_bg.tga" @@ -1201,9 +1267,13 @@ void CSQC_common_hud(void) case HUD_NORMAL: // do some accuracy var caching float i; + if(cvar_string("hud_panel_weapons_accuracy_color_levels") != acc_color_levels) if(!(gametype == GAME_RACE || gametype == GAME_CTS)) { - acc_levels = tokenize(cvar_string("hud_panel_weapons_accuracy_color_levels")); + if(acc_color_levels) + strunzone(acc_color_levels); + acc_color_levels = strzone(cvar_string("hud_panel_weapons_accuracy_color_levels")); + acc_levels = tokenize(acc_color_levels); if (acc_levels > MAX_ACCURACY_LEVELS) acc_levels = MAX_ACCURACY_LEVELS; @@ -1214,7 +1284,7 @@ void CSQC_common_hud(void) HUD_Main(); // always run these functions for alpha checks HUD_DrawScoreboard(); - if (scoreboard_showscores || scoreboard_showscores_force || getstati(STAT_HEALTH) <= 0 || intermission == 1) // scoreboard/accuracy + if (scoreboard_active) // scoreboard/accuracy { HUD_Reset(); // HUD_DrawScoreboard takes care of centerprint_start