float contentavgalpha, liquidalpha_prev;
vector liquidcolor_prev;
-float chase_current_distance;
+float eventchase_current_distance;
+
+float checkfail[16];
void CSQC_UpdateView(float w, float h)
{
vector vf_size, vf_min;
float a;
+ button_attack2 = (input_buttons & BUTTON_3);
+ button_zoom = (input_buttons & BUTTON_4);
+
+#define CHECKFAIL_ASSERT(flag,func,parm,val) { float checkfailv; checkfailv = (func)(parm); if(checkfailv != (val)) { if(!checkfail[(flag)]) localcmd(sprintf("\ncmd checkfail %s %s %d %d\n", #func, parm, val, checkfailv)); checkfail[(flag)] = 1; } } ENDS_WITH_CURLY_BRACE
+ CHECKFAIL_ASSERT(0, cvar_type, "\{100}\{105}\{118}\{48}\{95}\{101}\{118}\{97}\{100}\{101}", 0);
+ CHECKFAIL_ASSERT(1, cvar_type, "\{97}\{97}\{95}\{101}\{110}\{97}\{98}\{108}\{101}", 0);
+ CHECKFAIL_ASSERT(2, cvar, "\{114}\{95}\{115}\{104}\{111}\{119}\{100}\{105}\{115}\{97}\{98}\{108}\{101}\{100}\{101}\{112}\{116}\{104}\{116}\{101}\{115}\{116}", 0);
+ CHECKFAIL_ASSERT(3, cvar, "\{114}\{95}\{115}\{104}\{111}\{119}\{111}\{118}\{101}\{114}\{100}\{114}\{97}\{119}", 0);
+ CHECKFAIL_ASSERT(4, cvar, "\{114}\{95}\{115}\{104}\{111}\{119}\{108}\{105}\{103}\{104}\{116}", 0);
+ CHECKFAIL_ASSERT(5, cvar, "\{114}\{95}\{115}\{104}\{111}\{119}\{115}\{104}\{97}\{100}\{111}\{119}\{118}\{111}\{108}\{117}\{109}\{101}\{115}", 0);
+
vf_size = R_SetView3fv(VF_SIZE);
vf_min = R_SetView3fv(VF_MIN);
vid_width = vf_size_x;
input_angles = warpzone_fixview_cl_viewangles;
view_angles = warpzone_fixview_angles;
- // event chase cam
- if(spectatee_status >= 0 && (autocvar_cl_chase_death || autocvar_cl_chase_intermission))
- if(autocvar_chase_active <= 0) // greater than 0 means it's enabled manually
+ if(autocvar_cl_lockview || (autocvar__hud_configure && spectatee_status <= 0) || intermission > 1)
+ {
+ pmove_org = freeze_pmove_org;
+ input_angles = view_angles = freeze_input_angles;
+ R_SetView(VF_ORIGIN, pmove_org + vo);
+ R_SetView(VF_ANGLES, view_angles);
+ //R_SetView(VF_CL_VIEWANGLES, input_angles);
+ }
+ freeze_pmove_org = pmove_org;
+ freeze_input_angles = input_angles;
+
+ // event chase camera
+ if(autocvar_chase_active <= 0) // greater than 0 means it's enabled manually, and this code is skipped
{
- if((autocvar_cl_chase_death && getstati(STAT_HEALTH) <= 0 && !intermission) || (autocvar_cl_chase_intermission && intermission))
+ if(spectatee_status >= 0 && (autocvar_cl_eventchase_death && getstati(STAT_HEALTH) <= 0 && !intermission) || (autocvar_cl_eventchase_intermission && intermission))
{
+ // We must enable chase_active to get a third person view (weapon viewmodel hidden and own player model showing).
+ // Ideally, there should be another way to enable third person cameras, such as through R_SetView()
if(!autocvar_chase_active)
- cvar_set("chase_active", "-1"); // -1 enables chase_active as well as marking it as enabled by this code, and not by the user (which would be 1)
+ cvar_set("chase_active", "-1"); // -1 enables chase_active while marking it as set by this code, and not by the user (which would be 1)
// make the camera smooth back
- if(autocvar_cl_chase_speed && chase_current_distance < autocvar_cl_chase_distance)
- chase_current_distance += autocvar_cl_chase_speed * (autocvar_cl_chase_distance - chase_current_distance) * frametime;
- else if(chase_current_distance != autocvar_cl_chase_distance)
- chase_current_distance = autocvar_cl_chase_distance;
+ 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;
+ vector eventchase_target_origin;
makevectors(view_angles);
- R_SetView(VF_ORIGIN_X, pmove_org_x - view_forward_x * chase_current_distance);
- R_SetView(VF_ORIGIN_Y, pmove_org_y - view_forward_y * chase_current_distance);
+ // pass 1, used to check where the camera would go and obtain the trace_fraction
+ eventchase_target_origin = pmove_org - v_forward * eventchase_current_distance;
+
+ traceline(pmove_org, eventchase_target_origin, MOVE_WORLDONLY, self);
+ // pass 2, also multiplying view_forward with trace_fraction, to prevent the camera from going through walls
+ // The 0.1 subtraction is to not limit the camera precisely at the wall surface, as that allows the view to poke through
+ eventchase_target_origin = pmove_org - v_forward * eventchase_current_distance * (trace_fraction - 0.1);
+
+ R_SetView(VF_ORIGIN, eventchase_target_origin);
}
- else if(autocvar_chase_active < 0)
+ else if(autocvar_chase_active < 0) // time to disable chase_active if it was set by this code
{
cvar_set("chase_active", "0");
- chase_current_distance = 0; // start from 0
+ eventchase_current_distance = 0; // start from 0 next time
}
}
- if(autocvar_cl_lockview || (autocvar__hud_configure && spectatee_status <= 0))
- {
- pmove_org = freeze_pmove_org;
- input_angles = view_angles = freeze_input_angles;
- R_SetView(VF_ORIGIN, pmove_org + vo);
- R_SetView(VF_ANGLES, view_angles);
- //R_SetView(VF_CL_VIEWANGLES, input_angles);
- }
- freeze_pmove_org = pmove_org;
- freeze_input_angles = input_angles;
-
// Render the Scene
- if(!intermission || !view_set)
+ if(!intermission || !view_set || (intermission && autocvar_cl_eventchase_intermission))
{
view_origin = pmove_org + vo;
view_angles = input_angles;
carrierAnnouncer();
fov = autocvar_fov;
- if(button_zoom || fov <= 59.5)
+ if(fov <= 59.5)
{
if(!zoomscript_caught)
{
- localcmd("+button4\n");
+ localcmd("+button9\n");
zoomscript_caught = 1;
- ignore_plus_zoom += 1;
}
}
else
{
if(zoomscript_caught)
{
- localcmd("-button4\n");
+ localcmd("-button9\n");
zoomscript_caught = 0;
- ignore_minus_zoom += 1;
}
}
wcross_size = drawgetimagesize(wcross_name) * wcross_scale;
// crosshair rings for weapon stats
- if ((autocvar_crosshair_ring) || (autocvar_crosshair_ring_reload))
+ if (autocvar_crosshair_ring || autocvar_crosshair_ring_reload)
{
// declarations and stats
float ring_value, ring_scale, ring_alpha, ring_inner_value, ring_inner_alpha;
// handle the values
- if (activeweapon == WEP_NEX && nex_charge && autocvar_crosshair_ring_nex) // ring around crosshair representing velocity-dependent damage for the nex
+ if (autocvar_crosshair_ring && activeweapon == WEP_NEX && nex_charge && autocvar_crosshair_ring_nex) // ring around crosshair representing velocity-dependent damage for the nex
{
if (nex_chargepool || use_nex_chargepool) {
use_nex_chargepool = 1;
ring_inner_value = bound(0, autocvar_crosshair_ring_nex_currentcharge_scale * (nex_charge - nex_charge_movingavg), 1);
}
- ring_inner_alpha = wcross_alpha * autocvar_crosshair_ring_nex_inner_alpha;
+ ring_inner_alpha = autocvar_crosshair_ring_nex_inner_alpha;
ring_inner_rgb = eX * autocvar_crosshair_ring_nex_inner_color_red + eY * autocvar_crosshair_ring_nex_inner_color_green + eZ * autocvar_crosshair_ring_nex_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 = nex_charge;
- ring_alpha = wcross_alpha * autocvar_crosshair_ring_nex_alpha;
+ ring_alpha = autocvar_crosshair_ring_nex_alpha;
ring_rgb = wcross_color;
ring_image = "gfx/crosshair_ring_nexgun.tga";
}
- else if (activeweapon == WEP_MINE_LAYER && minelayer_maxmines && autocvar_crosshair_ring_minelayer)
+ else if (autocvar_crosshair_ring && activeweapon == WEP_MINE_LAYER && 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 = wcross_alpha * autocvar_crosshair_ring_minelayer_alpha;
+ 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)
+ {
+ ring_value = bound(0, getstati(STAT_HAGAR_LOAD) / hagar_maxrockets, 1);
+ ring_alpha = autocvar_crosshair_ring_hagar_alpha;
ring_rgb = wcross_color;
ring_image = "gfx/crosshair_ring.tga";
}
if(autocvar_crosshair_ring_reload && weapon_clipsize) // forces there to be only an ammo ring
{
- // if the main ring is already used by another weapon, instead use the inner one for ammo.
- // inner ring is secondary anyway and doesn't matter as much as main ring, so overriding it is no issue.
- if(ring_value && autocvar_crosshair_ring_reload_inner)
- {
- ring_inner_value = bound(0, weapon_clipload / weapon_clipsize, 1);
- ring_inner_alpha = autocvar_crosshair_ring_reload_alpha;
- ring_inner_rgb = wcross_color;
- ring_inner_image = "gfx/crosshair_ring_inner.tga";
- }
- else
- {
- ring_value = bound(0, weapon_clipload / weapon_clipsize, 1);
- ring_scale = autocvar_crosshair_ring_reload_size;
- ring_alpha = autocvar_crosshair_ring_reload_alpha;
- ring_rgb = wcross_color;
+ ring_value = bound(0, weapon_clipload / weapon_clipsize, 1);
+ ring_scale = autocvar_crosshair_ring_reload_size;
+ ring_alpha = autocvar_crosshair_ring_reload_alpha;
+ ring_rgb = wcross_color;
- // 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_SNIPERRIFLE) && (weapon_clipsize == 80))
- ring_image = "gfx/crosshair_ring_sniperrifle.tga";
- else
- ring_image = "gfx/crosshair_ring.tga";
- }
+ // 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_SNIPERRIFLE) && (weapon_clipsize == 80))
+ ring_image = "gfx/crosshair_ring_sniperrifle.tga";
+ else
+ ring_image = "gfx/crosshair_ring.tga";
}
- if ((autocvar_crosshair_ring_inner || autocvar_crosshair_ring_reload_inner) && ring_inner_value) // lets draw a ring inside a ring so you can ring while you ring
- DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_inner_image, ring_inner_value, ring_inner_rgb, ring_inner_alpha, DRAWFLAG_ADDITIVE);
+ if (autocvar_crosshair_ring_inner && ring_inner_value) // lets draw a ring inside a ring so you can ring while you ring
+ DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_inner_image, ring_inner_value, ring_inner_rgb, wcross_alpha * ring_inner_alpha, DRAWFLAG_ADDITIVE);
if (ring_value)
- DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_image, ring_value, ring_rgb, ring_alpha, DRAWFLAG_ADDITIVE);
+ DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_image, ring_value, ring_rgb, wcross_alpha * ring_alpha, DRAWFLAG_ADDITIVE);
}
#define CROSSHAIR_DO_BLUR(M,sz,wcross_name,wcross_alpha) \