X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fclient%2Fview.qc;h=67bcf422493bb5ceb44b956a934cf7b50b074ccc;hp=4947e9d5c6648a165a5493a58c6bbef48f1a4e2c;hb=ae2c1407ec9a05e4f501a6604a7cce8e1030df9f;hpb=37903827937b44f174275a75d2dab5301b8ab53e diff --git a/qcsrc/client/view.qc b/qcsrc/client/view.qc index 4947e9d5c6..67bcf42249 100644 --- a/qcsrc/client/view.qc +++ b/qcsrc/client/view.qc @@ -1,25 +1,30 @@ -#if defined(CSQC) - #include "../dpdefs/csprogsdefs.qh" - #include "defs.qh" - #include "../common/constants.qh" - #include "../common/stats.qh" - #include "../warpzonelib/mathlib.qh" - #include "../warpzonelib/common.qh" - #include "../warpzonelib/client.qh" - #include "../common/teams.qh" - #include "../common/util.qh" - #include "../common/nades.qh" - #include "../common/weapons/weapons.qh" - #include "../common/mapinfo.qh" - #include "autocvars.qh" - #include "hud.qh" - #include "scoreboard.qh" - #include "noise.qh" - #include "main.qh" - #include "../csqcmodellib/cl_player.qh" -#elif defined(MENUQC) -#elif defined(SVQC) -#endif +#include "_all.qh" + +#include "announcer.qh" +#include "hook.qh" +#include "hud.qh" +#include "hud_config.qh" +#include "mapvoting.qh" +#include "noise.qh" +#include "scoreboard.qh" +#include "shownames.qh" +#include "waypointsprites.qh" + +#include "../common/constants.qh" +#include "../common/mapinfo.qh" +#include "../common/nades.qh" +#include "../common/stats.qh" +#include "../common/triggers/target/music.qh" +#include "../common/teams.qh" +#include "../common/util.qh" + +#include "../common/weapons/all.qh" + +#include "../csqcmodellib/cl_player.qh" + +#include "../warpzonelib/client.qh" +#include "../warpzonelib/common.qh" +#include "../warpzonelib/mathlib.qh" entity porto; vector polyline[16]; @@ -28,7 +33,7 @@ void Porto_Draw() vector p, dir, ang, q, nextdir; float portal_number, portal1_idx; - if(activeweapon != WEP_PORTO || spectatee_status || gametype == MAPINFO_TYPE_NEXBALL) + if(activeweapon != WEP_PORTO.m_id || spectatee_status || gametype == MAPINFO_TYPE_NEXBALL) return; if(g_balance_porto_secondary) return; @@ -118,7 +123,7 @@ vector GetCurrentFov(float fov) zoomsensitivity = autocvar_cl_zoomsensitivity; zoomfactor = autocvar_cl_zoomfactor; - if(zoomfactor < 1 || zoomfactor > 16) + if(zoomfactor < 1 || zoomfactor > 30) zoomfactor = 2.5; zoomspeed = autocvar_cl_zoomspeed; if(zoomspeed >= 0) @@ -127,7 +132,7 @@ vector GetCurrentFov(float fov) zoomdir = button_zoom; if(hud == HUD_NORMAL) - if((activeweapon == WEP_VORTEX && vortex_scope) || (activeweapon == WEP_RIFLE && rifle_scope)) // do NOT use switchweapon here + if((activeweapon == WEP_VORTEX.m_id && vortex_scope) || (activeweapon == WEP_RIFLE.m_id && rifle_scope)) // do NOT use switchweapon here zoomdir += button_attack2; if(spectatee_status > 0 || isdemo()) { @@ -149,7 +154,7 @@ vector GetCurrentFov(float fov) } else if(autocvar_cl_spawnzoom && zoomin_effect) { - float spawnzoomfactor = bound(1, autocvar_cl_spawnzoom_factor, 16); + float spawnzoomfactor = bound(1, autocvar_cl_spawnzoom_factor, 30); current_viewzoom += (autocvar_cl_spawnzoom_speed * (spawnzoomfactor - current_viewzoom) * drawframetime); current_viewzoom = bound(1 / spawnzoomfactor, current_viewzoom, 1); @@ -222,6 +227,15 @@ vector GetCurrentFov(float fov) return '1 0 0' * fovx + '0 1 0' * fovy; } +vector GetViewLocationFOV(float fov) +{ + float frustumy = tan(fov * M_PI / 360.0) * 0.75; + float frustumx = frustumy * vid_width / vid_height / vid_pixelheight; + float fovx = atan2(frustumx, 1) / M_PI * 360.0; + float fovy = atan2(frustumy, 1) / M_PI * 360.0; + return '1 0 0' * fovx + '0 1 0' * fovy; +} + vector GetOrthoviewFOV(vector ov_worldmin, vector ov_worldmax, vector ov_mid, vector ov_org) { float fovx, fovy; @@ -305,16 +319,16 @@ float TrueAimCheck() switch(activeweapon) // WEAPONTODO { - case WEP_TUBA: // no aim - case WEP_PORTO: // shoots from eye - case WEP_HOOK: // no trueaim - case WEP_MORTAR: // toss curve + case WEP_TUBA.m_id: // no aim + case WEP_PORTO.m_id: // shoots from eye + case WEP_HOOK.m_id: // no trueaim + case WEP_MORTAR.m_id: // toss curve return SHOTTYPE_HITWORLD; - case WEP_VORTEX: - case WEP_VAPORIZER: + case WEP_VORTEX.m_id: + case WEP_VAPORIZER.m_id: mv = MOVE_NORMAL; break; - case WEP_RIFLE: + case WEP_RIFLE.m_id: ta = trueaim_rifle; mv = MOVE_NORMAL; if(zoomscript_caught) @@ -323,19 +337,19 @@ float TrueAimCheck() return EnemyHitCheck(); } break; - case WEP_DEVASTATOR: // projectile has a size! + case WEP_DEVASTATOR.m_id: // projectile has a size! mi = '-3 -3 -3'; ma = '3 3 3'; break; - case WEP_FIREBALL: // projectile has a size! + case WEP_FIREBALL.m_id: // projectile has a size! mi = '-16 -16 -16'; ma = '16 16 16'; break; - case WEP_SEEKER: // projectile has a size! + case WEP_SEEKER.m_id: // projectile has a size! mi = '-2 -2 -2'; ma = '2 2 2'; break; - case WEP_ELECTRO: // projectile has a size! + case WEP_ELECTRO.m_id: // projectile has a size! mi = '0 0 -3'; ma = '0 0 -3'; break; @@ -412,15 +426,19 @@ vector liquidcolor_prev; float eventchase_current_distance; float eventchase_running; -float WantEventchase() +bool WantEventchase() { if(autocvar_cl_orthoview) return false; if(intermission) return true; + if(self.viewloc) + return true; if(spectatee_status >= 0) { - if(autocvar_cl_eventchase_nexball && gametype == MAPINFO_TYPE_NEXBALL && !(WepSet_GetFromStat() & WepSet_FromWeapon(WEP_PORTO))) + if(hud != HUD_NORMAL && (autocvar_cl_eventchase_vehicle || spectatee_status > 0)) + return true; + if(autocvar_cl_eventchase_nexball && gametype == MAPINFO_TYPE_NEXBALL && !(WepSet_GetFromStat() & WepSet_FromWeapon(WEP_PORTO.m_id))) return true; if(autocvar_cl_eventchase_death && (getstati(STAT_HEALTH) <= 0)) { @@ -471,7 +489,7 @@ void UpdateHitsound() static float hitsound_time_prev = 0; // HACK: the only way to get the arc to sound consistent with pitch shift is to ignore cl_hitsound_antispam_time - float arc_hack = activeweapon == WEP_ARC && autocvar_cl_hitsound >= 2; + float arc_hack = activeweapon == WEP_ARC.m_id && autocvar_cl_hitsound >= 2; if (arc_hack || COMPARE_INCREASING(time, hitsound_time_prev) > autocvar_cl_hitsound_antispam_time) { if (autocvar_cl_hitsound && unaccounted_damage) @@ -524,7 +542,7 @@ void UpdateCrosshair() if(getstati(STAT_FROZEN)) drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, ((getstatf(STAT_REVIVE_PROGRESS)) ? ('0.25 0.90 1' + ('1 0 0' * getstatf(STAT_REVIVE_PROGRESS)) + ('0 1 1' * getstatf(STAT_REVIVE_PROGRESS) * -1)) : '0.25 0.90 1'), autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE); else if (getstatf(STAT_HEALING_ORB)>time) - drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, Nade_Color(NADE_TYPE_HEAL), autocvar_hud_colorflash_alpha*getstatf(STAT_HEALING_ORB_ALPHA), DRAWFLAG_ADDITIVE); + drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, NADE_TYPE_HEAL.m_color, autocvar_hud_colorflash_alpha*getstatf(STAT_HEALING_ORB_ALPHA), DRAWFLAG_ADDITIVE); if(!intermission) if(getstatf(STAT_NADE_TIMER) && autocvar_cl_nade_timer) // give nade top priority, as it's a matter of life and death { @@ -542,7 +560,7 @@ void UpdateCrosshair() CSQC_common_hud(); // crosshair goes VERY LAST - if(!scoreboard_active && !camera_active && intermission != 2 && spectatee_status != -1 && hud == HUD_NORMAL) + if(!scoreboard_active && !camera_active && intermission != 2 && spectatee_status != -1 && hud == HUD_NORMAL && !csqcplayer.viewloc) { if (!autocvar_crosshair_enabled) // main toggle for crosshair rendering return; @@ -761,7 +779,7 @@ void UpdateCrosshair() wcross_alpha_goal_prev = wcross_alpha; wcross_color_goal_prev = wcross_color; - if(shottype == SHOTTYPE_HITTEAM || (shottype == SHOTTYPE_HITOBSTRUCTION && autocvar_crosshair_hittest_blur && !autocvar_chase_active)) + if(spectatee_status == -1 && shottype == SHOTTYPE_HITTEAM || (shottype == SHOTTYPE_HITOBSTRUCTION && autocvar_crosshair_hittest_blur && !autocvar_chase_active)) { wcross_blur = 1; wcross_alpha *= 0.75; @@ -818,7 +836,7 @@ void UpdateCrosshair() // handle the values - if (autocvar_crosshair_ring && activeweapon == WEP_VORTEX && vortex_charge && autocvar_crosshair_ring_vortex) // ring around crosshair representing velocity-dependent damage for the vortex + if (autocvar_crosshair_ring && activeweapon == WEP_VORTEX.m_id && vortex_charge && autocvar_crosshair_ring_vortex) // ring around crosshair representing velocity-dependent damage for the vortex { if (vortex_chargepool || use_vortex_chargepool) { use_vortex_chargepool = 1; @@ -838,14 +856,14 @@ void UpdateCrosshair() ring_rgb = wcross_color; ring_image = "gfx/crosshair_ring_nexgun.tga"; } - else if (autocvar_crosshair_ring && activeweapon == WEP_MINE_LAYER && minelayer_maxmines && autocvar_crosshair_ring_minelayer) + else if (autocvar_crosshair_ring && activeweapon == WEP_MINE_LAYER.m_id && minelayer_maxmines && autocvar_crosshair_ring_minelayer) { ring_value = bound(0, getstati(STAT_LAYED_MINES) / minelayer_maxmines, 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 (activeweapon == WEP_HAGAR && getstati(STAT_HAGAR_LOAD) && autocvar_crosshair_ring_hagar) + else if (activeweapon == WEP_HAGAR.m_id && getstati(STAT_HAGAR_LOAD) && autocvar_crosshair_ring_hagar) { ring_value = bound(0, getstati(STAT_HAGAR_LOAD) / hagar_maxrockets, 1); ring_alpha = autocvar_crosshair_ring_hagar_alpha; @@ -868,12 +886,12 @@ void UpdateCrosshair() // Note: This is to stop Taoki from complaining that the image doesn't match all potential balances. // if a new image for another weapon is added, add the code (and its respective file/value) here - if ((activeweapon == WEP_RIFLE) && (weapon_clipsize == 80)) + if ((activeweapon == WEP_RIFLE.m_id) && (weapon_clipsize == 80)) ring_image = "gfx/crosshair_ring_rifle.tga"; else ring_image = "gfx/crosshair_ring.tga"; } - else if ( autocvar_crosshair_ring && autocvar_crosshair_ring_arc && arc_heat && activeweapon == WEP_ARC ) + else if ( autocvar_crosshair_ring && autocvar_crosshair_ring_arc && arc_heat && activeweapon == WEP_ARC.m_id ) { ring_value = arc_heat; ring_alpha = (1-arc_heat)*autocvar_crosshair_ring_arc_cold_alpha + @@ -988,6 +1006,8 @@ const int BUTTON_3 = 4; const int BUTTON_4 = 8; float cl_notice_run(); float prev_myteam; +int lasthud; +float vh_notice_time; void CSQC_UpdateView(float w, float h) { entity e; @@ -1003,6 +1023,11 @@ void CSQC_UpdateView(float w, float h) hud = getstati(STAT_HUD); + if(hud != HUD_NORMAL && lasthud == HUD_NORMAL) + vh_notice_time = time + autocvar_cl_vehicles_notify_time; + + lasthud = hud; + if(autocvar__hud_showbinds_reload) // menu can set this one { db_close(binddb); @@ -1046,7 +1071,11 @@ void CSQC_UpdateView(float w, float h) CSQCPlayer_SetCamera(); - myteam = GetPlayerColor(player_localentnum - 1); + if(player_localentnum <= maxclients) // is it a client? + current_player = player_localentnum - 1; + else // then player_localentnum is the vehicle I'm driving + current_player = player_localnum; + myteam = GetPlayerColor(current_player); if(myteam != prev_myteam) { @@ -1079,6 +1108,7 @@ void CSQC_UpdateView(float w, float h) // event chase camera if(autocvar_chase_active <= 0) // greater than 0 means it's enabled manually, and this code is skipped { + float vehicle_chase = (hud != HUD_NORMAL && (autocvar_cl_eventchase_vehicle || spectatee_status > 0)); if(WantEventchase()) { eventchase_running = true; @@ -1087,10 +1117,13 @@ void CSQC_UpdateView(float w, float h) vector current_view_origin = (csqcplayer ? csqcplayer.origin : pmove_org); // detect maximum viewoffset and use it - if(autocvar_cl_eventchase_viewoffset) + vector view_offset = autocvar_cl_eventchase_viewoffset; + if(vehicle_chase && autocvar_cl_eventchase_vehicle_viewoffset) { view_offset = autocvar_cl_eventchase_vehicle_viewoffset; } + + if(view_offset) { - WarpZone_TraceLine(current_view_origin, current_view_origin + autocvar_cl_eventchase_viewoffset + ('0 0 1' * autocvar_cl_eventchase_maxs.z), MOVE_WORLDONLY, self); - if(trace_fraction == 1) { current_view_origin += autocvar_cl_eventchase_viewoffset; } + WarpZone_TraceLine(current_view_origin, current_view_origin + view_offset + ('0 0 1' * autocvar_cl_eventchase_maxs.z), MOVE_WORLDONLY, self); + if(trace_fraction == 1) { current_view_origin += view_offset; } else { current_view_origin.z += max(0, (trace_endpos.z - current_view_origin.z) - autocvar_cl_eventchase_maxs.z); } } @@ -1100,10 +1133,13 @@ void CSQC_UpdateView(float w, float h) if(!autocvar_chase_active) { cvar_set("chase_active", "-1"); } // make the camera smooth back - if(autocvar_cl_eventchase_speed && eventchase_current_distance < autocvar_cl_eventchase_distance) - eventchase_current_distance += autocvar_cl_eventchase_speed * (autocvar_cl_eventchase_distance - eventchase_current_distance) * frametime; // slow down the further we get - else if(eventchase_current_distance != autocvar_cl_eventchase_distance) - eventchase_current_distance = autocvar_cl_eventchase_distance; + float chase_distance = autocvar_cl_eventchase_distance; + if(vehicle_chase && autocvar_cl_eventchase_vehicle_distance) { chase_distance = autocvar_cl_eventchase_vehicle_distance; } + + if(autocvar_cl_eventchase_speed && eventchase_current_distance < chase_distance) + eventchase_current_distance += autocvar_cl_eventchase_speed * (chase_distance - eventchase_current_distance) * frametime; // slow down the further we get + else if(eventchase_current_distance != chase_distance) + eventchase_current_distance = chase_distance; makevectors(view_angles); @@ -1111,6 +1147,7 @@ void CSQC_UpdateView(float w, float h) WarpZone_TraceBox(current_view_origin, autocvar_cl_eventchase_mins, autocvar_cl_eventchase_maxs, eventchase_target_origin, MOVE_WORLDONLY, self); // If the boxtrace fails, revert back to line tracing. + if(!self.viewloc) if(trace_startsolid) { eventchase_target_origin = (current_view_origin - (v_forward * eventchase_current_distance)); @@ -1119,7 +1156,8 @@ void CSQC_UpdateView(float w, float h) } else { setproperty(VF_ORIGIN, trace_endpos); } - setproperty(VF_ANGLES, WarpZone_TransformVAngles(WarpZone_trace_transform, view_angles)); + if(!self.viewloc) + setproperty(VF_ANGLES, WarpZone_TransformVAngles(WarpZone_trace_transform, view_angles)); } else if(autocvar_chase_active < 0) // time to disable chase_active if it was set by this code { @@ -1341,6 +1379,7 @@ void CSQC_UpdateView(float w, float h) vid_pixelheight = autocvar_vid_pixelheight; if(autocvar_cl_orthoview) { setproperty(VF_FOV, GetOrthoviewFOV(ov_worldmin, ov_worldmax, ov_mid, ov_org)); } + else if(csqcplayer.viewloc) { setproperty(VF_FOV, GetViewLocationFOV(110)); } // enforce 110 fov, so things dont look odd else { setproperty(VF_FOV, GetCurrentFov(fov)); } // Camera for demo playback @@ -1795,13 +1834,9 @@ void CSQC_common_hud(void) HUD_Main(); // always run these functions for alpha checks HUD_DrawScoreboard(); - if (scoreboard_active) // scoreboard/accuracy + // scoreboard/accuracy, map/gametype voting screen + if (scoreboard_active || intermission == 2) HUD_Reset(); - else if (intermission == 2) // map voting screen - { - MapVote_Draw(); - HUD_Reset(); - } }