X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fview.qc;h=972dcae424e6462cef7232af234d6dbacd31b7e9;hb=3c72b4c0734806d9ac24c7ed5f8cb1d95bff48ba;hp=be4b8f4a9674071b287b0e535b0b157b3a609120;hpb=1c458eaae6b3923322f9b4e9e439d6f24cde672a;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/view.qc b/qcsrc/client/view.qc index be4b8f4a9..972dcae42 100644 --- a/qcsrc/client/view.qc +++ b/qcsrc/client/view.qc @@ -133,8 +133,8 @@ void calc_followmodel_ofs(entity view) vel = view.velocity; else { - vector forward = '0 0 0', right = '0 0 0', up = '0 0 0'; - MAKEVECTORS(makevectors, view_angles, forward, right, up); + vector forward, right, up; + MAKE_VECTORS(view_angles, forward, right, up); vel.x = view.velocity * forward; vel.y = view.velocity * right * -1; vel.z = view.velocity * up; @@ -159,8 +159,8 @@ void calc_followmodel_ofs(entity view) if (autocvar_cl_followmodel_velocity_absolute) { vector fixed_gunorg; - vector forward = '0 0 0', right = '0 0 0', up = '0 0 0'; - MAKEVECTORS(makevectors, view_angles, forward, right, up); + vector forward, right, up; + MAKE_VECTORS(view_angles, forward, right, up); fixed_gunorg.x = gunorg * forward; fixed_gunorg.y = gunorg * right * -1; fixed_gunorg.z = gunorg * up; @@ -291,6 +291,7 @@ void viewmodel_draw(entity this) return; int mask = (intermission || (STAT(HEALTH) <= 0) || autocvar_chase_active) ? 0 : MASK_NORMAL; float a = ((autocvar_cl_viewmodel_alpha) ? bound(-1, autocvar_cl_viewmodel_alpha, this.m_alpha) : this.m_alpha); + int wepskin = this.m_skin; bool invehicle = player_localentnum > maxclients; if (invehicle) a = -1; Weapon wep = this.activeweapon; @@ -304,6 +305,7 @@ void viewmodel_draw(entity this) { e.drawmask = mask; e.alpha = a; + e.skin = wepskin; e.colormap = 256 + c; // colormap == 0 is black, c == 0 is white e.glowmod = g; e.csqcmodel_effects = fx; @@ -392,86 +394,6 @@ STATIC_INIT(fpscounter_init) showfps_prevfps_time = currentTime; // we must initialize it to avoid an instant low frame sending } -STATIC_INIT(Porto) -{ - entity e = new_pure(porto); - e.draw = Porto_Draw; - IL_PUSH(g_drawables, e); - e.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP; -} - -const int polyline_length = 16; -.vector polyline[polyline_length]; -void Porto_Draw(entity this) -{ - for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) - { - entity wepent = viewmodels[slot]; - - if (wepent.activeweapon != WEP_PORTO) continue; - if (spectatee_status) continue; - if (WEP_CVAR(porto, secondary)) continue; - if (intermission == 1) continue; - if (intermission == 2) continue; - if (STAT(HEALTH) <= 0) continue; - - vector pos = view_origin; - vector dir = view_forward; - makevectors(((autocvar_chase_active) ? warpzone_save_view_angles : view_angles)); - pos += v_right * -wepent.movedir.y - + v_up * wepent.movedir.z; - - if (wepent.angles_held_status) - { - makevectors(wepent.angles_held); - dir = v_forward; - } - - wepent.polyline[0] = pos; - - int portal_number = 0, portal1_idx = 1, portal_max = 2; - int n = 1 + 2; // 2 lines == 3 points - for (int idx = 0; idx < n && idx < polyline_length - 1; ) - { - traceline(pos, pos + 65536 * dir, true, this); - dir = reflect(dir, trace_plane_normal); - pos = trace_endpos; - wepent.polyline[++idx] = pos; - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK || trace_dphitcontents & DPCONTENTS_PLAYERCLIP) - { - n += 1; - continue; - } - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - n = max(2, idx); - break; - } - // check size - { - vector ang = vectoangles2(trace_plane_normal, dir); - ang.x = -ang.x; - makevectors(ang); - if (!CheckWireframeBox(this, pos - 48 * v_right - 48 * v_up + 16 * v_forward, 96 * v_right, 96 * v_up, 96 * v_forward)) - { - n = max(2, idx); - break; - } - } - portal_number += 1; - if (portal_number >= portal_max) break; - if (portal_number == 1) portal1_idx = idx; - } - for (int idx = 0; idx < n - 1; ++idx) - { - vector p = wepent.polyline[idx], q = wepent.polyline[idx + 1]; - if (idx == 0) p -= view_up * 16; // line from player - vector rgb = (idx < portal1_idx) ? '1 0 0' : '0 0 1'; - Draw_CylindricLine(p, q, 4, "", 1, 0, rgb, 0.5, DRAWFLAG_NORMAL, view_origin); - } - } -} - float drawtime; float avgspeed; vector GetCurrentFov(float fov) @@ -571,15 +493,16 @@ vector GetCurrentFov(float fov) curspeed = 0; else { - makevectors(view_angles); + vector forward, right, up; + MAKE_VECTORS(view_angles, forward, right, up); v = pmove_vel; if(csqcplayer) v = csqcplayer.velocity; switch(autocvar_cl_velocityzoom_type) { - case 3: curspeed = max(0, v_forward * v); break; - case 2: curspeed = (v_forward * v); break; + case 3: curspeed = max(0, forward * v); break; + case 2: curspeed = (forward * v); break; case 1: default: curspeed = vlen(v); break; } } @@ -679,6 +602,9 @@ float EnemyHitCheck() float TrueAimCheck(entity wepent) { + if(wepent.activeweapon.spawnflags & WEP_FLAG_NOTRUEAIM) + return SHOTTYPE_HITWORLD; + float nudge = 1; // added to traceline target and subtracted from result TOOD(divVerent): do we still need this? Doesn't the engine do this now for us? vector vecs, trueaimpoint, w_shotorg; vector mi, ma, dv; @@ -692,12 +618,6 @@ float TrueAimCheck(entity wepent) switch(wepent.activeweapon) // WEAPONTODO { - case WEP_TUBA: // no aim - case WEP_PORTO: // shoots from eye - case WEP_NEXBALL: // shoots from eye - case WEP_HOOK: // no trueaim - case WEP_MORTAR: // toss curve - return SHOTTYPE_HITWORLD; case WEP_VORTEX: case WEP_OVERKILL_NEX: case WEP_VAPORIZER: @@ -795,7 +715,7 @@ vector liquidcolor_prev; float eventchase_current_distance; float eventchase_running; -int WantEventchase(entity this) +int WantEventchase(entity this, bool want_vehiclechase) { if(autocvar_cl_orthoview) return 0; @@ -805,7 +725,7 @@ int WantEventchase(entity this) return 1; if(spectatee_status >= 0) { - if(hud != HUD_NORMAL && (autocvar_cl_eventchase_vehicle || spectatee_status > 0)) + if(want_vehiclechase) return 1; if(MUTATOR_CALLHOOK(WantEventchase, this)) return 1; @@ -1055,6 +975,21 @@ void HUD_Crosshair(entity this) // wcross_origin = '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight; if(csqcplayer.viewloc && (csqcplayer.viewloc.spawnflags & VIEWLOC_FREEAIM)) wcross_origin = viewloc_mousepos; + else if(autocvar_chase_active > 0 && autocvar_crosshair_chase) + { + vector player_org = ((csqcplayer) ? csqcplayer.origin + csqcplayer.view_ofs : view_origin); + if(csqcplayer && crosshair_chase_playeralpha && crosshair_chase_playeralpha < 1) + { + traceline(view_origin, view_origin + max_shot_distance * view_forward, MOVE_NORMAL, NULL); + float myalpha = (!csqcplayer.m_alpha) ? 1 : csqcplayer.m_alpha; + if(trace_ent == csqcplayer && STAT(HEALTH) > 0) + csqcplayer.alpha = min(crosshair_chase_playeralpha, myalpha); + else + csqcplayer.alpha = csqcplayer.m_alpha; + } + traceline(player_org, player_org + max_shot_distance * view_forward, MOVE_WORLDONLY, NULL); + wcross_origin = project_3d_to_2d(trace_endpos); + } else wcross_origin = project_3d_to_2d(view_origin + max_shot_distance * view_forward); wcross_origin.z = 0; @@ -1160,8 +1095,10 @@ void HUD_Crosshair(entity this) wcross_color.z += sin(hitindication_crosshair_size) * hitindication_color.z; } - if(shottype == SHOTTYPE_HITENEMY) - wcross_scale *= autocvar_crosshair_hittest; // is not queried if hittest is 0 + // no effects needed for targeting enemies, this can't possibly span all valid targets! + // just show for teammates to give a sign that they're an invalid target + //if(shottype == SHOTTYPE_HITENEMY) + //wcross_scale *= autocvar_crosshair_hittest; // is not queried if hittest is 0 if(shottype == SHOTTYPE_HITTEAM) wcross_scale /= autocvar_crosshair_hittest; // is not queried if hittest is 0 @@ -1187,7 +1124,7 @@ void HUD_Crosshair(entity this) wcross_alpha_goal_prev = wcross_alpha; wcross_color_goal_prev = wcross_color; - if(spectatee_status == -1 && shottype == SHOTTYPE_HITTEAM || (shottype == SHOTTYPE_HITOBSTRUCTION && autocvar_crosshair_hittest_blur && !autocvar_chase_active)) + if(spectatee_status == 0 && (shottype == SHOTTYPE_HITTEAM || (shottype == SHOTTYPE_HITOBSTRUCTION && autocvar_crosshair_hittest_blur && !autocvar_chase_active))) { wcross_blur = 1; wcross_alpha *= 0.75; @@ -1645,6 +1582,10 @@ void CSQC_UpdateView(entity this, float w, float h) lasthud = hud; + ReplicateVars(false); + if (ReplicateVars_NOT_SENDING()) + ReplicateVars_DELAY(0.8 + random() * 0.4); // no need to check cvars every frame + HUD_Scale_Disable(); if(autocvar__hud_showbinds_reload) // menu can set this one @@ -1734,7 +1675,7 @@ void CSQC_UpdateView(entity this, float w, float h) else if(autocvar_chase_active == -2) cvar_set("chase_active", "0"); - float vehicle_chase = (hud != HUD_NORMAL && (autocvar_cl_eventchase_vehicle || spectatee_status > 0)); + bool vehicle_chase = (hud != HUD_NORMAL && (autocvar_cl_eventchase_vehicle || spectatee_status > 0)); float vehicle_viewdist = 0; vector vehicle_viewofs = '0 0 0'; @@ -1746,10 +1687,14 @@ void CSQC_UpdateView(entity this, float w, float h) Vehicle info = Vehicles_from(hud); vehicle_viewdist = info.height; vehicle_viewofs = info.view_ofs; + if(vehicle_viewdist < 0) // when set below 0, this vehicle doesn't use third person view (gunner slots) + vehicle_chase = false; } + else + vehicle_chase = false; } - int eventchase = WantEventchase(this); + int eventchase = WantEventchase(this, vehicle_chase); if (eventchase) { vector current_view_origin_override = '0 0 0'; @@ -1810,18 +1755,19 @@ void CSQC_UpdateView(entity this, float w, float h) else if(eventchase_current_distance != chase_distance) eventchase_current_distance = chase_distance; - makevectors(view_angles); + vector forward, right, up; + MAKE_VECTORS(view_angles, forward, right, up); - vector eventchase_target_origin = (current_view_origin - (v_forward * eventchase_current_distance)); + vector eventchase_target_origin = (current_view_origin - (forward * eventchase_current_distance)); WarpZone_TraceBox(current_view_origin, autocvar_cl_eventchase_mins, autocvar_cl_eventchase_maxs, eventchase_target_origin, MOVE_WORLDONLY, this); // If the boxtrace fails, revert back to line tracing. if(!local_player.viewloc) if(trace_startsolid) { - eventchase_target_origin = (current_view_origin - (v_forward * eventchase_current_distance)); + eventchase_target_origin = (current_view_origin - (forward * eventchase_current_distance)); WarpZone_TraceLine(current_view_origin, eventchase_target_origin, MOVE_WORLDONLY, this); - setproperty(VF_ORIGIN, (trace_endpos - (v_forward * autocvar_cl_eventchase_mins.z))); + setproperty(VF_ORIGIN, (trace_endpos - (forward * autocvar_cl_eventchase_mins.z))); } else { setproperty(VF_ORIGIN, trace_endpos); } @@ -1948,7 +1894,7 @@ void CSQC_UpdateView(entity this, float w, float h) // Render the Scene view_origin = getpropertyvec(VF_ORIGIN); view_angles = getpropertyvec(VF_ANGLES); - MAKEVECTORS(makevectors, view_angles, view_forward, view_right, view_up); + MAKE_VECTORS(view_angles, view_forward, view_right, view_up); #ifdef BLURTEST if(time > blurtest_time0 && time < blurtest_time1) @@ -2188,7 +2134,7 @@ void CSQC_UpdateView(entity this, float w, float h) R_EndPolygon(); } - if(autocvar_cl_reticle) + if(autocvar_cl_reticle && !MUTATOR_CALLHOOK(DrawReticle)) { string reticle_image = string_null; bool wep_zoomed = false; @@ -2499,14 +2445,15 @@ void CSQC_UpdateView(entity this, float w, float h) setproperty(VF_ORIGIN, '0 0 0'); setproperty(VF_ANGLES, '0 0 0'); setproperty(VF_PERSPECTIVE, 1); - makevectors('0 0 0'); + vector forward, right, up; + MAKE_VECTORS('0 0 0', forward, right, up); vector v1, v2; cvar_set("vid_conwidth", "800"); cvar_set("vid_conheight", "600"); - v1 = cs_project(v_forward); + v1 = cs_project(forward); cvar_set("vid_conwidth", "640"); cvar_set("vid_conheight", "480"); - v2 = cs_project(v_forward); + v2 = cs_project(forward); if(v1 == v2) cs_project_is_b0rked = 1; else