X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fview.qc;h=0bde0788d303b6ec276559a8777cb6bd9be9d540;hb=3d19cbc8116b6bd8b5d46a042eb519a3ec77be8a;hp=57c48572a6b6dc73abd0e08da6d415bd07325bb4;hpb=ef0be2795f31d4fcaf74d17d6eab169435738bc3;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/view.qc b/qcsrc/client/view.qc index 57c48572a..0bde0788d 100644 --- a/qcsrc/client/view.qc +++ b/qcsrc/client/view.qc @@ -30,7 +30,9 @@ #include #include +#include #include +#include #include #include @@ -470,9 +472,14 @@ vector GetCurrentFov(float fov) for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) { entity wepent = viewmodels[slot]; - if(wepent.switchweapon == wepent.activeweapon) - if((wepent.activeweapon == WEP_VORTEX && !WEP_CVAR(vortex, secondary)) || (wepent.activeweapon == WEP_RIFLE && !WEP_CVAR(rifle, secondary))) // do NOT use switchweapon here - zoomdir += button_attack2; + if(wepent.switchweapon != wepent.activeweapon) + continue; + Weapon wep = wepent.activeweapon; + if(wep != WEP_Null && wep.wr_zoomdir) + { + bool do_zoom = wep.wr_zoomdir(wep); // TODO: merge this with wr_zoom? + zoomdir += do_zoom; + } } } if(spectatee_status > 0 || isdemo()) @@ -663,6 +670,7 @@ float TrueAimCheck(entity wepent) case WEP_MORTAR: // toss curve return SHOTTYPE_HITWORLD; case WEP_VORTEX: + case WEP_OVERKILL_NEX: case WEP_VAPORIZER: mv = MOVE_NORMAL; break; @@ -978,7 +986,7 @@ void HUD_Crosshair(entity this) float f, i, j; vector v; if(!scoreboard_active && !camera_active && intermission != 2 && !STAT(GAME_STOPPED) && - spectatee_status != -1 && !csqcplayer.viewloc && !MUTATOR_CALLHOOK(DrawCrosshair) && + spectatee_status != -1 && (!csqcplayer.viewloc || (!spectatee_status && (csqcplayer.viewloc.spawnflags & VIEWLOC_FREEAIM))) && !MUTATOR_CALLHOOK(DrawCrosshair) && !HUD_MinigameMenu_IsOpened() ) { if (!autocvar_crosshair_enabled) // main toggle for crosshair rendering @@ -996,6 +1004,8 @@ void HUD_Crosshair(entity this) string wcross_style; float wcross_alpha, wcross_resolution; wcross_style = autocvar_crosshair; + if (csqcplayer.viewloc && (csqcplayer.viewloc.spawnflags & VIEWLOC_FREEAIM) && autocvar_crosshair_2d != "") + wcross_style = autocvar_crosshair_2d; if (wcross_style == "0") return; wcross_resolution = autocvar_crosshair_size; @@ -1009,7 +1019,10 @@ void HUD_Crosshair(entity this) float shottype; // wcross_origin = '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight; - wcross_origin = project_3d_to_2d(view_origin + max_shot_distance * view_forward); + if(csqcplayer.viewloc && (csqcplayer.viewloc.spawnflags & VIEWLOC_FREEAIM)) + wcross_origin = viewloc_mousepos; + else + wcross_origin = project_3d_to_2d(view_origin + max_shot_distance * view_forward); wcross_origin.z = 0; if(autocvar_crosshair_hittest) { @@ -1180,30 +1193,29 @@ void HUD_Crosshair(entity this) ring_scale = autocvar_crosshair_ring_size; - float weapon_clipload, weapon_clipsize; - weapon_clipload = STAT(WEAPON_CLIPLOAD); - weapon_clipsize = STAT(WEAPON_CLIPSIZE); + entity wepent = viewmodels[0]; // TODO: unhardcode - float vortex_charge, vortex_chargepool; - vortex_charge = STAT(VORTEX_CHARGE); - vortex_chargepool = STAT(VORTEX_CHARGEPOOL); + int weapon_clipload = wepent.clip_load; + int weapon_clipsize = wepent.clip_size; - float arc_heat = STAT(ARC_HEAT); + float arc_heat = wepent.arc_heat_percent; + float vcharge = wepent.vortex_charge; + float vchargepool = wepent.vortex_chargepool_ammo; + float oknex_charge_ = wepent.oknex_charge; + float oknex_chargepool_ = wepent.oknex_chargepool_ammo; if(vortex_charge_movingavg == 0) // this should only happen if we have just loaded up the game - vortex_charge_movingavg = vortex_charge; - - entity wepent = viewmodels[0]; // TODO: unhardcode + vortex_charge_movingavg = vcharge; // handle the values - if (autocvar_crosshair_ring && wepent.activeweapon == WEP_VORTEX && vortex_charge && autocvar_crosshair_ring_vortex) // ring around crosshair representing velocity-dependent damage for the vortex + if (autocvar_crosshair_ring && wepent.activeweapon == WEP_VORTEX && vcharge && autocvar_crosshair_ring_vortex) // ring around crosshair representing velocity-dependent damage for the vortex { - if (vortex_chargepool || use_vortex_chargepool) { + if (vchargepool || use_vortex_chargepool) { use_vortex_chargepool = 1; - ring_inner_value = vortex_chargepool; + ring_inner_value = vchargepool; } else { - vortex_charge_movingavg = (1 - autocvar_crosshair_ring_vortex_currentcharge_movingavg_rate) * vortex_charge_movingavg + autocvar_crosshair_ring_vortex_currentcharge_movingavg_rate * vortex_charge; - ring_inner_value = bound(0, autocvar_crosshair_ring_vortex_currentcharge_scale * (vortex_charge - vortex_charge_movingavg), 1); + vortex_charge_movingavg = (1 - autocvar_crosshair_ring_vortex_currentcharge_movingavg_rate) * vortex_charge_movingavg + autocvar_crosshair_ring_vortex_currentcharge_movingavg_rate * vcharge; + ring_inner_value = bound(0, autocvar_crosshair_ring_vortex_currentcharge_scale * (vcharge - vortex_charge_movingavg), 1); } ring_inner_alpha = autocvar_crosshair_ring_vortex_inner_alpha; @@ -1211,21 +1223,41 @@ void HUD_Crosshair(entity this) ring_inner_image = "gfx/crosshair_ring_inner.tga"; // draw the outer ring to show the current charge of the weapon - ring_value = vortex_charge; + ring_value = vcharge; + ring_alpha = autocvar_crosshair_ring_vortex_alpha; + ring_rgb = wcross_color; + ring_image = "gfx/crosshair_ring_nexgun.tga"; + } + else if (autocvar_crosshair_ring && (wepent.activeweapon == WEP_OVERKILL_NEX) && oknex_charge && autocvar_crosshair_ring_vortex) + { + if (oknex_chargepool || use_vortex_chargepool) { + use_vortex_chargepool = 1; + ring_inner_value = oknex_chargepool; + } else { + vortex_charge_movingavg = (1 - autocvar_crosshair_ring_vortex_currentcharge_movingavg_rate) * vortex_charge_movingavg + autocvar_crosshair_ring_vortex_currentcharge_movingavg_rate * oknex_charge; + ring_inner_value = bound(0, autocvar_crosshair_ring_vortex_currentcharge_scale * (oknex_charge - vortex_charge_movingavg), 1); + } + + ring_inner_alpha = autocvar_crosshair_ring_vortex_inner_alpha; + ring_inner_rgb = eX * autocvar_crosshair_ring_vortex_inner_color_red + eY * autocvar_crosshair_ring_vortex_inner_color_green + eZ * autocvar_crosshair_ring_vortex_inner_color_blue; + ring_inner_image = "gfx/crosshair_ring_inner.tga"; + + // draw the outer ring to show the current charge of the weapon + ring_value = oknex_charge; ring_alpha = autocvar_crosshair_ring_vortex_alpha; ring_rgb = wcross_color; ring_image = "gfx/crosshair_ring_nexgun.tga"; } else if (autocvar_crosshair_ring && wepent.activeweapon == WEP_MINE_LAYER && WEP_CVAR(minelayer, limit) && autocvar_crosshair_ring_minelayer) { - ring_value = bound(0, STAT(LAYED_MINES) / WEP_CVAR(minelayer, limit), 1); // if you later need to use the count of bullets in another place, then add a float for it. For now, no need to. + ring_value = bound(0, wepent.minelayer_mines / WEP_CVAR(minelayer, limit), 1); // if you later need to use the count of bullets in another place, then add a float for it. For now, no need to. ring_alpha = autocvar_crosshair_ring_minelayer_alpha; ring_rgb = wcross_color; ring_image = "gfx/crosshair_ring.tga"; } - else if (wepent.activeweapon == WEP_HAGAR && STAT(HAGAR_LOAD) && autocvar_crosshair_ring_hagar) + else if (wepent.activeweapon == WEP_HAGAR && wepent.hagar_load && autocvar_crosshair_ring_hagar) { - ring_value = bound(0, STAT(HAGAR_LOAD) / WEP_CVAR_SEC(hagar, load_max), 1); + ring_value = bound(0, wepent.hagar_load / WEP_CVAR_SEC(hagar, load_max), 1); ring_alpha = autocvar_crosshair_ring_hagar_alpha; ring_rgb = wcross_color; ring_image = "gfx/crosshair_ring.tga"; @@ -1481,12 +1513,15 @@ void HUD_Draw(entity this) void ViewLocation_Mouse() { + if(spectatee_status) + return; // don't draw it as spectator! + viewloc_mousepos += getmousepos() * autocvar_menu_mouse_speed; viewloc_mousepos.x = bound(0, viewloc_mousepos.x, vid_conwidth); viewloc_mousepos.y = bound(0, viewloc_mousepos.y, vid_conheight); - float cursor_alpha = 1 - autocvar__menu_alpha; - draw_cursor(viewloc_mousepos, '0.5 0.5 0', "/cursor_move", '1 1 1', cursor_alpha); + //float cursor_alpha = 1 - autocvar__menu_alpha; + //draw_cursor(viewloc_mousepos, '0.5 0.5 0', "/cursor_move", '1 1 1', cursor_alpha); } bool ov_enabled; @@ -2073,7 +2108,7 @@ void CSQC_UpdateView(entity this, float w, float h) // 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 || is_dead || hud != HUD_NORMAL) + if(spectatee_status || is_dead || hud != HUD_NORMAL || local_player.viewloc) { // no zoom reticle while dead reticle_type = 0;