X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fclient%2FView.qc;h=2059527cdbe55425ecd09bc09db83af3522cc2e8;hp=1056fd59ae435b9fbffb334ef20f57fb6590aa42;hb=02bf8667ee9686ba129b305a263fcd704bb1d8c1;hpb=b0259aa7cd71ac09094e96c4986318ae476f3180 diff --git a/qcsrc/client/View.qc b/qcsrc/client/View.qc index 1056fd59ae..2059527cdb 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; } @@ -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()) { @@ -341,6 +341,7 @@ 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(); @@ -354,6 +355,8 @@ void CSQC_UpdateView(float w, float h) float f, i, j; vector v, vo; + vector reticle_pos, reticle_size; + WaypointSprite_Load(); if(spectatee_status) @@ -372,7 +375,7 @@ void CSQC_UpdateView(float w, float h) input_angles = warpzone_fixview_cl_viewangles; view_angles = warpzone_fixview_angles; - if(cvar("cl_lockview") || hud_configure) + if(cvar("cl_lockview") || autocvar__hud_configure) { pmove_org = freeze_pmove_org; input_angles = view_angles = freeze_input_angles; @@ -432,7 +435,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; } @@ -474,6 +477,12 @@ 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 @@ -549,6 +558,48 @@ void CSQC_UpdateView(float w, float h) // next R_RenderScene call drawstring('0 0 0', "", '1 1 0', '1 1 1', 0, 0); + // 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); @@ -572,11 +623,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) @@ -594,7 +640,7 @@ void CSQC_UpdateView(float w, float h) CSQC_common_hud(); // crosshair goes VERY LAST - if(!scoreboard_active && !camera_active) { + if(!scoreboard_active && !camera_active && intermission != 2) { // TrueAim check float shottype; float bullets, ring_scale; @@ -724,13 +770,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/", cvar_string("hud_skin"), "/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 \ @@ -830,7 +876,7 @@ void CSQC_UpdateView(float w, float h) cvar_set("vid_conheight", h0); } - if(hud_configure) + if(autocvar__hud_configure) HUD_Panel_Mouse(); // be safe against triggerbots until everyone has the fixed engine // this call is meant to overwrite the trace globals by something @@ -1141,23 +1187,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; - // scoreboard/accuracy - if (intermission == 2 && !scoreboard_showaccuracy && !scoreboard_showscores) // map voting screen + for (i = 0; i < acc_levels; ++i) + acc_lev[i] = stof(argv(i)); + } + + 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 (intermission == 2) // map voting screen { HUD_FinaleOverlay(); HUD_Reset(); - } - else if(scoreboard_showaccuracy && spectatee_status != -1) - HUD_DrawAccuracyStats(); - else - HUD_DrawScoreboard(); - if (scoreboard_showscores || scoreboard_showaccuracy || scoreboard_showscores_force || getstati(STAT_HEALTH) <= 0 || intermission == 1) - 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: