From c37231fde4fb30c41b8e42743322e670ebe839b5 Mon Sep 17 00:00:00 2001 From: FruitieX Date: Sun, 3 Oct 2010 21:48:12 +0300 Subject: [PATCH] send max/minvelocity, make the circle drawing code a function, allow some customization via cvars --- defaultXonotic.cfg | 4 + gfx/nex_ring.tga | Bin 6244 -> 57475 bytes qcsrc/client/Defs.qc | 3 + qcsrc/client/Main.qc | 5 ++ qcsrc/client/View.qc | 160 ++-------------------------------- qcsrc/client/miscfunctions.qc | 150 +++++++++++++++++++++++++++++++ qcsrc/common/constants.qh | 1 + qcsrc/server/cl_client.qc | 10 +++ 8 files changed, 182 insertions(+), 151 deletions(-) diff --git a/defaultXonotic.cfg b/defaultXonotic.cfg index 2e535c395..8a23a83e6 100644 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@ -198,6 +198,10 @@ seta crosshair_fireball_color_green 1.0 "crosshair color green component to disp seta crosshair_fireball_color_blue 0.2 "crosshair color blue component to display when wielding the fireball" seta crosshair_fireball_color_alpha 1 "crosshair alpha value to display when wielding the fireball" seta crosshair_fireball_size 1 "crosshair size when wielding the fireball" +seta crosshair_nexvelocity_color_red 0.8 +seta crosshair_nexvelocity_color_green 0 +seta crosshair_nexvelocity_color_blue 0 +seta crosshair_nexvelocity_alpha 0.25 seta cl_reticle_stretch 0 "whether to stretch reticles so they fit the screen (brakes image proportions)" seta cl_reticle_item_nex 1 "draw aiming recticle for the nex weapon's zoom, 0 disables and values between 0 and 1 change alpha" seta cl_reticle_item_normal 1 "draw recticle when zooming with the zoom button, 0 disables and values between 0 and 1 change alpha" diff --git a/gfx/nex_ring.tga b/gfx/nex_ring.tga index c082c62432f4a82e38146b652d11a8ee1526b79a..22e3514cf68748eb87acf0c638244c167a8a3148 100644 GIT binary patch literal 57475 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 ZKmR}f{D1#nU;BT*|Ih#DfBSmz{{wWH+baM7 literal 6244 zcmc(j&ue2<6vxvdLELmTT@(tEMK;9-O8$W^CeR=jsunl1NS9f(e?ejDkIYPGCgV7c ziZY$)I6i393{qW)3u#=45eY_&SSwuBsM?BJg+MMxGhNH@E3oN{VtA+cjV=52A_^RaNS zt!rp(PV4wzgk*1_u`9_S)YOe(MqE32^MBVfDwmbzw7RthHBFQj;Z)1 z8e2?7Ic-9fHvV;YVvn1b&{(<+{AW2}>yfkDkd4kM^SkEG9BWemXE^y48gowKAdrpe z4x3-uojJ=j18mKHO-DPD6DMfUcxz~^$YJ3dcUX|FV%$~sKzLb(!nY0=q+2%biorz}J1 z2Zu}2m5saPa9)PsM~4IH^2P~nT>zr1oiqn#%nQ~q86o2&|iqh4L zd(C^8kzwOEhc~2~F-~w8c~bDC;F@u-dgPo8!S5b9kS=GO;BZzlf-{1v#=YW^(=x37 z;gMIROB*M+BtuqkR=Uzjc)Nsnw#L`_BC^ZAF5R}lFMAr@i^Ih;EqGdy^Tr8YQIxGe zJ@S@xD<|PS8I}YuNw;V4lBW^Q^O)cB=YJrVNXM7o}?&Jis&% zX+%9{#dfEe>ve>bqq7RJ^S9@)V>+U<$I&p|KxiPe`)DN(znY>Jg%*X@jz?_^%?iy5 zZ4+h0lvLag4I0V}`5-?~h!oMhP8r6*4N_E|G8=hlC6XX%l&%)1;83bPtFe>U2QJ zfOLlukq8|{NH@ZuBTQX{3lQNlMpz6HmQ;j=8F88W-5XA0&zr~5a3UUgONOI;{~| zUq!CRQf7Osg}?u~haC;fR#0?MzGq`Ez{m}AP3dM3cUdV-u7t- z-^{&A#%m5Tm;Wk4TgjRc*(J-E&D&_~(ZbRdHQloIeMUS@;oQpZXAma^VLI~=#;rg& zb{1WCA#Df?`TVhp#AE7cBSV%x^kodj>K65x8hiMbZ=bm{fH}&k<@x;IC CJ6B); diff --git a/qcsrc/client/Defs.qc b/qcsrc/client/Defs.qc index fbed63fc4..1bd911aaf 100644 --- a/qcsrc/client/Defs.qc +++ b/qcsrc/client/Defs.qc @@ -260,3 +260,6 @@ vector w_org, w_backoff; float campingrifle_scope; float nex_scope; + +float nex_minvelocity; +float nex_maxvelocity; diff --git a/qcsrc/client/Main.qc b/qcsrc/client/Main.qc index 2fc1ce308..27b9284cd 100644 --- a/qcsrc/client/Main.qc +++ b/qcsrc/client/Main.qc @@ -1351,6 +1351,11 @@ float CSQC_Parse_TempEntity() Net_WeaponComplain(); bHandled = true; break; + case TE_CSQC_NEX_VELOCITY: + nex_minvelocity = ReadShort(); + nex_maxvelocity = ReadShort(); + bHandled = true; + break; default: // No special logic for this temporary entity; return 0 so the engine can handle it bHandled = false; diff --git a/qcsrc/client/View.qc b/qcsrc/client/View.qc index 5e1948215..6fc94ca43 100644 --- a/qcsrc/client/View.qc +++ b/qcsrc/client/View.qc @@ -701,160 +701,18 @@ void CSQC_UpdateView(float w, float h) // ring around crosshair representing velocity-dependent damage for the nex if (activeweapon == WEP_NEX) { - float x, y, q, d; - vector ringorigin, ringsize, t; - ringorigin = '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight; - ringsize = 64 * '1 -1 0'; // testing only - - // TODO send from server - float maxvel, minvel, curvel; - minvel = 400; - maxvel = 1000; - curvel = vlen('1 0 0' * pmove_vel_x + '0 1 0' * pmove_vel_y); - - f = bound(0, (curvel - minvel) / (maxvel - minvel), 1); - 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("gfx/nex_ring.tga", DRAWFLAG_ADDITIVE); - v = ringorigin; t = '0.5 0.5 0'; - v_x += 0.5 * ringsize_x; t += '0.5 0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - - v = ringorigin; t = '0.5 0.5 0'; - v_y += 0.5 * ringsize_y; t += '0.5 -0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - - v = ringorigin; t = '0.5 0.5 0'; - v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - - v = ringorigin; t = '0.5 0.5 0'; - v_y -= 0.5 * ringsize_y; t -= '0.5 -0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - R_EndPolygon(); - - d = q - 1; - if(d > 0) - { - R_BeginPolygon("gfx/nex_ring.tga", DRAWFLAG_ADDITIVE); - v = ringorigin; t = '0.5 0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - - v = ringorigin; t = '0.5 0.5 0'; - v_x += 0.5 * ringsize_x; t += '0.5 0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - } - } - else if(f > 0.75) - { - // draw upper and first triangle - R_BeginPolygon("gfx/nex_ring.tga", DRAWFLAG_ADDITIVE); - v = ringorigin; t = '0.5 0.5 0'; - v_x += 0.5 * ringsize_x; t += '0.5 0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - - v = ringorigin; t = '0.5 0.5 0'; - v_y += 0.5 * ringsize_y; t += '0.5 -0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - - v = ringorigin; t = '0.5 0.5 0'; - v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - R_EndPolygon(); - R_BeginPolygon("gfx/nex_ring.tga", DRAWFLAG_ADDITIVE); - v = ringorigin; t = '0.5 0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - - v = ringorigin; t = '0.5 0.5 0'; - v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - - v = ringorigin; t = '0.5 0.5 0'; - v_y -= 0.5 * ringsize_y; t -= '0.5 -0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - - d = q - 0.75; - if(d <= 0) - R_EndPolygon(); - } - else if(f > 0.5) - { - // draw upper triangle - R_BeginPolygon("gfx/nex_ring.tga", DRAWFLAG_ADDITIVE); - v = ringorigin; t = '0.5 0.5 0'; - v_x += 0.5 * ringsize_x; t += '0.5 0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - - v = ringorigin; t = '0.5 0.5 0'; - v_y += 0.5 * ringsize_y; t += '0.5 -0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - - v = ringorigin; t = '0.5 0.5 0'; - v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - R_EndPolygon(); - - d = q - 0.5; - if(d > 0) - { - R_BeginPolygon("gfx/nex_ring.tga", DRAWFLAG_ADDITIVE); - v = ringorigin; t = '0.5 0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); + float f, a, curvel; + vector rgb; - v = ringorigin; t = '0.5 0.5 0'; - v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - } - } - else if(f > 0.25) - { - // draw first triangle - R_BeginPolygon("gfx/nex_ring.tga", DRAWFLAG_ADDITIVE); - v = ringorigin; t = '0.5 0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - - v = ringorigin; t = '0.5 0.5 0'; - v_x += 0.5 * ringsize_x; t += '0.5 0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - - v = ringorigin; t = '0.5 0.5 0'; - v_y += 0.5 * ringsize_y; t += '0.5 -0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - - d = q - 0.25; - if(d <= 0) - R_EndPolygon(); - } - else - { - d = q; - if(d > 0) - { - R_BeginPolygon("gfx/nex_ring.tga", DRAWFLAG_ADDITIVE); - v = ringorigin; t = '0.5 0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); + rgb_x = cvar("crosshair_nexvelocity_color_red"); + rgb_y = cvar("crosshair_nexvelocity_color_green"); + rgb_z = cvar("crosshair_nexvelocity_color_blue"); + a = cvar("crosshair_nexvelocity_alpha"); - v = ringorigin; t = '0.5 0.5 0'; - v_x += 0.5 * ringsize_x; t += '0.5 0.5 0'; - R_PolygonVertex(v, t, '1 1 1', 1); - } - } + curvel = vlen('1 0 0' * pmove_vel_x + '0 1 0' * pmove_vel_y); + f = bound(0, (curvel - nex_minvelocity) / (nex_maxvelocity - nex_minvelocity), 1); - if(d > 0) - { - v = ringorigin; 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, '1 1 1', 1); - R_EndPolygon(); - } + DrawCircleClippedPic('0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight, 0.1 * vid_conheight, "gfx/nex_ring.tga", f, rgb, a, DRAWFLAG_ADDITIVE); } // crosshair goes VERY LAST diff --git a/qcsrc/client/miscfunctions.qc b/qcsrc/client/miscfunctions.qc index ed8f84fc2..5c377bffa 100644 --- a/qcsrc/client/miscfunctions.qc +++ b/qcsrc/client/miscfunctions.qc @@ -650,3 +650,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(); + } +} diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index 5ebeb5465..ddd24ed6b 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -61,6 +61,7 @@ const float TE_CSQC_NOTIFY = 112; const float TE_CSQC_WEAPONCOMPLAIN = 113; const float TE_CSQC_CAMPINGRIFLE_SCOPE = 115; const float TE_CSQC_NEX_SCOPE = 116; +const float TE_CSQC_NEX_VELOCITY = 117; const float RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder const float RACE_NET_CHECKPOINT_CLEAR = 1; diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index c269ce502..d5ffae1e5 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -6,6 +6,14 @@ void send_CSQC_teamnagger() { WriteByte(0, TE_CSQC_TEAMNAGGER); } +void send_CSQC_nexvelocity(entity e) { + msg_entity = e; + WriteByte(MSG_ONE, SVC_TEMPENTITY); + WriteByte(MSG_ONE, TE_CSQC_NEX_VELOCITY); + WriteShort(MSG_ONE, cvar("g_balance_nex_velocitydependent_minspeed")); + WriteShort(MSG_ONE, cvar("g_balance_nex_velocitydependent_maxspeed")); +} + void Announce(string snd) { WriteByte(MSG_ALL, SVC_TEMPENTITY); WriteByte(MSG_ALL, TE_CSQC_ANNOUNCE); @@ -1598,6 +1606,8 @@ void ClientConnect (void) else if(cvar("sv_teamnagger") && !(cvar("bot_vs_human") && (c3==-1 && c4==-1)) && !g_ca) // teamnagger is currently bad for ca send_CSQC_teamnagger(); + send_CSQC_nexvelocity(self); + CheatInitClient(); } -- 2.39.2