X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fclient%2FView.qc;h=7cf5ee6e5766999c552f8b75c334ad1705a495fe;hp=00c395893c596f4d142d0db66d70f4a4241faebf;hb=a60cee16752e5abd387f6b7cd7d826b4f0321d05;hpb=6ac92d930bc3ba23d4deeccaebe1cdd359d770d2 diff --git a/qcsrc/client/View.qc b/qcsrc/client/View.qc index 00c395893..7cf5ee6e5 100644 --- a/qcsrc/client/View.qc +++ b/qcsrc/client/View.qc @@ -349,6 +349,14 @@ void CSQC_RAPTOR_HUD(); vector freeze_pmove_org, freeze_input_angles; entity nightvision_noise, nightvision_noise2; +float pickup_crosshair_time, pickup_crosshair_size; +float use_nex_charge_pool; + +float myhealth, myhealth_prev; +float myhealth_flash; + +vector myhealth_gentlergb; + void CSQC_UpdateView(float w, float h) { entity e; @@ -356,6 +364,7 @@ void CSQC_UpdateView(float w, float h) float f, i, j; vector v, vo; vector vf_size, vf_min; + float a; vf_size = R_SetView3fv(VF_SIZE); vf_min = R_SetView3fv(VF_MIN); @@ -563,11 +572,11 @@ void CSQC_UpdateView(float w, float h) // next R_RenderScene call drawstring('0 0 0', "", '1 1 0', '1 1 1', 0, 0); - if(cvar("r_fakelight") >= 2 || cvar("r_fullbright")) + if(cvar("r_fakelight") >= 2 || cvar("r_fullbright") >= 1) + if not(serverflags & SERVERFLAG_ALLOW_FULLBRIGHT) { // apply night vision effect vector rgb, tc_00, tc_01, tc_10, tc_11; - float a; if(!nightvision_noise) { @@ -657,6 +666,69 @@ void CSQC_UpdateView(float w, float h) drawpic(reticle_pos, "gfx/reticle_nex", reticle_size, '1 1 1', f * cvar("cl_reticle_item_nex"), DRAWFLAG_NORMAL); } + // improved polyblend + vector rgb; + if(cvar("hud_damage")) + { + float myhealth_flash_temp; + myhealth = getstati(STAT_HEALTH); + + // fade out + myhealth_flash = max(0, myhealth_flash - cvar("hud_damage_fade_rate") * frametime); + // add new damage + myhealth_flash = bound(0, myhealth_flash + max(0, myhealth_prev - myhealth) * cvar("hud_damage_factor"), cvar("hud_damage_maxalpha")); + + float pain_threshold, pain_threshold_lower, pain_threshold_lower_health; + pain_threshold = cvar("hud_damage_pain_threshold"); + pain_threshold_lower = cvar("hud_damage_pain_threshold_lower"); + pain_threshold_lower_health = cvar("hud_damage_pain_threshold_lower_health"); + + if(pain_threshold_lower && myhealth < pain_threshold_lower_health) + { + pain_threshold = pain_threshold - max(cvar("hud_damage_pain_threshold_pulsating_min"), fabs(sin(M_PI * time / cvar("hud_damage_pain_threshold_pulsating_period")))) * pain_threshold_lower * (1 - max(0, myhealth)/pain_threshold_lower_health); + } + + myhealth_flash_temp = bound(0, myhealth_flash - pain_threshold, 1); + + if(myhealth_prev < 1) + { + if(myhealth >= 1) + { + myhealth_flash = 0; // just spawned, clear the flash immediately + myhealth_flash_temp = 0; + } + else + { + myhealth_flash += cvar("hud_damage_fade_rate") * frametime; // dead + } + } + + if(spectatee_status == -1 || intermission) + { + myhealth_flash = 0; // observing, or match ended + myhealth_flash_temp = 0; + } + + myhealth_prev = myhealth; + + if(autocvar_cl_gentle_damage || cvar("cl_gentle")) + { + if(autocvar_cl_gentle_damage == 2) + { + if(myhealth_flash < pain_threshold) // only randomize when the flash is gone + { + myhealth_gentlergb = eX * random() + eY * random() + eZ * random(); + } + } + else + myhealth_gentlergb = stov(cvar_string("hud_damage_gentle_color")); + + drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, myhealth_gentlergb, cvar("hud_damage_gentle_alpha_multiplier") * bound(0, myhealth_flash_temp, 1), DRAWFLAG_NORMAL); + } + else + drawpic(reticle_pos, "gfx/blood", reticle_size, stov(cvar_string("hud_damage_color")), bound(0, myhealth_flash_temp, 1), DRAWFLAG_NORMAL); + } + // Draw the mouse cursor // NOTE: drawpic must happen after R_RenderScene for some reason //drawpic(getmousepos(), "gfx/cursor.tga", '11 14 0', '1 1 1', 1, 0); @@ -692,6 +764,17 @@ void CSQC_UpdateView(float w, float h) CSQC_RAPTOR_HUD(); else { + if(gametype == GAME_FREEZETAG) + { + if(getstati(STAT_FROZEN)) + drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, '0.25 0.90 1', cvar_or("hud_colorflash_alpha", 0.5), DRAWFLAG_ADDITIVE); + if(getstatf(STAT_REVIVE_PROGRESS)) + { + DrawCircleClippedPic(eX * 0.5 * vid_conwidth + eY * 0.6 * vid_conheight, 0.1 * vid_conheight, "gfx/crosshair_ring.tga", getstatf(STAT_REVIVE_PROGRESS), '0.25 0.90 1', cvar("hud_colorflash_alpha"), DRAWFLAG_ADDITIVE); + drawstring_aspect(eY * 0.64 * vid_conheight, "Revival progress", eX * vid_conwidth + eY * 0.025 * vid_conheight, '1 1 1', 1, DRAWFLAG_NORMAL); + } + } + if(cvar("r_letterbox") == 0) if(cvar("viewsize") < 120) CSQC_common_hud(); @@ -739,33 +822,30 @@ void CSQC_UpdateView(float w, float h) string wcross_wep, wcross_name; float wcross_scale, wcross_blur; - wcross_color_x = cvar("crosshair_color_red"); - wcross_color_y = cvar("crosshair_color_green"); - wcross_color_z = cvar("crosshair_color_blue"); - if (cvar("crosshair_per_weapon")) { + if (cvar("crosshair_per_weapon") || cvar("crosshair_color_per_weapon")) { e = get_weaponinfo(activeweapon); if (e && e.netname != "") { wcross_wep = e.netname; - wcross_resolution *= cvar(strcat("crosshair_", wcross_wep, "_size")); - if (wcross_resolution == 0) - return; - wcross_alpha *= cvar(strcat("crosshair_", wcross_wep, "_alpha")); - if (wcross_alpha == 0) - return; - - wcross_style = cvar_string(strcat("crosshair_", wcross_wep)); - if(wcross_style == "") - wcross_style = e.netname; - - if(!cvar("crosshair_color_override")) + if(cvar("crosshair_per_weapon")) { - wcross_color_x = cvar(strcat("crosshair_", wcross_wep, "_color_red")); - wcross_color_y = cvar(strcat("crosshair_", wcross_wep, "_color_green")); - wcross_color_z = cvar(strcat("crosshair_", wcross_wep, "_color_blue")); + wcross_resolution *= cvar(strcat("crosshair_", wcross_wep, "_size")); + if (wcross_resolution == 0) + return; + wcross_alpha *= cvar(strcat("crosshair_", wcross_wep, "_alpha")); + if (wcross_alpha == 0) + return; + + wcross_style = cvar_string(strcat("crosshair_", wcross_wep)); + if(wcross_style == "" || wcross_style == "0") + wcross_style = wcross_wep; } } } + if(wcross_wep != "" && cvar("crosshair_color_per_weapon")) + wcross_color = stov(cvar_string(strcat("crosshair_", wcross_wep, "_color"))); + else + wcross_color = stov(cvar_string("crosshair_color")); wcross_name = strcat("gfx/crosshair", wcross_style); @@ -779,9 +859,25 @@ void CSQC_UpdateView(float w, float h) wcross_scale = 1; } + if(cvar("crosshair_pickup")) + { + if(pickup_crosshair_time < getstatf(STAT_LAST_PICKUP)) + { + pickup_crosshair_size = 1; + pickup_crosshair_time = getstatf(STAT_LAST_PICKUP); + } + + if(pickup_crosshair_size > 0) + pickup_crosshair_size -= cvar("crosshair_pickup_speed") * frametime; + else + pickup_crosshair_size = 0; + + wcross_scale += sin(pickup_crosshair_size) * cvar("crosshair_pickup"); + } + if(shottype == SHOTTYPE_HITENEMY) wcross_scale *= cvar("crosshair_hittest"); // is not queried if hittest is 0 - else if(shottype == SHOTTYPE_HITTEAM) + if(shottype == SHOTTYPE_HITTEAM) wcross_scale /= cvar("crosshair_hittest"); // is not queried if hittest is 0 f = cvar("crosshair_effect_speed"); @@ -837,8 +933,12 @@ void CSQC_UpdateView(float w, float h) wcross_size = drawgetimagesize(wcross_name) * wcross_scale; - float nex_charge; + float nex_charge, nex_charge_pool; nex_charge = getstatf(STAT_NEX_CHARGE); + nex_charge_pool = getstatf(STAT_NEX_CHARGEPOOL); + + if(nex_charge_movingavg == 0) // this should only happen if we have just loaded up the game + nex_charge_movingavg = nex_charge; // ring around crosshair representing bullets left in camping rifle clip if (activeweapon == WEP_CAMPINGRIFLE && cr_maxbullets) @@ -846,12 +946,31 @@ void CSQC_UpdateView(float w, float h) bullets = getstati(STAT_BULLETS_LOADED); f = bound(0, bullets / cr_maxbullets, 1); - a = cvar("crosshair_campingrifle_bulletcounter_alpha"); + a = cvar("crosshair_ring_campingrifle_alpha"); DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring.tga", f, wcross_color, wcross_alpha * a, DRAWFLAG_ADDITIVE); } else if (activeweapon == WEP_NEX && nex_charge) // ring around crosshair representing velocity-dependent damage for the nex { - a = cvar("crosshair_nexvelocity_alpha"); + if(nex_charge_pool || use_nex_charge_pool) + { + use_nex_charge_pool = 1; + + a = cvar("crosshair_ring_nex_inner_alpha"); + rgb = eX * cvar("crosshair_ring_nex_inner_color_red") + eY * cvar("crosshair_ring_nex_inner_color_green") + eZ * cvar("crosshair_ring_nex_inner_color_blue"); + DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring_inner.tga", nex_charge_pool, rgb, wcross_alpha * a, DRAWFLAG_ADDITIVE); + } + else + { + // indicate how much we're charging right now with an inner circle + a = cvar("crosshair_ring_nex_inner_alpha"); + nex_charge_movingavg = (1 - cvar("crosshair_ring_nex_currentcharge_movingavg_rate")) * nex_charge_movingavg + cvar("crosshair_ring_nex_currentcharge_movingavg_rate") * nex_charge; + + rgb = eX * cvar("crosshair_ring_nex_inner_color_red") + eY * cvar("crosshair_ring_nex_inner_color_green") + eZ * cvar("crosshair_ring_nex_inner_color_blue"); + DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring_inner.tga", bound(0, cvar("crosshair_ring_nex_currentcharge_scale") * (nex_charge - nex_charge_movingavg), 1), rgb, wcross_alpha * a, DRAWFLAG_ADDITIVE); + } + + // draw the charge + a = cvar("crosshair_ring_nex_outer_alpha"); DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring.tga", nex_charge, wcross_color, wcross_alpha * a, DRAWFLAG_ADDITIVE); } @@ -893,7 +1012,14 @@ void CSQC_UpdateView(float w, float h) CROSSHAIR_DRAW(wcross_resolution, wcross_name, wcross_alpha * f); if(cvar("crosshair_dot")) - CROSSHAIR_DRAW(wcross_resolution * cvar("crosshair_dot_size"), "gfx/crosshairdot.tga", wcross_alpha * f * cvar("crosshair_dot_alpha")); + { + vector wcross_color_old; + wcross_color_old = wcross_color; + if(cvar_string("crosshair_dot_color") != "0") + wcross_color = stov(cvar_string("crosshair_dot_color")); + CROSSHAIR_DRAW(wcross_resolution * cvar("crosshair_dot_size"), "gfx/crosshairdot.tga", f * cvar("crosshair_dot_alpha")); + wcross_color = wcross_color_old; + } wcross_name_alpha_goal_prev = f; } @@ -1083,7 +1209,7 @@ void CSQC_SPIDER_HUD() void CSQC_RAPTOR_HUD() { - float rockets, reload, heat, hp, shield, energy; + float reload, hp, shield, energy; vector picsize, hudloc; // Fetch health & ammo stats @@ -1265,18 +1391,22 @@ void CSQC_common_hud(void) case HUD_NORMAL: // do some accuracy var caching float i; - if(cvar_string("hud_panel_weapons_accuracy_color_levels") != acc_color_levels) if(!(gametype == GAME_RACE || gametype == GAME_CTS)) { - if(acc_color_levels) - strunzone(acc_color_levels); - acc_color_levels = strzone(cvar_string("hud_panel_weapons_accuracy_color_levels")); - acc_levels = tokenize(acc_color_levels); - if (acc_levels > MAX_ACCURACY_LEVELS) - acc_levels = MAX_ACCURACY_LEVELS; - - for (i = 0; i < acc_levels; ++i) - acc_lev[i] = stof(argv(i)); + if(cvar_string("accuracy_color_levels") != acc_color_levels) + { + if(acc_color_levels) + strunzone(acc_color_levels); + acc_color_levels = strzone(cvar_string("accuracy_color_levels")); + acc_levels = tokenize(acc_color_levels); + if (acc_levels > MAX_ACCURACY_LEVELS) + acc_levels = MAX_ACCURACY_LEVELS; + + for (i = 0; i < acc_levels; ++i) + acc_lev[i] = stof(argv(i)) / 100.0; + } + // let know that acc_col[] needs to be loaded + acc_col_x[0] = -1; } HUD_Main(); // always run these functions for alpha checks