X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2FView.qc;h=d2268ed58a32bb6e4d329f432ba28c84a52c33c7;hb=669ea85f389d64cf59d47c24f9b447843a4e9d57;hp=0184c96765e9c00cad6e5dd1acdfa4a8de5a080c;hpb=190dff07ac02321207f8c32919a91fea442369d6;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/View.qc b/qcsrc/client/View.qc index 0184c9676..9953af664 100644 --- a/qcsrc/client/View.qc +++ b/qcsrc/client/View.qc @@ -79,11 +79,11 @@ void Porto_Draw() p = p - view_up * 16; if(idx-1 >= portal1_idx) { - Draw_CylindricLine(p, q, 4, "", 1, 0, '0 0 1', 0.5, DRAWFLAG_NORMAL); + Draw_CylindricLine(p, q, 4, "", 1, 0, '0 0 1', 0.5, DRAWFLAG_NORMAL, view_origin); } else { - Draw_CylindricLine(p, q, 4, "", 1, 0, '1 0 0', 0.5, DRAWFLAG_NORMAL); + Draw_CylindricLine(p, q, 4, "", 1, 0, '1 0 0', 0.5, DRAWFLAG_NORMAL, view_origin); } --idx; } @@ -102,7 +102,7 @@ void CheckForGamestartChange() { if (previous_game_starttime != startTime) { if ((time + 5.0) < startTime) { //if connecting to server while restart was active don't always play prepareforbattle - sound(self, CHAN_VOICE, strcat("announcer/", cvar_string("cl_announcer"), "/prepareforbattle.wav"), VOL_BASEVOICE, ATTN_NONE); + sound(world, CHAN_AUTO, strcat("announcer/", cvar_string("cl_announcer"), "/prepareforbattle.wav"), VOL_BASEVOICE, ATTN_NONE); } if (time < startTime) { restartAnnouncer = spawn(); @@ -137,7 +137,7 @@ vector GetCurrentFov(float fov) zoomspeed = 3.5; zoomdir = button_zoom; - if(getstati(STAT_ACTIVEWEAPON) == WEP_NEX) // do NOT use switchweapon here + if((getstati(STAT_ACTIVEWEAPON) == WEP_NEX && nex_scope) || (getstati(STAT_ACTIVEWEAPON) == WEP_CAMPINGRIFLE && campingrifle_scope)) // do NOT use switchweapon here zoomdir += button_attack2; if(spectatee_status > 0 || isdemo()) { @@ -291,6 +291,10 @@ float TrueAimCheck() mi = '-16 -16 -16'; ma = '16 16 16'; break; + case WEP_SEEKER: // projectile has a size! + mi = '-2 -2 -2'; + ma = '2 2 2'; + break; case WEP_ELECTRO: // projectile has a size! mi = '0 0 -3'; ma = '0 0 -3'; @@ -332,18 +336,18 @@ float TrueAimCheck() void CSQC_common_hud(void); -void CSQC_kh_hud(void); -void CSQC_ctf_hud(void); void PostInit(void); void CSQC_Demo_Camera(); float HUD_WouldDrawScoreboard (); float view_set; float camera_mode; +float reticle_type; string NextFrameCommand; 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) { @@ -351,6 +355,14 @@ void CSQC_UpdateView(float w, float h) float fov; float f, i, j; vector v, vo; + vector vf_size, vf_min; + + vf_size = R_SetView3fv(VF_SIZE); + vf_min = R_SetView3fv(VF_MIN); + vid_width = vf_size_x; + vid_height = vf_size_y; + + vector reticle_pos, reticle_size; WaypointSprite_Load(); @@ -363,17 +375,19 @@ void CSQC_UpdateView(float w, float h) vo = '0 0 1' * getstati(STAT_VIEWHEIGHT); warpzone_fixview_origin = pmove_org + vo; - warpzone_fixview_angles = input_angles; + warpzone_fixview_cl_viewangles = input_angles; + warpzone_fixview_angles = view_angles; WarpZone_FixView(); pmove_org = warpzone_fixview_origin - vo; - input_angles = warpzone_fixview_angles; + input_angles = warpzone_fixview_cl_viewangles; + view_angles = warpzone_fixview_angles; - if(cvar("cl_lockview")) + if(cvar("cl_lockview") || autocvar__hud_configure) { - pmove_org = warpzone_fixview_origin = freeze_pmove_org; - input_angles = freeze_input_angles; + pmove_org = freeze_pmove_org; + input_angles = view_angles = freeze_input_angles; R_SetView(VF_ORIGIN, pmove_org + vo); - R_SetView(VF_ANGLES, input_angles); + R_SetView(VF_ANGLES, view_angles); //R_SetView(VF_CL_VIEWANGLES, input_angles); } freeze_pmove_org = pmove_org; @@ -391,13 +405,6 @@ void CSQC_UpdateView(float w, float h) view_set = 1; } - hudconf_active = cvar("_hud_configure"); - if(hudconf_active) - R_SetView(VF_ANGLES, self.angles); // TODO: this should freeze the view as it is, not change it to '0 0 0' or whatever it currently does... - - vid_width = w; - vid_height = h; - #ifdef BLURTEST if(time > blurtest_time0 && time < blurtest_time1) { @@ -432,7 +439,7 @@ void CSQC_UpdateView(float w, float h) if(intermission && !isdemo() && !(calledhooks & HOOK_END)) if(calledhooks & HOOK_START) { - localcmd("\ncl_hook_gameend;"); + localcmd("\ncl_hook_gameend\n"); calledhooks |= HOOK_END; } @@ -461,9 +468,6 @@ void CSQC_UpdateView(float w, float h) } } - hud_alpha_fg = cvar_or("hud_alpha_fg", 1) * (1 - cvar("_menu_alpha")); - hud_currentammo = cvar("hud_showcurrentammo"); - hud_hudselector = cvar("hud_hudselector"); hud_accuracy_hud = cvar_or("hud_accuracy_hud", 1); ColorTranslateMode = cvar("cl_stripcolorcodes"); activeweapon = getstati(STAT_SWITCHWEAPON); @@ -477,11 +481,21 @@ void CSQC_UpdateView(float w, float h) if(last_weapon != activeweapon) { weapontime = time; last_weapon = activeweapon; + + e = get_weaponinfo(activeweapon); + if(e.netname != "") + localcmd(strcat("\ncl_hook_activeweapon ", e.netname), "\n"); + else + localcmd("\ncl_hook_activeweapon none\n"); } // ALWAYS Clear Current Scene First R_ClearScene(); + // FIXME engine bug? VF_SIZE and VF_MIN are not restored to sensible values by this + R_SetView(VF_SIZE, vf_size); + R_SetView(VF_MIN, vf_min); + // Assign Standard Viewflags // Draw the World (and sky) R_SetView(VF_DRAWWORLD, 1); @@ -552,6 +566,98 @@ 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(button_zoom || zoomscript_caught) + reticle_type = 1; // normal zoom + else if(activeweapon == WEP_NEX && button_attack2 || activeweapon == WEP_CAMPINGRIFLE && button_attack2) + reticle_type = 2; // nex zoom + + if(cvar("cl_reticle_stretch")) + { + reticle_size_x = vid_conwidth; + reticle_size_y = vid_conheight; + reticle_pos_x = 0; + reticle_pos_y = 0; + } + else + { + reticle_size_x = max(vid_conwidth, vid_conheight); + reticle_size_y = max(vid_conwidth, vid_conheight); + reticle_pos_x = (vid_conwidth - reticle_size_x) / 2; + reticle_pos_y = (vid_conheight - reticle_size_y) / 2; + } + + f = current_zoomfraction; + if(zoomscript_caught) + f = 1; + if(cvar("cl_reticle_item_normal")) + { + precache_pic("gfx/reticle_normal"); + if(reticle_type == 1 && f) + drawpic(reticle_pos, "gfx/reticle_normal", reticle_size, '1 1 1', f * cvar("cl_reticle_item_normal"), DRAWFLAG_NORMAL); + } + if(cvar("cl_reticle_item_nex")) + { + precache_pic("gfx/reticle_nex"); + if(reticle_type == 2 && f) + drawpic(reticle_pos, "gfx/reticle_nex", reticle_size, '1 1 1', f * cvar("cl_reticle_item_nex"), DRAWFLAG_NORMAL); + } + // Draw the mouse cursor // NOTE: drawpic must happen after R_RenderScene for some reason //drawpic(getmousepos(), "gfx/cursor.tga", '11 14 0', '1 1 1', 1, 0); @@ -575,11 +681,6 @@ void CSQC_UpdateView(float w, float h) self.draw2d(); self = e; - // draw hud - if(cvar("r_letterbox") == 0) { - HUD_DrawCenterPrint(); // draw centerprint messages even if viewsize >= 120 - } - float hud; hud = getstati(STAT_HUD); if(hud == HUD_SPIDERBOT) @@ -596,8 +697,27 @@ void CSQC_UpdateView(float w, float h) if(cvar("viewsize") < 120) CSQC_common_hud(); + + precache_pic("gfx/nex_ring.tga"); + // ring around crosshair representing velocity-dependent damage for the nex + if (activeweapon == WEP_NEX) + { + float f, a, curvel; + vector rgb; + + rgb_x = cvar("crosshair_nexvelocity_color_red"); + rgb_y = cvar("crosshair_nexvelocity_color_green"); + rgb_z = cvar("crosshair_nexvelocity_color_blue"); + a = cvar("crosshair_nexvelocity_alpha"); + + curvel = vlen('1 0 0' * pmove_vel_x + '0 1 0' * pmove_vel_y); + f = bound(0, (curvel - nex_minvelocity) / (nex_maxvelocity - nex_minvelocity), 1); + + DrawCircleClippedPic('0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight, 0.1 * vid_conheight, "gfx/nex_ring.tga", f, rgb, a, DRAWFLAG_ADDITIVE); + } + // crosshair goes VERY LAST - if(!scoreboard_active && !ons_showmap && !camera_active && !hudconf_active) { + if(!scoreboard_active && !camera_active && intermission != 2) { // TrueAim check float shottype; float bullets, ring_scale; @@ -727,13 +847,13 @@ void CSQC_UpdateView(float w, float h) if (activeweapon == WEP_CAMPINGRIFLE) { ring_scale = cvar("crosshair_campingrifle_ring_size"); - bullets = bound(0, getstati(STAT_BULLETS_LOADED), 8); + bullets = bound(0, getstati(STAT_BULLETS_LOADED), 4); } else bullets = 0; #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/hud/rifle_ring_", ftos(bullets)), sz * wcross_size * ring_scale, wcross_color, wcross_alpha, DRAWFLAG_NORMAL) + 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) #define CROSSHAIR_DO_BLUR(M,sz,wcross_name,wcross_alpha) \ do \ @@ -774,7 +894,12 @@ void CSQC_UpdateView(float w, float h) { 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; } } @@ -833,8 +958,13 @@ void CSQC_UpdateView(float w, float h) cvar_set("vid_conheight", h0); } - if(hudconf_active) + if(autocvar__hud_configure) HUD_Panel_Mouse(); + + // 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 @@ -948,7 +1078,7 @@ void CSQC_SPIDER_HUD() } */ - if (sb_showscores) + if (scoreboard_showscores) { HUD_DrawScoreboard(); HUD_DrawCenterPrint(); @@ -962,9 +1092,6 @@ void CSQC_SPIDER_HUD() #define raptor_g2 "gfx/vehicles/raptor_bombs.tga" #define raptor_s "gfx/vehicles/shiled.tga" -#define spider_a1 "gfx/hud/sb_rocket.tga" -#define spider_a2 "gfx/sb_bullets.tga" - void CSQC_RAPTOR_HUD() { float rockets, reload, heat, hp, shield, energy; @@ -1018,7 +1145,7 @@ void CSQC_RAPTOR_HUD() drawpic(hudloc, raptor_g2, picsize, '1 1 1' * reload + '1 0 0' * (1 - reload), 1, DRAWFLAG_NORMAL); - if (sb_showscores) + if (scoreboard_showscores) { HUD_DrawScoreboard(); HUD_DrawCenterPrint(); @@ -1128,7 +1255,7 @@ const float STAT_VEHICLESTAT_RELOAD2 = 66; - if (sb_showscores) + if (scoreboard_showscores) { HUD_DrawScoreboard(); HUD_DrawCenterPrint(); @@ -1147,34 +1274,41 @@ void CSQC_common_hud(void) switch(hud) { case HUD_NORMAL: - // hud first - HUD_Main(); + // do some accuracy var caching + float i; + if(!(gametype == GAME_RACE || gametype == GAME_CTS)) + { + acc_levels = tokenize(cvar_string("hud_panel_weapons_accuracy_color_levels")); + if (acc_levels > MAX_ACCURACY_LEVELS) + acc_levels = MAX_ACCURACY_LEVELS; - // is this needed? - //HUD_UpdatePlayerTeams(); + for (i = 0; i < acc_levels; ++i) + acc_lev[i] = stof(argv(i)); + } - if (intermission == 2) // map voting screen - { - if(sb_showaccuracy && spectatee_status != -1) { - HUD_DrawAccuracyStats(); - } - else if(sb_showscores) { - HUD_DrawScoreboard(); - } - else - HUD_FinaleOverlay(); + 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 + { HUD_Reset(); + // HUD_DrawScoreboard takes care of centerprint_start } - else if (sb_showscores || sb_showaccuracy || sb_showscores_force || getstati(STAT_HEALTH) <= 0 || intermission == 1) + else if (intermission == 2) // map voting screen { - if(sb_showaccuracy && spectatee_status != -1) - HUD_DrawAccuracyStats(); - else - HUD_DrawScoreboard(); - + HUD_FinaleOverlay(); HUD_Reset(); + + centerprint_start_x = 0; + centerprint_start_y = cvar("scr_centerpos") * vid_conheight; } + else // hud + { + centerprint_start_x = 0; + centerprint_start_y = cvar("scr_centerpos") * vid_conheight; + } + + HUD_DrawCenterPrint(); break; case HUD_SPIDERBOT: