From: MirceaKitsune Date: Mon, 28 Feb 2011 15:25:17 +0000 (+0200) Subject: And lastly, implement the client side part. X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=4766dbf975b974c4d0049470965182bd40be3bac;p=voretournament%2Fvoretournament.git And lastly, implement the client side part. --- diff --git a/data/defaultVoretournament.cfg b/data/defaultVoretournament.cfg index aece24ec..d0ccbde0 100644 --- a/data/defaultVoretournament.cfg +++ b/data/defaultVoretournament.cfg @@ -110,6 +110,8 @@ _cl_playerskin 0 crosshair 1 seta crosshair_pickup 1 seta crosshair_pickup_speed 4 +seta crosshair_ring_alpha 0.5 +seta crosshair_ring_size 3 seta crosshair_effect_speed 0.25 "how fast (in seconds) some crosshair effects should take place, 0 = instant, -1 = 2x weapon switch time" seta crosshair_effect_scalefade 1 "use scaling and fading for crosshair effects" seta crosshair_hittest 1.25 "do a crosshair hit evaluation; also, the crosshair is scaled by the given number when aiming at an enemy, and blurred when aiming at a team mate" diff --git a/data/qcsrc/client/View.qc b/data/qcsrc/client/View.qc index f68adaaf..bdfb160e 100644 --- a/data/qcsrc/client/View.qc +++ b/data/qcsrc/client/View.qc @@ -270,6 +270,7 @@ void CSQC_UpdateView(float w, float h) float fov; float f, i, j; vector v, vo; + float a; vector artwork_pos, artwork_size; @@ -926,6 +927,8 @@ void CSQC_UpdateView(float w, float h) else shottype = SHOTTYPE_HITWORLD; + float weapon_clipload, weapon_clipsize, ring_scale; + string wcross_style; wcross_style = cvar_string("crosshair"); @@ -1057,6 +1060,17 @@ void CSQC_UpdateView(float w, float h) wcross_size = drawgetimagesize(wcross_name) * wcross_scale; CROSSHAIR_DRAW(wcross_resolution, wcross_name, wcross_alpha * f); wcross_name_alpha_goal_prev = f; + + // ring around crosshair representing bullets left in weapon clip + weapon_clipload = getstati(STAT_WEAPON_CLIPLOAD); + if (weapon_clipload) + { + weapon_clipsize = getstati(STAT_WEAPON_CLIPSIZE); + f = bound(0, weapon_clipload / weapon_clipsize, 1); + ring_scale = cvar("crosshair_ring_size"); + a = cvar("crosshair_ring_alpha"); + DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring.tga", f, wcross_color, wcross_alpha * a, DRAWFLAG_ADDITIVE); + } } } else diff --git a/data/qcsrc/client/miscfunctions.qc b/data/qcsrc/client/miscfunctions.qc index 226a964c..0d72bfec 100644 --- a/data/qcsrc/client/miscfunctions.qc +++ b/data/qcsrc/client/miscfunctions.qc @@ -541,3 +541,153 @@ void PolyDrawModel(entity e) } } } + +void DrawCircleClippedPic(vector centre, float radius, string pic, float f, vector rgb, float a, float drawflag) +{ + float x, y, q, d; + vector ringsize, v, t; + ringsize = radius * '1 1 0'; + + x = cos(f * 2 * M_PI); + y = sin(f * 2 * M_PI); + q = fabs(x) + fabs(y); + x /= q; + y /= q; + + if(f >= 1) + { + // draw full rectangle + R_BeginPolygon(pic, drawflag); + v = centre; t = '0.5 0.5 0'; + v_x += 0.5 * ringsize_x; t += '0.5 0.5 0'; + R_PolygonVertex(v, t, rgb, a); + + v = centre; t = '0.5 0.5 0'; + v_y += 0.5 * ringsize_y; t += '0.5 -0.5 0'; + R_PolygonVertex(v, t, rgb, a); + + v = centre; t = '0.5 0.5 0'; + v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0'; + R_PolygonVertex(v, t, rgb, a); + + v = centre; t = '0.5 0.5 0'; + v_y -= 0.5 * ringsize_y; t -= '0.5 -0.5 0'; + R_PolygonVertex(v, t, rgb, a); + R_EndPolygon(); + + d = q - 1; + if(d > 0) + { + R_BeginPolygon(pic, drawflag); + v = centre; t = '0.5 0.5 0'; + R_PolygonVertex(v, t, rgb, a); + + v = centre; t = '0.5 0.5 0'; + v_x += 0.5 * ringsize_x; t += '0.5 0.5 0'; + R_PolygonVertex(v, t, rgb, a); + } + } + else if(f > 0.75) + { + // draw upper and first triangle + R_BeginPolygon(pic, drawflag); + v = centre; t = '0.5 0.5 0'; + v_x += 0.5 * ringsize_x; t += '0.5 0.5 0'; + R_PolygonVertex(v, t, rgb, a); + + v = centre; t = '0.5 0.5 0'; + v_y += 0.5 * ringsize_y; t += '0.5 -0.5 0'; + R_PolygonVertex(v, t, rgb, a); + + v = centre; t = '0.5 0.5 0'; + v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0'; + R_PolygonVertex(v, t, rgb, a); + R_EndPolygon(); + R_BeginPolygon(pic, drawflag); + v = centre; t = '0.5 0.5 0'; + R_PolygonVertex(v, t, rgb, a); + + v = centre; t = '0.5 0.5 0'; + v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0'; + R_PolygonVertex(v, t, rgb, a); + + v = centre; t = '0.5 0.5 0'; + v_y -= 0.5 * ringsize_y; t -= '0.5 -0.5 0'; + R_PolygonVertex(v, t, rgb, a); + + d = q - 0.75; + if(d <= 0) + R_EndPolygon(); + } + else if(f > 0.5) + { + // draw upper triangle + R_BeginPolygon(pic, drawflag); + v = centre; t = '0.5 0.5 0'; + v_x += 0.5 * ringsize_x; t += '0.5 0.5 0'; + R_PolygonVertex(v, t, rgb, a); + + v = centre; t = '0.5 0.5 0'; + v_y += 0.5 * ringsize_y; t += '0.5 -0.5 0'; + R_PolygonVertex(v, t, rgb, a); + + v = centre; t = '0.5 0.5 0'; + v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0'; + R_PolygonVertex(v, t, rgb, a); + R_EndPolygon(); + + d = q - 0.5; + if(d > 0) + { + R_BeginPolygon(pic, drawflag); + v = centre; t = '0.5 0.5 0'; + R_PolygonVertex(v, t, rgb, a); + + v = centre; t = '0.5 0.5 0'; + v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0'; + R_PolygonVertex(v, t, rgb, a); + } + } + else if(f > 0.25) + { + // draw first triangle + R_BeginPolygon(pic, drawflag); + v = centre; t = '0.5 0.5 0'; + R_PolygonVertex(v, t, rgb, a); + + v = centre; t = '0.5 0.5 0'; + v_x += 0.5 * ringsize_x; t += '0.5 0.5 0'; + R_PolygonVertex(v, t, rgb, a); + + v = centre; t = '0.5 0.5 0'; + v_y += 0.5 * ringsize_y; t += '0.5 -0.5 0'; + R_PolygonVertex(v, t, rgb, a); + + d = q - 0.25; + if(d <= 0) + R_EndPolygon(); + } + else + { + d = q; + if(d > 0) + { + R_BeginPolygon(pic, drawflag); + v = centre; t = '0.5 0.5 0'; + R_PolygonVertex(v, t, rgb, a); + + v = centre; t = '0.5 0.5 0'; + v_x += 0.5 * ringsize_x; t += '0.5 0.5 0'; + R_PolygonVertex(v, t, rgb, a); + } + } + + if(d > 0) + { + v = centre; t = '0.5 0.5 0'; + v_x += x * 0.5 * ringsize_x; t += x * '0.5 0.5 0'; + v_y += y * 0.5 * ringsize_y; t += y * '0.5 -0.5 0'; + R_PolygonVertex(v, t, rgb, a); + R_EndPolygon(); + } +}