X-Git-Url: https://de.git.xonotic.org/?p=voretournament%2Fvoretournament.git;a=blobdiff_plain;f=data%2Fqcsrc%2Fclient%2FView.qc;h=6ae6d038c7a7b80db19593a418452c6ea1aa2417;hp=9a1b97ab6d89b078e5ccbb9006f1801010c34759;hb=e774793d5c0144e68d43e363d36c11d91c97774b;hpb=580d180600e2d66f4032c27b825a5e5f2ec19e72 diff --git a/data/qcsrc/client/View.qc b/data/qcsrc/client/View.qc index 9a1b97ab..6ae6d038 100644 --- a/data/qcsrc/client/View.qc +++ b/data/qcsrc/client/View.qc @@ -256,9 +256,11 @@ float artwork_fade; float pickup_crosshair_time, pickup_crosshair_size; float myhealth, myhealth_prev, myhealth_flash; float contentavgalpha, liquidalpha_prev; +float old_blurradius, old_bluralpha, old_sharpen_intensity; float stomachsplash_alpha, stomachsplash_remove_at_respawn; float volume_modify_1, volume_modify_2, volume_modify_default_1, volume_modify_default_2; float volume_modify_changed_1, volume_modify_changed_2; +float eventchase_current_distance; vector myhealth_gentlergb; vector liquidcolor_prev; vector damage_blurpostprocess, content_blurpostprocess; @@ -274,6 +276,7 @@ void CSQC_UpdateView(float w, float h) float a; vector reticle_pos, reticle_size; + vector splash_pos, splash_size; vector artwork_pos, artwork_size; WaypointSprite_Load(); @@ -292,6 +295,41 @@ void CSQC_UpdateView(float w, float h) pmove_org = warpzone_fixview_origin - vo; input_angles = warpzone_fixview_angles; + // event chase camera + if(cvar("chase_active") <= 0) // greater than 0 means it's enabled manually, and this code is skipped + { + if(!getstati(STAT_VORE_EATEN) && spectatee_status >= 0 && (cvar("cl_eventchase_death") && getstati(STAT_HEALTH) <= 0 && !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(!cvar("chase_active")) + 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(cvar("cl_eventchase_speed") && eventchase_current_distance < cvar("cl_eventchase_distance")) + eventchase_current_distance += cvar("cl_eventchase_speed") * (cvar("cl_eventchase_distance") - eventchase_current_distance) * frametime; // slow down the further we get + else if(eventchase_current_distance != cvar("cl_eventchase_distance")) + eventchase_current_distance = cvar("cl_eventchase_distance"); + + vector eventchase_target_origin; + makevectors(view_angles); + // 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(cvar("chase_active") < 0) // time to disable chase_active if it was set by this code + { + cvar_set("chase_active", "0"); + eventchase_current_distance = 0; // start from 0 next time + } + } + // Render the Scene if(!intermission || !view_set) { @@ -473,35 +511,36 @@ void CSQC_UpdateView(float w, float h) else if(button_zoom || zoomscript_caught) reticle_type = 1; // normal zoom - if(cvar("cl_reticle_stretch")) + if (reticle_type) { - 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; - } + 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_weapon")) - { - precache_pic("gfx/reticle_weapon"); - if(reticle_type == 2 && f) - drawpic(reticle_pos, "gfx/reticle_weapon", reticle_size, '1 1 1', f * cvar("cl_reticle_item_weapon"), DRAWFLAG_NORMAL); + f = current_zoomfraction; + if(zoomscript_caught) + f = 1; + if(cvar("cl_reticle_item_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_weapon")) + { + if(reticle_type == 2 && f) + drawpic(reticle_pos, "gfx/reticle_weapon", reticle_size, '1 1 1', f * cvar("cl_reticle_item_weapon"), DRAWFLAG_NORMAL); + } } // screen effects @@ -563,7 +602,7 @@ void CSQC_UpdateView(float w, float h) if(cvar("hud_postprocessing")) { - if(cvar("hud_contents_liquid_blur")) + if(cvar("hud_contents_liquid_blur") && contentavgalpha) { // when inside the stomach, we use different blur settings than when we're inside other fluids content_blurpostprocess_x = 1; @@ -589,6 +628,11 @@ void CSQC_UpdateView(float w, float h) if(cvar("hud_damage")) { + splash_size_x = max(vid_conwidth, vid_conheight); + splash_size_y = max(vid_conwidth, vid_conheight); + splash_pos_x = (vid_conwidth - splash_size_x) / 2; + splash_pos_y = (vid_conheight - splash_size_y) / 2; + float myhealth_flash_temp; myhealth = getstati(STAT_HEALTH); @@ -645,11 +689,11 @@ void CSQC_UpdateView(float w, float h) drawfill('0 0 0', '1 0 0' * vid_conwidth + '0 1 0' * vid_conheight, myhealth_gentlergb, cvar("hud_damage_gentle_alpha_multiplier") * bound(0, myhealth_flash_temp, 1) * cvar("hud_damage"), DRAWFLAG_NORMAL); } else - drawpic('0 0 0', "gfx/blood", '1 0 0' * vid_conwidth + '0 1 0' * vid_conheight, stov(cvar_string("hud_damage_color")), bound(0, myhealth_flash_temp, 1) * cvar("hud_damage"), DRAWFLAG_NORMAL); + drawpic(splash_pos, "gfx/blood", splash_size, stov(cvar_string("hud_damage_color")), bound(0, myhealth_flash_temp, 1) * cvar("hud_damage"), DRAWFLAG_NORMAL); if(cvar("hud_postprocessing")) { - if(cvar("hud_damage_blur")) + if(cvar("hud_damage_blur") && myhealth_flash_temp) { damage_blurpostprocess_x = 1; damage_blurpostprocess_y = bound(0, myhealth_flash_temp, 1) * cvar("hud_damage_blur"); @@ -689,54 +733,70 @@ void CSQC_UpdateView(float w, float h) stomachsplash_alpha = 0; stomachsplash_alpha = bound(0, stomachsplash_alpha, 1); - drawpic('0 0 0', "gfx/food", '1 0 0' * vid_conwidth + '0 1 0' * vid_conheight, stov(cvar_string("hud_stomach_color")), stomachsplash_alpha, DRAWFLAG_NORMAL); + drawpic(splash_pos, "gfx/food", splash_size, stov(cvar_string("hud_stomach_color")), stomachsplash_alpha, DRAWFLAG_NORMAL); } if(cvar("hud_postprocessing")) { + // all of this should be done in the engine eventually + + // enable or disable rendering types if they are used or not + if(cvar("r_glsl_postprocess_uservec1_enable") != (cvar("hud_postprocessing_maxbluralpha") != 0)) + cvar_set("r_glsl_postprocess_uservec1_enable", ftos(cvar("hud_postprocessing_maxbluralpha") != 0)); + if(cvar("r_glsl_postprocess_uservec2_enable") != (cvar("hud_powerup") != 0)) + cvar_set("r_glsl_postprocess_uservec2_enable", ftos(cvar("hud_powerup") != 0)); + // lets apply the postprocess effects from the previous two functions if needed if(damage_blurpostprocess_x || content_blurpostprocess_x) { float blurradius = bound(0, damage_blurpostprocess_y + content_blurpostprocess_y, cvar("hud_postprocessing_maxblurradius")); float bluralpha = bound(0, damage_blurpostprocess_z + content_blurpostprocess_z, cvar("hud_postprocessing_maxbluralpha")); - cvar_set("r_glsl_postprocess_uservec1", strcat(ftos(blurradius), " ", ftos(bluralpha), " 0 0")); - cvar_set("r_glsl_postprocess_uservec1_enable", "1"); + if(blurradius != old_blurradius || bluralpha != old_bluralpha) // reduce cvar_set spam as much as possible + { + cvar_set("r_glsl_postprocess_uservec1", strcat(ftos(blurradius), " ", ftos(bluralpha), " 0 0")); + old_blurradius = blurradius; + old_bluralpha = bluralpha; + } } - else + else if(cvar_string("r_glsl_postprocess_uservec1") != "0 0 0 0") // reduce cvar_set spam as much as possible { cvar_set("r_glsl_postprocess_uservec1", "0 0 0 0"); - cvar_set("r_glsl_postprocess_uservec1_enable", "0"); + old_blurradius = 0; + old_bluralpha = 0; } - if(cvar("hud_powerup")) + float sharpen_intensity; + if (getstatf(STAT_STRENGTH_FINISHED) - time > 0) + sharpen_intensity += (getstatf(STAT_STRENGTH_FINISHED) - time); + if (getstatf(STAT_INVINCIBLE_FINISHED) - time > 0) + sharpen_intensity += (getstatf(STAT_INVINCIBLE_FINISHED) - time); + + if(cvar("hud_powerup") && sharpen_intensity > 0) { - float sharpen_intensity; - if (getstatf(STAT_STRENGTH_FINISHED) - time > 0) - sharpen_intensity += (getstatf(STAT_STRENGTH_FINISHED) - time); - if (getstatf(STAT_INVINCIBLE_FINISHED) - time > 0) - sharpen_intensity += (getstatf(STAT_INVINCIBLE_FINISHED) - time); sharpen_intensity = bound(0, sharpen_intensity, 5); // powerup warning time is 5 seconds, so fade the effect from there - if(sharpen_intensity > 0) + if(sharpen_intensity != old_sharpen_intensity) // reduce cvar_set spam as much as possible { cvar_set("r_glsl_postprocess_uservec2", strcat("0 ", ftos(-sharpen_intensity * cvar("hud_powerup")), " 0 0")); - cvar_set("r_glsl_postprocess_uservec2_enable", "1"); - } - else - { - cvar_set("r_glsl_postprocess_uservec2", "0 0 0 0"); - cvar_set("r_glsl_postprocess_uservec2_enable", "0"); + old_sharpen_intensity = sharpen_intensity; } } + else if(cvar_string("r_glsl_postprocess_uservec2") != "0 0 0 0") // reduce cvar_set spam as much as possible + { + cvar_set("r_glsl_postprocess_uservec2", "0 0 0 0"); + old_sharpen_intensity = 0; + } } - if not(cvar("hud_damage") && cvar("hud_postprocessing")) + if(cvar("hud_postprocessing") && !cvar("hud_postprocessing_maxbluralpha")) + if(cvar("r_glsl_postprocess_uservec1_enable")) { // don't allow blur to get stuck on if we disable the cvar while damaged cvar_set("r_glsl_postprocess_uservec1", "0 0 0 0"); cvar_set("r_glsl_postprocess_uservec1_enable", "0"); } - if not(cvar("hud_powerup") && cvar("hud_postprocessing")) + if(cvar("hud_postprocessing") && !cvar("hud_powerup")) + if(cvar("r_glsl_postprocess_uservec2_enable")) { // don't allow sharpen to get stuck on if we disable the cvar while powered up cvar_set("r_glsl_postprocess_uservec2", "0 0 0 0"); @@ -984,6 +1044,8 @@ void CSQC_UpdateView(float w, float h) wcross_style = "_canswallow_team.tga"; else if(swallow_indicator > 0) wcross_style = "_canswallow.tga"; + else if(swallow_indicator < 0) + wcross_style = "_canswallow_no.tga"; else wcross_style = cvar_string("crosshair"); @@ -992,12 +1054,56 @@ void CSQC_UpdateView(float w, float h) string wcross_name; float wcross_alpha, wcross_scale, wcross_blur, wcross_resolution; - if(swallow_indicator) + if(swallow_indicator && (cvar("crosshair_swallowindicator_color_red") || cvar("crosshair_swallowindicator_color_green") || cvar("crosshair_swallowindicator_color_blue"))) { wcross_color_x = cvar("crosshair_swallowindicator_color_red"); wcross_color_y = cvar("crosshair_swallowindicator_color_green"); wcross_color_z = cvar("crosshair_swallowindicator_color_blue"); } + else if(cvar("crosshair_color_by_health")) + { + local float x = getstati(STAT_HEALTH); + + //x = red + //y = green + //z = blue + + wcross_color_z = 0; + + if(x > 200) + { + wcross_color_x = 0; + wcross_color_y = 1; + } + else if(x > 150) + { + wcross_color_x = 0.4 - (x-150)*0.02 * 0.4; + wcross_color_y = 0.9 + (x-150)*0.02 * 0.1; + } + else if(x > 100) + { + wcross_color_x = 1 - (x-100)*0.02 * 0.6; + wcross_color_y = 1 - (x-100)*0.02 * 0.1; + wcross_color_z = 1 - (x-100)*0.02; + } + else if(x > 50) + { + wcross_color_x = 1; + wcross_color_y = 1; + wcross_color_z = 0.2 + (x-50)*0.02 * 0.8; + } + else if(x > 20) + { + wcross_color_x = 1; + wcross_color_y = (x-20)*90/27/100; + wcross_color_z = (x-20)*90/27/100 * 0.2; + } + else + { + wcross_color_x = 1; + wcross_color_y = 0; + } + } else { wcross_color_x = cvar("crosshair_color_red"); @@ -1007,6 +1113,15 @@ void CSQC_UpdateView(float w, float h) wcross_alpha = cvar("crosshair_color_alpha"); wcross_resolution = cvar("crosshair_size"); + if(!activeweapon) + if(!swallow_indicator) + { + if(cvar("crosshair_unarmed_dim_color")) + wcross_color *= cvar("crosshair_unarmed_dim_color"); + if(cvar("crosshair_unarmed_dim_alpha")) + wcross_alpha *= cvar("crosshair_unarmed_dim_alpha"); + } + wcross_name = strcat("gfx/crosshair", wcross_style); if(cvar("crosshair_effect_scalefade")) @@ -1127,7 +1242,7 @@ void CSQC_UpdateView(float w, float h) CROSSHAIR_DRAW(wcross_resolution, wcross_name, wcross_alpha * f); wcross_name_alpha_goal_prev = f; - // ring around crosshair representing bullets left in weapon clip + // ring around crosshair representing ammo left in weapon clip weapon_clipload = getstati(STAT_WEAPON_CLIPLOAD); a = cvar("crosshair_ring_alpha"); if (weapon_clipload && a)