From: FruitieX Date: Fri, 12 Nov 2010 06:49:55 +0000 (+0200) Subject: Merge branch 'terencehill/crosshair_colors' into fruitiex/panelhud X-Git-Tag: xonotic-v0.1.0preview~134^2~3 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=cb0dd369118ab822156128516ebcdd8350c70e9b;hp=c1310c0cc29e7d162a3a27b61572c24ec370841c Merge branch 'terencehill/crosshair_colors' into fruitiex/panelhud --- diff --git a/balance25.cfg b/balance25.cfg index 1df67732ef..49a450f807 100644 --- a/balance25.cfg +++ b/balance25.cfg @@ -224,6 +224,8 @@ set g_balance_laser_primary_lifetime 30 set g_balance_laser_primary_shotangle 0 set g_balance_laser_primary_delay 0.05 set g_balance_laser_primary_gauntlet 0 +set g_balance_laser_primary_force_zscale 1 +set g_balance_laser_primary_force_velocitybias 0 set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists set g_balance_laser_secondary_damage 35 set g_balance_laser_secondary_edgedamage 10 @@ -237,6 +239,8 @@ set g_balance_laser_secondary_lifetime 30 set g_balance_laser_secondary_shotangle 0 set g_balance_laser_secondary_delay 0 set g_balance_laser_secondary_gauntlet 0 +set g_balance_laser_secondary_force_zscale 1 +set g_balance_laser_secondary_force_velocitybias 0 // }}} // {{{ shotgun set g_balance_shotgun_primary_bullets 6 @@ -290,8 +294,6 @@ set g_balance_grenadelauncher_primary_animtime 0.3 set g_balance_grenadelauncher_primary_ammo 2 set g_balance_grenadelauncher_primary_health 25 set g_balance_grenadelauncher_primary_damageforcescale 4 -set g_balance_grenadelauncher_primary_bouncefactor 0.5 -set g_balance_grenadelauncher_primary_bouncestop 0.075 set g_balance_grenadelauncher_primary_remote_minbouncecnt 0 set g_balance_grenadelauncher_secondary_type 1 @@ -310,9 +312,10 @@ set g_balance_grenadelauncher_secondary_animtime 0.3 set g_balance_grenadelauncher_secondary_ammo 2 set g_balance_grenadelauncher_secondary_health 10 set g_balance_grenadelauncher_secondary_damageforcescale 4 -set g_balance_grenadelauncher_secondary_bouncefactor 0.5 -set g_balance_grenadelauncher_secondary_bouncestop 0.075 set g_balance_grenadelauncher_secondary_remote_detonateprimary 0 + +set g_balance_grenadelauncher_bouncefactor 0.5 +set g_balance_grenadelauncher_bouncestop 0.075 // }}} // {{{ minelayer // TODO set g_balance_minelayer_damage 35 @@ -390,11 +393,10 @@ set g_balance_crylink_primary_refire 0.4 set g_balance_crylink_primary_animtime 0.3 set g_balance_crylink_primary_ammo 2 set g_balance_crylink_primary_bouncedamagefactor 0.5 +set g_balance_crylink_primary_joinspeed 0 set g_balance_crylink_primary_middle_lifetime 5 // range: 35000 full, fades to 70000 set g_balance_crylink_primary_middle_fadetime 5 -set g_balance_crylink_primary_star_lifetime 0.1 // range: 700 full, fades to 2450 -set g_balance_crylink_primary_star_fadetime 0.25 set g_balance_crylink_primary_other_lifetime 0.1 // range: 700 full, fades to 2450 set g_balance_crylink_primary_other_fadetime 0.25 @@ -411,6 +413,7 @@ set g_balance_crylink_secondary_refire 0.5 set g_balance_crylink_secondary_animtime 0.3 set g_balance_crylink_secondary_ammo 2 set g_balance_crylink_secondary_bouncedamagefactor 0.5 +set g_balance_crylink_secondary_joinspeed 0 set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000 set g_balance_crylink_secondary_middle_fadetime 5 @@ -446,6 +449,7 @@ set g_balance_nex_charge_mindmg 40 set g_balance_nex_charge_start 0 set g_balance_nex_charge_rate 0.1 set g_balance_nex_charge_limit 0.5 +set g_balance_nex_charge_rot_rate 0 set g_balance_nex_charge_shot_multiplier 0.5 set g_balance_nex_charge_velocity_rate 0.2 set g_balance_nex_charge_minspeed 400 diff --git a/balanceLeeStricklin.cfg b/balanceLeeStricklin.cfg index b1c2673422..9735e07a57 100644 --- a/balanceLeeStricklin.cfg +++ b/balanceLeeStricklin.cfg @@ -225,7 +225,7 @@ set g_balance_grapplehook_health 130 // {{{ laser set g_balance_laser_primary_damage 25 set g_balance_laser_primary_edgedamage 10 -set g_balance_laser_primary_force 258 +set g_balance_laser_primary_force 182 // Original value was insanely low :P set g_balance_laser_primary_radius 70 set g_balance_laser_primary_speed 12000 set g_balance_laser_primary_spread 0 @@ -235,19 +235,23 @@ set g_balance_laser_primary_lifetime 30 set g_balance_laser_primary_shotangle 0 set g_balance_laser_primary_delay 0.03 set g_balance_laser_primary_gauntlet 0 +set g_balance_laser_primary_force_zscale 2 // 300 upforce +set g_balance_laser_primary_force_velocitybias 0.3 set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists -set g_balance_laser_secondary_damage 25 -set g_balance_laser_secondary_edgedamage 10 -set g_balance_laser_secondary_force 375 -set g_balance_laser_secondary_radius 70 -set g_balance_laser_secondary_speed 12000 +set g_balance_laser_secondary_damage 200 // dps +set g_balance_laser_secondary_edgedamage 0 +set g_balance_laser_secondary_force 1300 +set g_balance_laser_secondary_radius 60 +set g_balance_laser_secondary_speed 0 set g_balance_laser_secondary_spread 0 -set g_balance_laser_secondary_refire 0.7 -set g_balance_laser_secondary_animtime 0.3 -set g_balance_laser_secondary_lifetime 30 -set g_balance_laser_secondary_shotangle -90 +set g_balance_laser_secondary_refire 0.066 +set g_balance_laser_secondary_animtime 0.066 +set g_balance_laser_secondary_lifetime 0 +set g_balance_laser_secondary_shotangle 0 set g_balance_laser_secondary_delay 0 -set g_balance_laser_secondary_gauntlet 0 +set g_balance_laser_secondary_gauntlet 1 +set g_balance_laser_secondary_force_zscale 1.25 +set g_balance_laser_secondary_force_velocitybias 0 // }}} // {{{ shotgun set g_balance_shotgun_primary_bullets 5 @@ -301,8 +305,6 @@ set g_balance_grenadelauncher_primary_animtime 0.3 set g_balance_grenadelauncher_primary_ammo 2 set g_balance_grenadelauncher_primary_health 72 set g_balance_grenadelauncher_primary_damageforcescale 0 -set g_balance_grenadelauncher_primary_bouncefactor 0.7 -set g_balance_grenadelauncher_primary_bouncestop 0.12 set g_balance_grenadelauncher_primary_remote_minbouncecnt 0 set g_balance_grenadelauncher_secondary_type 1 @@ -321,9 +323,10 @@ set g_balance_grenadelauncher_secondary_animtime 0.3 set g_balance_grenadelauncher_secondary_ammo 2 set g_balance_grenadelauncher_secondary_health 40 set g_balance_grenadelauncher_secondary_damageforcescale 0 -set g_balance_grenadelauncher_secondary_bouncefactor 0.7 -set g_balance_grenadelauncher_secondary_bouncestop 0.12 set g_balance_grenadelauncher_secondary_remote_detonateprimary 0 + +set g_balance_grenadelauncher_bouncefactor 0.7 +set g_balance_grenadelauncher_bouncestop 0.12 // }}} // {{{ minelayer // TODO set g_balance_minelayer_damage 35 @@ -401,11 +404,10 @@ set g_balance_crylink_primary_refire 0.4 set g_balance_crylink_primary_animtime 0.30008 set g_balance_crylink_primary_ammo 3 set g_balance_crylink_primary_bouncedamagefactor 0.2 +set g_balance_crylink_primary_joinspeed 0 set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000 set g_balance_crylink_primary_middle_fadetime 5 -set g_balance_crylink_primary_star_lifetime 2 // range: 800 full, fades to 1300 -set g_balance_crylink_primary_star_fadetime 0.25 set g_balance_crylink_primary_other_lifetime 2 // range: 800 full, fades to 1300 set g_balance_crylink_primary_other_fadetime 0.25 @@ -422,6 +424,7 @@ set g_balance_crylink_secondary_refire 0.5 set g_balance_crylink_secondary_animtime 0.3 set g_balance_crylink_secondary_ammo 3 set g_balance_crylink_secondary_bouncedamagefactor 0.5 +set g_balance_crylink_secondary_joinspeed 0 set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000 set g_balance_crylink_secondary_middle_fadetime 5 @@ -457,6 +460,7 @@ set g_balance_nex_charge_mindmg 40 set g_balance_nex_charge_start 0 set g_balance_nex_charge_rate 0.1 set g_balance_nex_charge_limit 0.5 +set g_balance_nex_charge_rot_rate 0 set g_balance_nex_charge_shot_multiplier 0.5 set g_balance_nex_charge_velocity_rate 0.2 set g_balance_nex_charge_minspeed 400 diff --git a/balanceNexSVN.cfg b/balanceNexSVN.cfg index bb704d3ca9..4649a6eaaf 100644 --- a/balanceNexSVN.cfg +++ b/balanceNexSVN.cfg @@ -224,6 +224,8 @@ set g_balance_laser_primary_lifetime 30 set g_balance_laser_primary_shotangle 0 set g_balance_laser_primary_delay 0.03 set g_balance_laser_primary_gauntlet 0 +set g_balance_laser_primary_force_zscale 1 +set g_balance_laser_primary_force_velocitybias 0 set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists set g_balance_laser_secondary_damage 35 set g_balance_laser_secondary_edgedamage 10 @@ -237,6 +239,8 @@ set g_balance_laser_secondary_lifetime 30 set g_balance_laser_secondary_shotangle 0 set g_balance_laser_secondary_delay 0 set g_balance_laser_secondary_gauntlet 0 +set g_balance_laser_secondary_force_zscale 1 +set g_balance_laser_secondary_force_velocitybias 0 // }} // {{{ shotgun set g_balance_shotgun_primary_bullets 6 @@ -290,8 +294,6 @@ set g_balance_grenadelauncher_primary_animtime 0.3 set g_balance_grenadelauncher_primary_ammo 2 set g_balance_grenadelauncher_primary_health 25 set g_balance_grenadelauncher_primary_damageforcescale 4 -set g_balance_grenadelauncher_primary_bouncefactor 0.5 -set g_balance_grenadelauncher_primary_bouncestop 0.075 set g_balance_grenadelauncher_primary_remote_minbouncecnt 0 set g_balance_grenadelauncher_secondary_type 1 set g_balance_grenadelauncher_secondary_damage 70 @@ -309,9 +311,10 @@ set g_balance_grenadelauncher_secondary_animtime 0.3 set g_balance_grenadelauncher_secondary_ammo 2 set g_balance_grenadelauncher_secondary_health 10 set g_balance_grenadelauncher_secondary_damageforcescale 4 -set g_balance_grenadelauncher_secondary_bouncefactor 0.5 -set g_balance_grenadelauncher_secondary_bouncestop 0.075 set g_balance_grenadelauncher_secondary_remote_detonateprimary 0 + +set g_balance_grenadelauncher_bouncefactor 0.5 +set g_balance_grenadelauncher_bouncestop 0.075 // }}} // {{{ minelayer // TODO set g_balance_minelayer_damage 35 @@ -389,11 +392,10 @@ set g_balance_crylink_primary_refire 0.4 set g_balance_crylink_primary_animtime 0.3 set g_balance_crylink_primary_ammo 2 set g_balance_crylink_primary_bouncedamagefactor 0.5 +set g_balance_crylink_primary_joinspeed 0 set g_balance_crylink_primary_middle_lifetime 5 // range: 35000 full, fades to 70000 set g_balance_crylink_primary_middle_fadetime 5 -set g_balance_crylink_primary_star_lifetime 0.1 // range: 700 full, fades to 2450 -set g_balance_crylink_primary_star_fadetime 0.25 set g_balance_crylink_primary_other_lifetime 0.1 // range: 700 full, fades to 2450 set g_balance_crylink_primary_other_fadetime 0.25 @@ -410,6 +412,7 @@ set g_balance_crylink_secondary_refire 0.5 set g_balance_crylink_secondary_animtime 0.3 set g_balance_crylink_secondary_ammo 2 set g_balance_crylink_secondary_bouncedamagefactor 0.5 +set g_balance_crylink_secondary_joinspeed 0 set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000 set g_balance_crylink_secondary_middle_fadetime 5 @@ -445,6 +448,7 @@ set g_balance_nex_charge_mindmg 40 set g_balance_nex_charge_start 0 set g_balance_nex_charge_rate 0.1 set g_balance_nex_charge_limit 0.5 +set g_balance_nex_charge_rot_rate 0 set g_balance_nex_charge_shot_multiplier 0.5 set g_balance_nex_charge_velocity_rate 0.2 set g_balance_nex_charge_minspeed 400 diff --git a/balanceSamual.cfg b/balanceSamual.cfg index 4b4a91c624..fc16e2ee34 100644 --- a/balanceSamual.cfg +++ b/balanceSamual.cfg @@ -224,6 +224,8 @@ set g_balance_laser_primary_lifetime 30 set g_balance_laser_primary_shotangle 0 set g_balance_laser_primary_delay 0.03 set g_balance_laser_primary_gauntlet 0 +set g_balance_laser_primary_force_zscale 1 +set g_balance_laser_primary_force_velocitybias 0 set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists set g_balance_laser_secondary_damage 25 set g_balance_laser_secondary_edgedamage 10 @@ -237,6 +239,8 @@ set g_balance_laser_secondary_lifetime 30 set g_balance_laser_secondary_shotangle -90 set g_balance_laser_secondary_delay 0 set g_balance_laser_secondary_gauntlet 0 +set g_balance_laser_secondary_force_zscale 1 +set g_balance_laser_secondary_force_velocitybias 0 // }}} // {{{ shotgun set g_balance_shotgun_primary_bullets 6 @@ -290,8 +294,6 @@ set g_balance_grenadelauncher_primary_animtime 0.3 set g_balance_grenadelauncher_primary_ammo 2 set g_balance_grenadelauncher_primary_health 25 set g_balance_grenadelauncher_primary_damageforcescale 4 -set g_balance_grenadelauncher_primary_bouncefactor 0.5 -set g_balance_grenadelauncher_primary_bouncestop 0.075 set g_balance_grenadelauncher_primary_remote_minbouncecnt 0 set g_balance_grenadelauncher_secondary_type 1 @@ -310,9 +312,10 @@ set g_balance_grenadelauncher_secondary_animtime 0.3 set g_balance_grenadelauncher_secondary_ammo 2 set g_balance_grenadelauncher_secondary_health 70 set g_balance_grenadelauncher_secondary_damageforcescale 4 -set g_balance_grenadelauncher_secondary_bouncefactor 0.5 -set g_balance_grenadelauncher_secondary_bouncestop 0.075 set g_balance_grenadelauncher_secondary_remote_detonateprimary 1 + +set g_balance_grenadelauncher_bouncefactor 0.5 +set g_balance_grenadelauncher_bouncestop 0.075 // }}} // {{{ minelayer // TODO set g_balance_minelayer_damage 35 @@ -390,11 +393,10 @@ set g_balance_crylink_primary_refire 0.4 set g_balance_crylink_primary_animtime 0.3 set g_balance_crylink_primary_ammo 2 set g_balance_crylink_primary_bouncedamagefactor 0.5 +set g_balance_crylink_primary_joinspeed 0 set g_balance_crylink_primary_middle_lifetime 5 // range: 35000 full, fades to 70000 set g_balance_crylink_primary_middle_fadetime 5 -set g_balance_crylink_primary_star_lifetime 0.1 // range: 700 full, fades to 2450 -set g_balance_crylink_primary_star_fadetime 0.25 set g_balance_crylink_primary_other_lifetime 0.1 // range: 700 full, fades to 2450 set g_balance_crylink_primary_other_fadetime 0.25 @@ -411,6 +413,7 @@ set g_balance_crylink_secondary_refire 0.1 set g_balance_crylink_secondary_animtime 0.1 set g_balance_crylink_secondary_ammo 2 set g_balance_crylink_secondary_bouncedamagefactor 0.5 +set g_balance_crylink_secondary_joinspeed 0 set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000 set g_balance_crylink_secondary_middle_fadetime 5 @@ -446,6 +449,7 @@ set g_balance_nex_charge_mindmg 40 set g_balance_nex_charge_start 0 set g_balance_nex_charge_rate 0.1 set g_balance_nex_charge_limit 0.5 +set g_balance_nex_charge_rot_rate 0 set g_balance_nex_charge_shot_multiplier 0.5 set g_balance_nex_charge_velocity_rate 0.2 set g_balance_nex_charge_minspeed 400 diff --git a/balanceTest.cfg b/balanceTest.cfg index 7defd001f7..4bfe87bbd8 100644 --- a/balanceTest.cfg +++ b/balanceTest.cfg @@ -176,8 +176,8 @@ set g_projectiles_spread_style 7 // 7: forward + circle with (1-r)(2-r) falloff set g_balance_falldamage_deadminspeed 150 set g_balance_falldamage_minspeed 800 -set g_balance_falldamage_factor 0.20 -set g_balance_falldamage_maxdamage 15 +set g_balance_falldamage_factor 0.02 // maxspeed = minspeed + maxdamage / factor = 4550 +set g_balance_falldamage_maxdamage 75 // }}} // {{{ powerups @@ -214,7 +214,7 @@ set g_balance_grapplehook_health 130 // {{{ laser set g_balance_laser_primary_damage 20 // dps 33, hope that's not too high set g_balance_laser_primary_edgedamage 20 -set g_balance_laser_primary_force 270 +set g_balance_laser_primary_force 200 // this looks insanely low, but actually isn't with zscale and velocitybias set g_balance_laser_primary_radius 60 set g_balance_laser_primary_speed 4000 set g_balance_laser_primary_spread 0 @@ -222,8 +222,10 @@ set g_balance_laser_primary_refire 0.6 set g_balance_laser_primary_animtime 0.6 set g_balance_laser_primary_lifetime 5 set g_balance_laser_primary_shotangle 0 -set g_balance_laser_primary_delay 0.03 +set g_balance_laser_primary_delay 0 set g_balance_laser_primary_gauntlet 0 +set g_balance_laser_primary_force_zscale 1.35 // 270 upforce +set g_balance_laser_primary_force_velocitybias 0.25 set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists set g_balance_laser_secondary_damage 35 set g_balance_laser_secondary_edgedamage 10 @@ -237,6 +239,8 @@ set g_balance_laser_secondary_lifetime 30 set g_balance_laser_secondary_shotangle 0 set g_balance_laser_secondary_delay 0 set g_balance_laser_secondary_gauntlet 0 +set g_balance_laser_secondary_force_zscale 1 +set g_balance_laser_secondary_force_velocitybias 0.25 // }}} // {{{ shotgun set g_balance_shotgun_primary_bullets 10 @@ -290,8 +294,6 @@ set g_balance_grenadelauncher_primary_animtime 0.3 set g_balance_grenadelauncher_primary_ammo 2 set g_balance_grenadelauncher_primary_health 25 set g_balance_grenadelauncher_primary_damageforcescale 4 -set g_balance_grenadelauncher_primary_bouncefactor 0.5 -set g_balance_grenadelauncher_primary_bouncestop 0.075 set g_balance_grenadelauncher_primary_remote_minbouncecnt 0 set g_balance_grenadelauncher_secondary_type 1 @@ -310,9 +312,10 @@ set g_balance_grenadelauncher_secondary_animtime 0.3 set g_balance_grenadelauncher_secondary_ammo 2 set g_balance_grenadelauncher_secondary_health 10 set g_balance_grenadelauncher_secondary_damageforcescale 4 -set g_balance_grenadelauncher_secondary_bouncefactor 0.5 -set g_balance_grenadelauncher_secondary_bouncestop 0.075 set g_balance_grenadelauncher_secondary_remote_detonateprimary 0 + +set g_balance_grenadelauncher_bouncefactor 0.5 +set g_balance_grenadelauncher_bouncestop 0.075 // }}} // {{{ minelayer // TODO set g_balance_minelayer_damage 35 @@ -390,11 +393,10 @@ set g_balance_crylink_primary_refire 1 set g_balance_crylink_primary_animtime 0.4 set g_balance_crylink_primary_ammo 2 set g_balance_crylink_primary_bouncedamagefactor 0.2 +set g_balance_crylink_primary_joinspeed 150 set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000 set g_balance_crylink_primary_middle_fadetime 5 -set g_balance_crylink_primary_star_lifetime 2 // range: 800 full, fades to 1300 -set g_balance_crylink_primary_star_fadetime 0.25 set g_balance_crylink_primary_other_lifetime 2 // range: 800 full, fades to 1300 set g_balance_crylink_primary_other_fadetime 0.25 @@ -411,6 +413,7 @@ set g_balance_crylink_secondary_refire 0.15 set g_balance_crylink_secondary_animtime 0.15 set g_balance_crylink_secondary_ammo 1 set g_balance_crylink_secondary_bouncedamagefactor 0.5 +set g_balance_crylink_secondary_joinspeed 150 set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000 set g_balance_crylink_secondary_middle_fadetime 5 @@ -446,6 +449,7 @@ set g_balance_nex_charge_mindmg 10 set g_balance_nex_charge_start 0 set g_balance_nex_charge_rate 0.35 set g_balance_nex_charge_limit 0.5 +set g_balance_nex_charge_rot_rate 0 set g_balance_nex_charge_shot_multiplier 0 set g_balance_nex_charge_velocity_rate 0 set g_balance_nex_charge_minspeed 400 diff --git a/balanceXonotic.cfg b/balanceXonotic.cfg index d50669f3a0..55d0fe69f9 100644 --- a/balanceXonotic.cfg +++ b/balanceXonotic.cfg @@ -31,8 +31,8 @@ set g_warmup_start_ammo_nails 150 "starting values when being in warmup-stage" set g_warmup_start_ammo_rockets 50 "starting values when being in warmup-stage" set g_warmup_start_ammo_cells 50 "starting values when being in warmup-stage" set g_warmup_start_ammo_fuel 0 "starting values when being in warmup-stage" -set g_lms_start_health 200 -set g_lms_start_armor 100 +set g_lms_start_health 250 +set g_lms_start_armor 250 set g_lms_start_ammo_shells 30 set g_lms_start_ammo_nails 250 set g_lms_start_ammo_rockets 100 @@ -66,34 +66,34 @@ set g_pickup_rockets_weapon 15 set g_pickup_rockets_max 150 set g_pickup_cells 30 set g_pickup_cells_weapon 20 -set g_pickup_cells_max 200 +set g_pickup_cells_max 150 set g_pickup_fuel 25 set g_pickup_fuel_weapon 15 set g_pickup_fuel_jetpack 50 set g_pickup_fuel_max 100 set g_pickup_armorsmall 5 -set g_pickup_armorsmall_max 200 +set g_pickup_armorsmall_max 250 set g_pickup_armorsmall_anyway 1 set g_pickup_armormedium 25 -set g_pickup_armormedium_max 200 +set g_pickup_armormedium_max 250 set g_pickup_armormedium_anyway 1 set g_pickup_armorbig 50 -set g_pickup_armorbig_max 200 +set g_pickup_armorbig_max 250 set g_pickup_armorbig_anyway 1 set g_pickup_armorlarge 100 -set g_pickup_armorlarge_max 200 +set g_pickup_armorlarge_max 250 set g_pickup_armorlarge_anyway 1 set g_pickup_healthsmall 5 -set g_pickup_healthsmall_max 200 +set g_pickup_healthsmall_max 250 set g_pickup_healthsmall_anyway 1 set g_pickup_healthmedium 25 -set g_pickup_healthmedium_max 100 +set g_pickup_healthmedium_max 150 set g_pickup_healthmedium_anyway 0 set g_pickup_healthlarge 50 -set g_pickup_healthlarge_max 100 +set g_pickup_healthlarge_max 150 set g_pickup_healthlarge_anyway 0 set g_pickup_healthmega 100 -set g_pickup_healthmega_max 200 +set g_pickup_healthmega_max 250 set g_pickup_healthmega_anyway 1 set g_pickup_respawntime_short 15 set g_pickup_respawntime_medium 20 @@ -155,7 +155,7 @@ set g_balance_firetransfer_time 0.9 set g_balance_firetransfer_damage 0.8 set g_throughfloor_damage 0.5 set g_throughfloor_force 0.7 -set g_projectiles_newton_style 0 +set g_projectiles_newton_style 2 // possible values: // 0: absolute velocity projectiles (like Quake) // 1: relative velocity projectiles, "Newtonian" (like Tribes 2) @@ -164,7 +164,7 @@ set g_projectiles_newton_style 0 // 4: just add the player velocity length to the absolute velocity (tZork's sniper rockets) set g_projectiles_newton_style_2_minfactor 0.7 set g_projectiles_newton_style_2_maxfactor 5 -set g_projectiles_spread_style 4 +set g_projectiles_spread_style 7 // possible values: // 0: forward + solid sphere (like Quake) - varies velocity // 1: forward + flattened solid sphere @@ -214,7 +214,7 @@ set g_balance_grapplehook_health 130 // {{{ laser set g_balance_laser_primary_damage 20 // dps 33, hope that's not too high set g_balance_laser_primary_edgedamage 20 -set g_balance_laser_primary_force 235 +set g_balance_laser_primary_force 150 // this looks insanely low, but actually isn't with zscale and velocitybias set g_balance_laser_primary_radius 60 set g_balance_laser_primary_speed 4000 set g_balance_laser_primary_spread 0 @@ -224,6 +224,8 @@ set g_balance_laser_primary_lifetime 5 set g_balance_laser_primary_shotangle 0 set g_balance_laser_primary_delay 0 set g_balance_laser_primary_gauntlet 0 +set g_balance_laser_primary_force_zscale 2 // 300 upforce +set g_balance_laser_primary_force_velocitybias 0.3 set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists set g_balance_laser_secondary_damage 200 // dps set g_balance_laser_secondary_edgedamage 0 @@ -237,6 +239,8 @@ set g_balance_laser_secondary_lifetime 0 set g_balance_laser_secondary_shotangle 0 set g_balance_laser_secondary_delay 0 set g_balance_laser_secondary_gauntlet 1 +set g_balance_laser_secondary_force_zscale 1.25 +set g_balance_laser_secondary_force_velocitybias 0 // }}} // {{{ shotgun set g_balance_shotgun_primary_bullets 20 @@ -290,8 +294,6 @@ set g_balance_grenadelauncher_primary_animtime 0.4 set g_balance_grenadelauncher_primary_ammo 2 set g_balance_grenadelauncher_primary_health 80 set g_balance_grenadelauncher_primary_damageforcescale 0 -set g_balance_grenadelauncher_primary_bouncefactor 0.5 -set g_balance_grenadelauncher_primary_bouncestop 0.12 set g_balance_grenadelauncher_primary_remote_minbouncecnt 0 set g_balance_grenadelauncher_secondary_type 1 @@ -310,9 +312,10 @@ set g_balance_grenadelauncher_secondary_animtime 0.4 set g_balance_grenadelauncher_secondary_ammo 2 set g_balance_grenadelauncher_secondary_health 40 set g_balance_grenadelauncher_secondary_damageforcescale 0 -set g_balance_grenadelauncher_secondary_bouncefactor 0.5 -set g_balance_grenadelauncher_secondary_bouncestop 0.12 set g_balance_grenadelauncher_secondary_remote_detonateprimary 0 + +set g_balance_grenadelauncher_bouncefactor 0.5 +set g_balance_grenadelauncher_bouncestop 0.12 // }}} // {{{ minelayer // TODO set g_balance_minelayer_damage 35 @@ -390,11 +393,10 @@ set g_balance_crylink_primary_refire 0.8 set g_balance_crylink_primary_animtime 0.4 set g_balance_crylink_primary_ammo 2 set g_balance_crylink_primary_bouncedamagefactor 0.2 +set g_balance_crylink_primary_joinspeed 150 set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000 set g_balance_crylink_primary_middle_fadetime 5 -set g_balance_crylink_primary_star_lifetime 2 // range: 800 full, fades to 1300 -set g_balance_crylink_primary_star_fadetime 0.25 set g_balance_crylink_primary_other_lifetime 2 // range: 800 full, fades to 1300 set g_balance_crylink_primary_other_fadetime 0.25 @@ -411,6 +413,7 @@ set g_balance_crylink_secondary_refire 0.15 set g_balance_crylink_secondary_animtime 0.15 set g_balance_crylink_secondary_ammo 1 set g_balance_crylink_secondary_bouncedamagefactor 0.5 +set g_balance_crylink_secondary_joinspeed 0 set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000 set g_balance_crylink_secondary_middle_fadetime 5 @@ -443,9 +446,10 @@ set g_balance_nex_secondary_damagefalloff_forcehalflife 0 set g_balance_nex_charge 1 set g_balance_nex_charge_mindmg 40 -set g_balance_nex_charge_start 0.2 +set g_balance_nex_charge_start 0.5 set g_balance_nex_charge_rate 0.05 set g_balance_nex_charge_limit 0.5 +set g_balance_nex_charge_rot_rate 0.01 set g_balance_nex_charge_shot_multiplier 0.675 set g_balance_nex_charge_velocity_rate 0.15 set g_balance_nex_charge_minspeed 400 @@ -460,7 +464,7 @@ set g_balance_minstanex_ammo 10 set g_balance_hagar_primary_damage 12 set g_balance_hagar_primary_edgedamage 6 set g_balance_hagar_primary_force 70 -set g_balance_hagar_primary_radius 100 +set g_balance_hagar_primary_radius 125 set g_balance_hagar_primary_spread 0.1 set g_balance_hagar_primary_speed 1800 set g_balance_hagar_primary_lifetime 5 @@ -470,7 +474,7 @@ set g_balance_hagar_secondary 1 set g_balance_hagar_secondary_damage 12 set g_balance_hagar_secondary_edgedamage 6 set g_balance_hagar_secondary_force 70 -set g_balance_hagar_secondary_radius 100 +set g_balance_hagar_secondary_radius 135 set g_balance_hagar_secondary_spread 0.15 set g_balance_hagar_secondary_speed 1800 set g_balance_hagar_secondary_lifetime_min 5 @@ -479,7 +483,7 @@ set g_balance_hagar_secondary_refire 0.12 set g_balance_hagar_secondary_ammo 1 // }}} // {{{ rocketlauncher // TODO -set g_balance_rocketlauncher_damage 100 +set g_balance_rocketlauncher_damage 90 set g_balance_rocketlauncher_edgedamage 33 set g_balance_rocketlauncher_force 350 set g_balance_rocketlauncher_radius 125 @@ -537,20 +541,20 @@ set g_balance_hook_secondary_power 3 // effect behaves like a square function set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds // }}} // {{{ hlac -set g_balance_hlac_primary_spread_min 0 -set g_balance_hlac_primary_spread_max 0 -set g_balance_hlac_primary_spread_add 0 -set g_balance_hlac_primary_spread_crouchmod 0 +set g_balance_hlac_primary_spread_min 0.01 +set g_balance_hlac_primary_spread_max 0.075 +set g_balance_hlac_primary_spread_add 0.001 +set g_balance_hlac_primary_spread_crouchmod 0.25 set g_balance_hlac_primary_damage 15 -set g_balance_hlac_primary_edgedamage 0 +set g_balance_hlac_primary_edgedamage 5 set g_balance_hlac_primary_force 70 set g_balance_hlac_primary_radius 30 set g_balance_hlac_primary_speed 2500 set g_balance_hlac_primary_lifetime 5 set g_balance_hlac_primary_refire 0.1 -set g_balance_hlac_primary_animtime 0.4 +set g_balance_hlac_primary_animtime 0.3 set g_balance_hlac_primary_ammo 1 set g_balance_hlac_secondary 1 @@ -558,15 +562,15 @@ set g_balance_hlac_secondary_spread 0.15 set g_balance_hlac_secondary_spread_crouchmod 0.5 set g_balance_hlac_secondary_damage 20 -set g_balance_hlac_secondary_edgedamage 0 -set g_balance_hlac_secondary_force 40 +set g_balance_hlac_secondary_edgedamage 5 +set g_balance_hlac_secondary_force 100 set g_balance_hlac_secondary_radius 35 set g_balance_hlac_secondary_speed 2500 set g_balance_hlac_secondary_lifetime 5 -set g_balance_hlac_secondary_refire 1 -set g_balance_hlac_secondary_animtime 0.7 -set g_balance_hlac_secondary_ammo 10 +set g_balance_hlac_secondary_refire 0.8 +set g_balance_hlac_secondary_animtime 0.6 +set g_balance_hlac_secondary_ammo 4 set g_balance_hlac_secondary_shots 6 // }}} // {{{ campingrifle @@ -576,7 +580,7 @@ set g_balance_campingrifle_auto_reload_after_changing_weapons 0 set g_balance_campingrifle_bursttime 0 set g_balance_campingrifle_primary_tracer 1 set g_balance_campingrifle_primary_damage 75 -set g_balance_campingrifle_primary_headshotaddeddamage 75 +set g_balance_campingrifle_primary_headshotaddeddamage 125 set g_balance_campingrifle_primary_spread 0 set g_balance_campingrifle_primary_force 2 set g_balance_campingrifle_primary_speed 40000 @@ -590,7 +594,7 @@ set g_balance_campingrifle_primary_bullethail 0 // empty magazine on shot set g_balance_campingrifle_secondary 1 set g_balance_campingrifle_secondary_tracer 0 set g_balance_campingrifle_secondary_damage 50 -set g_balance_campingrifle_secondary_headshotaddeddamage 50 // 50 damage only on head +set g_balance_campingrifle_secondary_headshotaddeddamage 75 set g_balance_campingrifle_secondary_spread 0 set g_balance_campingrifle_secondary_force 2 set g_balance_campingrifle_secondary_speed 20000 diff --git a/balancetZork.cfg b/balancetZork.cfg index 7ab11edf78..7bf8285d90 100644 --- a/balancetZork.cfg +++ b/balancetZork.cfg @@ -224,6 +224,8 @@ set g_balance_laser_primary_lifetime 5 set g_balance_laser_primary_shotangle 0 set g_balance_laser_primary_delay 0 set g_balance_laser_primary_gauntlet 0 +set g_balance_laser_primary_force_zscale 1 +set g_balance_laser_primary_force_velocitybias 0 set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists set g_balance_laser_secondary_damage 35 set g_balance_laser_secondary_edgedamage 10 @@ -237,6 +239,8 @@ set g_balance_laser_secondary_lifetime 30 set g_balance_laser_secondary_shotangle 0 set g_balance_laser_secondary_delay 0 set g_balance_laser_secondary_gauntlet 0 +set g_balance_laser_secondary_force_zscale 1 +set g_balance_laser_secondary_force_velocitybias 0 // }}} // {{{ shotgun set g_balance_shotgun_primary_bullets 10 @@ -290,8 +294,6 @@ set g_balance_grenadelauncher_primary_animtime 0.3 set g_balance_grenadelauncher_primary_ammo 2 set g_balance_grenadelauncher_primary_health 25 set g_balance_grenadelauncher_primary_damageforcescale 4 -set g_balance_grenadelauncher_primary_bouncefactor 0.5 -set g_balance_grenadelauncher_primary_bouncestop 0.075 set g_balance_grenadelauncher_primary_remote_minbouncecnt 0 set g_balance_grenadelauncher_secondary_type 1 @@ -310,9 +312,10 @@ set g_balance_grenadelauncher_secondary_animtime 0.3 set g_balance_grenadelauncher_secondary_ammo 2 set g_balance_grenadelauncher_secondary_health 10 set g_balance_grenadelauncher_secondary_damageforcescale 4 -set g_balance_grenadelauncher_secondary_bouncefactor 0.5 -set g_balance_grenadelauncher_secondary_bouncestop 0.075 set g_balance_grenadelauncher_secondary_remote_detonateprimary 0 + +set g_balance_grenadelauncher_bouncefactor 0.5 +set g_balance_grenadelauncher_bouncestop 0.075 // }}} // {{{ minelayer // TODO set g_balance_minelayer_damage 35 @@ -391,11 +394,10 @@ set g_balance_crylink_primary_refire 1 set g_balance_crylink_primary_animtime 0.4 set g_balance_crylink_primary_ammo 2 set g_balance_crylink_primary_bouncedamagefactor 0.2 +set g_balance_crylink_primary_joinspeed 0 set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000 set g_balance_crylink_primary_middle_fadetime 5 -set g_balance_crylink_primary_star_lifetime 2 // range: 800 full, fades to 1300 -set g_balance_crylink_primary_star_fadetime 0.25 set g_balance_crylink_primary_other_lifetime 2 // range: 800 full, fades to 1300 set g_balance_crylink_primary_other_fadetime 0.25 @@ -412,6 +414,7 @@ set g_balance_crylink_secondary_refire 0.15 set g_balance_crylink_secondary_animtime 0.15 set g_balance_crylink_secondary_ammo 1 set g_balance_crylink_secondary_bouncedamagefactor 0.5 +set g_balance_crylink_secondary_joinspeed 0 set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000 set g_balance_crylink_secondary_middle_fadetime 5 @@ -447,6 +450,7 @@ set g_balance_nex_charge_mindmg 10 set g_balance_nex_charge_start 0 set g_balance_nex_charge_rate 0.35 set g_balance_nex_charge_limit 0.5 +set g_balance_nex_charge_rot_rate 0 set g_balance_nex_charge_shot_multiplier 0 set g_balance_nex_charge_velocity_rate 0 set g_balance_nex_charge_minspeed 400 diff --git a/defaultXonotic.cfg b/defaultXonotic.cfg index ee119b2262..8af70b4776 100644 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@ -179,7 +179,15 @@ seta crosshair_fireball_alpha 1 "crosshair alpha value to display when wielding seta crosshair_fireball_size 1 "crosshair size when wielding the fireball" seta crosshair_ring_size 2 "bullet counter ring size for Rifle, velocity ring for Nex" seta crosshair_campingrifle_bulletcounter_alpha 0.15 + seta crosshair_nexvelocity_alpha 0.15 +seta crosshair_nexvelocity_currentcharge_scale 30 +seta crosshair_nexvelocity_currentcharge_alpha 0.15 +seta crosshair_nexvelocity_currentcharge_color_red 0.8 +seta crosshair_nexvelocity_currentcharge_color_green 0 +seta crosshair_nexvelocity_currentcharge_color_blue 0 +seta crosshair_nexvelocity_currentcharge_movingavg_rate 0.05 + 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" @@ -323,11 +331,11 @@ set sv_fragmessage_information_typefrag 1 "Enable typefrag display information, // use default physics set sv_friction_on_land 0 -exec physicsNoQWBunny-xpmbased.cfg -set sv_player_viewoffset "0 0 42" "view offset of the player model" +set sv_player_viewoffset "0 0 35" "view offset of the player model" set sv_player_mins "-16 -16 -24" "playermodel mins" set sv_player_maxs "16 16 45" "playermodel maxs" +set sv_player_headsize "24 24 12" "playermodel headshot bbox size (centered at top of player bbox, preview with r_showbboxes)" // actually SHOULD be 19.2 19.2 10 according to docs set sv_player_crouch_viewoffset "0 0 20" "view offset of the player model when crouched" set sv_player_crouch_mins "-16 -16 -24" "mins of a crouched playermodel" set sv_player_crouch_maxs "16 16 25" "maxs of a crouched playermodel" @@ -652,8 +660,6 @@ set g_ctf_flag_pickup_effects 1 set g_ctf_flag_capture_effects 1 set g_ctf_captimerecord_always 0 "if enabled, assisted CTF records (with other players on the server) are recorded too" -exec ctfscoring-ai.cfg - // runematch set g_runematch 0 "Runematch: pick up and hold the runes, special items that give you points, a special power (rune) and a disadvantage (curse)" set g_runematch_pointrate 5 @@ -825,11 +831,6 @@ set g_nexball_trail_color 254 "1-256 for different colors (Quake palette, 2 set g_nexball_radar_showallplayers 1 "1: show every player and the ball on the radar 0: only show teammates and the ball on the radar" -// server game balance settings -// powerup balance settings -// weapon balance settings follow -exec balanceXonotic.cfg - set g_bloodloss 0 "amount of health below which blood loss occurs" set g_footsteps 1 "serverside footstep sounds" @@ -877,7 +878,6 @@ r_glsl_offsetmapping_reliefmapping 0 r_glsl_offsetmapping_scale 0.02 // execute effects-normal.cfg to make sure that all effect settings are reset alias menu_sync "" // will be re-aliased later -exec effects-normal.cfg // misc fs_empty_files_in_pack_mark_deletions 1 // makes patches able to delete files @@ -1334,21 +1334,11 @@ seta hud_configure_grid_alpha 0.15 "alpha for visible grid when in configure mod seta sbar_info_pos 0 "Y-axis distance from lower right corner for engine info prints" -// hud cvar descriptions -exec _hud_descriptions.cfg -// exec the default skin config -// please add any new cvars into the hud_save script in qcsrc/client/hud.qc for consistency -exec hud_luminos.cfg - // user preference cvars (i.e. shouldn't be adjusted by a skin config) seta hud_panel_weapons_label 1 "1 = show number of weapon, 2 = show bound key of weapon" seta hud_panel_weapons_complainbubble_time 1 "time that a new entry stays until it fades out" seta hud_panel_weapons_complainbubble_fadetime 0.25 "fade out time" -seta hud_panel_weapons_accuracy 1 "show accuracy color as the weapon icon background" -seta hud_panel_weapons_accuracy_color0 "1 0 0" -seta hud_panel_weapons_accuracy_color1 "1 1 0" -seta hud_panel_weapons_accuracy_color2 "0 1 0" -seta hud_panel_weapons_accuracy_color_levels "0 20 100" "accuracy values at which a specified color (hud_panel_weapons_accuracy_color) will be used. If your accuracy is between 2 of these values then a mix of the Xth and X+1th colors will be used. You can specify up to 10 values, in increasing order" +seta hud_panel_weapons_accuracy 1 "show accuracy color as the weapon icon background; colors can be configured with accuracy_color* cvars" seta hud_panel_weapons_ammo 1 "show ammo as a status bar" seta hud_panel_weapons_ammo_full_shells 50 "show 100% of the status bar at this ammo count" seta hud_panel_weapons_ammo_full_nails 200 "show 100% of the status bar at this ammo count" @@ -1382,7 +1372,7 @@ seta scoreboard_columns default seta scoreboard_border_thickness 1 "scoreboard border thickness" seta scoreboard_accuracy_border_thickness 1 "accuracy stats border thickness" seta scoreboard_accuracy_doublerows 0 "use two rows instead of one" -seta scoreboard_accuracy 1 "show weapon accuracy stats panel on scoreboard" +seta scoreboard_accuracy 1 "show weapon accuracy stats panel on scoreboard; colors can be configured with accuracy_color* cvars" seta scoreboard_color_bg_r 0 "red color component of the scoreboard background" seta scoreboard_color_bg_g 0.4 "green color component of the scoreboard background" seta scoreboard_color_bg_b 0.6 "blue color component of the scoreboard background" @@ -1400,6 +1390,11 @@ seta scoreboard_offset_left 0.04 "how many pixels the scoreboard is offset from seta scoreboard_offset_right 0.148 "how many pixels the scoreboard is offset from the right screen edge" seta scoreboard_bg_scale 0.25 "scale for the tiled scoreboard background" +seta accuracy_color_levels "0 20 100" "accuracy values at which a specified color (accuracy_color) will be used. If your accuracy is between 2 of these values then a mix of the Xth and X+1th colors will be used. You can specify up to 10 values, in increasing order" +seta accuracy_color0 "1 0 0" +seta accuracy_color1 "1 1 0" +seta accuracy_color2 "0 1 0" + // for menu server list (eventually make them have engine support?) seta menu_slist_showfull 1 "show servers even if they are full and have no slots to join" seta menu_slist_showempty 1 "show servers even if they are no empty and have no opponents to play against" @@ -1578,8 +1573,6 @@ set sv_clones 0 "number of clones a player may make (reset by the \"kill\" comma set cl_handicap 1 "the higher, the more damage you will receive (client setting)" -exec turrets.cfg - // must be at the bottom of this file: // alias for switching the teamselect menu alias menu_showteamselect "menu_cmd directmenu TeamSelect" @@ -1972,8 +1965,25 @@ seta cl_allow_uid2name -1 "-1 = ask if the player wants to disable/enable this f // polygonoffset for submodel SUCKS SUCKS SUCKS (only a hack for quake1, we don't need that) r_polygonoffset_submodel_offset 0 r_polygonoffset_submodel_factor 0 -// workaround for "decals flicker all the time" - note that this polygonoffset still is not perfect, also, why do decals need higher polygonoffset when in a warpzone -// this workaround causes decals to sometimes be visible through walls! (not seen it happen yet though other than on zfightometer) -// once the issue is found, please revert back to the default of -14 -r_polygonoffset_decals_offset -100 +// decals: need a higher polygonoffset than default to not compete with _decal surfaces too much +r_polygonoffset_decals_offset -28 r_polygonoffset_decals_factor 0 +// this is mainly for _decal entities (their shaders should use "polygonoffset" shader parameter) - this is "good enough" as it seems, but smaller than the decals one so these don't zfight decals +mod_q3shader_default_polygonoffset -14 +mod_q3shader_default_polygonfactor 0 + +// allow fullbright +set sv_allow_fullbright 0 "when set, clients may use r_fullbright on this server without getting a night vision effect overlay" + +// other config files +exec balanceXonotic.cfg +exec ctfscoring-ai.cfg +exec effects-normal.cfg +exec physicsNoQWBunny-xpmbased.cfg +exec turrets.cfg + +// hud cvar descriptions +exec _hud_descriptions.cfg +// exec the default skin config +// please add any new cvars into the hud_save script in qcsrc/client/hud.qc for consistency +exec hud_luminos.cfg diff --git a/effectinfo.txt b/effectinfo.txt index 3ad766d85f..9529ebecc8 100644 --- a/effectinfo.txt +++ b/effectinfo.txt @@ -5060,3 +5060,56 @@ velocitymultiplier 2.5 airfriction 8 gravity 1.3 stretchfactor 0.1 + + + +// crylink linkjoin effect +// decal +// used in qcsrc/client/damage.qc: pointparticles(particleeffectnum("crylink_linkjoin"), org2, '0 0 0', 1) +effect crylink_linkjoin +countabsolute 1 +type decal +tex 47 47 +size 8 8 +alpha 256 256 0 +originjitter 12 12 12 +//lightradius 60 +//lightradiusfade 300 +//lightcolor 3.2 0.4 4 +// purple flare effect +effect crylink_linkjoin +countabsolute 1 +type static +tex 39 39 +color 0x504060 0x504060 +size 8 8 +alpha 256 256 512 +// purple sparks +effect crylink_linkjoin +count 10 +type spark +tex 41 41 +color 0xA040C0 0xA040C0 +bounce 2 +size 1 2 +alpha 256 256 1024 +velocityjitter 256 256 256 +// purple splash +effect crylink_linkjoin +count 1.5 +type static +color 0xE070FF 0xE070FF +size 8 8 +alpha 256 256 512 +velocityjitter 8 8 8 +// purple splash +effect crylink_linkjoin +count 1.5 +type static +color 0xE070FF 0xE070FF +size 8 8 +alpha 256 256 1024 +velocityjitter 32 32 32 + + + diff --git a/gfx/crosshair_ring_inner.tga b/gfx/crosshair_ring_inner.tga new file mode 100644 index 0000000000..3bf51b5fba Binary files /dev/null and b/gfx/crosshair_ring_inner.tga differ diff --git a/gfx/menu/xaw/colorpicker_selected.tga b/gfx/menu/xaw/colorpicker_selected.tga new file mode 100644 index 0000000000..605e932017 Binary files /dev/null and b/gfx/menu/xaw/colorpicker_selected.tga differ diff --git a/hud_luminos.cfg b/hud_luminos.cfg index 5660da4b77..0ded419425 100644 --- a/hud_luminos.cfg +++ b/hud_luminos.cfg @@ -81,7 +81,7 @@ seta hud_panel_healtharmor_bg_color_team "" seta hud_panel_healtharmor_bg_alpha "" seta hud_panel_healtharmor_bg_border "" seta hud_panel_healtharmor_bg_padding "" -seta hud_panel_healtharmor_flip "0 +seta hud_panel_healtharmor_flip "0" seta hud_panel_healtharmor_iconalign "4" seta hud_panel_healtharmor_baralign "4" seta hud_panel_healtharmor_progressbar "1" diff --git a/hud_nexuiz.cfg b/hud_nexuiz.cfg index 93e8c99591..bdd7a97f2a 100644 --- a/hud_nexuiz.cfg +++ b/hud_nexuiz.cfg @@ -81,7 +81,7 @@ seta hud_panel_healtharmor_bg_color_team "" seta hud_panel_healtharmor_bg_alpha "" seta hud_panel_healtharmor_bg_border "" seta hud_panel_healtharmor_bg_padding "" -seta hud_panel_healtharmor_flip "0 +seta hud_panel_healtharmor_flip "0" seta hud_panel_healtharmor_iconalign "0" seta hud_panel_healtharmor_baralign "0" seta hud_panel_healtharmor_progressbar "0" diff --git a/physicsLeeStricklin.cfg b/physicsLeeStricklin.cfg index 5d9a1280b6..dc82a81f54 100644 --- a/physicsLeeStricklin.cfg +++ b/physicsLeeStricklin.cfg @@ -1,29 +1,34 @@ -// These have been modified from Nexuiz 2.4.2's physicsQBR.cfg file and a bunch of other crap div0 threw on here :P -// DO NOT SCREW WITH friction on land, edge friction, step height, or sv_airaccel_qw -sv_gravity 819 -sv_maxspeed 420 -sv_maxairspeed 283 +// "NoQWBunny" physics based on XPM +sv_gravity 800 +sv_maxspeed 320 +sv_maxairspeed 424 sv_stopspeed 100 sv_accelerate 13 -sv_airaccelerate 6 -sv_friction 9.6 // higher values make you slide less -edgefriction 1 // div0 says no! lol +sv_airaccelerate 2 +sv_friction 8 +edgefriction 1 sv_stepheight 26 -sv_jumpvelocity 304 +// Q1: 16+2 +// Nex: 32+2 +// we try: 24+2 + +// actually, what we want is 266.6666 for 180bpm +// but 260 takes same amount of frames and is nicer to mappers +sv_jumpvelocity 260 sv_wateraccelerate -1 sv_waterfriction -1 -sv_airaccel_sideways_friction 0 // pain in the ass to tweak without screwing up the strafing -sv_airaccel_qw -0.93 //given a negative value to combat potential cheats, was told by divVerent not to mess with it +sv_airaccel_sideways_friction 0 +sv_airaccel_qw -0.8 -sv_airstopaccelerate 0 -sv_airstrafeaccelerate 0 -sv_maxairstrafespeed 0 -sv_airstrafeaccel_qw 0 -sv_aircontrol 0 -sv_aircontrol_penalty 0 +sv_airstopaccelerate 3 +sv_airstrafeaccelerate 24 +sv_maxairstrafespeed 100 +sv_airstrafeaccel_qw -0.95 +sv_aircontrol 125 +sv_aircontrol_penalty 150 sv_aircontrol_power 2 -sv_airspeedlimit_nonqw 0 +sv_airspeedlimit_nonqw 800 sv_warsowbunny_turnaccel 0 sv_warsowbunny_accel 0.1593 sv_warsowbunny_topspeed 925 @@ -31,5 +36,5 @@ sv_warsowbunny_backtosideratio 0.8 sv_friction_on_land 0 sv_doublejump 0 sv_jumpspeedcap_min "" -sv_jumpspeedcap_max 0.38 -sv_jumpspeedcap_max_disable_on_ramps 0 +sv_jumpspeedcap_max "" +sv_jumpspeedcap_max_disable_on_ramps 1 diff --git a/physicsLeeStricklinOld.cfg b/physicsLeeStricklinOld.cfg new file mode 100644 index 0000000000..5d9a1280b6 --- /dev/null +++ b/physicsLeeStricklinOld.cfg @@ -0,0 +1,35 @@ +// These have been modified from Nexuiz 2.4.2's physicsQBR.cfg file and a bunch of other crap div0 threw on here :P +// DO NOT SCREW WITH friction on land, edge friction, step height, or sv_airaccel_qw +sv_gravity 819 +sv_maxspeed 420 +sv_maxairspeed 283 + +sv_stopspeed 100 +sv_accelerate 13 +sv_airaccelerate 6 +sv_friction 9.6 // higher values make you slide less +edgefriction 1 // div0 says no! lol +sv_stepheight 26 +sv_jumpvelocity 304 +sv_wateraccelerate -1 +sv_waterfriction -1 +sv_airaccel_sideways_friction 0 // pain in the ass to tweak without screwing up the strafing +sv_airaccel_qw -0.93 //given a negative value to combat potential cheats, was told by divVerent not to mess with it + +sv_airstopaccelerate 0 +sv_airstrafeaccelerate 0 +sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 +sv_aircontrol 0 +sv_aircontrol_penalty 0 +sv_aircontrol_power 2 +sv_airspeedlimit_nonqw 0 +sv_warsowbunny_turnaccel 0 +sv_warsowbunny_accel 0.1593 +sv_warsowbunny_topspeed 925 +sv_warsowbunny_backtosideratio 0.8 +sv_friction_on_land 0 +sv_doublejump 0 +sv_jumpspeedcap_min "" +sv_jumpspeedcap_max 0.38 +sv_jumpspeedcap_max_disable_on_ramps 0 diff --git a/qcsrc/client/Defs.qc b/qcsrc/client/Defs.qc index 0d822e1642..8e47e6fa5b 100644 --- a/qcsrc/client/Defs.qc +++ b/qcsrc/client/Defs.qc @@ -267,3 +267,7 @@ float bgmtime; string weaponorder_byimpulse; string weaponorder_bypriority; + +float nex_charge_movingavg; + +float serverflags; diff --git a/qcsrc/client/Main.qc b/qcsrc/client/Main.qc index 4846a9fef5..d358a59a53 100644 --- a/qcsrc/client/Main.qc +++ b/qcsrc/client/Main.qc @@ -1093,6 +1093,8 @@ void Ent_Init() nex_scope = !ReadByte(); campingrifle_scope = !ReadByte(); + serverflags = ReadByte(); + if(!postinit) PostInit(); } diff --git a/qcsrc/client/View.qc b/qcsrc/client/View.qc index 90e0356cbb..119941ad2c 100644 --- a/qcsrc/client/View.qc +++ b/qcsrc/client/View.qc @@ -566,7 +566,8 @@ 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; @@ -855,6 +856,9 @@ void CSQC_UpdateView(float w, float h) float nex_charge; nex_charge = getstatf(STAT_NEX_CHARGE); + 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) { @@ -866,6 +870,15 @@ void CSQC_UpdateView(float w, float h) } else if (activeweapon == WEP_NEX && nex_charge) // ring around crosshair representing velocity-dependent damage for the nex { + vector rgb; + // indicate how much we're charging right now with an inner circle + a = cvar("crosshair_nexvelocity_currentcharge_alpha"); + nex_charge_movingavg = (1 - cvar("crosshair_nexvelocity_currentcharge_movingavg_rate")) * nex_charge_movingavg + cvar("crosshair_nexvelocity_currentcharge_movingavg_rate") * nex_charge; + + rgb = eX * cvar("crosshair_nexvelocity_currentcharge_color_red") + eY * cvar("crosshair_nexvelocity_currentcharge_color_green") + eZ * cvar("crosshair_nexvelocity_currentcharge_color_blue"); + DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring_inner.tga", bound(0, cvar("crosshair_nexvelocity_currentcharge_scale") * (nex_charge - nex_charge_movingavg), 1), rgb, wcross_alpha * a, DRAWFLAG_ADDITIVE); + + // draw the charge a = cvar("crosshair_nexvelocity_alpha"); DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, "gfx/crosshair_ring.tga", nex_charge, wcross_color, wcross_alpha * a, DRAWFLAG_ADDITIVE); } @@ -1280,18 +1293,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)); + } + // let know that acc_col[] needs to be loaded + acc_col_x[0] = -1; } HUD_Main(); // always run these functions for alpha checks diff --git a/qcsrc/client/autocvars.qh b/qcsrc/client/autocvars.qh index ea0fcecedf..2834071932 100644 --- a/qcsrc/client/autocvars.qh +++ b/qcsrc/client/autocvars.qh @@ -6,17 +6,12 @@ var float autocvar_cl_gibs_sloppy = 1; var float autocvar_cl_casings_ticrate = 0.1; var float autocvar_cl_casings_sloppy = 1; -var float autocvar_cl_gentle; -var float autocvar_cl_gentle_gibs; -var float autocvar_cl_gentle_messages; - var float autocvar_scoreboard_color_bg_team; var float autocvar__menu_alpha; var float autocvar__hud_configure; var float autocvar_hud_configure_teamcolorforced; -var float autocvar_hud_configure_checkcollisions; var float autocvar_hud_configure_bg_minalpha; var float autocvar_hud_configure_grid; var float autocvar_hud_configure_grid_xsize; @@ -26,19 +21,9 @@ var float autocvar_hud_configure_grid_alpha; var float autocvar__con_chat_maximized; var string autocvar__hud_panelorder; -var string autocvar_hud_skin; var string autocvar_hud_dock; -var string autocvar_hud_dock_color; -var float autocvar_hud_dock_color_team; -var float autocvar_hud_dock_alpha; var float autocvar_hud_progressbar_alpha; -var vector autocvar_hud_progressbar_strength_color; -var vector autocvar_hud_progressbar_shield_color; -var vector autocvar_hud_progressbar_health_color; -var vector autocvar_hud_progressbar_armor_color; -var vector autocvar_hud_progressbar_fuel_color; -var vector autocvar_hud_progressbar_nexball_color; var string autocvar_hud_panel_bg; var vector autocvar_hud_panel_bg_color; @@ -49,189 +34,37 @@ var float autocvar_hud_panel_bg_padding; var float autocvar_hud_panel_fg_alpha; var float autocvar_hud_panel_weapons; -var vector autocvar_hud_panel_weapons_pos; -var vector autocvar_hud_panel_weapons_size; -var string autocvar_hud_panel_weapons_bg; -var string autocvar_hud_panel_weapons_bg_color; -var string autocvar_hud_panel_weapons_bg_color_team; -var string autocvar_hud_panel_weapons_bg_alpha; -var string autocvar_hud_panel_weapons_bg_border; -var string autocvar_hud_panel_weapons_bg_padding; -var float autocvar_hud_panel_weapons_aspect; -var float autocvar_hud_panel_weapons_accuracy; -var float autocvar_hud_panel_weapons_ammo; -var vector autocvar_hud_panel_weapons_ammo_color; -var float autocvar_hud_panel_weapons_ammo_alpha; -var float autocvar_hud_panel_weapons_ammo_full_shells; -var float autocvar_hud_panel_weapons_ammo_full_nails; -var float autocvar_hud_panel_weapons_ammo_full_rockets; -var float autocvar_hud_panel_weapons_ammo_full_cells; -var float autocvar_hud_panel_weapons_ammo_full_fuel; -var float autocvar_hud_panel_weapons_label; -var float autocvar_hud_panel_weapons_complainbubble; -var float autocvar_hud_panel_weapons_complainbubble_padding; -var float autocvar_hud_panel_weapons_complainbubble_time; -var float autocvar_hud_panel_weapons_complainbubble_fadetime; -var vector autocvar_hud_panel_weapons_complainbubble_color_outofammo; -var vector autocvar_hud_panel_weapons_complainbubble_color_donthave; -var vector autocvar_hud_panel_weapons_complainbubble_color_unavailable; var float autocvar_hud_panel_ammo; -var vector autocvar_hud_panel_ammo_pos; -var vector autocvar_hud_panel_ammo_size; -var string autocvar_hud_panel_ammo_bg; -var string autocvar_hud_panel_ammo_bg_color; -var string autocvar_hud_panel_ammo_bg_color_team; -var string autocvar_hud_panel_ammo_bg_alpha; -var string autocvar_hud_panel_ammo_bg_border; -var string autocvar_hud_panel_ammo_bg_padding; var float autocvar_hud_panel_ammo_onlycurrent; var float autocvar_hud_panel_ammo_iconalign; var float autocvar_hud_panel_powerups; -var vector autocvar_hud_panel_powerups_pos; -var vector autocvar_hud_panel_powerups_size; -var string autocvar_hud_panel_powerups_bg; -var string autocvar_hud_panel_powerups_bg_color; -var string autocvar_hud_panel_powerups_bg_color_team; -var string autocvar_hud_panel_powerups_bg_alpha; -var string autocvar_hud_panel_powerups_bg_border; -var string autocvar_hud_panel_powerups_bg_padding; -var float autocvar_hud_panel_powerups_flip; -var float autocvar_hud_panel_powerups_iconalign; -var float autocvar_hud_panel_powerups_baralign; -var float autocvar_hud_panel_powerups_progressbar; var float autocvar_hud_panel_healtharmor; -var vector autocvar_hud_panel_healtharmor_pos; -var vector autocvar_hud_panel_healtharmor_size; -var string autocvar_hud_panel_healtharmor_bg; -var string autocvar_hud_panel_healtharmor_bg_color; -var string autocvar_hud_panel_healtharmor_bg_color_team; -var string autocvar_hud_panel_healtharmor_bg_alpha; -var string autocvar_hud_panel_healtharmor_bg_border; -var string autocvar_hud_panel_healtharmor_bg_padding; -var float autocvar_hud_panel_healtharmor_flip; -var float autocvar_hud_panel_healtharmor_iconalign; -var float autocvar_hud_panel_healtharmor_baralign; -var float autocvar_hud_panel_healtharmor_progressbar; var float autocvar_hud_panel_notify; -var vector autocvar_hud_panel_notify_pos; -var vector autocvar_hud_panel_notify_size; -var string autocvar_hud_panel_notify_bg; -var string autocvar_hud_panel_notify_bg_color; -var string autocvar_hud_panel_notify_bg_color_team; -var string autocvar_hud_panel_notify_bg_alpha; -var string autocvar_hud_panel_notify_bg_border; -var string autocvar_hud_panel_notify_bg_padding; -var float autocvar_hud_panel_notify_print; -var float autocvar_hud_panel_notify_time; -var float autocvar_hud_panel_notify_fadetime; -var float autocvar_hud_panel_notify_flip; var float autocvar_hud_panel_timer; -var vector autocvar_hud_panel_timer_pos; -var vector autocvar_hud_panel_timer_size; -var string autocvar_hud_panel_timer_bg; -var string autocvar_hud_panel_timer_bg_color; -var string autocvar_hud_panel_timer_bg_color_team; -var string autocvar_hud_panel_timer_bg_alpha; -var string autocvar_hud_panel_timer_bg_border; -var string autocvar_hud_panel_timer_bg_padding; var float autocvar_hud_panel_timer_increment; var float autocvar_hud_panel_radar; -var vector autocvar_hud_panel_radar_pos; -var vector autocvar_hud_panel_radar_size; -var string autocvar_hud_panel_radar_bg; -var string autocvar_hud_panel_radar_bg_color; -var string autocvar_hud_panel_radar_bg_color_team; -var string autocvar_hud_panel_radar_bg_alpha; -var string autocvar_hud_panel_radar_bg_border; -var string autocvar_hud_panel_radar_bg_padding; var float autocvar_hud_panel_score; -var vector autocvar_hud_panel_score_pos; -var vector autocvar_hud_panel_score_size; -var string autocvar_hud_panel_score_bg; -var string autocvar_hud_panel_score_bg_color; -var string autocvar_hud_panel_score_bg_color_team; -var string autocvar_hud_panel_score_bg_alpha; -var string autocvar_hud_panel_score_bg_border; -var string autocvar_hud_panel_score_bg_padding; var float autocvar_hud_panel_racetimer; -var vector autocvar_hud_panel_racetimer_pos; -var vector autocvar_hud_panel_racetimer_size; -var string autocvar_hud_panel_racetimer_bg; -var string autocvar_hud_panel_racetimer_bg_color; -var string autocvar_hud_panel_racetimer_bg_color_team; -var string autocvar_hud_panel_racetimer_bg_alpha; -var string autocvar_hud_panel_racetimer_bg_border; -var string autocvar_hud_panel_racetimer_bg_padding; var float autocvar_hud_panel_vote; -var vector autocvar_hud_panel_vote_pos; -var vector autocvar_hud_panel_vote_size; -var string autocvar_hud_panel_vote_bg; -var string autocvar_hud_panel_vote_bg_color; -var string autocvar_hud_panel_vote_bg_color_team; -var string autocvar_hud_panel_vote_bg_alpha; -var string autocvar_hud_panel_vote_bg_border; -var string autocvar_hud_panel_vote_bg_padding; -var float autocvar_hud_panel_vote_alreadyvoted_alpha; var float autocvar_hud_panel_modicons; -var vector autocvar_hud_panel_modicons_pos; -var vector autocvar_hud_panel_modicons_size; -var string autocvar_hud_panel_modicons_bg; -var string autocvar_hud_panel_modicons_bg_color; -var string autocvar_hud_panel_modicons_bg_color_team; -var string autocvar_hud_panel_modicons_bg_alpha; -var string autocvar_hud_panel_modicons_bg_border; -var string autocvar_hud_panel_modicons_bg_padding; var float autocvar_hud_panel_pressedkeys; -var vector autocvar_hud_panel_pressedkeys_pos; -var vector autocvar_hud_panel_pressedkeys_size; -var string autocvar_hud_panel_pressedkeys_bg; -var string autocvar_hud_panel_pressedkeys_bg_color; -var string autocvar_hud_panel_pressedkeys_bg_color_team; -var string autocvar_hud_panel_pressedkeys_bg_alpha; -var string autocvar_hud_panel_pressedkeys_bg_border; -var string autocvar_hud_panel_pressedkeys_bg_padding; -var float autocvar_hud_panel_pressedkeys_aspect; var float autocvar_hud_panel_chat; -var vector autocvar_hud_panel_chat_pos; -var vector autocvar_hud_panel_chat_size; -var string autocvar_hud_panel_chat_bg; -var string autocvar_hud_panel_chat_bg_color; -var string autocvar_hud_panel_chat_bg_color_team; -var string autocvar_hud_panel_chat_bg_alpha; -var string autocvar_hud_panel_chat_bg_border; -var string autocvar_hud_panel_chat_bg_padding; var float autocvar_hud_panel_engineinfo; -var vector autocvar_hud_panel_engineinfo_pos; -var vector autocvar_hud_panel_engineinfo_size; -var string autocvar_hud_panel_engineinfo_bg; -var string autocvar_hud_panel_engineinfo_bg_color; -var string autocvar_hud_panel_engineinfo_bg_color_team; -var string autocvar_hud_panel_engineinfo_bg_alpha; -var string autocvar_hud_panel_engineinfo_bg_border; -var string autocvar_hud_panel_engineinfo_bg_padding; var float autocvar_hud_panel_infomessages; -var vector autocvar_hud_panel_infomessages_pos; -var vector autocvar_hud_panel_infomessages_size; -var string autocvar_hud_panel_infomessages_bg; -var string autocvar_hud_panel_infomessages_bg_color; -var string autocvar_hud_panel_infomessages_bg_color_team; -var string autocvar_hud_panel_infomessages_bg_alpha; -var string autocvar_hud_panel_infomessages_bg_border; -var string autocvar_hud_panel_infomessages_bg_padding; var float autocvar_hud_panel_infomessages_flip; var float autocvar_scoreboard_border_thickness; diff --git a/qcsrc/client/gibs.qc b/qcsrc/client/gibs.qc index 86b970c1a1..6f6e143934 100644 --- a/qcsrc/client/gibs.qc +++ b/qcsrc/client/gibs.qc @@ -153,14 +153,15 @@ void Ent_GibSplash(float isNew) org_z = ReadShort() * 4 + 2; vel = decompressShortVector(ReadShort()); - if(autocvar_cl_gentle_gibs || cvar("cl_gentle")) + float cl_gentle_gibs = cvar("cl_gentle_gibs"); + if(cl_gentle_gibs || cvar("cl_gentle")) type |= 0x80; // set gentle bit if(type & 0x80) { - if(autocvar_cl_gentle_gibs == 2) + if(cl_gentle_gibs == 2) gentle_prefix = ""; - else if(autocvar_cl_gentle_gibs == 3) + else if(cl_gentle_gibs == 3) gentle_prefix = "happy_"; else gentle_prefix = "morphed_"; @@ -171,7 +172,7 @@ void Ent_GibSplash(float isNew) gentle_prefix = "particlegibs_"; } - if not(autocvar_cl_gentle_gibs || cvar("cl_gentle")) + if not(cl_gentle_gibs || cvar("cl_gentle")) amount *= 1 - cvar("cl_nogibs"); if(cvar("ekg")) diff --git a/qcsrc/client/hud.qc b/qcsrc/client/hud.qc index 971a791aad..f77f1c1c1a 100644 --- a/qcsrc/client/hud.qc +++ b/qcsrc/client/hud.qc @@ -412,48 +412,55 @@ HUD panels ================== */ +#define HUD_Write(s) fputs(fh, s) +// q: quoted, n: not quoted +#define HUD_Write_Cvar_n(cvar) HUD_Write(strcat("seta ", cvar, " ", cvar_string(cvar), "\n")) +#define HUD_Write_Cvar_q(cvar) HUD_Write(strcat("seta ", cvar, " \"", cvar_string(cvar), "\"\n")) +#define HUD_Write_PanelCvar_n(cvar_suf) HUD_Write_Cvar_n(strcat("hud_panel_", panel_name, cvar_suf)) +#define HUD_Write_PanelCvar_q(cvar_suf) HUD_Write_Cvar_q(strcat("hud_panel_", panel_name, cvar_suf)) // Save the config void HUD_Panel_ExportCfg(string cfgname) { float fh; - fh = fopen(strcat("hud_", autocvar_hud_skin, "_", cfgname, ".cfg"), FILE_WRITE); + string filename = strcat("hud_", cvar_string("hud_skin"), "_", cfgname, ".cfg"); + fh = fopen(filename, FILE_WRITE); if(fh >= 0) { - fputs(fh, strcat("seta hud_skin \"", cvar_string("hud_skin"), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_bg \"", cvar_string("hud_panel_bg"), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_bg_color \"", cvar_string("hud_panel_bg_color"), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_bg_color_team \"", cvar_string("hud_panel_bg_color_team"), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_bg_alpha \"", cvar_string("hud_panel_bg_alpha"), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_bg_border \"", cvar_string("hud_panel_bg_border"), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_bg_padding \"", cvar_string("hud_panel_bg_padding"), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_fg_alpha \"", cvar_string("hud_panel_fg_alpha"), "\"", "\n")); - fputs(fh, "\n"); - - fputs(fh, strcat("seta hud_dock \"", cvar_string("hud_dock"), "\"", "\n")); - fputs(fh, strcat("seta hud_dock_color \"", cvar_string("hud_dock_color"), "\"", "\n")); - fputs(fh, strcat("seta hud_dock_color_team \"", cvar_string("hud_dock_color_team"), "\"", "\n")); - fputs(fh, strcat("seta hud_dock_alpha \"", cvar_string("hud_dock_alpha"), "\"", "\n")); - fputs(fh, "\n"); - - fputs(fh, strcat("seta hud_progressbar_alpha \"", cvar_string("hud_progressbar_alpha"), "\"", "\n")); - fputs(fh, strcat("seta hud_progressbar_strength_color \"", cvar_string("hud_progressbar_strength_color"), "\"", "\n")); - fputs(fh, strcat("seta hud_progressbar_shield_color \"", cvar_string("hud_progressbar_shield_color"), "\"", "\n")); - fputs(fh, strcat("seta hud_progressbar_health_color \"", cvar_string("hud_progressbar_health_color"), "\"", "\n")); - fputs(fh, strcat("seta hud_progressbar_armor_color \"", cvar_string("hud_progressbar_armor_color"), "\"", "\n")); - fputs(fh, strcat("seta hud_progressbar_fuel_color \"", cvar_string("hud_progressbar_fuel_color"), "\"", "\n")); - fputs(fh, strcat("seta hud_progressbar_nexball_color \"", cvar_string("hud_progressbar_nexball_color"), "\"", "\n")); - fputs(fh, "\n"); - - fputs(fh, strcat("seta _hud_panelorder \"", cvar_string("_hud_panelorder"), "\"", "\n")); - fputs(fh, "\n"); - - fputs(fh, strcat("seta hud_configure_grid \"", cvar_string("hud_configure_grid"), "\"", "\n")); - fputs(fh, strcat("seta hud_configure_grid_xsize \"", cvar_string("hud_configure_grid_xsize"), "\"", "\n")); - fputs(fh, strcat("seta hud_configure_grid_ysize \"", cvar_string("hud_configure_grid_ysize"), "\"", "\n")); - fputs(fh, "\n"); - - fputs(fh, strcat("seta scr_centerpos \"", cvar_string("scr_centerpos"), "\"", "\n")); - fputs(fh, "\n"); + HUD_Write_Cvar_q("hud_skin"); + HUD_Write_Cvar_q("hud_panel_bg"); + HUD_Write_Cvar_q("hud_panel_bg_color"); + HUD_Write_Cvar_q("hud_panel_bg_color_team"); + HUD_Write_Cvar_q("hud_panel_bg_alpha"); + HUD_Write_Cvar_q("hud_panel_bg_border"); + HUD_Write_Cvar_q("hud_panel_bg_padding"); + HUD_Write_Cvar_q("hud_panel_fg_alpha"); + HUD_Write("\n"); + + HUD_Write_Cvar_q("hud_dock"); + HUD_Write_Cvar_q("hud_dock_color"); + HUD_Write_Cvar_q("hud_dock_color_team"); + HUD_Write_Cvar_q("hud_dock_alpha"); + HUD_Write("\n"); + + HUD_Write_Cvar_q("hud_progressbar_alpha"); + HUD_Write_Cvar_q("hud_progressbar_strength_color"); + HUD_Write_Cvar_q("hud_progressbar_shield_color"); + HUD_Write_Cvar_q("hud_progressbar_health_color"); + HUD_Write_Cvar_q("hud_progressbar_armor_color"); + HUD_Write_Cvar_q("hud_progressbar_fuel_color"); + HUD_Write_Cvar_q("hud_progressbar_nexball_color"); + HUD_Write("\n"); + + HUD_Write_Cvar_q("_hud_panelorder"); + HUD_Write("\n"); + + HUD_Write_Cvar_q("hud_configure_grid"); + HUD_Write_Cvar_q("hud_configure_grid_xsize"); + HUD_Write_Cvar_q("hud_configure_grid_ysize"); + HUD_Write("\n"); + + HUD_Write_Cvar_q("scr_centerpos"); + HUD_Write("\n"); // common cvars for all panels float i; @@ -461,66 +468,68 @@ void HUD_Panel_ExportCfg(string cfgname) { HUD_Panel_GetName(i); - fputs(fh, strcat("seta hud_panel_", panel_name, " ", cvar_string(strcat("hud_panel_", panel_name)), "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_pos \"", cvar_string(strcat("hud_panel_", panel_name, "_pos")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_size \"", cvar_string(strcat("hud_panel_", panel_name, "_size")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_bg \"", cvar_string(strcat("hud_panel_", panel_name, "_bg")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_bg_color \"", cvar_string(strcat("hud_panel_", panel_name, "_bg_color")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_bg_color_team \"", cvar_string(strcat("hud_panel_", panel_name, "_bg_color_team")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_bg_alpha \"", cvar_string(strcat("hud_panel_", panel_name, "_bg_alpha")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_bg_border \"", cvar_string(strcat("hud_panel_", panel_name, "_bg_border")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_bg_padding \"", cvar_string(strcat("hud_panel_", panel_name, "_bg_padding")), "\"", "\n")); + HUD_Write_PanelCvar_n(""); + HUD_Write_PanelCvar_q("_pos"); + HUD_Write_PanelCvar_q("_size"); + HUD_Write_PanelCvar_q("_bg"); + HUD_Write_PanelCvar_q("_bg_color"); + HUD_Write_PanelCvar_q("_bg_color_team"); + HUD_Write_PanelCvar_q("_bg_alpha"); + HUD_Write_PanelCvar_q("_bg_border"); + HUD_Write_PanelCvar_q("_bg_padding"); switch(i) { case HUD_PANEL_WEAPONS: - fputs(fh, strcat("seta hud_panel_", panel_name, "_complainbubble \"", cvar_string(strcat("hud_panel_", panel_name, "_complainbubble")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_complainbubble_padding \"", cvar_string(strcat("hud_panel_", panel_name, "_complainbubble_padding")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_complainbubble_color_outofammo \"", cvar_string(strcat("hud_panel_", panel_name, "_complainbubble_color_outofammo")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_complainbubble_color_donthave \"", cvar_string(strcat("hud_panel_", panel_name, "_complainbubble_color_donthave")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_complainbubble_color_unavailable \"", cvar_string(strcat("hud_panel_", panel_name, "_complainbubble_color_unavailable")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_ammo_color \"", cvar_string(strcat("hud_panel_", panel_name, "_ammo_color")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_ammo_alpha \"", cvar_string(strcat("hud_panel_", panel_name, "_ammo_alpha")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_aspect \"", cvar_string(strcat("hud_panel_", panel_name, "_aspect")), "\"", "\n")); + HUD_Write_PanelCvar_q("_complainbubble"); + HUD_Write_PanelCvar_q("_complainbubble_padding"); + HUD_Write_PanelCvar_q("_complainbubble_color_outofammo"); + HUD_Write_PanelCvar_q("_complainbubble_color_donthave"); + HUD_Write_PanelCvar_q("_complainbubble_color_unavailable"); + HUD_Write_PanelCvar_q("_ammo_color"); + HUD_Write_PanelCvar_q("_ammo_alpha"); + HUD_Write_PanelCvar_q("_aspect"); break; case HUD_PANEL_AMMO: - fputs(fh, strcat("seta hud_panel_", panel_name, "_onlycurrent \"", cvar_string(strcat("hud_panel_", panel_name, "_onlycurrent")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_iconalign \"", cvar_string(strcat("hud_panel_", panel_name, "_iconalign")), "\"", "\n")); + HUD_Write_PanelCvar_q("_onlycurrent"); + HUD_Write_PanelCvar_q("_iconalign"); break; case HUD_PANEL_POWERUPS: - fputs(fh, strcat("seta hud_panel_", panel_name, "_flip \"", cvar_string(strcat("hud_panel_", panel_name, "_flip")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_iconalign \"", cvar_string(strcat("hud_panel_", panel_name, "_iconalign")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_baralign \"", cvar_string(strcat("hud_panel_", panel_name, "_baralign")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_progressbar \"", cvar_string(strcat("hud_panel_", panel_name, "_progressbar")), "\"", "\n")); + HUD_Write_PanelCvar_q("_flip"); + HUD_Write_PanelCvar_q("_iconalign"); + HUD_Write_PanelCvar_q("_baralign"); + HUD_Write_PanelCvar_q("_progressbar"); break; case HUD_PANEL_HEALTHARMOR: - fputs(fh, strcat("seta hud_panel_", panel_name, "_flip \"", cvar_string(strcat("hud_panel_", panel_name, "_flip")), "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_iconalign \"", cvar_string(strcat("hud_panel_", panel_name, "_iconalign")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_baralign \"", cvar_string(strcat("hud_panel_", panel_name, "_baralign")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_progressbar \"", cvar_string(strcat("hud_panel_", panel_name, "_progressbar")), "\"", "\n")); + HUD_Write_PanelCvar_q("_flip"); + HUD_Write_PanelCvar_q("_iconalign"); + HUD_Write_PanelCvar_q("_baralign"); + HUD_Write_PanelCvar_q("_progressbar"); break; case HUD_PANEL_NOTIFY: - fputs(fh, strcat("seta hud_panel_", panel_name, "_flip \"", cvar_string(strcat("hud_panel_", panel_name, "_flip")), "\"", "\n")); - fputs(fh, strcat("seta hud_panel_", panel_name, "_print \"", cvar_string(strcat("hud_panel_", panel_name, "_print")), "\"", "\n")); + HUD_Write_PanelCvar_q("_flip"); + HUD_Write_PanelCvar_q("_print"); break; case HUD_PANEL_RADAR: - fputs(fh, strcat("seta hud_panel_", panel_name, "_foreground_alpha \"", cvar_string(strcat("hud_panel_", panel_name, "_foreground_alpha")), "\"", "\n")); + HUD_Write_PanelCvar_q("_foreground_alpha"); break; case HUD_PANEL_VOTE: - fputs(fh, strcat("seta hud_panel_", panel_name, "_alreadyvoted_alpha \"", cvar_string(strcat("hud_panel_", panel_name, "_alreadyvoted_alpha")), "\"", "\n")); + HUD_Write_PanelCvar_q("_alreadyvoted_alpha"); break; case HUD_PANEL_PRESSEDKEYS: - fputs(fh, strcat("seta hud_panel_", panel_name, "_aspect \"", cvar_string(strcat("hud_panel_", panel_name, "_aspect")), "\"", "\n")); + HUD_Write_PanelCvar_q("_aspect"); break; case HUD_PANEL_INFOMESSAGES: - fputs(fh, strcat("seta hud_panel_", panel_name, "_flip \"", cvar_string(strcat("hud_panel_", panel_name, "_flip")), "\"", "\n")); + HUD_Write_PanelCvar_q("_flip"); break; } - fputs(fh, "\n"); + HUD_Write("\n"); } - fputs(fh, strcat("menu_sync", "\n")); // force the menu to reread the cvars, so that the dialogs are updated + HUD_Write("menu_sync\n"); // force the menu to reread the cvars, so that the dialogs are updated - print("^2Successfully exported to hud_", autocvar_hud_skin, "_", cfgname, ".cfg! (Note: It's saved in data/data/)\n"); + print("^2Successfully exported to ", filename, "! (Note: It's saved in data/data/)\n"); + fclose(fh); } - fclose(fh); + else + print("^1Couldn't write to ", filename, "\n"); } const float hlBorderSize = 4; @@ -656,8 +665,8 @@ vector HUD_Panel_CheckMove(vector myPos, vector mySize) else // push it downwards myTarget_y = panel_pos_y + panel_size_y; } - if(cvar("hud_configure_checkcollisions_debug")) - drawfill(panel_pos, panel_size, '1 1 0', .3, DRAWFLAG_NORMAL); + //if(cvar("hud_configure_checkcollisions_debug")) + //drawfill(panel_pos, panel_size, '1 1 0', .3, DRAWFLAG_NORMAL); } return myTarget; @@ -669,8 +678,8 @@ void HUD_Panel_SetPos(vector pos) vector mySize; mySize = panel_size; - if(cvar("hud_configure_checkcollisions_debug")) - drawfill(pos, mySize, '1 1 1', .2, DRAWFLAG_NORMAL); + //if(cvar("hud_configure_checkcollisions_debug")) + //drawfill(pos, mySize, '1 1 1', .2, DRAWFLAG_NORMAL); if(autocvar_hud_configure_grid) { @@ -795,8 +804,8 @@ vector HUD_Panel_CheckResize(vector mySize, vector resizeorigin) { else mySize_y = min(mySize_y, dist_y); } - if(cvar("hud_configure_checkcollisions_debug")) - drawfill(panel_pos, panel_size, '1 1 0', .3, DRAWFLAG_NORMAL); + //if(cvar("hud_configure_checkcollisions_debug")) + //drawfill(panel_pos, panel_size, '1 1 0', .3, DRAWFLAG_NORMAL); } return mySize; @@ -849,8 +858,8 @@ void HUD_Panel_SetPosSize(vector mySize) if(myPos_y + mySize_y > vid_conheight) mySize_y = vid_conheight - myPos_y; - if(cvar("hud_configure_checkcollisions_debug")) - drawfill(myPos, mySize, '1 1 1', .2, DRAWFLAG_NORMAL); + //if(cvar("hud_configure_checkcollisions_debug")) + //drawfill(myPos, mySize, '1 1 1', .2, DRAWFLAG_NORMAL); // before checkresize, otherwise panel can be snapped partially inside another panel or panel aspect ratio can be broken if(autocvar_hud_configure_grid) @@ -881,8 +890,8 @@ void HUD_Panel_SetPosSize(vector mySize) myPos_y = resizeorigin_y; } - if(cvar("hud_configure_checkcollisions_debug")) - drawfill(myPos, mySize, '0 1 0', .3, DRAWFLAG_NORMAL); + //if(cvar("hud_configure_checkcollisions_debug")) + //drawfill(myPos, mySize, '0 1 0', .3, DRAWFLAG_NORMAL); HUD_Panel_GetName(highlightedPanel); string s; @@ -1356,7 +1365,7 @@ void HUD_Panel_Mouse() if (prev_pos != panel_pos || prev_size != panel_size) { - hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && autocvar_hud_configure_checkcollisions); + hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && cvar("hud_configure_checkcollisions")); // backup! panel_pos_backup = prev_pos; panel_size_backup = prev_size; @@ -1580,7 +1589,7 @@ void HUD_Weapons(void) } } - float i, weapid, fade, weapon_stats, weapon_number, weapon_cnt; + float i, weapid, wpnalpha, weapon_cnt; weapon_cnt = 0; for(i = WEP_FIRST; i <= WEP_LAST; ++i) { @@ -1623,57 +1632,96 @@ void HUD_Weapons(void) panel_size -= '2 2 0' * panel_bg_padding; } - // hits - weapon_stats = getstati(STAT_DAMAGE_HITS); - weapon_number = weapon_stats & 63; - weapon_hits[weapon_number-WEP_FIRST] = floor(weapon_stats / 64); - // fired - weapon_stats = getstati(STAT_DAMAGE_FIRED); - weapon_number = weapon_stats & 63; - weapon_fired[weapon_number-WEP_FIRST] = floor(weapon_stats / 64); - if(cvar_or("hud_panel_weapons_fade", 1)) { - fade = 3.2 - 2 * (time - weapontime); - fade = bound(0.7, fade, 1); + wpnalpha = 3.2 - 2 * (time - weapontime); + wpnalpha = bound(0.7, wpnalpha, 1) * panel_fg_alpha; } else - fade = 1; + wpnalpha = panel_fg_alpha; HUD_Weapons_Clear(); float rows, columns; + float aspect = cvar("hud_panel_weapons_aspect"); rows = panel_size_y/panel_size_x; - rows = bound(1, floor((sqrt(4 * autocvar_hud_panel_weapons_aspect * rows * WEP_COUNT + rows * rows) + rows + 0.5) / 2), WEP_COUNT); + rows = bound(1, floor((sqrt(4 * aspect * rows * WEP_COUNT + rows * rows) + rows + 0.5) / 2), WEP_COUNT); columns = ceil(WEP_COUNT/rows); float row, column; float a, type, fullammo; float when; - when = autocvar_hud_panel_weapons_complainbubble_time; + when = cvar("hud_panel_weapons_complainbubble_time"); float fadetime; - fadetime = autocvar_hud_panel_weapons_complainbubble_fadetime; + fadetime = cvar("hud_panel_weapons_complainbubble_fadetime"); vector color; vector wpnpos; vector wpnsize; + + float fullammo_shells, fullammo_nails, fullammo_rockets, fullammo_cells, fullammo_fuel; + vector ammo_color; + float ammo_alpha; + wpnsize = eX * panel_size_x*(1/columns) + eY * panel_size_y*(1/rows); + float barsize_x, barsize_y, baroffset_x, baroffset_y; + float show_ammo = cvar("hud_panel_weapons_ammo"); + if (show_ammo) + { + fullammo_shells = cvar("hud_panel_weapons_ammo_full_shells"); + fullammo_nails = cvar("hud_panel_weapons_ammo_full_nails"); + fullammo_rockets = cvar("hud_panel_weapons_ammo_full_rockets"); + fullammo_cells = cvar("hud_panel_weapons_ammo_full_cells"); + fullammo_fuel = cvar("hud_panel_weapons_ammo_full_fuel"); + ammo_color = stov(cvar_string("hud_panel_weapons_ammo_color")); + ammo_alpha = panel_fg_alpha * cvar("hud_panel_weapons_ammo_alpha"); + + + if(wpnsize_x/wpnsize_y > aspect) + { + barsize_x = aspect * wpnsize_y; + barsize_y = wpnsize_y; + baroffset_x = (wpnsize_x - barsize_x) / 2; + } + else + { + barsize_y = 1/aspect * wpnsize_x; + barsize_x = wpnsize_x; + baroffset_y = (wpnsize_y - barsize_y) / 2; + } + } float show_accuracy; - if(autocvar_hud_panel_weapons_accuracy && acc_levels) + float weapon_stats, weapon_number; + if(cvar("hud_panel_weapons_accuracy") && acc_levels) + { show_accuracy = true; + // hits + weapon_stats = getstati(STAT_DAMAGE_HITS); + weapon_number = weapon_stats & 63; + weapon_hits[weapon_number-WEP_FIRST] = floor(weapon_stats / 64); + // fired + weapon_stats = getstati(STAT_DAMAGE_FIRED); + weapon_number = weapon_stats & 63; + weapon_fired[weapon_number-WEP_FIRST] = floor(weapon_stats / 64); + if (acc_col_x[0] == -1) + for (i = 0; i < acc_levels; ++i) + acc_col[i] = stov(cvar_string(strcat("accuracy_color", ftos(i)))); + } + + float weapons_st = getstati(STAT_WEAPONS); + float label = cvar("hud_panel_weapons_label"); for(i = 0; i < weapon_cnt; ++i) { - wpnpos = panel_pos + eX * column * panel_size_x*(1/columns) + eY * row * panel_size_y*(1/rows); - wpnsize = eX * panel_size_x*(1/columns) + eY * panel_size_y*(1/rows); + wpnpos = panel_pos + eX * column * wpnsize_x + eY * row * wpnsize_y; self = weaponorder[i]; weapid = self.impulse; // draw background behind currently selected weapon if(self.weapon == activeweapon) - drawpic_aspect_skin(wpnpos, "weapon_current_bg", wpnsize, '1 1 1', fade * panel_fg_alpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(wpnpos, "weapon_current_bg", wpnsize, '1 1 1', wpnalpha, DRAWFLAG_NORMAL); // draw the weapon accuracy if(show_accuracy) @@ -1684,36 +1732,35 @@ void HUD_Weapons(void) { weapon_hit = weapon_hits[self.weapon-WEP_FIRST]; weapon_stats = floor(100 * weapon_hit / weapon_damage); - } - // find the max level lower than weapon_stats - float j; - j = acc_levels-1; - while ( j && weapon_stats < acc_lev[j] ) - --j; + // find the max level lower than weapon_stats + float j; + j = acc_levels-1; + while ( j && weapon_stats < acc_lev[j] ) + --j; - // inject color j+1 in color j, how much depending on how much weapon_stats is higher than level j - float factor; - factor = (weapon_stats - acc_lev[j]) / (acc_lev[j+1] - acc_lev[j]); - color = acc_color(j); - color = color + factor * (acc_color(j+1) - color); + // inject color j+1 in color j, how much depending on how much weapon_stats is higher than level j + float factor; + factor = (weapon_stats - acc_lev[j]) / (acc_lev[j+1] - acc_lev[j]); + color = acc_col[j]; + color = color + factor * (acc_col[j+1] - color); - if(weapon_damage) drawpic_aspect_skin(wpnpos, "weapon_accuracy", wpnsize, color, panel_fg_alpha, DRAWFLAG_NORMAL); + } } // draw the weapon icon - if((self.impulse >= 0) && (getstati(STAT_WEAPONS) & self.weapons)) + if((weapid >= 0) && (weapons_st & self.weapons)) { - drawpic_aspect_skin(wpnpos, strcat("weapon", self.netname), wpnsize, '1 1 1', fade * panel_fg_alpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(wpnpos, strcat("weapon", self.netname), wpnsize, '1 1 1', wpnalpha, DRAWFLAG_NORMAL); - if(autocvar_hud_panel_weapons_label == 1) // weapon number - drawstring(wpnpos, ftos(weapid), '1 1 0' * 0.5 * panel_size_y*(1/rows), '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - else if(autocvar_hud_panel_weapons_label == 2) // bind - drawstring(wpnpos, getcommandkey(ftos(weapid), strcat("impulse ", ftos(weapid))), '1 1 0' * 0.5 * panel_size_y*(1/rows), '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + if(label == 1) // weapon number + drawstring(wpnpos, ftos(weapid), '1 1 0' * 0.5 * wpnsize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + else if(label == 2) // bind + drawstring(wpnpos, getcommandkey(ftos(weapid), strcat("impulse ", ftos(weapid))), '1 1 0' * 0.5 * wpnsize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); // draw ammo status bar - if(autocvar_hud_panel_weapons_ammo && weapid != WEP_TUBA && weapid != WEP_LASER && weapid != WEP_PORTO) + if(show_ammo && weapid != WEP_TUBA && weapid != WEP_LASER && weapid != WEP_PORTO) { a = 0; type = GetAmmoTypeForWep(weapid); @@ -1723,38 +1770,20 @@ void HUD_Weapons(void) if(a > 0) { switch(type) { - case 0: fullammo = autocvar_hud_panel_weapons_ammo_full_shells; break; - case 1: fullammo = autocvar_hud_panel_weapons_ammo_full_nails; break; - case 2: fullammo = autocvar_hud_panel_weapons_ammo_full_rockets; break; - case 3: fullammo = autocvar_hud_panel_weapons_ammo_full_cells; break; - case 4: fullammo = autocvar_hud_panel_weapons_ammo_full_fuel; break; + case 0: fullammo = fullammo_shells; break; + case 1: fullammo = fullammo_nails; break; + case 2: fullammo = fullammo_rockets; break; + case 3: fullammo = fullammo_cells; break; + case 4: fullammo = fullammo_fuel; break; default: fullammo = 60; } - float barsize_x, barsize_y, barpos_x, barpos_y; - if(wpnsize_x/wpnsize_y > autocvar_hud_panel_weapons_aspect) - { - barsize_x = autocvar_hud_panel_weapons_aspect * wpnsize_y; - barsize_y = wpnsize_y; - - barpos_x = wpnpos_x + (wpnsize_x - barsize_x) / 2; - barpos_y = wpnpos_y; - } - else - { - barsize_y = 1/autocvar_hud_panel_weapons_aspect * wpnsize_x; - barsize_x = wpnsize_x; - - barpos_y = wpnpos_y + (wpnsize_y - barsize_y) / 2; - barpos_x = wpnpos_x; - } - drawsetcliparea( - barpos_x, - barpos_y, + wpnpos_x + baroffset_x, + wpnpos_y + baroffset_y, barsize_x * bound(0, a/fullammo, 1), barsize_y); - drawpic_aspect_skin(wpnpos, "weapon_ammo", wpnsize, autocvar_hud_panel_weapons_ammo_color, panel_fg_alpha * autocvar_hud_panel_weapons_ammo_alpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(wpnpos, "weapon_ammo", wpnsize, ammo_color, ammo_alpha, DRAWFLAG_NORMAL); drawresetcliparea(); } } @@ -1767,7 +1796,7 @@ void HUD_Weapons(void) } // draw the complain message - if(time - complain_weapon_time < when + fadetime && self.weapon == complain_weapon && autocvar_hud_panel_weapons_complainbubble) + if(time - complain_weapon_time < when + fadetime && self.weapon == complain_weapon && cvar("hud_panel_weapons_complainbubble")) { if(fadetime) { @@ -1787,18 +1816,19 @@ void HUD_Weapons(void) string s; if(complain_weapon_type == 0) { s = "Out of ammo"; - color = autocvar_hud_panel_weapons_complainbubble_color_outofammo; + color = stov(cvar_string("hud_panel_weapons_complainbubble_color_outofammo")); } else if(complain_weapon_type == 1) { s = "Don't have"; - color = autocvar_hud_panel_weapons_complainbubble_color_donthave; + color = stov(cvar_string("hud_panel_weapons_complainbubble_color_donthave")); } else { s = "Unavailable"; - color = autocvar_hud_panel_weapons_complainbubble_color_unavailable; + color = stov(cvar_string("hud_panel_weapons_complainbubble_color_unavailable")); } - drawpic_aspect_skin(wpnpos + '1 1 0' * autocvar_hud_panel_weapons_complainbubble_padding, "weapon_complainbubble", wpnsize - '2 2 0' * autocvar_hud_panel_weapons_complainbubble_padding, color, a * panel_fg_alpha, DRAWFLAG_NORMAL); - drawstring_aspect(wpnpos + '1 1 0' * autocvar_hud_panel_weapons_complainbubble_padding, s, wpnsize - '2 2 0' * autocvar_hud_panel_weapons_complainbubble_padding, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL); + float padding = cvar("hud_panel_weapons_complainbubble_padding"); + drawpic_aspect_skin(wpnpos + '1 1 0' * padding, "weapon_complainbubble", wpnsize - '2 2 0' * padding, color, a * panel_fg_alpha, DRAWFLAG_NORMAL); + drawstring_aspect(wpnpos + '1 1 0' * padding, s, wpnsize - '2 2 0' * padding, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL); } ++row; @@ -1843,9 +1873,13 @@ string GetAmmoPicture(float i) void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_selected) { float a; - a = getstati(GetAmmoStat(itemcode)); // how much ammo do we have of type itemcode? if(autocvar__hud_configure) + { + currently_selected = (itemcode == 2); //rockets always selected a = 100; + } + else + a = getstati(GetAmmoStat(itemcode)); // how much ammo do we have of type itemcode? vector color; if(a < 10) @@ -1859,49 +1893,29 @@ void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_s else alpha = 0.7; - vector newSize, newPos; - if(mySize_x/mySize_y > 3) - { - newSize_x = 3 * mySize_y; - newSize_y = mySize_y; - - newPos_x = myPos_x + (mySize_x - newSize_x) / 2; - newPos_y = myPos_y; - } - else - { - newSize_y = 1/3 * mySize_x; - newSize_x = mySize_x; - - newPos_y = myPos_y + (mySize_y - newSize_y) / 2; - newPos_x = myPos_x; - } - vector picpos, numpos; if(autocvar_hud_panel_ammo_iconalign) { - numpos = newPos; - picpos = newPos + eX * 2 * newSize_y; + numpos = myPos; + picpos = myPos + eX * 2 * mySize_y; } else { - numpos = newPos + eX * newSize_y; - picpos = newPos; + numpos = myPos + eX * mySize_y; + picpos = myPos; } if (currently_selected) - drawpic_aspect_skin(newPos, "ammo_current_bg", newSize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(myPos, "ammo_current_bg", mySize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - drawfont = hud_bigfont; if(a > 0) - drawstring_aspect(numpos, ftos(a), eX * (2/3) * newSize_x + eY * newSize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL); + drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL); else // "ghost" ammo count - drawstring_aspect(numpos, ftos(a), eX * (2/3) * newSize_x + eY * newSize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL); - drawfont = hud_font; + drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL); if(a > 0) - drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * newSize_y, '1 1 1', panel_fg_alpha * alpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * alpha, DRAWFLAG_NORMAL); else // "ghost" ammo icon - drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * newSize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL); + drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * mySize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL); } void HUD_Ammo(void) @@ -1911,8 +1925,6 @@ void HUD_Ammo(void) active_panel = HUD_PANEL_AMMO; HUD_Panel_UpdateCvars(ammo); - float i, currently_selected; - vector pos, mySize; pos = panel_pos; mySize = panel_size; @@ -1924,35 +1936,71 @@ void HUD_Ammo(void) mySize -= '2 2 0' * panel_bg_padding; } - float rows, columns; - rows = mySize_y/mySize_x; - rows = bound(1, floor((sqrt(4 * (3/1) * rows * AMMO_COUNT + rows * rows) + rows + 0.5) / 2), AMMO_COUNT); - // ^^^ ammo item aspect goes here + float rows, columns, row, column; + vector ammo_size; + if (autocvar_hud_panel_ammo_onlycurrent) + ammo_size = mySize; + else + { + rows = mySize_y/mySize_x; + rows = bound(1, floor((sqrt(4 * (3/1) * rows * AMMO_COUNT + rows * rows) + rows + 0.5) / 2), AMMO_COUNT); + // ^^^ ammo item aspect goes here - columns = ceil(AMMO_COUNT/rows); + columns = ceil(AMMO_COUNT/rows); - float row, column; - // ammo - for (i = 0; i < AMMO_COUNT; ++i) { - currently_selected = getstati(STAT_ITEMS) & GetAmmoItemCode(i); - if(autocvar_hud_panel_ammo_onlycurrent) { - if(autocvar__hud_configure) - i = 2; - if (currently_selected || autocvar__hud_configure) - { - DrawAmmoItem(pos, mySize, i, currently_selected); - break; - } - } else { - DrawAmmoItem(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), i, currently_selected); - ++row; - if(row >= rows) + ammo_size = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows); + } + + vector offset; + float newSize; + if(ammo_size_x/ammo_size_y > 3) + { + newSize = 3 * ammo_size_y; + offset_x = ammo_size_x - newSize; + pos_x += offset_x/2; + ammo_size_x = newSize; + } + else + { + newSize = 1/3 * ammo_size_x; + offset_y = ammo_size_y - newSize; + pos_y += offset_y/2; + ammo_size_y = newSize; + } + + drawfont = hud_bigfont; + float i, stat_items, currently_selected; + if (autocvar_hud_panel_ammo_onlycurrent) + { + if(autocvar__hud_configure) + { + DrawAmmoItem(pos, ammo_size, 2, true); //show rockets + return; + } + stat_items = getstati(STAT_ITEMS); + for (i = 0; i < AMMO_COUNT; ++i) { + currently_selected = stat_items & GetAmmoItemCode(i); + if (currently_selected) { - row = 0; - column = column + 1; + DrawAmmoItem(pos, ammo_size, i, true); + return; } } + return; // nothing to display } + + stat_items = getstati(STAT_ITEMS); + for (i = 0; i < AMMO_COUNT; ++i) { + currently_selected = stat_items & GetAmmoItemCode(i); + DrawAmmoItem(pos + eX * column * (ammo_size_x + offset_x) + eY * row * (ammo_size_y + offset_y), ammo_size, i, currently_selected); + ++row; + if(row >= rows) + { + row = 0; + column = column + 1; + } + } + drawfont = hud_font; } void DrawNumIcon(float iconalign, vector myPos, vector mySize, float x, string icon, float left, vector color, float alpha) @@ -2024,21 +2072,17 @@ void HUD_Powerups(void) { if(!autocvar_hud_panel_powerups && !autocvar__hud_configure) return; - active_panel = HUD_PANEL_POWERUPS; - HUD_Panel_UpdateCvars(powerups); - float stat_items; - stat_items = getstati(STAT_ITEMS); - if(!autocvar__hud_configure) { - if not(stat_items & IT_STRENGTH) - if not(stat_items & IT_INVINCIBLE) - return; + if not(getstati(STAT_ITEMS) & (IT_STRENGTH | IT_INVINCIBLE)) + return; if (getstati(STAT_HEALTH) <= 0) return; } + active_panel = HUD_PANEL_POWERUPS; + HUD_Panel_UpdateCvars(powerups); vector pos, mySize; pos = panel_pos; mySize = panel_size; @@ -2069,7 +2113,8 @@ void HUD_Powerups(void) { string leftname, rightname; float leftcnt, rightcnt; float leftexact, rightexact; - if (autocvar_hud_panel_powerups_flip) { + float flip = cvar("hud_panel_powerups_flip"); + if (flip) { leftname = "strength"; leftcnt = ceil(strength_time); leftexact = strength_time; @@ -2088,11 +2133,14 @@ void HUD_Powerups(void) { } drawfont = hud_bigfont; + float baralign = cvar("hud_panel_powerups_baralign"); + float iconalign = cvar("hud_panel_powerups_iconalign"); + float progressbar = cvar("hud_panel_powerups_progressbar"); if (mySize_x/mySize_y > 4) { if(leftcnt) { - if(autocvar_hud_panel_powerups_baralign == 1 || autocvar_hud_panel_powerups_baralign == 3) { // right align + if(baralign == 1 || baralign == 3) { // right align barpos = pos + eX * 0.5 * mySize_x - eX * 0.5 * mySize_x * min(1, leftcnt/30); barsize = eX * 0.5 * mySize_x * min(1, leftcnt/30) + eY * mySize_y; } else { // left align @@ -2100,20 +2148,20 @@ void HUD_Powerups(void) { barsize = eX * 0.5 * mySize_x * min(1, leftcnt/30) + eY * mySize_y; } - if(autocvar_hud_panel_powerups_progressbar) + if(progressbar) { HUD_Panel_GetProgressBarColorForString(leftname); HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL); } if(leftcnt > 1) - DrawNumIcon(autocvar_hud_panel_powerups_iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, '1 1 1', 1); + DrawNumIcon(iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, '1 1 1', 1); if(leftcnt <= 5) - DrawNumIcon_expanding(autocvar_hud_panel_powerups_iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1)); + DrawNumIcon_expanding(iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1)); } if(rightcnt) { - if(autocvar_hud_panel_powerups_baralign == 0 || autocvar_hud_panel_powerups_baralign == 3) { // left align + if(baralign == 0 || baralign == 3) { // left align barpos = pos + eX * 0.5 * mySize_x; barsize = eX * 0.5 * mySize_x * min(1, rightcnt/30) + eY * mySize_y; } else { // right align @@ -2121,22 +2169,22 @@ void HUD_Powerups(void) { barsize = eX * 0.5 * mySize_x * min(1, rightcnt/30) + eY * mySize_y; } - if(autocvar_hud_panel_powerups_progressbar) + if(progressbar) { HUD_Panel_GetProgressBarColorForString(rightname); - HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1) * panel_fg_alpha, DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL); } if(rightcnt > 1) - DrawNumIcon(autocvar_hud_panel_powerups_iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, '1 1 1', 1); + DrawNumIcon(iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, '1 1 1', 1); if(rightcnt <= 5) - DrawNumIcon_expanding(autocvar_hud_panel_powerups_iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1)); + DrawNumIcon_expanding(iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1)); } } else if (mySize_x/mySize_y > 1.5) { if(leftcnt) { - if(autocvar_hud_panel_powerups_baralign == 1 || autocvar_hud_panel_powerups_baralign == 3) { // right align + if(baralign == 1 || baralign == 3) { // right align barpos = pos + eX * mySize_x - eX * mySize_x * min(1, leftcnt/30); barsize = eX * mySize_x * min(1, leftcnt/30) + eY * 0.5 * mySize_y; } else { // left align @@ -2144,20 +2192,20 @@ void HUD_Powerups(void) { barsize = eX * mySize_x * min(1, leftcnt/30) + eY * 0.5 * mySize_y; } - if(autocvar_hud_panel_powerups_progressbar) + if(progressbar) { HUD_Panel_GetProgressBarColorForString(leftname); - HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1) * panel_fg_alpha, DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL); } if(leftcnt > 1) - DrawNumIcon(autocvar_hud_panel_powerups_iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, '1 1 1', 1); + DrawNumIcon(iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, '1 1 1', 1); if(leftcnt <= 5) - DrawNumIcon_expanding(autocvar_hud_panel_powerups_iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1)); + DrawNumIcon_expanding(iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, '1 1 1', bound(0, (leftcnt - leftexact) / 0.5, 1)); } if(rightcnt) { - if(autocvar_hud_panel_powerups_baralign == 0 || autocvar_hud_panel_powerups_baralign == 3) { // left align + if(baralign == 0 || baralign == 3) { // left align barpos = pos + eY * 0.5 * mySize_y; barsize = eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y; } else { // right align @@ -2165,22 +2213,22 @@ void HUD_Powerups(void) { barsize = eX * mySize_x * min(1, rightcnt/30) + eY * 0.5 * mySize_y; } - if(autocvar_hud_panel_powerups_progressbar) + if(progressbar) { HUD_Panel_GetProgressBarColorForString(rightname); - HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1) * panel_fg_alpha, DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL); } if(rightcnt > 1) - DrawNumIcon(autocvar_hud_panel_powerups_iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, '1 1 1', 1); + DrawNumIcon(iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, '1 1 1', 1); if(rightcnt <= 5) - DrawNumIcon_expanding(autocvar_hud_panel_powerups_iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1)); + DrawNumIcon_expanding(iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, '1 1 1', bound(0, (rightcnt - rightexact) / 0.5, 1)); } } else { if(leftcnt) { - if(autocvar_hud_panel_powerups_baralign == 1 || autocvar_hud_panel_powerups_baralign == 3) { // down align + if(baralign == 1 || baralign == 3) { // down align barpos = pos + eY * mySize_y - eY * mySize_y * min(1, leftcnt/30); barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/30); } else { // up align @@ -2188,7 +2236,7 @@ void HUD_Powerups(void) { barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/30); } - if(autocvar_hud_panel_powerups_iconalign == 1 || autocvar_hud_panel_powerups_iconalign == 3) { // down align + if(iconalign == 1 || iconalign == 3) { // down align picpos = pos + eX * 0.05 * mySize_x + eY * (mySize_y - 0.65 * mySize_x); numpos = pos + eY * mySize_y - eY * 0.25 * mySize_x; } else { // up align @@ -2196,10 +2244,10 @@ void HUD_Powerups(void) { numpos = pos + eY * 0.4 * mySize_x; } - if(autocvar_hud_panel_powerups_progressbar) + if(progressbar) { HUD_Panel_GetProgressBarColorForString(leftname); - HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1) * panel_fg_alpha, DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL); } if(leftcnt <= 5) drawpic_aspect_skin_expanding(picpos, leftname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, bound(0, (leftcnt - leftexact) / 0.5, 1)); @@ -2210,7 +2258,7 @@ void HUD_Powerups(void) { if(rightcnt) { - if(autocvar_hud_panel_powerups_baralign == 0 || autocvar_hud_panel_powerups_baralign == 3) { // up align + if(baralign == 0 || baralign == 3) { // up align barpos = pos + eX * 0.5 * mySize_x; barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/30); } else { // down align @@ -2218,7 +2266,7 @@ void HUD_Powerups(void) { barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/30); } - if(autocvar_hud_panel_powerups_iconalign == 0 || autocvar_hud_panel_powerups_iconalign == 3) { // up align + if(iconalign == 0 || iconalign == 3) { // up align picpos = pos + eX * 0.05 * mySize_x + eX * 0.5 * mySize_x; numpos = pos + eY * 0.4 * mySize_x + eX * 0.5 * mySize_x; } else { // down align @@ -2226,10 +2274,10 @@ void HUD_Powerups(void) { numpos = pos + eY * mySize_y - eY * 0.25 * mySize_x + eX * 0.5 * mySize_x; } - if(autocvar_hud_panel_powerups_progressbar) + if(progressbar) { HUD_Panel_GetProgressBarColorForString(rightname); - HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1) * panel_fg_alpha, DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha * bound(0, max(strength_time, shield_time), 1), DRAWFLAG_NORMAL); } if(rightcnt <= 5) drawpic_aspect_skin_expanding(picpos, rightname, '0.4 0.4 0' * mySize_x, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, bound(0, (rightcnt - rightexact) / 0.5, 1)); @@ -2281,6 +2329,9 @@ void HUD_HealthArmor(void) vector numpos; drawfont = hud_bigfont; + float baralign = cvar("hud_panel_healtharmor_baralign"); + float iconalign = cvar("hud_panel_healtharmor_iconalign"); + float progressbar = cvar("hud_panel_healtharmor_progressbar"); if(autocvar_hud_panel_healtharmor == 2) // combined health and armor display { vector v; @@ -2289,7 +2340,7 @@ void HUD_HealthArmor(void) float x; x = floor(v_x + 1); - if(autocvar_hud_panel_healtharmor_baralign == 1 || autocvar_hud_panel_healtharmor_baralign == 3) { // right align + if(baralign == 1 || baralign == 3) { // right align barpos = pos + eX * mySize_x - eX * mySize_x * min(1, x/400); barsize = eX * mySize_x * min(1, x/400) + eY * mySize_y; } else { // left align @@ -2301,7 +2352,7 @@ void HUD_HealthArmor(void) if(v_z) // NOT fully armored { biggercount = "health"; - if(autocvar_hud_panel_healtharmor_progressbar) + if(progressbar) { HUD_Panel_GetProgressBarColor(health); HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); @@ -2312,7 +2363,7 @@ void HUD_HealthArmor(void) else { biggercount = "armor"; - if(autocvar_hud_panel_healtharmor_progressbar) + if(progressbar) { HUD_Panel_GetProgressBarColor(armor); HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); @@ -2320,12 +2371,12 @@ void HUD_HealthArmor(void) if(health) drawpic_aspect_skin(pos + eX * mySize_x - eX * 0.5 * mySize_y, "health", '0.5 0.5 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); } - DrawNumIcon(autocvar_hud_panel_healtharmor_iconalign, pos, mySize, x, biggercount, 1, HUD_Get_Num_Color(x, 2 * 200), 1); + DrawNumIcon(iconalign, pos, mySize, x, biggercount, 1, HUD_Get_Num_Color(x, 2 * 200), 1); // fuel if(fuel) { - if(autocvar_hud_panel_healtharmor_baralign == 0 || autocvar_hud_panel_healtharmor_baralign == 3) { // left align + if(baralign == 0 || baralign == 3) { // left align barpos = pos + eX * mySize_x - eX * mySize_x * min(1, fuel/100); barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y; } else { @@ -2342,7 +2393,8 @@ void HUD_HealthArmor(void) float leftcnt, rightcnt; float leftactive, rightactive; float leftalpha, rightalpha; - if (autocvar_hud_panel_healtharmor_flip) { // old style layout with armor left/top of health + float flip = cvar("hud_panel_healtharmor_flip"); + if (flip) { // old style layout with armor left/top of health leftname = "armor"; leftcnt = armor; if(leftcnt) @@ -2370,7 +2422,7 @@ void HUD_HealthArmor(void) { if(leftactive) { - if(autocvar_hud_panel_healtharmor_baralign == 1 || autocvar_hud_panel_healtharmor_baralign == 3) { // right align + if(baralign == 1 || baralign == 3) { // right align barpos = pos + eX * 0.5 * mySize_x - eX * 0.5 * mySize_x * min(1, leftcnt/200); barsize = eX * 0.5 * mySize_x * min(1, leftcnt/200) + eY * mySize_y; } else { // left align @@ -2378,17 +2430,17 @@ void HUD_HealthArmor(void) barsize = eX * 0.5 * mySize_x * min(1, leftcnt/200) + eY * mySize_y; } - if(autocvar_hud_panel_healtharmor_progressbar) + if(progressbar) { HUD_Panel_GetProgressBarColorForString(leftname); HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); } - DrawNumIcon(autocvar_hud_panel_healtharmor_iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, HUD_Get_Num_Color(leftcnt, 200), 1); + DrawNumIcon(iconalign, pos, eX * 0.5 * mySize_x + eY * mySize_y, leftcnt, leftname, 1, HUD_Get_Num_Color(leftcnt, 200), 1); } if(rightactive) { - if(autocvar_hud_panel_healtharmor_baralign == 0 || autocvar_hud_panel_healtharmor_baralign == 3) { // left align + if(baralign == 0 || baralign == 3) { // left align barpos = pos + eX * 0.5 * mySize_x; barsize = eX * 0.5 * mySize_x * min(1, rightcnt/200) + eY * mySize_y; } else { // right align @@ -2396,17 +2448,17 @@ void HUD_HealthArmor(void) barsize = eX * 0.5 * mySize_x * min(1, rightcnt/200) + eY * mySize_y; } - if(autocvar_hud_panel_healtharmor_progressbar) + if(progressbar) { HUD_Panel_GetProgressBarColorForString(rightname); HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); } - DrawNumIcon(autocvar_hud_panel_healtharmor_iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, HUD_Get_Num_Color(rightcnt, 200), 1); + DrawNumIcon(iconalign, pos + eX * 0.5 * mySize_x, eX * 0.5 * mySize_x + eY * mySize_y, rightcnt, rightname, 0, HUD_Get_Num_Color(rightcnt, 200), 1); } if(fuel) { - if(autocvar_hud_panel_healtharmor_baralign == 0 || autocvar_hud_panel_healtharmor_baralign == 3) { // left align + if(baralign == 0 || baralign == 3) { // left align barpos = pos + eX * mySize_x - eX * mySize_x * min(1, fuel/100); barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.2 * mySize_y; } else { @@ -2421,7 +2473,7 @@ void HUD_HealthArmor(void) { if(leftactive) { - if(autocvar_hud_panel_healtharmor_baralign == 1 || autocvar_hud_panel_healtharmor_baralign == 3) { // right align + if(baralign == 1 || baralign == 3) { // right align barpos = pos + eX * mySize_x - eX * mySize_x * min(1, leftcnt/200); barsize = eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y; } else { // left align @@ -2429,17 +2481,17 @@ void HUD_HealthArmor(void) barsize = eX * mySize_x * min(1, leftcnt/200) + eY * 0.5 * mySize_y; } - if(autocvar_hud_panel_healtharmor_progressbar) + if(progressbar) { HUD_Panel_GetProgressBarColorForString(leftname); HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); } - DrawNumIcon(autocvar_hud_panel_healtharmor_iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, HUD_Get_Num_Color(leftcnt, 200), 1); + DrawNumIcon(iconalign, pos, eX * mySize_x + eY * 0.5 * mySize_y, leftcnt, leftname, 1, HUD_Get_Num_Color(leftcnt, 200), 1); } if(rightactive) { - if(autocvar_hud_panel_healtharmor_baralign == 0 || autocvar_hud_panel_healtharmor_baralign == 3) { // left align + if(baralign == 0 || baralign == 3) { // left align barpos = pos + eY * 0.5 * mySize_y; barsize = eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y; } else { // right align @@ -2447,17 +2499,17 @@ void HUD_HealthArmor(void) barsize = eX * mySize_x * min(1, rightcnt/200) + eY * 0.5 * mySize_y; } - if(autocvar_hud_panel_healtharmor_progressbar) + if(progressbar) { HUD_Panel_GetProgressBarColorForString(rightname); HUD_Panel_DrawProgressBar(barpos, 0, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); } - DrawNumIcon(autocvar_hud_panel_healtharmor_iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, HUD_Get_Num_Color(rightcnt, 200), 1); + DrawNumIcon(iconalign, pos + eY * 0.5 * mySize_y, eX * mySize_x + eY * 0.5 * mySize_y, rightcnt, rightname, 0, HUD_Get_Num_Color(rightcnt, 200), 1); } if(fuel) { - if(autocvar_hud_panel_healtharmor_baralign == 0 || autocvar_hud_panel_healtharmor_baralign == 3) { // left align + if(baralign == 0 || baralign == 3) { // left align barpos = pos + eX * mySize_x - eX * mySize_x * min(1, fuel/100); barsize = eX * mySize_x * min(1, fuel/100) + eY * 0.1 * mySize_y; } else { @@ -2472,7 +2524,7 @@ void HUD_HealthArmor(void) { if(leftactive) { - if(autocvar_hud_panel_healtharmor_baralign == 1 || autocvar_hud_panel_healtharmor_baralign == 3) { // down align + if(baralign == 1 || baralign == 3) { // down align barpos = pos + eY * mySize_y - eY * mySize_y * min(1, leftcnt/200); barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/200); } else { // up align @@ -2480,7 +2532,7 @@ void HUD_HealthArmor(void) barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, leftcnt/200); } - if(autocvar_hud_panel_healtharmor_iconalign == 1 || autocvar_hud_panel_healtharmor_iconalign == 3) { // down align + if(iconalign == 1 || iconalign == 3) { // down align picpos = pos + eX * 0.05 * mySize_x + eY * (mySize_y - 0.65 * mySize_x); numpos = pos + eY * mySize_y - eY * 0.25 * mySize_x; } else { // up align @@ -2488,7 +2540,7 @@ void HUD_HealthArmor(void) numpos = pos + eY * 0.4 * mySize_x; } - if(autocvar_hud_panel_healtharmor_progressbar) + if(progressbar) { HUD_Panel_GetProgressBarColorForString(leftname); HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); @@ -2499,7 +2551,7 @@ void HUD_HealthArmor(void) if(rightactive) { - if(autocvar_hud_panel_healtharmor_baralign == 0 || autocvar_hud_panel_healtharmor_baralign == 3) { // up align + if(baralign == 0 || baralign == 3) { // up align barpos = pos + eX * 0.5 * mySize_x; barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/200); } else { // down align @@ -2507,7 +2559,7 @@ void HUD_HealthArmor(void) barsize = eX * 0.5 * mySize_x + eY * mySize_y * min(1, rightcnt/200); } - if(autocvar_hud_panel_healtharmor_iconalign == 0 || autocvar_hud_panel_healtharmor_iconalign == 3) { // up align + if(iconalign == 0 || iconalign == 3) { // up align picpos = pos + eX * 0.05 * mySize_x + eX * 0.5 * mySize_x; numpos = pos + eY * 0.4 * mySize_x + eX * 0.5 * mySize_x; } else { // down align @@ -2515,7 +2567,7 @@ void HUD_HealthArmor(void) numpos = pos + eY * mySize_y - eY * 0.25 * mySize_x + eX * 0.5 * mySize_x; } - if(autocvar_hud_panel_healtharmor_progressbar) + if(progressbar) { HUD_Panel_GetProgressBarColorForString(rightname); HUD_Panel_DrawProgressBar(barpos, 1, barsize, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); @@ -2526,7 +2578,7 @@ void HUD_HealthArmor(void) if(fuel) { - if(autocvar_hud_panel_healtharmor_baralign == 0 || autocvar_hud_panel_healtharmor_baralign == 3) { // left align + if(baralign == 0 || baralign == 3) { // left align barpos = pos; barsize = eX * 0.05 * mySize_x + eY * mySize_y * min(1, fuel/100); } else { @@ -2558,42 +2610,35 @@ string Weapon_KillMessage(float deathtype) return w_deathtypestring; } -float killnotify_times[10]; -float killnotify_deathtype[10]; -float killnotify_actiontype[10]; // 0 = "Y [used by] X", 1 = "X [did action to] Y" -string killnotify_attackers[10]; -string killnotify_victims[10]; +#define KN_MAX_ENTRIES 10 +float kn_index; +float killnotify_times[KN_MAX_ENTRIES]; +float killnotify_deathtype[KN_MAX_ENTRIES]; +float killnotify_actiontype[KN_MAX_ENTRIES]; // 0 = "Y [used by] X", 1 = "X [did action to] Y" +string killnotify_attackers[KN_MAX_ENTRIES]; +string killnotify_victims[KN_MAX_ENTRIES]; void HUD_KillNotify_Push(string attacker, string victim, float actiontype, float wpn) { - float i; - for (i = 9; i > 0; --i) { - killnotify_times[i] = killnotify_times[i-1]; - killnotify_deathtype[i] = killnotify_deathtype[i-1]; - killnotify_actiontype[i] = killnotify_actiontype[i-1]; - if(killnotify_attackers[i]) - strunzone(killnotify_attackers[i]); - killnotify_attackers[i] = strzone(killnotify_attackers[i-1]); - if(killnotify_victims[i]) - strunzone(killnotify_victims[i]); - killnotify_victims[i] = strzone(killnotify_victims[i-1]); - } - killnotify_times[0] = time; - killnotify_deathtype[0] = wpn; - killnotify_actiontype[0] = actiontype; - if(killnotify_attackers[0]) - strunzone(killnotify_attackers[0]); - killnotify_attackers[0] = strzone(attacker); - if(killnotify_victims[0]) - strunzone(killnotify_victims[0]); - killnotify_victims[0] = strzone(victim); + --kn_index; + if (kn_index == -1) + kn_index = KN_MAX_ENTRIES-1; + killnotify_times[kn_index] = time; + killnotify_deathtype[kn_index] = wpn; + killnotify_actiontype[kn_index] = actiontype; + if(killnotify_attackers[kn_index]) + strunzone(killnotify_attackers[kn_index]); + killnotify_attackers[kn_index] = strzone(attacker); + if(killnotify_victims[kn_index]) + strunzone(killnotify_victims[kn_index]); + killnotify_victims[kn_index] = strzone(victim); } void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s1 = attacker, s2 = victim { float w; float alsoprint, gentle; - alsoprint = (autocvar_hud_panel_notify_print || !panel_enabled); // print message to console if: notify panel disabled, or cvar to do so enabled - gentle = (autocvar_cl_gentle || autocvar_cl_gentle_messages); + alsoprint = (cvar("hud_panel_notify_print") || !panel_enabled); // print message to console if: notify panel disabled, or cvar to do so enabled + gentle = (cvar("cl_gentle") || cvar("cl_gentle_messages")); if ((msg == MSG_SUICIDE || msg == MSG_KILL || msg == MSG_KILL_ACTION) && gametype == GAME_CTS) // selfkill isn't interesting in CTS and only spams up the notify panel return; @@ -2643,7 +2688,11 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s } else if(msg == MSG_KILL) { w = DEATH_WEAPONOF(type); if(WEP_VALID(w)) { - HUD_KillNotify_Push(s1, s2, 1, type); + if((w == WEP_CAMPINGRIFLE || w == WEP_MINSTANEX) && type & HITTYPE_HEADSHOT) // all headshot weapons go here + HUD_KillNotify_Push(s1, s2, 1, DEATH_HEADSHOT); + else + HUD_KillNotify_Push(s1, s2, 1, type); + if (alsoprint) print("^1", sprintf(Weapon_KillMessage(type), strcat(s2, "^1"), strcat(s1, "^1")), "\n"); // default order: victim, killer } @@ -2945,7 +2994,7 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s void HUD_Centerprint(string s1, string s2, float type, float msg) { float gentle; - gentle = (autocvar_cl_gentle || autocvar_cl_gentle_messages); + gentle = (cvar("cl_gentle") || cvar("cl_gentle_messages")); if(msg == MSG_SUICIDE) { if (type == DEATH_TEAMCHANGE) { centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "You are now on: ", s1)); @@ -3048,7 +3097,7 @@ void HUD_Notify (void) } float entries, height; - entries = bound(1, floor(10 * mySize_y/mySize_x), 10); + entries = bound(1, floor(KN_MAX_ENTRIES * mySize_y/mySize_x), KN_MAX_ENTRIES); height = mySize_y/entries; vector fontsize; @@ -3056,9 +3105,9 @@ void HUD_Notify (void) float a; float when; - when = autocvar_hud_panel_notify_time; + when = cvar("hud_panel_notify_time"); float fadetime; - fadetime = autocvar_hud_panel_notify_fadetime; + fadetime = cvar("hud_panel_notify_fadetime"); string s; @@ -3067,42 +3116,63 @@ void HUD_Notify (void) float width_attacker; string attacker, victim; - float i, j, w; - for(j = 0; j < entries; ++j) + float i, j, w, step, limit; + if(cvar("hud_panel_notify_flip")) //order items from the top down { - s = ""; - if(autocvar_hud_panel_notify_flip) - i = j; - else // rather nasty hack for ordering items from the bottom up - i = entries - j - 1; + i = 0; + step = +1; + limit = entries; + } + else //order items from the bottom up + { + i = entries - 1; + step = -1; + limit = -1; + } - if(fadetime) + for(j = kn_index; i != limit; i += step, ++j) + { + if(autocvar__hud_configure) { - if(killnotify_times[j] + when > time) - a = 1; - else - a = bound(0, (killnotify_times[j] + when + fadetime - time) / fadetime, 1); + if (step == +1) + a = i; + else // inverse order + a = entries - 1 - i; + attacker = textShortenToWidth(strcat("Player", ftos(a+1)), 0.48 * mySize_x - height, fontsize, stringwidth_colors); + victim = textShortenToWidth(strcat("Player", ftos(a+2)), 0.48 * mySize_x - height, fontsize, stringwidth_colors); + s = strcat("weapon", get_weaponinfo(WEP_FIRST + mod(floor(a*2.4), WEP_LAST)).netname); + a = bound(0, (when - a) / 4, 1); + goto hud_config_notifyprint; + } + + if (j == KN_MAX_ENTRIES) + j = 0; + + if(killnotify_times[j] + when > time) + a = 1; + else if(fadetime) + { + a = bound(0, (killnotify_times[j] + when + fadetime - time) / fadetime, 1); + if(!a) + { + break; + } } else { - if(killnotify_times[j] + when > time) - a = 1; - else - a = 0; + break; } + s = ""; + w = -1; w = DEATH_WEAPONOF(killnotify_deathtype[j]); // TODO: maybe print in team colors? // // Y [used by] X - if(killnotify_actiontype[j] == 0 && !autocvar__hud_configure) + if(killnotify_actiontype[j] == 0) { - attacker = textShortenToWidth(killnotify_attackers[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors); - pos_attacker = pos + eX * (0.52 * mySize_x + height) + eY * (0.5 * fontsize_y + i * height); - weap_pos = pos + eX * 0.5 * mySize_x - eX * height + eY * i * height; - if(killnotify_deathtype[j] == DEATH_GENERIC) { s = "notify_death"; @@ -3195,7 +3265,11 @@ void HUD_Notify (void) s = "notify_blue_captured"; } } - if(s != "" && a) + attacker = textShortenToWidth(killnotify_attackers[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors); + pos_attacker = pos + eX * (0.52 * mySize_x + height) + eY * (0.5 * fontsize_y + i * height); + weap_pos = pos + eX * 0.5 * mySize_x - eX * height + eY * i * height; + + if(s != "") { drawpic_aspect_skin(weap_pos, s, '2 1 0' * height, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL); drawcolorcodedstring(pos_attacker, attacker, fontsize, panel_fg_alpha * a, DRAWFLAG_NORMAL); @@ -3204,27 +3278,7 @@ void HUD_Notify (void) // X [did action to] Y else { - if(autocvar__hud_configure) - { - attacker = textShortenToWidth("Player1", 0.48 * mySize_x - height, fontsize, stringwidth_colors); - victim = textShortenToWidth("Player2", 0.48 * mySize_x - height, fontsize, stringwidth_colors); - a = bound(0, (when - j) / 4, 1); - } - else - { - attacker = textShortenToWidth(killnotify_attackers[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors); - victim = textShortenToWidth(killnotify_victims[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors); - } - width_attacker = stringwidth(attacker, TRUE, fontsize); - pos_attacker = pos + eX * (0.48 * mySize_x - height - width_attacker) + eY * (0.5 * fontsize_y + i * height); - pos_victim = pos + eX * (0.52 * mySize_x + height) + eY * (0.5 * fontsize_y + i * height); - weap_pos = pos + eX * 0.5 * mySize_x - eX * height + eY * i * height; - - if(autocvar__hud_configure) // example actions for config mode - { - s = "weaponelectro"; - } - else if(killnotify_deathtype[j] & HITTYPE_SECONDARY && w == WEP_LASER) + if(killnotify_deathtype[j] & HITTYPE_SECONDARY && w == WEP_LASER) { s = "notify_melee_laser"; } @@ -3273,6 +3327,10 @@ void HUD_Notify (void) { s = "notify_void"; } + else if(killnotify_deathtype[j] == DEATH_HEADSHOT) + { + s = "notify_headshot"; + } else if(killnotify_deathtype[j] == RACE_SERVER_RECORD) { s = "race_newrecordserver"; @@ -3289,7 +3347,16 @@ void HUD_Notify (void) { s = "race_newfail"; } - if(s != "" && a) + + attacker = textShortenToWidth(killnotify_attackers[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors); + victim = textShortenToWidth(killnotify_victims[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors); +:hud_config_notifyprint + width_attacker = stringwidth(attacker, TRUE, fontsize); + pos_attacker = pos + eX * (0.48 * mySize_x - height - width_attacker) + eY * (0.5 * fontsize_y + i * height); + pos_victim = pos + eX * (0.52 * mySize_x + height) + eY * (0.5 * fontsize_y + i * height); + weap_pos = pos + eX * 0.5 * mySize_x - eX * height + eY * i * height; + + if(s != "") { drawpic_aspect_skin(weap_pos, s, '2 1 0' * height, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL); drawcolorcodedstring(pos_attacker, attacker, fontsize, panel_fg_alpha * a, DRAWFLAG_NORMAL); @@ -3791,21 +3858,10 @@ void HUD_VoteWindow(void) if(!autocvar_hud_panel_vote && !autocvar__hud_configure) return; - active_panel = HUD_PANEL_VOTE; - HUD_Panel_UpdateCvars(vote); - if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE)) - { - panel_pos = eX * 0.3 * vid_conwidth + eY * 0.1 * vid_conheight; - panel_size = eX * 0.4 * vid_conwidth + eY * 0.3 * vid_conheight; - } - vector pos, mySize; - pos = panel_pos; - mySize = panel_size; - if(!autocvar__hud_configure) { panel_fg_alpha = autocvar_hud_panel_fg_alpha; - panel_bg_alpha_str = autocvar_hud_panel_vote_bg_alpha; + panel_bg_alpha_str = cvar_string("hud_panel_vote_bg_alpha"); if(panel_bg_alpha_str == "") { panel_bg_alpha_str = ftos(autocvar_hud_panel_bg_alpha); @@ -3835,9 +3891,22 @@ void HUD_VoteWindow(void) if(!vote_alpha) return; - a = panel_bg_alpha * vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1); + active_panel = HUD_PANEL_VOTE; + HUD_Panel_UpdateCvars(vote); + vector pos, mySize; + pos = panel_pos; + mySize = panel_size; + + if(autocvar_cl_allow_uid2name == -1 && (gametype == GAME_CTS || gametype == GAME_RACE)) + { + panel_pos = eX * 0.3 * vid_conwidth + eY * 0.1 * vid_conheight; + panel_size = eX * 0.4 * vid_conwidth + eY * 0.3 * vid_conheight; + } + + a = vote_alpha * bound(cvar("hud_panel_vote_alreadyvoted_alpha"), 1 - vote_highlighted, 1); HUD_Panel_DrawBg(a); - a = panel_fg_alpha * vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1); + a = panel_fg_alpha * a; + if(panel_bg_padding) { pos += '1 1 0' * panel_bg_padding; @@ -3895,11 +3964,17 @@ void HUD_VoteWindow(void) } // draw the progress bars - drawsetcliparea(pos_x, pos_y, mySize_x * 0.5 * (vote_yescount/vote_needed), mySize_y); - drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL); + if(vote_yescount && vote_needed) + { + drawsetcliparea(pos_x, pos_y, mySize_x * 0.5 * (vote_yescount/vote_needed), mySize_y); + drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL); + } - drawsetcliparea(pos_x + mySize_x - mySize_x * 0.5 * (vote_nocount/vote_needed), pos_y, mySize_x * 0.5, mySize_y); - drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL); + if(vote_nocount && vote_needed) + { + drawsetcliparea(pos_x + mySize_x - mySize_x * 0.5 * (vote_nocount/vote_needed), pos_y, mySize_x * 0.5, mySize_y); + drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL); + } drawresetcliparea(); @@ -4505,19 +4580,20 @@ void HUD_DrawPressedKeys(void) } // force custom aspect - if(autocvar_hud_panel_pressedkeys_aspect) + float aspect = cvar("hud_panel_pressedkeys_aspect"); + if(aspect) { vector newSize; - if(mySize_x/mySize_y > autocvar_hud_panel_pressedkeys_aspect) + if(mySize_x/mySize_y > aspect) { - newSize_x = autocvar_hud_panel_pressedkeys_aspect * mySize_y; + newSize_x = aspect * mySize_y; newSize_y = mySize_y; pos_x = pos_x + (mySize_x - newSize_x) / 2; } else { - newSize_y = 1/autocvar_hud_panel_pressedkeys_aspect * mySize_x; + newSize_y = 1/aspect * mySize_x; newSize_x = mySize_x; pos_y = pos_y + (mySize_y - newSize_y) / 2; @@ -5001,9 +5077,6 @@ switch (id) {\ void HUD_Main (void) { float i; - - hud_skin_path = strcat("gfx/hud/", autocvar_hud_skin); - // global hud alpha fade if(menu_enabled == 1) hud_fade_alpha = 1; @@ -5024,6 +5097,12 @@ void HUD_Main (void) return; // Drawing stuff + if (hud_skin_path != cvar_string("hud_skin")) + { + if (hud_skin_path) + strunzone(hud_skin_path); + hud_skin_path = strzone(strcat("gfx/hud/", cvar_string("hud_skin"))); + } // HUD configure visible grid if(autocvar__hud_configure && autocvar_hud_configure_grid && autocvar_hud_configure_grid_alpha) @@ -5045,23 +5124,28 @@ void HUD_Main (void) { float f; vector color; - if((teamplay) && autocvar_hud_dock_color_team) { - f = stof(getplayerkey(player_localentnum - 1, "colors")); - color = colormapPaletteColor(mod(f, 16), 1) * autocvar_hud_dock_color_team; - } - else if(autocvar_hud_configure_teamcolorforced && autocvar__hud_configure && autocvar_hud_dock_color_team) { - color = '1 0 0' * autocvar_hud_dock_color_team; - } - else if(autocvar_hud_dock_color == "shirt") { + float hud_dock_color_team = cvar("hud_dock_color_team"); + if((teamplay) && hud_dock_color_team) { f = stof(getplayerkey(player_localentnum - 1, "colors")); - color = colormapPaletteColor(floor(f / 16), 0); + color = colormapPaletteColor(mod(f, 16), 1) * hud_dock_color_team; } - else if(autocvar_hud_dock_color == "pants") { - f = stof(getplayerkey(player_localentnum - 1, "colors")); - color = colormapPaletteColor(mod(f, 16), 1); + else if(autocvar_hud_configure_teamcolorforced && autocvar__hud_configure && hud_dock_color_team) { + color = '1 0 0' * hud_dock_color_team; } else - color = stov(autocvar_hud_dock_color); + { + string hud_dock_color = cvar_string("hud_dock_color"); + if(hud_dock_color == "shirt") { + f = stof(getplayerkey(player_localentnum - 1, "colors")); + color = colormapPaletteColor(floor(f / 16), 0); + } + else if(hud_dock_color == "pants") { + f = stof(getplayerkey(player_localentnum - 1, "colors")); + color = colormapPaletteColor(mod(f, 16), 1); + } + else + color = stov(hud_dock_color); + } string pic; pic = strcat(hud_skin_path, "/", autocvar_hud_dock); @@ -5071,7 +5155,7 @@ void HUD_Main (void) pic = "gfx/hud/default/dock_medium"; } } - drawpic('0 0 0', pic, eX * vid_conwidth + eY * vid_conheight, color, autocvar_hud_dock_alpha * hud_fade_alpha, DRAWFLAG_NORMAL); // no aspect ratio forcing on dock... + drawpic('0 0 0', pic, eX * vid_conwidth + eY * vid_conheight, color, cvar("hud_dock_alpha") * hud_fade_alpha, DRAWFLAG_NORMAL); // no aspect ratio forcing on dock... } // cache the panel order into the panel_order array diff --git a/qcsrc/client/hud.qh b/qcsrc/client/hud.qh index 7a61b515c8..b661e30ff5 100644 --- a/qcsrc/client/hud.qh +++ b/qcsrc/client/hud.qh @@ -18,9 +18,9 @@ float scoreboard_bottom; float weapon_hits[WEP_MAXCOUNT]; float weapon_fired[WEP_MAXCOUNT]; -#define acc_color(i) stov(cvar_string(strcat("hud_panel_weapons_accuracy_color", ftos(i)))) #define MAX_ACCURACY_LEVELS 10 float acc_lev[MAX_ACCURACY_LEVELS]; +vector acc_col[MAX_ACCURACY_LEVELS]; float acc_levels; string acc_color_levels; @@ -88,7 +88,7 @@ var string panel_bg_padding_str; // Little help for the poor people who have to make sense of this: Start from the bottom ;) #define HUD_Panel_GetProgressBarColor(item) \ - progressbar_color = autocvar_hud_progressbar_##item##_color + progressbar_color = stov(cvar_string("hud_progressbar_" #item "_color")) #define HUD_Panel_GetProgressBarColorForString(item) \ switch(item) {\ case "strength": HUD_Panel_GetProgressBarColor(strength); break;\ @@ -251,14 +251,14 @@ else\ // Update all common cvars of given panel name #define HUD_Panel_UpdateCvars(name) \ panel_enabled = autocvar_hud_panel_##name; \ -panel_pos = autocvar_hud_panel_##name##_pos; \ -panel_size = autocvar_hud_panel_##name##_size; \ -panel_bg_str = autocvar_hud_panel_##name##_bg; \ -panel_bg_color_str = autocvar_hud_panel_##name##_bg_color; \ -panel_bg_color_team_str = autocvar_hud_panel_##name##_bg_color_team; \ -panel_bg_alpha_str = autocvar_hud_panel_##name##_bg_alpha; \ -panel_bg_border_str = autocvar_hud_panel_##name##_bg_border; \ -panel_bg_padding_str = autocvar_hud_panel_##name##_bg_padding; \ +panel_pos = stov(cvar_string("hud_panel_" #name "_pos")); \ +panel_size = stov(cvar_string("hud_panel_" #name "_size")); \ +panel_bg_str = cvar_string("hud_panel_" #name "_bg"); \ +panel_bg_color_str = cvar_string("hud_panel_" #name "_bg_color"); \ +panel_bg_color_team_str = cvar_string("hud_panel_" #name "_bg_color_team"); \ +panel_bg_alpha_str = cvar_string("hud_panel_" #name "_bg_alpha"); \ +panel_bg_border_str = cvar_string("hud_panel_" #name "_bg_border"); \ +panel_bg_padding_str = cvar_string("hud_panel_" #name "_bg_padding"); \ HUD_Panel_StringVars()\ if(menu_enabled == 2 && active_panel == highlightedPanel) {\ HUD_Panel_GetMenuSize()\ @@ -286,14 +286,14 @@ switch(id) { \ } #define HUD_Panel_UpdatePosSize(name) \ -panel_pos = autocvar_hud_panel_##name##_pos; \ -panel_size = autocvar_hud_panel_##name##_size; \ +panel_pos = stov(cvar_string("hud_panel_" #name "_pos")); \ +panel_size = stov(cvar_string("hud_panel_" #name "_size")); \ HUD_Panel_GetScaledVectors()\ if(menu_enabled == 2 && active_panel == highlightedPanel) {\ HUD_Panel_GetMenuSize()\ HUD_Panel_GetMenuPos()\ }\ -panel_bg_border_str = autocvar_hud_panel_##name##_bg_border; \ +panel_bg_border_str = cvar_string("hud_panel_" #name "_bg_border"); \ HUD_Panel_GetBorder() // Update pos and size of given panel id diff --git a/qcsrc/client/scoreboard.qc b/qcsrc/client/scoreboard.qc index b61568a2ae..ec17dfca77 100644 --- a/qcsrc/client/scoreboard.qc +++ b/qcsrc/client/scoreboard.qc @@ -895,7 +895,6 @@ float average_accuracy; vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) { float i; - float weapon_hit, weapon_damage, weapon_stats; float weapon_cnt = WEP_COUNT - 3; // either minstanex/nex are hidden, no port-o-launch, no tuba float rows; if(cvar("scoreboard_accuracy_doublerows")) @@ -942,8 +941,21 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) if(getstati(STAT_SWITCHWEAPON) == WEP_MINSTANEX) g_minstagib = 1; // TODO: real detection for minstagib? + float weapon_hit, weapon_damage, weapon_stats, weapon_number; + // hits + weapon_stats = getstati(STAT_DAMAGE_HITS); + weapon_number = weapon_stats & 63; + weapon_hits[weapon_number-WEP_FIRST] = floor(weapon_stats / 64); + // fired + weapon_stats = getstati(STAT_DAMAGE_FIRED); + weapon_number = weapon_stats & 63; + weapon_fired[weapon_number-WEP_FIRST] = floor(weapon_stats / 64); + if (!acc_levels) rgb = '1 1 1'; + else if (acc_col_x[0] == -1) + for (i = 0; i < acc_levels; ++i) + acc_col[i] = stov(cvar_string(strcat("accuracy_color", ftos(i)))); for(i = WEP_FIRST; i <= WEP_LAST; ++i) { @@ -954,12 +966,13 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) continue; weapon_hit = weapon_hits[i-WEP_FIRST]; weapon_damage = weapon_fired[i-WEP_FIRST]; - if(weapon_damage) - weapon_stats = bound(0, floor(100 * weapon_hit / weapon_damage), 100); - float weapon_alpha; + float weapon_alpha; if(weapon_damage) + { + weapon_stats = bound(0, floor(100 * weapon_hit / weapon_damage), 100); weapon_alpha = scoreboard_alpha_fg; + } else weapon_alpha = 0.2 * scoreboard_alpha_fg; @@ -994,8 +1007,8 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) // inject color j+1 in color j, how much depending on how much weapon_stats is higher than level j float factor; factor = (weapon_stats - acc_lev[j]) / (acc_lev[j+1] - acc_lev[j]); - rgb = acc_color(j); - rgb = rgb + factor * (acc_color(j+1) - rgb); + rgb = acc_col[j]; + rgb = rgb + factor * (acc_col[j+1] - rgb); } drawstring(pos + '1 0 0' * padding + '0 1 0' * weapon_height, s, '1 1 0' * fontsize, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL); @@ -1105,8 +1118,8 @@ void HUD_DrawScoreboard() HUD_UpdatePlayerTeams(); - scoreboard_alpha_bg = cvar("scoreboard_alpha_bg") * scoreboard_fade_alpha * (1 - cvar("_menu_alpha")); - scoreboard_alpha_fg = cvar_or("scoreboard_alpha_fg", 1.0) * scoreboard_fade_alpha * (1 - cvar("_menu_alpha")); + scoreboard_alpha_bg = cvar("scoreboard_alpha_bg") * scoreboard_fade_alpha * (1 - autocvar__menu_alpha); + scoreboard_alpha_fg = cvar_or("scoreboard_alpha_fg", 1.0) * scoreboard_fade_alpha * (1 - autocvar__menu_alpha); scoreboard_highlight = cvar("scoreboard_highlight"); scoreboard_highlight_alpha = cvar_or("scoreboard_highlight_alpha", 0.10) * scoreboard_alpha_fg; scoreboard_highlight_alpha_self = cvar_or("scoreboard_highlight_alpha_self", 0.25) * scoreboard_alpha_fg; diff --git a/qcsrc/client/waypointsprites.qc b/qcsrc/client/waypointsprites.qc index 07e9127827..816a2e4851 100644 --- a/qcsrc/client/waypointsprites.qc +++ b/qcsrc/client/waypointsprites.qc @@ -425,7 +425,7 @@ void WaypointSprite_Load() waypointsprite_distancefadealpha = cvar_or("g_waypointsprite_distancefadealpha", 1); waypointsprite_distancefadescale = cvar_or("g_waypointsprite_distancefadescale", 1); waypointsprite_distancefadedistance = vlen(mi_max - mi_min) * cvar_or("g_waypointsprite_distancefadedistancemultiplier", 1); - waypointsprite_alpha = cvar_or("g_waypointsprite_alpha", 1) * (1 - cvar("_menu_alpha")); + waypointsprite_alpha = cvar_or("g_waypointsprite_alpha", 1) * (1 - autocvar__menu_alpha); if(!waypointsprite_initialized) { diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index 29029f6e45..4acf797b7d 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -508,6 +508,7 @@ float DEATH_CHEAT = 10016; float DEATH_FIRE = 10017; float DEATH_TURRET = 10020; float DEATH_QUIET = 10021; +float DEATH_HEADSHOT = 10022; float DEATH_SBMINIGUN = 10030; float DEATH_SBROCKET = 10031; @@ -645,3 +646,5 @@ string HUD_PANELNAME_ENGINEINFO = "engineinfo"; string HUD_PANELNAME_INFOMESSAGES = "infomessages"; float HUD_MENU_ENABLE = 0; + +#define SERVERFLAG_ALLOW_FULLBRIGHT 1 diff --git a/qcsrc/menu/xonotic/colorpicker.c b/qcsrc/menu/xonotic/colorpicker.c index b888358c37..66f292a036 100644 --- a/qcsrc/menu/xonotic/colorpicker.c +++ b/qcsrc/menu/xonotic/colorpicker.c @@ -51,6 +51,25 @@ vector hslimage_color(vector v, vector margin) return hsl_to_rgb(v_x * 6 * eX + eY + v_y / 0.875 * eZ); } +vector color_hslimage(vector v, vector margin) +{ + vector pos; + v = rgb_to_hsl(v); + if (v_y) + { + pos_x = v_x / 6; + pos_y = v_z * 0.875; + } + else // grey scale + { + pos_x = v_z; + pos_y = 0.875 + 0.07; + } + pos_x = margin_x + pos_x * (1 - 2 * margin_x); + pos_y = margin_y + pos_y * (1 - 2 * margin_y); + return pos; +} + float XonoticColorpicker_mouseDrag(entity me, vector coords) { float i; diff --git a/qcsrc/menu/xonotic/colorpicker_string.c b/qcsrc/menu/xonotic/colorpicker_string.c index 3633553044..f57c768a5f 100644 --- a/qcsrc/menu/xonotic/colorpicker_string.c +++ b/qcsrc/menu/xonotic/colorpicker_string.c @@ -1,6 +1,6 @@ #ifdef INTERFACE CLASS(XonoticColorpickerString) EXTENDS(Image) - METHOD(XonoticColorpickerString, configureXonoticColorpickerString, void(entity, string)) + METHOD(XonoticColorpickerString, configureXonoticColorpickerString, void(entity, string, string)) METHOD(XonoticColorpickerString, mousePress, float(entity, vector)) METHOD(XonoticColorpickerString, mouseRelease, float(entity, vector)) METHOD(XonoticColorpickerString, mouseDrag, float(entity, vector)) @@ -12,23 +12,26 @@ CLASS(XonoticColorpickerString) EXTENDS(Image) METHOD(XonoticColorpickerString, draw, void(entity)) ATTRIB(XonoticColorpickerString, disabledAlpha, float, 0.3) ENDCLASS(XonoticColorpickerString) -entity makeXonoticColorpickerString(string theCvar); +entity makeXonoticColorpickerString(string theCvar, string theDefaultCvar); #endif #ifdef IMPLEMENTATION -entity makeXonoticColorpickerString(string theCvar) +entity makeXonoticColorpickerString(string theCvar, string theDefaultCvar) { entity me; me = spawnXonoticColorpickerString(); - me.configureXonoticColorpickerString(me, theCvar); + me.configureXonoticColorpickerString(me, theCvar, theDefaultCvar); return me; } -void XonoticColorpickerString_configureXonoticColorpickerString(entity me, string theCvar) +void XonoticColorpickerString_configureXonoticColorpickerString(entity me, string theCvar, string theDefaultCvar) { me.cvarName = theCvar; me.configureImage(me, me.image); - me.prevcoords = '1 1 0'; + if(cvar_string(theCvar) != "") + me.prevcoords = color_hslimage(stov(cvar_string(theCvar)), me.imagemargin); + else // use default + me.prevcoords = color_hslimage(stov(cvar_string(theDefaultCvar)), me.imagemargin); } float XonoticColorpickerString_mousePress(entity me, vector coords) @@ -48,7 +51,6 @@ float XonoticColorpickerString_mouseDrag(entity me, vector coords) if(coords_x <= 1 - margin_x) if(coords_y <= 1 - margin_y) { - cvar_set(me.cvarName, sprintf("%v", hslimage_color(coords, margin))); me.prevcoords = coords; } @@ -74,10 +76,11 @@ void XonoticColorpickerString_draw(entity me) sz = draw_PictureSize(strcat(me.src, "_selected")); sz = globalToBoxSize(sz, draw_scale); - if(me.disabled) - me.prevcoords = '1 1 0'; - else + if(!me.disabled) + { + cvar_set(me.cvarName, sprintf("%v", hslimage_color(me.prevcoords, me.imagemargin))); draw_Picture(me.imgOrigin + me.prevcoords - 0.5 * sz, strcat(me.src, "_selected"), sz, '1 1 1', 1); + } draw_alpha = save; } #endif diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_ammo.c b/qcsrc/menu/xonotic/dialog_hudpanel_ammo.c index 1e0d4bf92d..256dbe7df0 100644 --- a/qcsrc/menu/xonotic/dialog_hudpanel_ammo.c +++ b/qcsrc/menu/xonotic/dialog_hudpanel_ammo.c @@ -29,7 +29,7 @@ void XonoticHUDAmmoDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")))); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")), "hud_panel_bg_color")); setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), ""); me.TR(me); me.TDempty(me, 0.2); diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_chat.c b/qcsrc/menu/xonotic/dialog_hudpanel_chat.c index 74fabe0518..c9a4eae6e8 100644 --- a/qcsrc/menu/xonotic/dialog_hudpanel_chat.c +++ b/qcsrc/menu/xonotic/dialog_hudpanel_chat.c @@ -29,7 +29,7 @@ void XonoticHUDChatDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")))); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")), "hud_panel_bg_color")); setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), ""); me.TR(me); me.TDempty(me, 0.2); diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c b/qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c index 8d359e9cf6..03ef106c7d 100644 --- a/qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c +++ b/qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c @@ -29,7 +29,7 @@ void XonoticHUDEngineInfoDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")))); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")), "hud_panel_bg_color")); setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), ""); me.TR(me); me.TDempty(me, 0.2); diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c b/qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c index b276045b63..3e8a43aeb3 100644 --- a/qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c +++ b/qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c @@ -29,7 +29,7 @@ void XonoticHUDHealthArmorDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")))); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")), "hud_panel_bg_color")); setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), ""); me.TR(me); me.TDempty(me, 0.2); diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c b/qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c index 56d4bf4636..d8534a20e9 100644 --- a/qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c +++ b/qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c @@ -29,7 +29,7 @@ void XonoticHUDInfoMessagesDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")))); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")), "hud_panel_bg_color")); setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), ""); me.TR(me); me.TDempty(me, 0.2); diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_modicons.c b/qcsrc/menu/xonotic/dialog_hudpanel_modicons.c index ebd5f240be..d60a72473f 100644 --- a/qcsrc/menu/xonotic/dialog_hudpanel_modicons.c +++ b/qcsrc/menu/xonotic/dialog_hudpanel_modicons.c @@ -29,7 +29,7 @@ void XonoticHUDModIconsDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")))); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")), "hud_panel_bg_color")); setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), ""); me.TR(me); me.TDempty(me, 0.2); diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_notification.c b/qcsrc/menu/xonotic/dialog_hudpanel_notification.c index c811cb6283..3eeaff284d 100644 --- a/qcsrc/menu/xonotic/dialog_hudpanel_notification.c +++ b/qcsrc/menu/xonotic/dialog_hudpanel_notification.c @@ -29,7 +29,7 @@ void XonoticHUDNotificationDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")))); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")), "hud_panel_bg_color")); setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), ""); me.TR(me); me.TDempty(me, 0.2); diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_powerups.c b/qcsrc/menu/xonotic/dialog_hudpanel_powerups.c index 14f4a19268..5d4e14c08b 100644 --- a/qcsrc/menu/xonotic/dialog_hudpanel_powerups.c +++ b/qcsrc/menu/xonotic/dialog_hudpanel_powerups.c @@ -29,7 +29,7 @@ void XonoticHUDPowerupsDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")))); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")), "hud_panel_bg_color")); setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), ""); me.TR(me); me.TDempty(me, 0.2); diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c b/qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c index 7d32914dda..30f6bfc1f2 100644 --- a/qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c +++ b/qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c @@ -33,7 +33,7 @@ void XonoticHUDPressedKeysDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")))); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")), "hud_panel_bg_color")); setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), ""); me.TR(me); me.TDempty(me, 0.2); diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c b/qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c index febbd54497..35fdc55f3c 100644 --- a/qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c +++ b/qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c @@ -29,7 +29,7 @@ void XonoticHUDRaceTimerDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")))); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")), "hud_panel_bg_color")); setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), ""); me.TR(me); me.TDempty(me, 0.2); diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_radar.c b/qcsrc/menu/xonotic/dialog_hudpanel_radar.c index 90de04795a..d1202846e2 100644 --- a/qcsrc/menu/xonotic/dialog_hudpanel_radar.c +++ b/qcsrc/menu/xonotic/dialog_hudpanel_radar.c @@ -33,7 +33,7 @@ void XonoticHUDRadarDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")))); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")), "hud_panel_bg_color")); setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), ""); me.TR(me); me.TDempty(me, 0.2); diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_score.c b/qcsrc/menu/xonotic/dialog_hudpanel_score.c index 8c8561ea79..fc51921e23 100644 --- a/qcsrc/menu/xonotic/dialog_hudpanel_score.c +++ b/qcsrc/menu/xonotic/dialog_hudpanel_score.c @@ -29,7 +29,7 @@ void XonoticHUDScoreDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")))); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")), "hud_panel_bg_color")); setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), ""); me.TR(me); me.TDempty(me, 0.2); diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_timer.c b/qcsrc/menu/xonotic/dialog_hudpanel_timer.c index 748d2911ec..96dc4aa695 100644 --- a/qcsrc/menu/xonotic/dialog_hudpanel_timer.c +++ b/qcsrc/menu/xonotic/dialog_hudpanel_timer.c @@ -29,7 +29,7 @@ void XonoticHUDTimerDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")))); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")), "hud_panel_bg_color")); setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), ""); me.TR(me); me.TDempty(me, 0.2); diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_vote.c b/qcsrc/menu/xonotic/dialog_hudpanel_vote.c index 6c935d9e7f..b5f5b6e27b 100644 --- a/qcsrc/menu/xonotic/dialog_hudpanel_vote.c +++ b/qcsrc/menu/xonotic/dialog_hudpanel_vote.c @@ -29,7 +29,7 @@ void XonoticHUDVoteDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")))); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")), "hud_panel_bg_color")); setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), ""); me.TR(me); me.TDempty(me, 0.2); diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_weapons.c b/qcsrc/menu/xonotic/dialog_hudpanel_weapons.c index 538723bce1..ad3d080415 100644 --- a/qcsrc/menu/xonotic/dialog_hudpanel_weapons.c +++ b/qcsrc/menu/xonotic/dialog_hudpanel_weapons.c @@ -29,11 +29,11 @@ void XonoticHUDWeaponsDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")))); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString(strzone(strcat("hud_panel_", panelname, "_bg_color")), "hud_panel_bg_color")); setDependentStringNotEqual(e, strzone(strcat("hud_panel_", panelname, "_bg_color")), ""); me.TR(me); me.TDempty(me, 0.2); - me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", "1 1 1", strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default")); + me.TD(me, 1, 1.2, e = makeXonoticCheckBoxString("", cvar_string("hud_panel_bg_color"), strzone(strcat("hud_panel_", panelname, "_bg_color")), "Use default")); me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Border size:")); @@ -103,7 +103,7 @@ void XonoticHUDWeaponsDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Ammo bar color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString("hud_panel_weapons_ammo_color")); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString("hud_panel_weapons_ammo_color", "hud_panel_weapons_ammo_color")); setDependent(e, "hud_panel_weapons_ammo", 1, 1); me.TR(me); me.TR(me); diff --git a/qcsrc/menu/xonotic/dialog_hudsetup_exit.c b/qcsrc/menu/xonotic/dialog_hudsetup_exit.c index 3f8bcebd77..751b3cf95c 100644 --- a/qcsrc/menu/xonotic/dialog_hudsetup_exit.c +++ b/qcsrc/menu/xonotic/dialog_hudsetup_exit.c @@ -28,7 +28,7 @@ void XonoticHUDExitDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString("hud_panel_bg_color")); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString("hud_panel_bg_color", "hud_panel_bg_color")); me.TR(me); me.TR(me); me.TDempty(me, 0.2); @@ -75,7 +75,7 @@ void XonoticHUDExitDialog_fill(entity me) me.TR(me); me.TDempty(me, 0.2); me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, "Color:")); - me.TD(me, 2, 2.4, e = makeXonoticColorpickerString("hud_dock_color")); + me.TD(me, 2, 2.4, e = makeXonoticColorpickerString("hud_dock_color", "hud_dock_color")); me.TR(me); me.TR(me); me.TDempty(me, 0.2); diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 66a838a31c..1438d317c7 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -1091,10 +1091,11 @@ float ClientInit_SendEntity(entity to, float sf) WriteString(MSG_ENTITY, ""); WriteByte(MSG_ENTITY, self.count * 255.0); // g_balance_armor_blockpercent WriteByte(MSG_ENTITY, self.cnt * 255.0); // g_balance_weaponswitchdelay - WriteCoord(MSG_ENTITY, self.bouncefactor); // g_balance_grenadelauncher_secondary_bouncefactor - WriteCoord(MSG_ENTITY, self.bouncestop); // g_balance_grenadelauncher_secondary_bouncestop + WriteCoord(MSG_ENTITY, self.bouncefactor); // g_balance_grenadelauncher_bouncefactor + WriteCoord(MSG_ENTITY, self.bouncestop); // g_balance_grenadelauncher_bouncestop WriteByte(MSG_ENTITY, cvar("g_balance_nex_secondary")); // client has to know if it should zoom or not WriteByte(MSG_ENTITY, cvar("g_balance_campingrifle_secondary")); // client has to know if it should zoom or not + WriteByte(MSG_ENTITY, serverflags); // client has to know if it should zoom or not return TRUE; } @@ -1111,14 +1112,14 @@ void ClientInit_CheckUpdate() self.cnt = cvar("g_balance_weaponswitchdelay"); self.SendFlags |= 1; } - if(self.bouncefactor != cvar("g_balance_grenadelauncher_secondary_bouncefactor")) + if(self.bouncefactor != cvar("g_balance_grenadelauncher_bouncefactor")) { - self.bouncefactor = cvar("g_balance_grenadelauncher_secondary_bouncefactor"); + self.bouncefactor = cvar("g_balance_grenadelauncher_bouncefactor"); self.SendFlags |= 1; } - if(self.bouncestop != cvar("g_balance_grenadelauncher_secondary_bouncestop")) + if(self.bouncestop != cvar("g_balance_grenadelauncher_bouncestop")) { - self.bouncestop = cvar("g_balance_grenadelauncher_secondary_bouncestop"); + self.bouncestop = cvar("g_balance_grenadelauncher_bouncestop"); self.SendFlags |= 1; } } @@ -2808,6 +2809,11 @@ void PlayerPreThink (void) } player_regen(); + + // rot nex charge to the charge limit + if(cvar("g_balance_nex_charge_rot_rate") && self.nex_charge > cvar("g_balance_nex_charge_limit")) + self.nex_charge = bound(cvar("g_balance_nex_charge_limit"), self.nex_charge - cvar("g_balance_nex_charge_rot_rate") * frametime / W_TICSPERFRAME, 1); + if(frametime) player_anim(); diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index 45394eb792..74797441c3 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -660,3 +660,5 @@ string deathmessage; .float nex_charge; float allowed_to_spawn; // boolean variable used by the clan arena code to determine if a player can spawn (after the round has ended) + +float serverflags; diff --git a/qcsrc/server/g_damage.qc b/qcsrc/server/g_damage.qc index 6f8c9490ef..809df9ecbd 100644 --- a/qcsrc/server/g_damage.qc +++ b/qcsrc/server/g_damage.qc @@ -88,11 +88,11 @@ float IsFlying(entity a) vector GetHeadshotMins(entity targ) { - return '0.6 0 0' * targ.mins_x + '0 0.6 0' * targ.mins_y + '0 0 1' * (1.3 * targ.view_ofs_z - 0.3 * targ.maxs_z); + return '-0.5 0 0' * PL_HEAD_x + '0 -0.5 0' * PL_HEAD_y + '0 0 1' * (targ.maxs_z - PL_HEAD_z); } vector GetHeadshotMaxs(entity targ) { - return '0.6 0 0' * targ.maxs_x + '0 0.6 0' * targ.maxs_y + '0 0 1' * targ.maxs_z; + return '0.5 0 0' * PL_HEAD_x + '0 0.5 0' * PL_HEAD_y + '0 0 1' * targ.maxs_z; } void UpdateFrags(entity player, float f) @@ -993,6 +993,39 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e finaldmg = finaldmg * a; a = bound(0, tfloorforce + (1-tfloorforce) * hitratio, 1); force = force * a; + + // laser force adjustments :P + if(DEATH_WEAPONOF(deathtype) == WEP_LASER) + { + vector vel; + + float force_zscale; + float force_velocitybiasramp; + float force_velocitybias; + + force_velocitybiasramp = cvar("sv_maxspeed"); + if(deathtype & HITTYPE_SECONDARY) + { + force_zscale = cvar("g_balance_laser_secondary_force_zscale"); + force_velocitybias = cvar("g_balance_laser_secondary_force_velocitybias"); + } + else + { + force_zscale = cvar("g_balance_laser_primary_force_zscale"); + force_velocitybias = cvar("g_balance_laser_primary_force_velocitybias"); + } + + vel = targ.velocity; + vel_z = 0; + vel = normalize(vel) * bound(0, vlen(vel) / force_velocitybiasramp, 1) * force_velocitybias; + force = + vlen(force) + * + normalize(normalize(force) + vel); + + force_z *= force_zscale; + } + //if (targ == attacker) //{ // print("hits ", ftos(hits), " / ", ftos(total)); diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index b351d77615..c5abb52f59 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -403,6 +403,7 @@ void cvar_changes_init() BADCVAR("g_maplist_votable_abstain"); BADCVAR("g_maplist_votable_nodetail"); BADCVAR("g_maplist_votable_suggestions"); + BADCVAR("g_minstagib"); BADCVAR("g_nexball_goallimit"); BADCVAR("g_runematch_point_limit"); BADCVAR("g_start_delay"); @@ -449,6 +450,12 @@ void cvar_changes_init() } } ++cvar_purechanges_count; + // WARNING: this variable is used for the server list + // NEVER dare to skip this code! + // Hacks to intentionally appearing as "pure server" even though you DO have + // modified settings may be punished by removal from the server list. + // You can do to the variables cvar_changes and cvar_purechanges all you want, + // though. } buf_del(h); if(cvar_changes == "") diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 5485cc10db..738c32eba8 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -181,6 +181,7 @@ void GameLogClose() vector PL_VIEW_OFS; vector PL_MIN; vector PL_MAX; +vector PL_HEAD; vector PL_CROUCH_VIEW_OFS; vector PL_CROUCH_MIN; vector PL_CROUCH_MAX; @@ -191,6 +192,7 @@ void relocate_spawnpoint() PL_VIEW_OFS = stov(cvar_string("sv_player_viewoffset")); PL_MIN = stov(cvar_string("sv_player_mins")); PL_MAX = stov(cvar_string("sv_player_maxs")); + PL_HEAD = stov(cvar_string("sv_player_headsize")); PL_CROUCH_VIEW_OFS = stov(cvar_string("sv_player_crouch_viewoffset")); PL_CROUCH_MIN = stov(cvar_string("sv_player_crouch_mins")); PL_CROUCH_MAX = stov(cvar_string("sv_player_crouch_maxs")); @@ -1182,9 +1184,13 @@ void readlevelcvars(void) MUTATOR_ADD(mutator_nix); if(cvar("g_dodging")) MUTATOR_ADD(mutator_dodging); - if(cvar("g_rocket_flying") || (cvar("g_balance_rocketlauncher_detonatedelay") == 0 && stof(cvar_defstring("g_balance_rocketlauncher_detonatedelay")) != 0)) + if(cvar("g_rocket_flying")) MUTATOR_ADD(mutator_rocketflying); + serverflags = 0; + if(cvar("sv_allow_fullbright")) + serverflags |= SERVERFLAG_ALLOW_FULLBRIGHT; + g_bugrigs = cvar("g_bugrigs"); g_bugrigs_planar_movement = cvar("g_bugrigs_planar_movement"); g_bugrigs_planar_movement_car_jumping = cvar("g_bugrigs_planar_movement_car_jumping"); diff --git a/qcsrc/server/mutators/mutator_rocketflying.qc b/qcsrc/server/mutators/mutator_rocketflying.qc index d1957b01f7..03a5bde619 100644 --- a/qcsrc/server/mutators/mutator_rocketflying.qc +++ b/qcsrc/server/mutators/mutator_rocketflying.qc @@ -1,6 +1,6 @@ MUTATOR_HOOKFUNCTION(rocketflying_EditProjectile) { - if(other.classname == "rocket") + if(other.classname == "rocket" || other.classname == "mine") { // kill detonate delay of rockets other.spawnshieldtime = time; diff --git a/qcsrc/server/w_crylink.qc b/qcsrc/server/w_crylink.qc index 44e3967b54..566563487b 100644 --- a/qcsrc/server/w_crylink.qc +++ b/qcsrc/server/w_crylink.qc @@ -3,39 +3,163 @@ REGISTER_WEAPON(CRYLINK, w_crylink, IT_CELLS, 6, WEP_FLAG_NORMAL | WEP_TYPE_SPLA #else #ifdef SVQC .float gravity; +.float crylink_waitrelease; +.entity crylink_lastgroup; .entity queuenext; .entity queueprev; +void W_Crylink_Dequeue_Raw(entity own, entity prev, entity me, entity next) +{ + if(me == own.crylink_lastgroup) + own.crylink_lastgroup = ((me == next) ? world : next); + prev.queuenext = next; + next.queueprev = prev; +} + +void W_Crylink_Dequeue(entity e) +{ + W_Crylink_Dequeue_Raw(e.realowner, e.queueprev, e, e.queuenext); +} + // force projectile to explode void W_Crylink_LinkExplode (entity e, entity e2) { float a; a = bound(0, 1 - (time - e.fade_time) * e.fade_rate, 1); + if(e == e.realowner.crylink_lastgroup) + e.realowner.crylink_lastgroup = world; + RadiusDamage (e, e.realowner, cvar("g_balance_crylink_primary_damage") * a, cvar("g_balance_crylink_primary_edgedamage") * a, cvar("g_balance_crylink_primary_radius"), world, cvar("g_balance_crylink_primary_force") * a, e.projectiledeathtype, other); if(e.queuenext != e2) W_Crylink_LinkExplode(e.queuenext, e2); + remove (e); } +// adjust towards center +// returns the origin where they will meet... and the time till the meeting is +// stored in w_crylink_linkjoin_time. +// could possibly network this origin and time, and display a special particle +// effect when projectiles meet there :P +float w_crylink_linkjoin_time; +vector W_Crylink_LinkJoin(entity e, float joinspeed) +{ + vector avg_origin, avg_velocity; + vector targ_origin; + float avg_dist, n; + entity p; + + w_crylink_linkjoin_time = 0; + + avg_origin = e.origin; + avg_velocity = e.velocity; + n = 1; + for(p = e; (p = p.queuenext) != e; ) + { + avg_origin += p.origin; + avg_velocity += p.velocity; + ++n; + } + avg_origin *= (1.0 / n); + avg_velocity *= (1.0 / n); + + if(n < 2) + return avg_origin; // nothing to do + + // yes, mathematically we can do this in ONE step, but beware of 32bit floats... + avg_dist = pow(vlen(e.origin - avg_origin), 2); + for(p = e; (p = p.queuenext) != e; ) + avg_dist += pow(vlen(e.origin - avg_origin), 2); + avg_dist *= (1.0 / n); + avg_dist = sqrt(avg_dist); + + if(avg_dist == 0) + return avg_origin; // no change needed + + if(joinspeed == 0) + { + e.velocity = avg_velocity; + UpdateCSQCProjectile(e); + for(p = e; (p = p.queuenext) != e; ) + { + p.velocity = avg_velocity; + UpdateCSQCProjectile(p); + } + } + else + { + w_crylink_linkjoin_time = avg_dist / joinspeed; + targ_origin = avg_origin + w_crylink_linkjoin_time * avg_velocity; + + e.velocity = (targ_origin - e.origin) * (joinspeed / avg_dist); + UpdateCSQCProjectile(e); + for(p = e; (p = p.queuenext) != e; ) + { + p.velocity = (targ_origin - p.origin) * (joinspeed / avg_dist); + UpdateCSQCProjectile(p); + } + + // analysis: + // joinspeed -> +infinity: + // w_crylink_linkjoin_time -> +0 + // targ_origin -> avg_origin + // p->velocity -> HUEG towards center + // joinspeed -> 0: + // w_crylink_linkjoin_time -> +/- infinity + // targ_origin -> avg_velocity * +/- infinity + // p->velocity -> avg_velocity + // joinspeed -> -infinity: + // w_crylink_linkjoin_time -> -0 + // targ_origin -> avg_origin + // p->velocity -> HUEG away from center + } + + return targ_origin; +} + +void W_Crylink_LinkJoinEffect_Think() +{ + // is there at least 2 projectiles very close? + entity e, p; + float n; + e = self.owner.crylink_lastgroup; + n = 0; + if(e) + { + if(vlen(e.origin - self.origin) < vlen(e.velocity) * frametime) + ++n; + for(p = e; (p = p.queuenext) != e; ) + { + if(vlen(p.origin - self.origin) < vlen(p.velocity) * frametime) + ++n; + } + if(n >= 2) + { + // they seem to touch... + // TODO make a specific particle effect for this + pointparticles(particleeffectnum("crylink_linkjoin"), self.origin, '0 0 0', 1); + } + } + remove(self); +} + // NO bounce protection, as bounces are limited! void W_Crylink_Touch (void) { float finalhit; float f; //PROJECTILE_TOUCH; - local entity savenext, saveprev; + local entity savenext, saveprev, saveown; + saveown = self.realowner; savenext = self.queuenext; saveprev = self.queueprev; if(WarpZone_Projectile_Touch()) { if(wasfreed(self)) - { - savenext.queueprev = saveprev; - saveprev.queuenext = savenext; - } + W_Crylink_Dequeue_Raw(saveown, saveprev, self, savenext); return; } @@ -49,12 +173,19 @@ void W_Crylink_Touch (void) f = cvar("g_balance_crylink_primary_bouncedamagefactor"); if(a) f *= a; - if (RadiusDamage (self, self.realowner, cvar("g_balance_crylink_primary_damage") * f, cvar("g_balance_crylink_primary_edgedamage") * f, cvar("g_balance_crylink_primary_radius"), world, cvar("g_balance_crylink_primary_force") * f, self.projectiledeathtype, other) || finalhit) + if (RadiusDamage (self, self.realowner, cvar("g_balance_crylink_primary_damage") * f, cvar("g_balance_crylink_primary_edgedamage") * f, cvar("g_balance_crylink_primary_radius"), world, cvar("g_balance_crylink_primary_force") * f, self.projectiledeathtype, other)) { W_Crylink_LinkExplode(self.queuenext, self); remove (self); return; } + else if(finalhit) + { + // just unlink + W_Crylink_Dequeue(self); + remove(self); + return; + } self.cnt = self.cnt - 1; self.angles = vectoangles(self.velocity); self.owner = world; @@ -69,16 +200,14 @@ void W_Crylink_Touch2 (void) float finalhit; float f; //PROJECTILE_TOUCH; - local entity savenext, saveprev; + local entity savenext, saveprev, saveown; savenext = self.queuenext; saveprev = self.queueprev; + saveown = self.realowner; if(WarpZone_Projectile_Touch()) { if(wasfreed(self)) - { - savenext.queueprev = saveprev; - saveprev.queuenext = savenext; - } + W_Crylink_Dequeue_Raw(saveown, saveprev, self, savenext); return; } @@ -92,12 +221,19 @@ void W_Crylink_Touch2 (void) f = cvar("g_balance_crylink_secondary_bouncedamagefactor"); if(a) f *= a; - if (RadiusDamage (self, self.realowner, cvar("g_balance_crylink_secondary_damage") * f, cvar("g_balance_crylink_secondary_edgedamage") * f, cvar("g_balance_crylink_secondary_radius"), world, cvar("g_balance_crylink_secondary_force") * f, self.projectiledeathtype, other) || finalhit) + if (RadiusDamage (self, self.realowner, cvar("g_balance_crylink_secondary_damage") * f, cvar("g_balance_crylink_secondary_edgedamage") * f, cvar("g_balance_crylink_secondary_radius"), world, cvar("g_balance_crylink_secondary_force") * f, self.projectiledeathtype, other)) { W_Crylink_LinkExplode(self.queuenext, self); remove (self); return; } + else if(finalhit) + { + // just unlink + W_Crylink_Dequeue(self); + remove(self); + return; + } self.cnt = self.cnt - 1; self.angles = vectoangles(self.velocity); self.owner = world; @@ -109,8 +245,7 @@ void W_Crylink_Touch2 (void) void W_Crylink_Fadethink (void) { - self.queuenext.queueprev = self.queueprev; - self.queueprev.queuenext = self.queuenext; + W_Crylink_Dequeue(self); remove(self); } @@ -131,6 +266,7 @@ void W_Crylink_Attack (void) shots = cvar("g_balance_crylink_primary_shots"); pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots); + proj = world; while (counter < shots) { proj = spawn (); @@ -183,12 +319,6 @@ void W_Crylink_Attack (void) self.fade_rate = 1 / cvar("g_balance_crylink_primary_middle_fadetime"); proj.nextthink = time + cvar("g_balance_crylink_primary_middle_lifetime") + cvar("g_balance_crylink_primary_middle_fadetime"); } - else if(counter <= 3) - { - proj.fade_time = time + cvar("g_balance_crylink_primary_star_lifetime"); - self.fade_rate = 1 / cvar("g_balance_crylink_primary_star_fadetime"); - proj.nextthink = time + cvar("g_balance_crylink_primary_star_lifetime") + cvar("g_balance_crylink_primary_star_fadetime"); - } else { proj.fade_time = time + cvar("g_balance_crylink_primary_other_lifetime"); @@ -210,6 +340,7 @@ void W_Crylink_Attack (void) counter = counter + 1; } + self.crylink_lastgroup = proj; } void W_Crylink_Attack2 (void) @@ -224,6 +355,7 @@ void W_Crylink_Attack2 (void) shots = cvar("g_balance_crylink_secondary_shots"); pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots); + proj = world; while (counter < shots) { proj = spawn (); @@ -285,6 +417,7 @@ void W_Crylink_Attack2 (void) counter = counter + 1; } + self.crylink_lastgroup = proj; } void spawnfunc_weapon_crylink (void) @@ -304,16 +437,60 @@ float w_crylink(float req) else if (req == WR_THINK) { if (self.BUTTON_ATCK) - if (weapon_prepareattack(0, cvar("g_balance_crylink_primary_refire"))) { - W_Crylink_Attack(); - weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_crylink_primary_animtime"), w_ready); + if (!self.crylink_waitrelease) + if (weapon_prepareattack(0, cvar("g_balance_crylink_primary_refire"))) + { + W_Crylink_Attack(); + weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_crylink_primary_animtime"), w_ready); + if(cvar("g_balance_crylink_primary_joinspeed") != 0) + self.crylink_waitrelease = 1; + } } - if (self.BUTTON_ATCK2 && cvar("g_balance_crylink_secondary")) - if (weapon_prepareattack(1, cvar("g_balance_crylink_secondary_refire"))) + else if(self.BUTTON_ATCK2 && cvar("g_balance_crylink_secondary")) { - W_Crylink_Attack2(); - weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_crylink_secondary_animtime"), w_ready); + if (!self.crylink_waitrelease) + if (weapon_prepareattack(1, cvar("g_balance_crylink_secondary_refire"))) + { + W_Crylink_Attack2(); + weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_crylink_secondary_animtime"), w_ready); + if(cvar("g_balance_crylink_secondary_joinspeed") != 0) + self.crylink_waitrelease = 2; + } + } + else + { + if (self.crylink_waitrelease) + { + // fired and released now! + if(self.crylink_lastgroup) + { + vector pos; + if(self.crylink_waitrelease == 1) + { + pos = W_Crylink_LinkJoin(self.crylink_lastgroup, cvar("g_balance_crylink_primary_joinspeed")); + } + else + { + pos = W_Crylink_LinkJoin(self.crylink_lastgroup, cvar("g_balance_crylink_secondary_joinspeed")); + } + + entity linkjoineffect; + linkjoineffect = spawn(); + linkjoineffect.classname = "linkjoineffect"; + linkjoineffect.think = W_Crylink_LinkJoinEffect_Think; + linkjoineffect.nextthink = time + w_crylink_linkjoin_time; + linkjoineffect.owner = self; + setorigin(linkjoineffect, pos); + } + self.crylink_waitrelease = 0; + if(!w_crylink(WR_CHECKAMMO1) && !w_crylink(WR_CHECKAMMO2)) + { + // ran out of ammo! + self.cnt = WEP_CRYLINK; + self.switchweapon = w_getbestweapon(self); + } + } } } else if (req == WR_PRECACHE) @@ -323,13 +500,24 @@ float w_crylink(float req) precache_model ("models/weapons/h_crylink.iqm"); precache_sound ("weapons/crylink_fire.wav"); precache_sound ("weapons/crylink_fire2.wav"); + precache_sound ("weapons/crylink_linkjoin.wav"); } else if (req == WR_SETUP) weapon_setup(WEP_CRYLINK); else if (req == WR_CHECKAMMO1) + { + // don't "run out of ammo" and switch weapons while waiting for release + if(self.crylink_lastgroup && self.crylink_waitrelease) + return TRUE; return self.ammo_cells >= cvar("g_balance_crylink_primary_ammo"); + } else if (req == WR_CHECKAMMO2) + { + // don't "run out of ammo" and switch weapons while waiting for release + if(self.crylink_lastgroup && self.crylink_waitrelease) + return TRUE; return self.ammo_cells >= cvar("g_balance_crylink_secondary_ammo"); + } return TRUE; }; #endif diff --git a/qcsrc/server/w_grenadelauncher.qc b/qcsrc/server/w_grenadelauncher.qc index e92b2b2606..75d3d7e7bb 100644 --- a/qcsrc/server/w_grenadelauncher.qc +++ b/qcsrc/server/w_grenadelauncher.qc @@ -174,8 +174,8 @@ void W_Grenade_Attack (void) gren.bot_dodge = TRUE; gren.bot_dodgerating = cvar("g_balance_grenadelauncher_primary_damage"); gren.movetype = MOVETYPE_BOUNCE; - gren.bouncefactor = cvar("g_balance_grenadelauncher_primary_bouncefactor"); - gren.bouncestop = cvar("g_balance_grenadelauncher_primary_bouncestop"); + gren.bouncefactor = cvar("g_balance_grenadelauncher_bouncefactor"); + gren.bouncestop = cvar("g_balance_grenadelauncher_bouncestop"); PROJECTILE_MAKETRIGGER(gren); gren.projectiledeathtype = WEP_GRENADE_LAUNCHER; setorigin(gren, w_shotorg); @@ -221,8 +221,8 @@ void W_Grenade_Attack2 (void) gren.bot_dodge = TRUE; gren.bot_dodgerating = cvar("g_balance_grenadelauncher_secondary_damage"); gren.movetype = MOVETYPE_BOUNCE; - gren.bouncefactor = cvar("g_balance_grenadelauncher_secondary_bouncefactor"); - gren.bouncestop = cvar("g_balance_grenadelauncher_secondary_bouncestop"); + gren.bouncefactor = cvar("g_balance_grenadelauncher_bouncefactor"); + gren.bouncestop = cvar("g_balance_grenadelauncher_bouncestop"); PROJECTILE_MAKETRIGGER(gren); gren.projectiledeathtype = WEP_GRENADE_LAUNCHER | HITTYPE_SECONDARY; setorigin(gren, w_shotorg); diff --git a/qcsrc/server/w_minelayer.qc b/qcsrc/server/w_minelayer.qc index dc4f48152e..aeefbcd0b7 100644 --- a/qcsrc/server/w_minelayer.qc +++ b/qcsrc/server/w_minelayer.qc @@ -99,7 +99,7 @@ void W_Mine_RemoteExplode () if(self.owner.deadflag == DEAD_NO) if((self.spawnshieldtime >= 0) ? (time >= self.spawnshieldtime) // timer - : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > cvar("g_balance_minelayer_radius")) // safety device + : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > cvar("g_balance_minelayer_remote_radius")) // safety device ) { W_Mine_DoRemoteExplode(); @@ -171,9 +171,6 @@ void W_Mine_Think (void) if (self.owner.deadflag == DEAD_NO) if (self.minelayer_detonate) W_Mine_RemoteExplode(); - - if(self.csqcprojectile_clientanimate == 0) - UpdateCSQCProjectile(self); } void W_Mine_Touch (void) @@ -252,7 +249,7 @@ void W_Mine_Attack (void) mine.cnt = time + cvar("g_balance_minelayer_lifetime"); mine.flags = FL_PROJECTILE; - CSQCProjectile(mine, FALSE, PROJECTILE_MINE, TRUE); + CSQCProjectile(mine, TRUE, PROJECTILE_MINE, TRUE); // muzzle flash for 1st person view flash = spawn (); diff --git a/qcsrc/server/w_minstanex.qc b/qcsrc/server/w_minstanex.qc index 352aa2b25c..d337bbd33f 100644 --- a/qcsrc/server/w_minstanex.qc +++ b/qcsrc/server/w_minstanex.qc @@ -28,7 +28,6 @@ void W_MinstaNex_Attack (void) if(headshot) { AnnounceTo(self, "headshot"); - print("h\n"); } if(damage_goodhits && self.minstanex_lasthit) { diff --git a/qcsrc/server/w_nex.qc b/qcsrc/server/w_nex.qc index 29b8be7ef0..493fd005be 100644 --- a/qcsrc/server/w_nex.qc +++ b/qcsrc/server/w_nex.qc @@ -47,6 +47,7 @@ void W_Nex_Attack (float issecondary) { charge = cvar("g_balance_nex_charge_mindmg") / mydmg + (1 - cvar("g_balance_nex_charge_mindmg") / mydmg) * self.nex_charge; self.nex_charge *= cvar("g_balance_nex_charge_shot_multiplier"); // do this AFTER setting mydmg/myforce + // O RLY? -- divVerent } else charge = 1; @@ -86,6 +87,7 @@ float w_nex(float req) { if(cvar("g_balance_nex_charge") && self.nex_charge < cvar("g_balance_nex_charge_limit")) self.nex_charge = min(1, self.nex_charge + cvar("g_balance_nex_charge_rate") * frametime / W_TICSPERFRAME); + if (self.BUTTON_ATCK) { if (weapon_prepareattack(0, cvar("g_balance_nex_primary_refire"))) diff --git a/qcsrc/server/w_rocketlauncher.qc b/qcsrc/server/w_rocketlauncher.qc index c109fc796b..a57da6a67d 100644 --- a/qcsrc/server/w_rocketlauncher.qc +++ b/qcsrc/server/w_rocketlauncher.qc @@ -125,7 +125,7 @@ void W_Rocket_RemoteExplode() { if((self.spawnshieldtime >= 0) ? (time >= self.spawnshieldtime) // timer - : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > cvar("g_balance_rocketlauncher_radius")) // safety device + : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > cvar("g_balance_rocketlauncher_remote_radius")) // safety device ) { W_Rocket_DoRemoteExplode(); diff --git a/scripts/nexball.shader b/scripts/nexball.shader new file mode 100644 index 0000000000..6bf479311d --- /dev/null +++ b/scripts/nexball.shader @@ -0,0 +1,8 @@ +nexball/ball +{ + dpreflectcube cubemaps/default/sky + { + map textures/nexball/ball.tga + rgbgen lightingDiffuse + } +} diff --git a/sound/weapons/crylink_linkjoin.ogg b/sound/weapons/crylink_linkjoin.ogg new file mode 100644 index 0000000000..26c7af5d86 Binary files /dev/null and b/sound/weapons/crylink_linkjoin.ogg differ diff --git a/textures/nexball/ball.tga b/textures/nexball/ball.tga new file mode 100644 index 0000000000..6f96add456 Binary files /dev/null and b/textures/nexball/ball.tga differ diff --git a/textures/nexball/ball_gloss.tga b/textures/nexball/ball_gloss.tga new file mode 100644 index 0000000000..c4afcfc921 Binary files /dev/null and b/textures/nexball/ball_gloss.tga differ diff --git a/textures/nexball/ball_norm.tga b/textures/nexball/ball_norm.tga new file mode 100644 index 0000000000..e626855e1f Binary files /dev/null and b/textures/nexball/ball_norm.tga differ diff --git a/textures/nexball/ball_reflect.tga b/textures/nexball/ball_reflect.tga new file mode 100644 index 0000000000..9c39e18eb3 Binary files /dev/null and b/textures/nexball/ball_reflect.tga differ diff --git a/update-cvarcount.sh b/update-cvarcount.sh index b82840ae08..0bd63e9fb2 100755 --- a/update-cvarcount.sh +++ b/update-cvarcount.sh @@ -6,12 +6,12 @@ for b in balance*.cfg; do if [ "$countw" != "$countb" ]; then echo "Mismatch between balanceXonotic.cfg and $b. Aborting." echo "Differences are:" - A=`mktemp` - B=`mktemp` - awk '/^seta? g_/ { print $2; }' balanceXonotic.cfg | sort -u | tr -d '\r' > "$A" - awk '/^seta? g_/ { print $2; }' "$b" | sort -u | tr -d '\r' > "$B" echo "< missing in $b" echo "> must get removed from $b" + A=`mktemp || echo a.tmp` + B=`mktemp || echo b.tmp` + awk '/^seta? g_/ { print $2; }' balanceXonotic.cfg | sort -u | tr -d '\r' > "$A" + awk '/^seta? g_/ { print $2; }' "$b" | sort -u | tr -d '\r' > "$B" diff "$A" "$B" | grep '^[<>]' | sort rm -f "$A" "$B" exit 1