From: Samual Date: Wed, 16 Feb 2011 10:04:39 +0000 (-0500) Subject: Redo a lot of the crosshair_ring code, add new ring images for nex and sniper rifle... X-Git-Tag: xonotic-v0.5.0~309^2~17^2^2~5 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=017e583373a35ea9e22309e67e821fcecfa32e1a;p=xonotic%2Fxonotic-data.pk3dir.git Redo a lot of the crosshair_ring code, add new ring images for nex and sniper rifle, and add support for minelayer ring. Todo: Make a new image for minelayer ring - Add real support for minelayer_maxmines --- diff --git a/defaultXonotic.cfg b/defaultXonotic.cfg index c76176a84..9f0c44d3a 100644 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@ -188,12 +188,16 @@ seta crosshair_fireball_size 1 "crosshair size when wielding the fireball" seta crosshair_color_by_health 0 "if enabled, crosshair color will depend on current health" // ring around crosshair, used for various purposes (such as indicating bullets left in clip, nex charge) +seta crosshair_ring 1 "main cvar to enable or disable crosshair rings" +seta crosshair_ring_inner 0 "allow inner rings to be drawn too" seta crosshair_ring_size 2 "bullet counter ring size for Rifle, velocity ring for Nex" seta crosshair_ring_alpha 0.2 "ring alpha" +seta crosshair_ring_sniperrifle 1 "draw a ring showing the ammount of ammo left in the sniperrifle seta crosshair_ring_sniperrifle_alpha 0.15 -seta crosshair_ring_nex_outer_alpha 0.15 +seta crosshair_ring_nex 1 "draw a ring showing the current charge of the nexgun" +seta crosshair_ring_nex_alpha 0.15 seta crosshair_ring_nex_inner_alpha 0.15 seta crosshair_ring_nex_inner_color_red 0.8 seta crosshair_ring_nex_inner_color_green 0 @@ -201,6 +205,9 @@ seta crosshair_ring_nex_inner_color_blue 0 seta crosshair_ring_nex_currentcharge_scale 30 seta crosshair_ring_nex_currentcharge_movingavg_rate 0.05 +seta crosshair_ring_minelayer 1 +seta crosshair_ring_minelayer_alpha 0.15 + 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 reticle for the nex weapon's zoom, 0 disables and values between 0 and 1 change alpha" seta cl_reticle_item_normal 1 "draw reticle when zooming with the zoom button, 0 disables and values between 0 and 1 change alpha" diff --git a/qcsrc/client/View.qc b/qcsrc/client/View.qc index 3fbcfd951..9da93923d 100644 --- a/qcsrc/client/View.qc +++ b/qcsrc/client/View.qc @@ -866,7 +866,6 @@ void CSQC_UpdateView(float w, float h) // TrueAim check float shottype; - float bullets, ring_scale; // wcross_origin = '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight; wcross_origin = project_3d_to_2d(view_origin + MAX_SHOT_DISTANCE * view_forward); wcross_origin_z = 0; @@ -1064,50 +1063,63 @@ void CSQC_UpdateView(float w, float h) wcross_scale *= 1 - autocvar__menu_alpha; wcross_alpha *= 1 - autocvar__menu_alpha; - - ring_scale = autocvar_crosshair_ring_size; - wcross_size = drawgetimagesize(wcross_name) * wcross_scale; - float nex_charge, nex_chargepool; - nex_charge = getstatf(STAT_NEX_CHARGE); - nex_chargepool = 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_SNIPERRIFLE && cr_maxbullets) - { - bullets = getstati(STAT_BULLETS_LOADED); - f = bound(0, bullets / cr_maxbullets, 1); - - a = autocvar_crosshair_ring_sniperrifle_alpha; - DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring_sniperrifle.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 + if (autocvar_crosshair_ring) { - if(nex_chargepool || use_nex_chargepool) + float ring_value, ring_alpha, ring_inner_value, ring_inner_alpha; + string ring_image, ring_inner_image; + vector ring_rgb, ring_inner_rgb; + + float ring_scale = autocvar_crosshair_ring_size; + + float nex_charge, nex_chargepool; + nex_charge = getstatf(STAT_NEX_CHARGE); + nex_chargepool = 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; + + if (activeweapon == WEP_SNIPERRIFLE && cr_maxbullets && autocvar_crosshair_ring_sniperrifle) // ring around crosshair representing bullets left in camping rifle clip + { + ring_value = bound(0, getstati(STAT_BULLETS_LOADED) / cr_maxbullets, 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_sniperrifle_alpha; + ring_image = "gfx/crosshair_ring_sniperrifle.tga"; + ring_rgb = wcross_color; + } + else if (activeweapon == WEP_NEX && nex_charge && autocvar_crosshair_ring_nex) // ring around crosshair representing velocity-dependent damage for the nex { - use_nex_chargepool = 1; - - a = autocvar_crosshair_ring_nex_inner_alpha; - 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; - DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring_inner.tga", nex_chargepool, rgb, wcross_alpha * a, DRAWFLAG_ADDITIVE); + if (nex_chargepool || use_nex_chargepool) { + use_nex_chargepool = 1; + ring_inner_value = nex_chargepool; + } else { + nex_charge_movingavg = (1 - autocvar_crosshair_ring_nex_currentcharge_movingavg_rate) * nex_charge_movingavg + autocvar_crosshair_ring_nex_currentcharge_movingavg_rate * nex_charge; + 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_image = "gfx/crosshair_ring_inner.tga"; + 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; + + // 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_image = "gfx/crosshair_ring_nexgun.tga"; + ring_rgb = wcross_color; } - else + else if (activeweapon == WEP_MINE_LAYER && autocvar_crosshair_ring_minelayer) { - // indicate how much we're charging right now with an inner circle - a = autocvar_crosshair_ring_nex_inner_alpha; - nex_charge_movingavg = (1 - autocvar_crosshair_ring_nex_currentcharge_movingavg_rate) * nex_charge_movingavg + autocvar_crosshair_ring_nex_currentcharge_movingavg_rate * nex_charge; - - 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; - DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring_inner.tga", bound(0, autocvar_crosshair_ring_nex_currentcharge_scale * (nex_charge - nex_charge_movingavg), 1), rgb, wcross_alpha * a, DRAWFLAG_ADDITIVE); + ring_value = bound(0, getstati(STAT_LAYED_MINES) / 3, 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_image = "gfx/crosshair_ring.tga"; + ring_rgb = wcross_color; } - - // draw the charge - a = autocvar_crosshair_ring_nex_outer_alpha; - DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring_nexgun.tga", nex_charge, wcross_color, wcross_alpha * a, 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, 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); } #define CROSSHAIR_DO_BLUR(M,sz,wcross_name,wcross_alpha) \ diff --git a/qcsrc/client/autocvars.qh b/qcsrc/client/autocvars.qh index 790855c88..01bcce10e 100644 --- a/qcsrc/client/autocvars.qh +++ b/qcsrc/client/autocvars.qh @@ -108,15 +108,21 @@ float autocvar_crosshair_hittest_showimpact; float autocvar_crosshair_per_weapon; float autocvar_crosshair_pickup; float autocvar_crosshair_pickup_speed; -float autocvar_crosshair_ring_sniperrifle_alpha; +float autocvar_crosshair_ring; +float autocvar_crosshair_ring_inner; +float autocvar_crosshair_ring_minelayer; +float autocvar_crosshair_ring_minelayer_alpha; +float autocvar_crosshair_ring_nex; +float autocvar_crosshair_ring_nex_alpha; float autocvar_crosshair_ring_nex_currentcharge_movingavg_rate; float autocvar_crosshair_ring_nex_currentcharge_scale; float autocvar_crosshair_ring_nex_inner_alpha; float autocvar_crosshair_ring_nex_inner_color_blue; float autocvar_crosshair_ring_nex_inner_color_green; float autocvar_crosshair_ring_nex_inner_color_red; -float autocvar_crosshair_ring_nex_outer_alpha; float autocvar_crosshair_ring_size; +float autocvar_crosshair_ring_sniperrifle; +float autocvar_crosshair_ring_sniperrifle_alpha; float autocvar_crosshair_size; float autocvar_ekg; float autocvar_fov; diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index 60633f574..ad4c73a23 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -315,6 +315,7 @@ const float STAT_HUD = 51; const float STAT_NEX_CHARGEPOOL = 52; const float STAT_HIT_TIME = 53; const float STAT_TYPEHIT_TIME = 54; +const float STAT_LAYED_MINES = 55; // see DP source, quakedef.h const float STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW = 222; diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index 936cb9c6b..ee961d666 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -617,6 +617,7 @@ float client_cefc_accumulator; float client_cefc_accumulatortime; #endif +.float minelayer_mines; .float sniperrifle_bulletcounter; .float wish_reload; diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index 268743b41..51c98ec46 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -827,6 +827,7 @@ void spawnfunc_worldspawn (void) addstat(STAT_LAST_PICKUP, AS_FLOAT, last_pickup); addstat(STAT_HIT_TIME, AS_FLOAT, hit_time); addstat(STAT_TYPEHIT_TIME, AS_FLOAT, typehit_time); + addstat(STAT_LAYED_MINES, AS_INT, minelayer_mines); addstat(STAT_NEX_CHARGE, AS_FLOAT, nex_charge); addstat(STAT_NEX_CHARGEPOOL, AS_FLOAT, nex_chargepool_ammo); diff --git a/qcsrc/server/w_minelayer.qc b/qcsrc/server/w_minelayer.qc index 7e4749cd5..88e720ede 100644 --- a/qcsrc/server/w_minelayer.qc +++ b/qcsrc/server/w_minelayer.qc @@ -3,7 +3,7 @@ REGISTER_WEAPON(MINE_LAYER, w_minelayer, IT_ROCKETS, 4, WEP_FLAG_NORMAL | WEP_TY #else #ifdef SVQC void W_Mine_Think (void); -.float minelayer_detonate, minelayer_mines; +.float minelayer_detonate, mine_explodeanyway; .float mine_time; void spawnfunc_weapon_minelayer (void) @@ -73,6 +73,7 @@ void W_Mine_Explode () self.owner.switchweapon = w_getbestweapon(self.owner); } } + self.owner.minelayer_mines -= 1; remove (self); } @@ -92,6 +93,7 @@ void W_Mine_DoRemoteExplode () self.owner.switchweapon = w_getbestweapon(self.owner); } } + self.owner.minelayer_mines -= 1; remove (self); } @@ -110,7 +112,7 @@ void W_Mine_RemoteExplode () void W_Mine_ProximityExplode () { // make sure no friend is in the mine's radius. If there is any, explosion is delayed until he's at a safe distance - if(autocvar_g_balance_minelayer_protection && self.minelayer_mines == 0) + if(autocvar_g_balance_minelayer_protection && self.mine_explodeanyway == 0) { entity head; head = findradius(self.origin, autocvar_g_balance_minelayer_radius); @@ -126,6 +128,16 @@ void W_Mine_ProximityExplode () W_Mine_Explode(); } +float W_Mine_Count(entity e) +{ + float minecount; + entity mine; + for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == e) + minecount += 1; + + return minecount; +} + void W_Mine_Think (void) { entity head; @@ -139,7 +151,7 @@ void W_Mine_Think (void) if(autocvar_g_balance_minelayer_lifetime_countdown > 0) spamsound (self, CHAN_PROJECTILE, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM); self.mine_time = time + autocvar_g_balance_minelayer_lifetime_countdown; - self.minelayer_mines = 1; // make the mine super aggressive + self.mine_explodeanyway = 1; // make the mine super aggressive -- Samual: Rather, make it not care if a team mate is near. } // a player's mines shall explode if he disconnects or dies @@ -207,11 +219,8 @@ void W_Mine_Attack (void) // scan how many mines we placed, and return if we reached our limit if(autocvar_g_balance_minelayer_limit) { - self.minelayer_mines = 0; - for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self) - self.minelayer_mines += 1; - - if(self.minelayer_mines >= autocvar_g_balance_minelayer_limit) + + if(W_Mine_Count(self) >= autocvar_g_balance_minelayer_limit) { // the refire delay keeps this message from being spammed sprint(self, strcat("You cannot place more than ^2", ftos(autocvar_g_balance_minelayer_limit), " ^7mines at a time\n") ); @@ -268,6 +277,8 @@ void W_Mine_Attack (void) // common properties other = mine; MUTATOR_CALLHOOK(EditProjectile); + + self.minelayer_mines = W_Mine_Count(self); } void spawnfunc_weapon_minelayer (void); // defined in t_items.qc