From: Mario Date: Fri, 13 Sep 2019 12:51:28 +0000 (+0000) Subject: Merge branch 'martin-t/seta' into 'master' X-Git-Tag: xonotic-v0.8.5~1286 X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=a0a09daade95eb6c4a0ad85680440392ae4f6e6a;hp=ae851653541ad0471fa2e72ef83cbdf49271b82e Merge branch 'martin-t/seta' into 'master' Seta -> set in server configs See merge request xonotic/xonotic-data.pk3dir!700 --- diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 86d5528b9..2a26756c5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,7 +29,7 @@ test_sv_game: - wget -O data/maps/stormkeep.waypoints https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints - wget -O data/maps/stormkeep.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints.cache - make - - EXPECT=436bcf411c761042d68896ae92f630d5 + - EXPECT=892e447048e051e51f30cff2affc729a - HASH=$(${ENGINE} -noconfig -nohome +exec serverbench.cfg | tee /dev/stderr | grep '^:' diff --git a/.tx/merge-base b/.tx/merge-base index 27d0db5ac..67a023d4c 100644 --- a/.tx/merge-base +++ b/.tx/merge-base @@ -1 +1 @@ -Tue Jul 30 07:24:47 CEST 2019 +Thu Sep 12 07:24:50 CEST 2019 diff --git a/bal-wep-mario.cfg b/bal-wep-mario.cfg index 585986277..d3270acc8 100644 --- a/bal-wep-mario.cfg +++ b/bal-wep-mario.cfg @@ -3,8 +3,8 @@ set g_balance_blaster_primary_animtime 0.2 set g_balance_blaster_primary_damage 20 set g_balance_blaster_primary_delay 0 set g_balance_blaster_primary_edgedamage 10 -set g_balance_blaster_primary_force 300 -set g_balance_blaster_primary_force_zscale 1.25 +set g_balance_blaster_primary_force 375 +set g_balance_blaster_primary_force_zscale 1 set g_balance_blaster_primary_lifetime 5 set g_balance_blaster_primary_radius 60 set g_balance_blaster_primary_refire 0.7 @@ -16,8 +16,8 @@ set g_balance_blaster_secondary_animtime 0.2 set g_balance_blaster_secondary_damage 25 set g_balance_blaster_secondary_delay 0 set g_balance_blaster_secondary_edgedamage 12.5 -set g_balance_blaster_secondary_force 300 -set g_balance_blaster_secondary_force_zscale 1.2 +set g_balance_blaster_secondary_force 360 +set g_balance_blaster_secondary_force_zscale 1 set g_balance_blaster_secondary_lifetime 5 set g_balance_blaster_secondary_radius 70 set g_balance_blaster_secondary_refire 0.7 @@ -401,6 +401,7 @@ set g_balance_devastator_reload_time 2 set g_balance_devastator_remote_damage 70 set g_balance_devastator_remote_edgedamage 35 set g_balance_devastator_remote_force 300 +set g_balance_devastator_remote_jump 1 set g_balance_devastator_remote_jump_damage 70 set g_balance_devastator_remote_jump_force 450 set g_balance_devastator_remote_jump_radius 100 @@ -448,8 +449,8 @@ set g_balance_vaporizer_secondary_animtime 0.2 set g_balance_vaporizer_secondary_damage 25 set g_balance_vaporizer_secondary_delay 0 set g_balance_vaporizer_secondary_edgedamage 12.5 -set g_balance_vaporizer_secondary_force 400 -set g_balance_vaporizer_secondary_force_zscale 1.2 +set g_balance_vaporizer_secondary_force 480 +set g_balance_vaporizer_secondary_force_zscale 1 set g_balance_vaporizer_secondary_lifetime 5 set g_balance_vaporizer_secondary_radius 70 set g_balance_vaporizer_secondary_refire 0.7 @@ -787,7 +788,7 @@ set g_balance_okhmg_primary_ammo 1 set g_balance_okhmg_primary_damage 30 set g_balance_okhmg_primary_force 10 set g_balance_okhmg_primary_refire 0.05 -set g_balance_okhmg_primary_solidpenetration 32 +set g_balance_okhmg_primary_solidpenetration 127 set g_balance_okhmg_primary_spread_add 0.005 set g_balance_okhmg_primary_spread_max 0.06 set g_balance_okhmg_primary_spread_min 0.01 @@ -798,7 +799,7 @@ set g_balance_okhmg_secondary_animtime 0.2 set g_balance_okhmg_secondary_damage 25 set g_balance_okhmg_secondary_delay 0 set g_balance_okhmg_secondary_edgedamage 12.5 -set g_balance_okhmg_secondary_force 300 +set g_balance_okhmg_secondary_force 360 set g_balance_okhmg_secondary_force_zscale 1 set g_balance_okhmg_secondary_lifetime 5 set g_balance_okhmg_secondary_radius 70 @@ -819,7 +820,7 @@ set g_balance_okmachinegun_primary_ammo 1 set g_balance_okmachinegun_primary_damage 25 set g_balance_okmachinegun_primary_force 5 set g_balance_okmachinegun_primary_refire 0.1 -set g_balance_okmachinegun_primary_solidpenetration 63 +set g_balance_okmachinegun_primary_solidpenetration 100 set g_balance_okmachinegun_primary_spread_add 0.012 set g_balance_okmachinegun_primary_spread_max 0.05 set g_balance_okmachinegun_primary_spread_min 0 @@ -829,7 +830,7 @@ set g_balance_okmachinegun_secondary_animtime 0.2 set g_balance_okmachinegun_secondary_damage 25 set g_balance_okmachinegun_secondary_delay 0 set g_balance_okmachinegun_secondary_edgedamage 12.5 -set g_balance_okmachinegun_secondary_force 300 +set g_balance_okmachinegun_secondary_force 360 set g_balance_okmachinegun_secondary_force_zscale 1 set g_balance_okmachinegun_secondary_lifetime 5 set g_balance_okmachinegun_secondary_radius 70 @@ -882,7 +883,7 @@ set g_balance_oknex_secondary_damagefalloff_maxdist 0 set g_balance_oknex_secondary_damagefalloff_mindist 0 set g_balance_oknex_secondary_delay 0 set g_balance_oknex_secondary_edgedamage 12.5 -set g_balance_oknex_secondary_force 300 +set g_balance_oknex_secondary_force 360 set g_balance_oknex_secondary_force_zscale 1 set g_balance_oknex_secondary_lifetime 5 set g_balance_oknex_secondary_radius 70 @@ -919,7 +920,7 @@ set g_balance_okrpc_secondary_animtime 0.2 set g_balance_okrpc_secondary_damage 25 set g_balance_okrpc_secondary_delay 0 set g_balance_okrpc_secondary_edgedamage 12.5 -set g_balance_okrpc_secondary_force 300 +set g_balance_okrpc_secondary_force 360 set g_balance_okrpc_secondary_force_zscale 1 set g_balance_okrpc_secondary_lifetime 5 set g_balance_okrpc_secondary_radius 70 @@ -951,7 +952,7 @@ set g_balance_okshotgun_secondary_animtime 0.2 set g_balance_okshotgun_secondary_damage 25 set g_balance_okshotgun_secondary_delay 0 set g_balance_okshotgun_secondary_edgedamage 12.5 -set g_balance_okshotgun_secondary_force 300 +set g_balance_okshotgun_secondary_force 360 set g_balance_okshotgun_secondary_force_zscale 1 set g_balance_okshotgun_secondary_lifetime 5 set g_balance_okshotgun_secondary_radius 70 diff --git a/bal-wep-nexuiz25.cfg b/bal-wep-nexuiz25.cfg index f49629922..c9d87fd05 100644 --- a/bal-wep-nexuiz25.cfg +++ b/bal-wep-nexuiz25.cfg @@ -401,9 +401,10 @@ set g_balance_devastator_reload_time 2 set g_balance_devastator_remote_damage 105 set g_balance_devastator_remote_edgedamage 40 set g_balance_devastator_remote_force 600 +set g_balance_devastator_remote_jump 0 set g_balance_devastator_remote_jump_damage 70 set g_balance_devastator_remote_jump_force 0 -set g_balance_devastator_remote_jump_radius 0 +set g_balance_devastator_remote_jump_radius 100 set g_balance_devastator_remote_jump_velocity_z_add 400 set g_balance_devastator_remote_jump_velocity_z_max 1500 set g_balance_devastator_remote_jump_velocity_z_min 400 @@ -787,7 +788,7 @@ set g_balance_okhmg_primary_ammo 1 set g_balance_okhmg_primary_damage 30 set g_balance_okhmg_primary_force 10 set g_balance_okhmg_primary_refire 0.05 -set g_balance_okhmg_primary_solidpenetration 32 +set g_balance_okhmg_primary_solidpenetration 127 set g_balance_okhmg_primary_spread_add 0.005 set g_balance_okhmg_primary_spread_max 0.06 set g_balance_okhmg_primary_spread_min 0.01 @@ -798,7 +799,7 @@ set g_balance_okhmg_secondary_animtime 0.2 set g_balance_okhmg_secondary_damage 25 set g_balance_okhmg_secondary_delay 0 set g_balance_okhmg_secondary_edgedamage 12.5 -set g_balance_okhmg_secondary_force 300 +set g_balance_okhmg_secondary_force 360 set g_balance_okhmg_secondary_force_zscale 1 set g_balance_okhmg_secondary_lifetime 5 set g_balance_okhmg_secondary_radius 70 @@ -819,7 +820,7 @@ set g_balance_okmachinegun_primary_ammo 1 set g_balance_okmachinegun_primary_damage 25 set g_balance_okmachinegun_primary_force 5 set g_balance_okmachinegun_primary_refire 0.1 -set g_balance_okmachinegun_primary_solidpenetration 63 +set g_balance_okmachinegun_primary_solidpenetration 100 set g_balance_okmachinegun_primary_spread_add 0.012 set g_balance_okmachinegun_primary_spread_max 0.05 set g_balance_okmachinegun_primary_spread_min 0 @@ -829,7 +830,7 @@ set g_balance_okmachinegun_secondary_animtime 0.2 set g_balance_okmachinegun_secondary_damage 25 set g_balance_okmachinegun_secondary_delay 0 set g_balance_okmachinegun_secondary_edgedamage 12.5 -set g_balance_okmachinegun_secondary_force 300 +set g_balance_okmachinegun_secondary_force 360 set g_balance_okmachinegun_secondary_force_zscale 1 set g_balance_okmachinegun_secondary_lifetime 5 set g_balance_okmachinegun_secondary_radius 70 @@ -882,7 +883,7 @@ set g_balance_oknex_secondary_damagefalloff_maxdist 0 set g_balance_oknex_secondary_damagefalloff_mindist 0 set g_balance_oknex_secondary_delay 0 set g_balance_oknex_secondary_edgedamage 12.5 -set g_balance_oknex_secondary_force 300 +set g_balance_oknex_secondary_force 360 set g_balance_oknex_secondary_force_zscale 1 set g_balance_oknex_secondary_lifetime 5 set g_balance_oknex_secondary_radius 70 @@ -919,7 +920,7 @@ set g_balance_okrpc_secondary_animtime 0.2 set g_balance_okrpc_secondary_damage 25 set g_balance_okrpc_secondary_delay 0 set g_balance_okrpc_secondary_edgedamage 12.5 -set g_balance_okrpc_secondary_force 300 +set g_balance_okrpc_secondary_force 360 set g_balance_okrpc_secondary_force_zscale 1 set g_balance_okrpc_secondary_lifetime 5 set g_balance_okrpc_secondary_radius 70 @@ -951,7 +952,7 @@ set g_balance_okshotgun_secondary_animtime 0.2 set g_balance_okshotgun_secondary_damage 25 set g_balance_okshotgun_secondary_delay 0 set g_balance_okshotgun_secondary_edgedamage 12.5 -set g_balance_okshotgun_secondary_force 300 +set g_balance_okshotgun_secondary_force 360 set g_balance_okshotgun_secondary_force_zscale 1 set g_balance_okshotgun_secondary_lifetime 5 set g_balance_okshotgun_secondary_radius 70 diff --git a/bal-wep-overkill-nerfed.cfg b/bal-wep-overkill-nerfed.cfg index c5300f47b..74dd683c1 100644 --- a/bal-wep-overkill-nerfed.cfg +++ b/bal-wep-overkill-nerfed.cfg @@ -1,5 +1,6 @@ // This config file is for overkill weapons that were nerfed to have the same // stats as vanilla weapons, secondary attack uses stats of vanilla blaster. +// Secondary is actually inconsistent, see https://gitlab.com/xonotic/xonotic-data.pk3dir/issues/2258 // {{{ Overkill Shotgun set g_balance_okshotgun_primary_ammo 1 diff --git a/bal-wep-samual.cfg b/bal-wep-samual.cfg index 1b8a388d4..e32b54ff4 100644 --- a/bal-wep-samual.cfg +++ b/bal-wep-samual.cfg @@ -401,6 +401,7 @@ set g_balance_devastator_reload_time 2 set g_balance_devastator_remote_damage 70 set g_balance_devastator_remote_edgedamage 35 set g_balance_devastator_remote_force 400 +set g_balance_devastator_remote_jump 0 set g_balance_devastator_remote_jump_damage 40 set g_balance_devastator_remote_jump_force 0 set g_balance_devastator_remote_jump_radius 200 @@ -787,7 +788,7 @@ set g_balance_okhmg_primary_ammo 1 set g_balance_okhmg_primary_damage 30 set g_balance_okhmg_primary_force 10 set g_balance_okhmg_primary_refire 0.05 -set g_balance_okhmg_primary_solidpenetration 32 +set g_balance_okhmg_primary_solidpenetration 127 set g_balance_okhmg_primary_spread_add 0.005 set g_balance_okhmg_primary_spread_max 0.06 set g_balance_okhmg_primary_spread_min 0.01 @@ -798,7 +799,7 @@ set g_balance_okhmg_secondary_animtime 0.2 set g_balance_okhmg_secondary_damage 25 set g_balance_okhmg_secondary_delay 0 set g_balance_okhmg_secondary_edgedamage 12.5 -set g_balance_okhmg_secondary_force 300 +set g_balance_okhmg_secondary_force 360 set g_balance_okhmg_secondary_force_zscale 1 set g_balance_okhmg_secondary_lifetime 5 set g_balance_okhmg_secondary_radius 70 @@ -816,25 +817,25 @@ set g_balance_okhmg_weaponthrowable 0 // }}} // {{{ #22: Overkill MachineGun (MUTATOR WEAPON) set g_balance_okmachinegun_primary_ammo 1 -set g_balance_okmachinegun_primary_damage 10 -set g_balance_okmachinegun_primary_force 3 +set g_balance_okmachinegun_primary_damage 25 +set g_balance_okmachinegun_primary_force 5 set g_balance_okmachinegun_primary_refire 0.1 -set g_balance_okmachinegun_primary_solidpenetration 13.1 +set g_balance_okmachinegun_primary_solidpenetration 100 set g_balance_okmachinegun_primary_spread_add 0.012 set g_balance_okmachinegun_primary_spread_max 0.05 -set g_balance_okmachinegun_primary_spread_min 0.02 -set g_balance_okmachinegun_reload_ammo 60 -set g_balance_okmachinegun_reload_time 2 +set g_balance_okmachinegun_primary_spread_min 0 +set g_balance_okmachinegun_reload_ammo 30 +set g_balance_okmachinegun_reload_time 1.5 set g_balance_okmachinegun_secondary_animtime 0.2 -set g_balance_okmachinegun_secondary_damage 20 +set g_balance_okmachinegun_secondary_damage 25 set g_balance_okmachinegun_secondary_delay 0 -set g_balance_okmachinegun_secondary_edgedamage 10 -set g_balance_okmachinegun_secondary_force 300 +set g_balance_okmachinegun_secondary_edgedamage 12.5 +set g_balance_okmachinegun_secondary_force 360 set g_balance_okmachinegun_secondary_force_zscale 1 set g_balance_okmachinegun_secondary_lifetime 5 -set g_balance_okmachinegun_secondary_radius 60 +set g_balance_okmachinegun_secondary_radius 70 set g_balance_okmachinegun_secondary_refire 0.7 -set g_balance_okmachinegun_secondary_refire_type 0 +set g_balance_okmachinegun_secondary_refire_type 1 set g_balance_okmachinegun_secondary_shotangle 0 set g_balance_okmachinegun_secondary_speed 6000 set g_balance_okmachinegun_secondary_spread 0 @@ -846,7 +847,7 @@ set g_balance_okmachinegun_weaponstartoverride -1 set g_balance_okmachinegun_weaponthrowable 1 // }}} // {{{ #23: Overkill Nex (MUTATOR WEAPON) -set g_balance_oknex_charge 1 +set g_balance_oknex_charge 0 set g_balance_oknex_charge_animlimit 0.5 set g_balance_oknex_charge_limit 1 set g_balance_oknex_charge_maxspeed 800 @@ -858,36 +859,36 @@ set g_balance_oknex_charge_rot_rate 0 set g_balance_oknex_charge_shot_multiplier 0 set g_balance_oknex_charge_start 0.5 set g_balance_oknex_charge_velocity_rate 0 -set g_balance_oknex_primary_ammo 6 -set g_balance_oknex_primary_animtime 0.4 -set g_balance_oknex_primary_damage 80 +set g_balance_oknex_primary_ammo 10 +set g_balance_oknex_primary_animtime 0.65 +set g_balance_oknex_primary_damage 100 set g_balance_oknex_primary_damagefalloff_forcehalflife 0 set g_balance_oknex_primary_damagefalloff_halflife 0 set g_balance_oknex_primary_damagefalloff_maxdist 0 set g_balance_oknex_primary_damagefalloff_mindist 0 -set g_balance_oknex_primary_force 400 -set g_balance_oknex_primary_refire 1.5 -set g_balance_oknex_reload_ammo 0 +set g_balance_oknex_primary_force 500 +set g_balance_oknex_primary_refire 1 +set g_balance_oknex_reload_ammo 50 set g_balance_oknex_reload_time 2 -set g_balance_oknex_secondary 0 -set g_balance_oknex_secondary_ammo 2 -set g_balance_oknex_secondary_animtime 0 +set g_balance_oknex_secondary 2 +set g_balance_oknex_secondary_ammo 0 +set g_balance_oknex_secondary_animtime 0.2 set g_balance_oknex_secondary_chargepool 0 set g_balance_oknex_secondary_chargepool_pause_regen 1 set g_balance_oknex_secondary_chargepool_regen 0.15 -set g_balance_oknex_secondary_damage 0 +set g_balance_oknex_secondary_damage 25 set g_balance_oknex_secondary_damagefalloff_forcehalflife 0 set g_balance_oknex_secondary_damagefalloff_halflife 0 set g_balance_oknex_secondary_damagefalloff_maxdist 0 set g_balance_oknex_secondary_damagefalloff_mindist 0 set g_balance_oknex_secondary_delay 0 -set g_balance_oknex_secondary_edgedamage 10 -set g_balance_oknex_secondary_force 0 +set g_balance_oknex_secondary_edgedamage 12.5 +set g_balance_oknex_secondary_force 360 set g_balance_oknex_secondary_force_zscale 1 set g_balance_oknex_secondary_lifetime 5 -set g_balance_oknex_secondary_radius 60 -set g_balance_oknex_secondary_refire 0 -set g_balance_oknex_secondary_refire_type 0 +set g_balance_oknex_secondary_radius 70 +set g_balance_oknex_secondary_refire 0.7 +set g_balance_oknex_secondary_refire_type 1 set g_balance_oknex_secondary_shotangle 0 set g_balance_oknex_secondary_speed 6000 set g_balance_oknex_secondary_spread 0 @@ -919,7 +920,7 @@ set g_balance_okrpc_secondary_animtime 0.2 set g_balance_okrpc_secondary_damage 25 set g_balance_okrpc_secondary_delay 0 set g_balance_okrpc_secondary_edgedamage 12.5 -set g_balance_okrpc_secondary_force 300 +set g_balance_okrpc_secondary_force 360 set g_balance_okrpc_secondary_force_zscale 1 set g_balance_okrpc_secondary_lifetime 5 set g_balance_okrpc_secondary_radius 70 @@ -936,27 +937,27 @@ set g_balance_okrpc_weaponstartoverride 0 set g_balance_okrpc_weaponthrowable 0 // }}} // {{{ #25: Overkill Shotgun (MUTATOR WEAPON) -set g_balance_okshotgun_primary_ammo 1 -set g_balance_okshotgun_primary_animtime 0.2 +set g_balance_okshotgun_primary_ammo 3 +set g_balance_okshotgun_primary_animtime 0.65 set g_balance_okshotgun_primary_bot_range 512 -set g_balance_okshotgun_primary_bullets 12 -set g_balance_okshotgun_primary_damage 4 -set g_balance_okshotgun_primary_force 15 +set g_balance_okshotgun_primary_bullets 10 +set g_balance_okshotgun_primary_damage 17 +set g_balance_okshotgun_primary_force 80 set g_balance_okshotgun_primary_refire 0.75 set g_balance_okshotgun_primary_solidpenetration 3.8 -set g_balance_okshotgun_primary_spread 0.12 -set g_balance_okshotgun_reload_ammo 0 +set g_balance_okshotgun_primary_spread 0.07 +set g_balance_okshotgun_reload_ammo 24 set g_balance_okshotgun_reload_time 2 set g_balance_okshotgun_secondary_animtime 0.2 -set g_balance_okshotgun_secondary_damage 20 +set g_balance_okshotgun_secondary_damage 25 set g_balance_okshotgun_secondary_delay 0 -set g_balance_okshotgun_secondary_edgedamage 10 -set g_balance_okshotgun_secondary_force 300 +set g_balance_okshotgun_secondary_edgedamage 12.5 +set g_balance_okshotgun_secondary_force 360 set g_balance_okshotgun_secondary_force_zscale 1 set g_balance_okshotgun_secondary_lifetime 5 -set g_balance_okshotgun_secondary_radius 60 +set g_balance_okshotgun_secondary_radius 70 set g_balance_okshotgun_secondary_refire 0.7 -set g_balance_okshotgun_secondary_refire_type 0 +set g_balance_okshotgun_secondary_refire_type 1 set g_balance_okshotgun_secondary_shotangle 0 set g_balance_okshotgun_secondary_speed 6000 set g_balance_okshotgun_secondary_spread 0 diff --git a/bal-wep-testing.cfg b/bal-wep-testing.cfg new file mode 100644 index 000000000..c1cb57666 --- /dev/null +++ b/bal-wep-testing.cfg @@ -0,0 +1,970 @@ +// {{{ #1: Blaster +set g_balance_blaster_primary_animtime 0.2 +set g_balance_blaster_primary_damage 20 +set g_balance_blaster_primary_delay 0 +set g_balance_blaster_primary_edgedamage 10 +set g_balance_blaster_primary_force 375 +set g_balance_blaster_primary_force_zscale 1 +set g_balance_blaster_primary_lifetime 5 +set g_balance_blaster_primary_radius 60 +set g_balance_blaster_primary_refire 0.7 +set g_balance_blaster_primary_shotangle 0 +set g_balance_blaster_primary_speed 6000 +set g_balance_blaster_primary_spread 0 +set g_balance_blaster_secondary 0 +set g_balance_blaster_secondary_animtime 0.2 +set g_balance_blaster_secondary_damage 25 +set g_balance_blaster_secondary_delay 0 +set g_balance_blaster_secondary_edgedamage 12.5 +set g_balance_blaster_secondary_force 360 +set g_balance_blaster_secondary_force_zscale 1 +set g_balance_blaster_secondary_lifetime 5 +set g_balance_blaster_secondary_radius 70 +set g_balance_blaster_secondary_refire 0.7 +set g_balance_blaster_secondary_shotangle 0 +set g_balance_blaster_secondary_speed 6000 +set g_balance_blaster_secondary_spread 0 +set g_balance_blaster_switchdelay_drop 0.2 +set g_balance_blaster_switchdelay_raise 0.2 +set g_balance_blaster_weaponreplace "" +set g_balance_blaster_weaponstart 1 +set g_balance_blaster_weaponstartoverride -1 +set g_balance_blaster_weaponthrowable 0 +// }}} +// {{{ #2: Shotgun +set g_balance_shotgun_primary_ammo 1 +set g_balance_shotgun_primary_animtime 0.2 +set g_balance_shotgun_primary_bullets 12 +set g_balance_shotgun_primary_damage 4 +set g_balance_shotgun_primary_force 15 +set g_balance_shotgun_primary_refire 0.75 +set g_balance_shotgun_primary_solidpenetration 3.8 +set g_balance_shotgun_primary_spread 0.12 +set g_balance_shotgun_reload_ammo 0 +set g_balance_shotgun_reload_time 2 +set g_balance_shotgun_secondary 1 +set g_balance_shotgun_secondary_alt_animtime 0.2 +set g_balance_shotgun_secondary_alt_refire 1.2 +set g_balance_shotgun_secondary_animtime 1.15 +set g_balance_shotgun_secondary_damage 70 +set g_balance_shotgun_secondary_force 200 +set g_balance_shotgun_secondary_melee_delay 0.25 +set g_balance_shotgun_secondary_melee_multihit 1 +set g_balance_shotgun_secondary_melee_no_doubleslap 1 +set g_balance_shotgun_secondary_melee_nonplayerdamage 40 +set g_balance_shotgun_secondary_melee_range 120 +set g_balance_shotgun_secondary_melee_swing_side 120 +set g_balance_shotgun_secondary_melee_swing_up 30 +set g_balance_shotgun_secondary_melee_time 0.15 +set g_balance_shotgun_secondary_melee_traces 10 +set g_balance_shotgun_secondary_refire 1.25 +set g_balance_shotgun_switchdelay_drop 0.2 +set g_balance_shotgun_switchdelay_raise 0.2 +set g_balance_shotgun_weaponreplace "" +set g_balance_shotgun_weaponstart 1 +set g_balance_shotgun_weaponstartoverride -1 +set g_balance_shotgun_weaponthrowable 1 +// }}} +// {{{ #3: MachineGun +set g_balance_machinegun_burst 3 +set g_balance_machinegun_burst_ammo 3 +set g_balance_machinegun_burst_animtime 0.3 +set g_balance_machinegun_burst_refire 0.06 +set g_balance_machinegun_burst_refire2 0.45 +set g_balance_machinegun_burst_spread 0 +set g_balance_machinegun_first 1 +set g_balance_machinegun_first_ammo 1 +set g_balance_machinegun_first_damage 14 +set g_balance_machinegun_first_force 3 +set g_balance_machinegun_first_refire 0.125 +set g_balance_machinegun_first_spread 0.03 +set g_balance_machinegun_mode 1 +set g_balance_machinegun_reload_ammo 60 +set g_balance_machinegun_reload_time 2 +set g_balance_machinegun_solidpenetration 63 +set g_balance_machinegun_spread_add 0.012 +set g_balance_machinegun_spread_max 0.05 +set g_balance_machinegun_spread_min 0.02 +set g_balance_machinegun_sustained_ammo 1 +set g_balance_machinegun_sustained_damage 10 +set g_balance_machinegun_sustained_force 3 +set g_balance_machinegun_sustained_refire 0.1 +set g_balance_machinegun_sustained_spread 0.03 +set g_balance_machinegun_switchdelay_drop 0.2 +set g_balance_machinegun_switchdelay_raise 0.2 +set g_balance_machinegun_weaponreplace "" +set g_balance_machinegun_weaponstart 0 +set g_balance_machinegun_weaponstartoverride -1 +set g_balance_machinegun_weaponthrowable 1 +// }}} +// {{{ #4: Mortar +set g_balance_mortar_bouncefactor 0.5 +set g_balance_mortar_bouncestop 0.075 +set g_balance_mortar_primary_ammo 2 +set g_balance_mortar_primary_animtime 0.3 +set g_balance_mortar_primary_damage 55 +set g_balance_mortar_primary_damageforcescale 0 +set g_balance_mortar_primary_edgedamage 25 +set g_balance_mortar_primary_force 250 +set g_balance_mortar_primary_health 15 +set g_balance_mortar_primary_lifetime 5 +set g_balance_mortar_primary_lifetime_stick 0 +set g_balance_mortar_primary_radius 120 +set g_balance_mortar_primary_refire 0.8 +set g_balance_mortar_primary_remote_minbouncecnt 0 +set g_balance_mortar_primary_speed 1900 +set g_balance_mortar_primary_speed_up 225 +set g_balance_mortar_primary_speed_z 0 +set g_balance_mortar_primary_spread 0 +set g_balance_mortar_primary_type 0 +set g_balance_mortar_reload_ammo 0 +set g_balance_mortar_reload_time 2 +set g_balance_mortar_secondary_ammo 2 +set g_balance_mortar_secondary_animtime 0.3 +set g_balance_mortar_secondary_damage 55 +set g_balance_mortar_secondary_damageforcescale 4 +set g_balance_mortar_secondary_edgedamage 30 +set g_balance_mortar_secondary_force 250 +set g_balance_mortar_secondary_health 30 +set g_balance_mortar_secondary_lifetime 5 +set g_balance_mortar_secondary_lifetime_bounce 0.5 +set g_balance_mortar_secondary_lifetime_stick 0 +set g_balance_mortar_secondary_radius 120 +set g_balance_mortar_secondary_refire 0.7 +set g_balance_mortar_secondary_remote_detonateprimary 0 +set g_balance_mortar_secondary_speed 1400 +set g_balance_mortar_secondary_speed_up 150 +set g_balance_mortar_secondary_speed_z 0 +set g_balance_mortar_secondary_spread 0 +set g_balance_mortar_secondary_type 1 +set g_balance_mortar_switchdelay_drop 0.2 +set g_balance_mortar_switchdelay_raise 0.2 +set g_balance_mortar_weaponreplace "" +set g_balance_mortar_weaponstart 0 +set g_balance_mortar_weaponstartoverride -1 +set g_balance_mortar_weaponthrowable 1 +// }}} +// {{{ #5: Mine Layer (MUTATOR WEAPON) +set g_balance_minelayer_ammo 4 +set g_balance_minelayer_animtime 0.4 +set g_balance_minelayer_damage 40 +set g_balance_minelayer_damageforcescale 0 +set g_balance_minelayer_detonatedelay -1 +set g_balance_minelayer_edgedamage 20 +set g_balance_minelayer_force 250 +set g_balance_minelayer_health 15 +set g_balance_minelayer_lifetime 10 +set g_balance_minelayer_lifetime_countdown 0.5 +set g_balance_minelayer_limit 3 +set g_balance_minelayer_protection 0 +set g_balance_minelayer_proximityradius 150 +set g_balance_minelayer_radius 175 +set g_balance_minelayer_refire 1.5 +set g_balance_minelayer_reload_ammo 0 +set g_balance_minelayer_reload_time 2 +set g_balance_minelayer_remote_damage 45 +set g_balance_minelayer_remote_edgedamage 40 +set g_balance_minelayer_remote_force 300 +set g_balance_minelayer_remote_radius 200 +set g_balance_minelayer_speed 1000 +set g_balance_minelayer_switchdelay_drop 0.2 +set g_balance_minelayer_switchdelay_raise 0.2 +set g_balance_minelayer_time 0.5 +set g_balance_minelayer_weaponreplace "" +set g_balance_minelayer_weaponstart 0 +set g_balance_minelayer_weaponstartoverride -1 +set g_balance_minelayer_weaponthrowable 1 +// }}} +// {{{ #6: Electro +set g_balance_electro_combo_comboradius 300 +set g_balance_electro_combo_comboradius_thruwall 200 +set g_balance_electro_combo_damage 50 +set g_balance_electro_combo_edgedamage 25 +set g_balance_electro_combo_force 120 +set g_balance_electro_combo_radius 150 +set g_balance_electro_combo_safeammocheck 1 +set g_balance_electro_combo_speed 2000 +set g_balance_electro_primary_ammo 4 +set g_balance_electro_primary_animtime 0.3 +set g_balance_electro_primary_comboradius 300 +set g_balance_electro_primary_damage 40 +set g_balance_electro_primary_edgedamage 20 +set g_balance_electro_primary_force 200 +set g_balance_electro_primary_lifetime 5 +set g_balance_electro_primary_midaircombo_explode 1 +set g_balance_electro_primary_midaircombo_interval 0.1 +set g_balance_electro_primary_midaircombo_radius 0 +set g_balance_electro_primary_radius 100 +set g_balance_electro_primary_refire 0.6 +set g_balance_electro_primary_speed 2500 +set g_balance_electro_primary_spread 0 +set g_balance_electro_reload_ammo 0 +set g_balance_electro_reload_time 2 +set g_balance_electro_secondary_ammo 2 +set g_balance_electro_secondary_animtime 0.2 +set g_balance_electro_secondary_bouncefactor 0.3 +set g_balance_electro_secondary_bouncestop 0.05 +set g_balance_electro_secondary_count 3 +set g_balance_electro_secondary_damage 30 +set g_balance_electro_secondary_damagedbycontents 1 +set g_balance_electro_secondary_damageforcescale 4 +set g_balance_electro_secondary_edgedamage 15 +set g_balance_electro_secondary_force 50 +set g_balance_electro_secondary_health 5 +set g_balance_electro_secondary_lifetime 4 +set g_balance_electro_secondary_radius 150 +set g_balance_electro_secondary_refire 0.2 +set g_balance_electro_secondary_refire2 1.6 +set g_balance_electro_secondary_speed 1000 +set g_balance_electro_secondary_speed_up 200 +set g_balance_electro_secondary_speed_z 0 +set g_balance_electro_secondary_spread 0 +set g_balance_electro_secondary_stick 0 +set g_balance_electro_secondary_touchexplode 1 +set g_balance_electro_switchdelay_drop 0.2 +set g_balance_electro_switchdelay_raise 0.2 +set g_balance_electro_weaponreplace "" +set g_balance_electro_weaponstart 0 +set g_balance_electro_weaponstartoverride -1 +set g_balance_electro_weaponthrowable 1 +// }}} +// {{{ #7: Crylink +set g_balance_crylink_primary_ammo 3 +set g_balance_crylink_primary_animtime 0.3 +set g_balance_crylink_primary_bouncedamagefactor 0.5 +set g_balance_crylink_primary_bounces 1 +set g_balance_crylink_primary_damage 10 +set g_balance_crylink_primary_edgedamage 5 +set g_balance_crylink_primary_force -50 +set g_balance_crylink_primary_joindelay 0.1 +set g_balance_crylink_primary_joinexplode 1 +set g_balance_crylink_primary_joinexplode_damage 0 +set g_balance_crylink_primary_joinexplode_edgedamage 0 +set g_balance_crylink_primary_joinexplode_force 0 +set g_balance_crylink_primary_joinexplode_radius 0 +set g_balance_crylink_primary_joinspread 0.2 +set g_balance_crylink_primary_linkexplode 1 +set g_balance_crylink_primary_middle_fadetime 5 +set g_balance_crylink_primary_middle_lifetime 5 +set g_balance_crylink_primary_other_fadetime 5 +set g_balance_crylink_primary_other_lifetime 5 +set g_balance_crylink_primary_radius 80 +set g_balance_crylink_primary_refire 0.7 +set g_balance_crylink_primary_shots 6 +set g_balance_crylink_primary_speed 2000 +set g_balance_crylink_primary_spread 0.08 +set g_balance_crylink_reload_ammo 0 +set g_balance_crylink_reload_time 2 +set g_balance_crylink_secondary 1 +set g_balance_crylink_secondary_ammo 3 +set g_balance_crylink_secondary_animtime 0.2 +set g_balance_crylink_secondary_bouncedamagefactor 0.5 +set g_balance_crylink_secondary_bounces 0 +set g_balance_crylink_secondary_damage 8 +set g_balance_crylink_secondary_edgedamage 4 +set g_balance_crylink_secondary_force -200 +set g_balance_crylink_secondary_joindelay 0 +set g_balance_crylink_secondary_joinexplode 0 +set g_balance_crylink_secondary_joinexplode_damage 0 +set g_balance_crylink_secondary_joinexplode_edgedamage 0 +set g_balance_crylink_secondary_joinexplode_force 0 +set g_balance_crylink_secondary_joinexplode_radius 0 +set g_balance_crylink_secondary_joinspread 0 +set g_balance_crylink_secondary_linkexplode 0 +set g_balance_crylink_secondary_middle_fadetime 5 +set g_balance_crylink_secondary_middle_lifetime 5 +set g_balance_crylink_secondary_other_fadetime 2 +set g_balance_crylink_secondary_other_lifetime 2 +set g_balance_crylink_secondary_radius 100 +set g_balance_crylink_secondary_refire 0.7 +set g_balance_crylink_secondary_shots 5 +set g_balance_crylink_secondary_speed 4000 +set g_balance_crylink_secondary_spread 0.08 +set g_balance_crylink_secondary_spreadtype 0 +set g_balance_crylink_switchdelay_drop 0.2 +set g_balance_crylink_switchdelay_raise 0.2 +set g_balance_crylink_weaponreplace "" +set g_balance_crylink_weaponstart 0 +set g_balance_crylink_weaponstartoverride -1 +set g_balance_crylink_weaponthrowable 1 +// }}} +// {{{ #8: Vortex +set g_balance_vortex_charge 0 +set g_balance_vortex_charge_always 0 +set g_balance_vortex_charge_animlimit 0.5 +set g_balance_vortex_charge_limit 1 +set g_balance_vortex_charge_maxspeed 800 +set g_balance_vortex_charge_mindmg 40 +set g_balance_vortex_charge_minspeed 400 +set g_balance_vortex_charge_rate 0.6 +set g_balance_vortex_charge_rot_pause 0 +set g_balance_vortex_charge_rot_rate 0 +set g_balance_vortex_charge_shot_multiplier 0 +set g_balance_vortex_charge_start 0.5 +set g_balance_vortex_charge_velocity_rate 0 +set g_balance_vortex_primary_ammo 6 +set g_balance_vortex_primary_animtime 0.4 +set g_balance_vortex_primary_armorpierce 0 +set g_balance_vortex_primary_damage 65 +set g_balance_vortex_primary_damagefalloff_forcehalflife 0 +set g_balance_vortex_primary_damagefalloff_halflife 0 +set g_balance_vortex_primary_damagefalloff_maxdist 0 +set g_balance_vortex_primary_damagefalloff_mindist 0 +set g_balance_vortex_primary_force 400 +set g_balance_vortex_primary_refire 1.5 +set g_balance_vortex_reload_ammo 0 +set g_balance_vortex_reload_time 2 +set g_balance_vortex_secondary 0 +set g_balance_vortex_secondary_ammo 2 +set g_balance_vortex_secondary_animtime 0 +set g_balance_vortex_secondary_armorpierce 0 +set g_balance_vortex_secondary_chargepool 0 +set g_balance_vortex_secondary_chargepool_pause_regen 1 +set g_balance_vortex_secondary_chargepool_regen 0.15 +set g_balance_vortex_secondary_damage 0 +set g_balance_vortex_secondary_damagefalloff_forcehalflife 0 +set g_balance_vortex_secondary_damagefalloff_halflife 0 +set g_balance_vortex_secondary_damagefalloff_maxdist 0 +set g_balance_vortex_secondary_damagefalloff_mindist 0 +set g_balance_vortex_secondary_force 0 +set g_balance_vortex_secondary_refire 0 +set g_balance_vortex_switchdelay_drop 0.2 +set g_balance_vortex_switchdelay_raise 0.2 +set g_balance_vortex_weaponreplace "" +set g_balance_vortex_weaponstart 0 +set g_balance_vortex_weaponstartoverride -1 +set g_balance_vortex_weaponthrowable 1 +// }}} +// {{{ #9: Hagar +set g_balance_hagar_primary_ammo 1 +set g_balance_hagar_primary_damage 25 +set g_balance_hagar_primary_damageforcescale 0 +set g_balance_hagar_primary_edgedamage 12.5 +set g_balance_hagar_primary_force 100 +set g_balance_hagar_primary_health 15 +set g_balance_hagar_primary_lifetime 5 +set g_balance_hagar_primary_radius 65 +set g_balance_hagar_primary_refire 0.16667 +set g_balance_hagar_primary_speed 2200 +set g_balance_hagar_primary_spread 0 +set g_balance_hagar_reload_ammo 0 +set g_balance_hagar_reload_time 2 +set g_balance_hagar_secondary 1 +set g_balance_hagar_secondary_ammo 1 +set g_balance_hagar_secondary_damage 35 +set g_balance_hagar_secondary_damageforcescale 0 +set g_balance_hagar_secondary_edgedamage 17.5 +set g_balance_hagar_secondary_force 75 +set g_balance_hagar_secondary_health 15 +set g_balance_hagar_secondary_lifetime_min 10 +set g_balance_hagar_secondary_lifetime_rand 0 +set g_balance_hagar_secondary_load 1 +set g_balance_hagar_secondary_load_abort 1 +set g_balance_hagar_secondary_load_animtime 0.2 +set g_balance_hagar_secondary_load_hold 4 +set g_balance_hagar_secondary_load_linkexplode 0 +set g_balance_hagar_secondary_load_max 4 +set g_balance_hagar_secondary_load_releasedeath 0 +set g_balance_hagar_secondary_load_speed 0.5 +set g_balance_hagar_secondary_load_spread 0.075 +set g_balance_hagar_secondary_load_spread_bias 0.5 +set g_balance_hagar_secondary_radius 80 +set g_balance_hagar_secondary_refire 0.5 +set g_balance_hagar_secondary_speed 2000 +set g_balance_hagar_secondary_spread 0 +set g_balance_hagar_switchdelay_drop 0.2 +set g_balance_hagar_switchdelay_raise 0.2 +set g_balance_hagar_weaponreplace "" +set g_balance_hagar_weaponstart 0 +set g_balance_hagar_weaponstartoverride -1 +set g_balance_hagar_weaponthrowable 1 +// }}} +// {{{ #10: Devastator +set g_balance_devastator_ammo 4 +set g_balance_devastator_animtime 0.4 +set g_balance_devastator_damage 80 +set g_balance_devastator_damageforcescale 1 +set g_balance_devastator_detonatedelay 0.02 +set g_balance_devastator_edgedamage 40 +set g_balance_devastator_force 400 +set g_balance_devastator_guidedelay 0.2 +set g_balance_devastator_guidegoal 512 +set g_balance_devastator_guiderate 90 +set g_balance_devastator_guideratedelay 0.01 +set g_balance_devastator_guidestop 0 +set g_balance_devastator_health 30 +set g_balance_devastator_lifetime 10 +set g_balance_devastator_radius 110 +set g_balance_devastator_refire 1.1 +set g_balance_devastator_reload_ammo 0 +set g_balance_devastator_reload_time 2 +set g_balance_devastator_remote_damage 70 +set g_balance_devastator_remote_edgedamage 35 +set g_balance_devastator_remote_force 300 +set g_balance_devastator_remote_jump 1 +set g_balance_devastator_remote_jump_damage 70 +set g_balance_devastator_remote_jump_force 450 +set g_balance_devastator_remote_jump_radius 100 +set g_balance_devastator_remote_jump_velocity_z_add 0 +set g_balance_devastator_remote_jump_velocity_z_max 1500 +set g_balance_devastator_remote_jump_velocity_z_min 400 +set g_balance_devastator_remote_radius 110 +set g_balance_devastator_speed 1300 +set g_balance_devastator_speedaccel 1300 +set g_balance_devastator_speedstart 1000 +set g_balance_devastator_switchdelay_drop 0.2 +set g_balance_devastator_switchdelay_raise 0.2 +set g_balance_devastator_weaponreplace "" +set g_balance_devastator_weaponstart 0 +set g_balance_devastator_weaponstartoverride -1 +set g_balance_devastator_weaponthrowable 1 +// }}} +// {{{ #11: Port-O-Launch +set g_balance_porto_primary_animtime 0.3 +set g_balance_porto_primary_lifetime 5 +set g_balance_porto_primary_refire 1.5 +set g_balance_porto_primary_speed 1000 +set g_balance_porto_secondary 1 +set g_balance_porto_secondary_animtime 0.3 +set g_balance_porto_secondary_lifetime 5 +set g_balance_porto_secondary_refire 1.5 +set g_balance_porto_secondary_speed 1000 +set g_balance_porto_switchdelay_drop 0.2 +set g_balance_porto_switchdelay_raise 0.2 +set g_balance_porto_weaponreplace "" +set g_balance_porto_weaponstart 0 +set g_balance_porto_weaponstartoverride -1 +set g_balance_porto_weaponthrowable 1 +// }}} +// {{{ #12: Vaporizer +set g_balance_vaporizer_primary_ammo 10 +set g_balance_vaporizer_primary_animtime 0.3 +set g_balance_vaporizer_primary_damage 150 +set g_balance_vaporizer_primary_force 800 +set g_balance_vaporizer_primary_refire 1 +set g_balance_vaporizer_reload_ammo 0 +set g_balance_vaporizer_reload_time 0 +set g_balance_vaporizer_secondary_ammo 0 +set g_balance_vaporizer_secondary_animtime 0.2 +set g_balance_vaporizer_secondary_damage 25 +set g_balance_vaporizer_secondary_delay 0 +set g_balance_vaporizer_secondary_edgedamage 12.5 +set g_balance_vaporizer_secondary_force 480 +set g_balance_vaporizer_secondary_force_zscale 1 +set g_balance_vaporizer_secondary_lifetime 5 +set g_balance_vaporizer_secondary_radius 70 +set g_balance_vaporizer_secondary_refire 0.7 +set g_balance_vaporizer_secondary_shotangle 0 +set g_balance_vaporizer_secondary_speed 6000 +set g_balance_vaporizer_secondary_spread 0 +set g_balance_vaporizer_switchdelay_drop 0.2 +set g_balance_vaporizer_switchdelay_raise 0.2 +set g_balance_vaporizer_weaponreplace "" +set g_balance_vaporizer_weaponstart 0 +set g_balance_vaporizer_weaponstartoverride -1 +set g_balance_vaporizer_weaponthrowable 1 +// }}} +// {{{ #13: Grappling Hook +set g_balance_hook_primary_ammo 5 +set g_balance_hook_primary_animtime 0.3 +set g_balance_hook_primary_hooked_ammo 5 +set g_balance_hook_primary_hooked_time_free 2 +set g_balance_hook_primary_hooked_time_max 0 +set g_balance_hook_primary_refire 0.2 +set g_balance_hook_secondary_animtime 0.3 +set g_balance_hook_secondary_damage 25 +set g_balance_hook_secondary_damageforcescale 0 +set g_balance_hook_secondary_duration 1.5 +set g_balance_hook_secondary_edgedamage 5 +set g_balance_hook_secondary_force -2000 +set g_balance_hook_secondary_gravity 5 +set g_balance_hook_secondary_health 15 +set g_balance_hook_secondary_lifetime 5 +set g_balance_hook_secondary_power 3 +set g_balance_hook_secondary_radius 500 +set g_balance_hook_secondary_refire 3 +set g_balance_hook_secondary_speed 0 +set g_balance_hook_switchdelay_drop 0.2 +set g_balance_hook_switchdelay_raise 0.2 +set g_balance_hook_weaponreplace "" +set g_balance_hook_weaponstart 0 +set g_balance_hook_weaponstartoverride -1 +set g_balance_hook_weaponthrowable 1 +// }}} +// {{{ #14: Heavy Laser Assault Cannon (MUTATOR WEAPON) +set g_balance_hlac_primary_ammo 1 +set g_balance_hlac_primary_animtime 0.4 +set g_balance_hlac_primary_damage 18 +set g_balance_hlac_primary_edgedamage 9 +set g_balance_hlac_primary_force 90 +set g_balance_hlac_primary_lifetime 5 +set g_balance_hlac_primary_radius 70 +set g_balance_hlac_primary_refire 0.15 +set g_balance_hlac_primary_speed 9000 +set g_balance_hlac_primary_spread_add 0.0045 +set g_balance_hlac_primary_spread_crouchmod 0.25 +set g_balance_hlac_primary_spread_max 0.25 +set g_balance_hlac_primary_spread_min 0.01 +set g_balance_hlac_reload_ammo 0 +set g_balance_hlac_reload_time 2 +set g_balance_hlac_secondary 1 +set g_balance_hlac_secondary_ammo 10 +set g_balance_hlac_secondary_animtime 0.3 +set g_balance_hlac_secondary_damage 15 +set g_balance_hlac_secondary_edgedamage 7.5 +set g_balance_hlac_secondary_force 90 +set g_balance_hlac_secondary_lifetime 5 +set g_balance_hlac_secondary_radius 70 +set g_balance_hlac_secondary_refire 1 +set g_balance_hlac_secondary_shots 6 +set g_balance_hlac_secondary_speed 9000 +set g_balance_hlac_secondary_spread 0.15 +set g_balance_hlac_secondary_spread_crouchmod 0.5 +set g_balance_hlac_switchdelay_drop 0.2 +set g_balance_hlac_switchdelay_raise 0.2 +set g_balance_hlac_weaponreplace "" +set g_balance_hlac_weaponstart 0 +set g_balance_hlac_weaponstartoverride -1 +set g_balance_hlac_weaponthrowable 1 +// }}} +// {{{ #15: @!#%'n Tuba +set g_balance_tuba_animtime 0.05 +set g_balance_tuba_attenuation 0.5 +set g_balance_tuba_damage 5 +set g_balance_tuba_edgedamage 0 +set g_balance_tuba_fadetime 0.25 +set g_balance_tuba_force 40 +set g_balance_tuba_pitchstep 6 +set g_balance_tuba_radius 200 +set g_balance_tuba_refire 0.05 +set g_balance_tuba_switchdelay_drop 0.2 +set g_balance_tuba_switchdelay_raise 0.2 +set g_balance_tuba_volume 1 +set g_balance_tuba_weaponreplace "" +set g_balance_tuba_weaponstart 0 +set g_balance_tuba_weaponstartoverride -1 +set g_balance_tuba_weaponthrowable 1 +// }}} +// {{{ #16: Rifle (MUTATOR WEAPON) +set g_balance_rifle_bursttime 0 +set g_balance_rifle_primary_ammo 10 +set g_balance_rifle_primary_animtime 0.4 +set g_balance_rifle_primary_bullethail 0 +set g_balance_rifle_primary_burstcost 0 +set g_balance_rifle_primary_damage 80 +set g_balance_rifle_primary_force 100 +set g_balance_rifle_primary_refire 1.2 +set g_balance_rifle_primary_shots 1 +set g_balance_rifle_primary_solidpenetration 62.2 +set g_balance_rifle_primary_spread 0 +set g_balance_rifle_primary_tracer 1 +set g_balance_rifle_reload_ammo 80 +set g_balance_rifle_reload_time 2 +set g_balance_rifle_secondary 1 +set g_balance_rifle_secondary_ammo 10 +set g_balance_rifle_secondary_animtime 0.3 +set g_balance_rifle_secondary_bullethail 0 +set g_balance_rifle_secondary_burstcost 0 +set g_balance_rifle_secondary_damage 20 +set g_balance_rifle_secondary_force 50 +set g_balance_rifle_secondary_refire 0.9 +set g_balance_rifle_secondary_reload 0 +set g_balance_rifle_secondary_shots 4 +set g_balance_rifle_secondary_solidpenetration 15.5 +set g_balance_rifle_secondary_spread 0.04 +set g_balance_rifle_secondary_tracer 0 +set g_balance_rifle_switchdelay_drop 0.2 +set g_balance_rifle_switchdelay_raise 0.2 +set g_balance_rifle_weaponreplace "" +set g_balance_rifle_weaponstart 0 +set g_balance_rifle_weaponstartoverride -1 +set g_balance_rifle_weaponthrowable 1 +// }}} +// {{{ #17: Fireball +set g_balance_fireball_primary_animtime 0.4 +set g_balance_fireball_primary_bfgdamage 100 +set g_balance_fireball_primary_bfgforce 0 +set g_balance_fireball_primary_bfgradius 1000 +set g_balance_fireball_primary_damage 200 +set g_balance_fireball_primary_damageforcescale 0 +set g_balance_fireball_primary_edgedamage 50 +set g_balance_fireball_primary_force 600 +set g_balance_fireball_primary_health 0 +set g_balance_fireball_primary_laserburntime 0.5 +set g_balance_fireball_primary_laserdamage 80 +set g_balance_fireball_primary_laseredgedamage 20 +set g_balance_fireball_primary_laserradius 256 +set g_balance_fireball_primary_lifetime 15 +set g_balance_fireball_primary_radius 200 +set g_balance_fireball_primary_refire 2 +set g_balance_fireball_primary_refire2 0 +set g_balance_fireball_primary_speed 1200 +set g_balance_fireball_primary_spread 0 +set g_balance_fireball_secondary_animtime 0.3 +set g_balance_fireball_secondary_damage 40 +set g_balance_fireball_secondary_damageforcescale 4 +set g_balance_fireball_secondary_damagetime 5 +set g_balance_fireball_secondary_laserburntime 0.5 +set g_balance_fireball_secondary_laserdamage 50 +set g_balance_fireball_secondary_laseredgedamage 20 +set g_balance_fireball_secondary_laserradius 110 +set g_balance_fireball_secondary_lifetime 7 +set g_balance_fireball_secondary_refire 1.5 +set g_balance_fireball_secondary_speed 900 +set g_balance_fireball_secondary_speed_up 100 +set g_balance_fireball_secondary_speed_z 0 +set g_balance_fireball_secondary_spread 0 +set g_balance_fireball_switchdelay_drop 0.2 +set g_balance_fireball_switchdelay_raise 0.2 +set g_balance_fireball_weaponreplace "" +set g_balance_fireball_weaponstart 0 +set g_balance_fireball_weaponstartoverride -1 +set g_balance_fireball_weaponthrowable 0 +// }}} +// {{{ #18: T.A.G. Seeker (MUTATOR WEAPON) +set g_balance_seeker_flac_ammo 1 +set g_balance_seeker_flac_animtime 0.1 +set g_balance_seeker_flac_damage 15 +set g_balance_seeker_flac_edgedamage 10 +set g_balance_seeker_flac_force 50 +set g_balance_seeker_flac_lifetime 0.1 +set g_balance_seeker_flac_lifetime_rand 0.05 +set g_balance_seeker_flac_radius 100 +set g_balance_seeker_flac_refire 0.1 +set g_balance_seeker_flac_speed 3000 +set g_balance_seeker_flac_speed_up 1000 +set g_balance_seeker_flac_speed_z 0 +set g_balance_seeker_flac_spread 0.4 +set g_balance_seeker_missile_accel 1400 +set g_balance_seeker_missile_ammo 2 +set g_balance_seeker_missile_animtime 0.2 +set g_balance_seeker_missile_count 3 +set g_balance_seeker_missile_damage 30 +set g_balance_seeker_missile_damageforcescale 4 +set g_balance_seeker_missile_decel 1400 +set g_balance_seeker_missile_delay 0.25 +set g_balance_seeker_missile_edgedamage 10 +set g_balance_seeker_missile_force 150 +set g_balance_seeker_missile_health 5 +set g_balance_seeker_missile_lifetime 15 +set g_balance_seeker_missile_proxy 0 +set g_balance_seeker_missile_proxy_delay 0.2 +set g_balance_seeker_missile_proxy_maxrange 45 +set g_balance_seeker_missile_radius 80 +set g_balance_seeker_missile_refire 0.5 +set g_balance_seeker_missile_smart 1 +set g_balance_seeker_missile_smart_mindist 800 +set g_balance_seeker_missile_smart_trace_max 2500 +set g_balance_seeker_missile_smart_trace_min 1000 +set g_balance_seeker_missile_speed 700 +set g_balance_seeker_missile_speed_max 1300 +set g_balance_seeker_missile_speed_up 300 +set g_balance_seeker_missile_speed_z 0 +set g_balance_seeker_missile_spread 0 +set g_balance_seeker_missile_turnrate 0.65 +set g_balance_seeker_reload_ammo 0 +set g_balance_seeker_reload_time 2 +set g_balance_seeker_switchdelay_drop 0.2 +set g_balance_seeker_switchdelay_raise 0.2 +set g_balance_seeker_tag_ammo 1 +set g_balance_seeker_tag_animtime 0.2 +set g_balance_seeker_tag_damageforcescale 4 +set g_balance_seeker_tag_health 5 +set g_balance_seeker_tag_lifetime 15 +set g_balance_seeker_tag_refire 0.75 +set g_balance_seeker_tag_speed 5000 +set g_balance_seeker_tag_spread 0 +set g_balance_seeker_tag_tracker_lifetime 10 +set g_balance_seeker_type 0 +set g_balance_seeker_weaponreplace "" +set g_balance_seeker_weaponstart 0 +set g_balance_seeker_weaponstartoverride -1 +set g_balance_seeker_weaponthrowable 1 +// }}} +// {{{ #19: Shockwave +set g_balance_shockwave_blast_animtime 0.3 +set g_balance_shockwave_blast_damage 40 +set g_balance_shockwave_blast_distance 1000 +set g_balance_shockwave_blast_edgedamage 0 +set g_balance_shockwave_blast_force 15 +set g_balance_shockwave_blast_force_forwardbias 50 +set g_balance_shockwave_blast_force_zscale 1 +set g_balance_shockwave_blast_jump_damage 20 +set g_balance_shockwave_blast_jump_edgedamage 0 +set g_balance_shockwave_blast_jump_force 100 +set g_balance_shockwave_blast_jump_force_velocitybias 1 +set g_balance_shockwave_blast_jump_force_zscale 1 +set g_balance_shockwave_blast_jump_multiplier_accuracy 0.5 +set g_balance_shockwave_blast_jump_multiplier_distance 0.5 +set g_balance_shockwave_blast_jump_multiplier_min 0 +set g_balance_shockwave_blast_jump_radius 150 +set g_balance_shockwave_blast_multiplier_accuracy 0.45 +set g_balance_shockwave_blast_multiplier_distance 0.2 +set g_balance_shockwave_blast_multiplier_min 0 +set g_balance_shockwave_blast_refire 0.75 +set g_balance_shockwave_blast_splash_damage 15 +set g_balance_shockwave_blast_splash_edgedamage 0 +set g_balance_shockwave_blast_splash_force 100 +set g_balance_shockwave_blast_splash_force_forwardbias 50 +set g_balance_shockwave_blast_splash_multiplier_accuracy 0.5 +set g_balance_shockwave_blast_splash_multiplier_distance 0.5 +set g_balance_shockwave_blast_splash_multiplier_min 0 +set g_balance_shockwave_blast_splash_radius 70 +set g_balance_shockwave_blast_spread_max 120 +set g_balance_shockwave_blast_spread_min 25 +set g_balance_shockwave_melee_animtime 1.3 +set g_balance_shockwave_melee_damage 80 +set g_balance_shockwave_melee_delay 0.25 +set g_balance_shockwave_melee_force 200 +set g_balance_shockwave_melee_multihit 1 +set g_balance_shockwave_melee_no_doubleslap 1 +set g_balance_shockwave_melee_nonplayerdamage 40 +set g_balance_shockwave_melee_range 120 +set g_balance_shockwave_melee_refire 1.25 +set g_balance_shockwave_melee_swing_side 120 +set g_balance_shockwave_melee_swing_up 30 +set g_balance_shockwave_melee_time 0.15 +set g_balance_shockwave_melee_traces 10 +set g_balance_shockwave_switchdelay_drop 0.2 +set g_balance_shockwave_switchdelay_raise 0.2 +set g_balance_shockwave_weaponreplace "" +set g_balance_shockwave_weaponstart 0 +set g_balance_shockwave_weaponstartoverride -1 +set g_balance_shockwave_weaponthrowable 0 +// }}} +// {{{ #20: Arc +set g_balance_arc_beam_ammo 6 +set g_balance_arc_beam_animtime 0.1 +set g_balance_arc_beam_botaimlifetime 0 +set g_balance_arc_beam_botaimspeed 0 +set g_balance_arc_beam_damage 100 +set g_balance_arc_beam_degreespersegment 1 +set g_balance_arc_beam_distancepersegment 0 +set g_balance_arc_beam_falloff_halflifedist 0 +set g_balance_arc_beam_falloff_maxdist 0 +set g_balance_arc_beam_falloff_mindist 0 +set g_balance_arc_beam_force 600 +set g_balance_arc_beam_healing_amax 0 +set g_balance_arc_beam_healing_aps 50 +set g_balance_arc_beam_healing_hmax 150 +set g_balance_arc_beam_healing_hps 50 +set g_balance_arc_beam_heat 0 +set g_balance_arc_beam_maxangle 10 +set g_balance_arc_beam_nonplayerdamage 80 +set g_balance_arc_beam_range 1500 +set g_balance_arc_beam_refire 0.25 +set g_balance_arc_beam_returnspeed 8 +set g_balance_arc_beam_tightness 0.6 +set g_balance_arc_bolt 1 +set g_balance_arc_bolt_ammo 1 +set g_balance_arc_bolt_damage 25 +set g_balance_arc_bolt_damageforcescale 0 +set g_balance_arc_bolt_edgedamage 12.5 +set g_balance_arc_bolt_force 120 +set g_balance_arc_bolt_health 15 +set g_balance_arc_bolt_lifetime 5 +set g_balance_arc_bolt_radius 65 +set g_balance_arc_bolt_refire 0.16667 +set g_balance_arc_bolt_speed 2300 +set g_balance_arc_bolt_spread 0 +set g_balance_arc_burst_ammo 15 +set g_balance_arc_burst_damage 250 +set g_balance_arc_burst_healing_aps 100 +set g_balance_arc_burst_healing_hps 100 +set g_balance_arc_burst_heat 5 +set g_balance_arc_cooldown 2.5 +set g_balance_arc_cooldown_release 0 +set g_balance_arc_overheat_max 5 +set g_balance_arc_overheat_min 3 +set g_balance_arc_switchdelay_drop 0.2 +set g_balance_arc_switchdelay_raise 0.2 +set g_balance_arc_weaponreplace "" +set g_balance_arc_weaponstart 0 +set g_balance_arc_weaponstartoverride -1 +set g_balance_arc_weaponthrowable 1 +// }}} +// {{{ #21: Overkill Heavy Machine Gun (MUTATOR WEAPON) +set g_balance_okhmg_primary_ammo 1 +set g_balance_okhmg_primary_damage 30 +set g_balance_okhmg_primary_force 10 +set g_balance_okhmg_primary_refire 0.05 +set g_balance_okhmg_primary_solidpenetration 127 +set g_balance_okhmg_primary_spread_add 0.005 +set g_balance_okhmg_primary_spread_max 0.06 +set g_balance_okhmg_primary_spread_min 0.01 +set g_balance_okhmg_reload_ammo 120 +set g_balance_okhmg_reload_time 1 +set g_balance_okhmg_secondary_ammo 0 +set g_balance_okhmg_secondary_animtime 0.2 +set g_balance_okhmg_secondary_damage 25 +set g_balance_okhmg_secondary_delay 0 +set g_balance_okhmg_secondary_edgedamage 12.5 +set g_balance_okhmg_secondary_force 360 +set g_balance_okhmg_secondary_force_zscale 1 +set g_balance_okhmg_secondary_lifetime 5 +set g_balance_okhmg_secondary_radius 70 +set g_balance_okhmg_secondary_refire 0.7 +set g_balance_okhmg_secondary_refire_type 1 +set g_balance_okhmg_secondary_shotangle 0 +set g_balance_okhmg_secondary_speed 6000 +set g_balance_okhmg_secondary_spread 0 +set g_balance_okhmg_switchdelay_drop 0.2 +set g_balance_okhmg_switchdelay_raise 0.2 +set g_balance_okhmg_weaponreplace "" +set g_balance_okhmg_weaponstart 0 +set g_balance_okhmg_weaponstartoverride 0 +set g_balance_okhmg_weaponthrowable 0 +// }}} +// {{{ #22: Overkill MachineGun (MUTATOR WEAPON) +set g_balance_okmachinegun_primary_ammo 1 +set g_balance_okmachinegun_primary_damage 25 +set g_balance_okmachinegun_primary_force 5 +set g_balance_okmachinegun_primary_refire 0.1 +set g_balance_okmachinegun_primary_solidpenetration 100 +set g_balance_okmachinegun_primary_spread_add 0.012 +set g_balance_okmachinegun_primary_spread_max 0.05 +set g_balance_okmachinegun_primary_spread_min 0 +set g_balance_okmachinegun_reload_ammo 30 +set g_balance_okmachinegun_reload_time 1.5 +set g_balance_okmachinegun_secondary_animtime 0.2 +set g_balance_okmachinegun_secondary_damage 25 +set g_balance_okmachinegun_secondary_delay 0 +set g_balance_okmachinegun_secondary_edgedamage 12.5 +set g_balance_okmachinegun_secondary_force 360 +set g_balance_okmachinegun_secondary_force_zscale 1 +set g_balance_okmachinegun_secondary_lifetime 5 +set g_balance_okmachinegun_secondary_radius 70 +set g_balance_okmachinegun_secondary_refire 0.7 +set g_balance_okmachinegun_secondary_refire_type 1 +set g_balance_okmachinegun_secondary_shotangle 0 +set g_balance_okmachinegun_secondary_speed 6000 +set g_balance_okmachinegun_secondary_spread 0 +set g_balance_okmachinegun_switchdelay_drop 0.2 +set g_balance_okmachinegun_switchdelay_raise 0.2 +set g_balance_okmachinegun_weaponreplace "" +set g_balance_okmachinegun_weaponstart 0 +set g_balance_okmachinegun_weaponstartoverride -1 +set g_balance_okmachinegun_weaponthrowable 1 +// }}} +// {{{ #23: Overkill Nex (MUTATOR WEAPON) +set g_balance_oknex_charge 0 +set g_balance_oknex_charge_animlimit 0.5 +set g_balance_oknex_charge_limit 1 +set g_balance_oknex_charge_maxspeed 800 +set g_balance_oknex_charge_mindmg 40 +set g_balance_oknex_charge_minspeed 400 +set g_balance_oknex_charge_rate 0.6 +set g_balance_oknex_charge_rot_pause 0 +set g_balance_oknex_charge_rot_rate 0 +set g_balance_oknex_charge_shot_multiplier 0 +set g_balance_oknex_charge_start 0.5 +set g_balance_oknex_charge_velocity_rate 0 +set g_balance_oknex_primary_ammo 10 +set g_balance_oknex_primary_animtime 0.65 +set g_balance_oknex_primary_damage 100 +set g_balance_oknex_primary_damagefalloff_forcehalflife 0 +set g_balance_oknex_primary_damagefalloff_halflife 0 +set g_balance_oknex_primary_damagefalloff_maxdist 0 +set g_balance_oknex_primary_damagefalloff_mindist 0 +set g_balance_oknex_primary_force 500 +set g_balance_oknex_primary_refire 1 +set g_balance_oknex_reload_ammo 50 +set g_balance_oknex_reload_time 2 +set g_balance_oknex_secondary 2 +set g_balance_oknex_secondary_ammo 0 +set g_balance_oknex_secondary_animtime 0.2 +set g_balance_oknex_secondary_chargepool 0 +set g_balance_oknex_secondary_chargepool_pause_regen 1 +set g_balance_oknex_secondary_chargepool_regen 0.15 +set g_balance_oknex_secondary_damage 25 +set g_balance_oknex_secondary_damagefalloff_forcehalflife 0 +set g_balance_oknex_secondary_damagefalloff_halflife 0 +set g_balance_oknex_secondary_damagefalloff_maxdist 0 +set g_balance_oknex_secondary_damagefalloff_mindist 0 +set g_balance_oknex_secondary_delay 0 +set g_balance_oknex_secondary_edgedamage 12.5 +set g_balance_oknex_secondary_force 360 +set g_balance_oknex_secondary_force_zscale 1 +set g_balance_oknex_secondary_lifetime 5 +set g_balance_oknex_secondary_radius 70 +set g_balance_oknex_secondary_refire 0.7 +set g_balance_oknex_secondary_refire_type 1 +set g_balance_oknex_secondary_shotangle 0 +set g_balance_oknex_secondary_speed 6000 +set g_balance_oknex_secondary_spread 0 +set g_balance_oknex_switchdelay_drop 0.2 +set g_balance_oknex_switchdelay_raise 0.2 +set g_balance_oknex_weaponreplace "" +set g_balance_oknex_weaponstart 0 +set g_balance_oknex_weaponstartoverride -1 +set g_balance_oknex_weaponthrowable 1 +// }}} +// {{{ #24: Overkill Rocket Propelled Chainsaw (MUTATOR WEAPON) +set g_balance_okrpc_primary_ammo 10 +set g_balance_okrpc_primary_animtime 1 +set g_balance_okrpc_primary_damage 150 +set g_balance_okrpc_primary_damage2 500 +set g_balance_okrpc_primary_damageforcescale 2 +set g_balance_okrpc_primary_edgedamage 50 +set g_balance_okrpc_primary_force 400 +set g_balance_okrpc_primary_health 25 +set g_balance_okrpc_primary_lifetime 30 +set g_balance_okrpc_primary_radius 300 +set g_balance_okrpc_primary_refire 1 +set g_balance_okrpc_primary_speed 2500 +set g_balance_okrpc_primary_speedaccel 5000 +set g_balance_okrpc_reload_ammo 10 +set g_balance_okrpc_reload_time 1 +set g_balance_okrpc_secondary_ammo 0 +set g_balance_okrpc_secondary_animtime 0.2 +set g_balance_okrpc_secondary_damage 25 +set g_balance_okrpc_secondary_delay 0 +set g_balance_okrpc_secondary_edgedamage 12.5 +set g_balance_okrpc_secondary_force 360 +set g_balance_okrpc_secondary_force_zscale 1 +set g_balance_okrpc_secondary_lifetime 5 +set g_balance_okrpc_secondary_radius 70 +set g_balance_okrpc_secondary_refire 0.7 +set g_balance_okrpc_secondary_refire_type 1 +set g_balance_okrpc_secondary_shotangle 0 +set g_balance_okrpc_secondary_speed 6000 +set g_balance_okrpc_secondary_spread 0 +set g_balance_okrpc_switchdelay_drop 0.2 +set g_balance_okrpc_switchdelay_raise 0.2 +set g_balance_okrpc_weaponreplace "" +set g_balance_okrpc_weaponstart 0 +set g_balance_okrpc_weaponstartoverride 0 +set g_balance_okrpc_weaponthrowable 0 +// }}} +// {{{ #25: Overkill Shotgun (MUTATOR WEAPON) +set g_balance_okshotgun_primary_ammo 3 +set g_balance_okshotgun_primary_animtime 0.65 +set g_balance_okshotgun_primary_bot_range 512 +set g_balance_okshotgun_primary_bullets 10 +set g_balance_okshotgun_primary_damage 17 +set g_balance_okshotgun_primary_force 80 +set g_balance_okshotgun_primary_refire 0.75 +set g_balance_okshotgun_primary_solidpenetration 3.8 +set g_balance_okshotgun_primary_spread 0.07 +set g_balance_okshotgun_reload_ammo 24 +set g_balance_okshotgun_reload_time 2 +set g_balance_okshotgun_secondary_animtime 0.2 +set g_balance_okshotgun_secondary_damage 25 +set g_balance_okshotgun_secondary_delay 0 +set g_balance_okshotgun_secondary_edgedamage 12.5 +set g_balance_okshotgun_secondary_force 360 +set g_balance_okshotgun_secondary_force_zscale 1 +set g_balance_okshotgun_secondary_lifetime 5 +set g_balance_okshotgun_secondary_radius 70 +set g_balance_okshotgun_secondary_refire 0.7 +set g_balance_okshotgun_secondary_refire_type 1 +set g_balance_okshotgun_secondary_shotangle 0 +set g_balance_okshotgun_secondary_speed 6000 +set g_balance_okshotgun_secondary_spread 0 +set g_balance_okshotgun_switchdelay_drop 0.2 +set g_balance_okshotgun_switchdelay_raise 0.2 +set g_balance_okshotgun_weaponreplace "" +set g_balance_okshotgun_weaponstart 0 +set g_balance_okshotgun_weaponstartoverride -1 +set g_balance_okshotgun_weaponthrowable 1 +// }}} diff --git a/bal-wep-testingxpm.cfg b/bal-wep-testingxpm.cfg new file mode 100644 index 000000000..3bfe7a74b --- /dev/null +++ b/bal-wep-testingxpm.cfg @@ -0,0 +1,970 @@ +// {{{ #1: Blaster +set g_balance_blaster_primary_animtime 0.2 +set g_balance_blaster_primary_damage 20 +set g_balance_blaster_primary_delay 0 +set g_balance_blaster_primary_edgedamage 10 +set g_balance_blaster_primary_force 375 +set g_balance_blaster_primary_force_zscale 1 +set g_balance_blaster_primary_lifetime 5 +set g_balance_blaster_primary_radius 60 +set g_balance_blaster_primary_refire 0.7 +set g_balance_blaster_primary_shotangle 0 +set g_balance_blaster_primary_speed 6000 +set g_balance_blaster_primary_spread 0 +set g_balance_blaster_secondary 0 +set g_balance_blaster_secondary_animtime 0.2 +set g_balance_blaster_secondary_damage 25 +set g_balance_blaster_secondary_delay 0 +set g_balance_blaster_secondary_edgedamage 12.5 +set g_balance_blaster_secondary_force 360 +set g_balance_blaster_secondary_force_zscale 1 +set g_balance_blaster_secondary_lifetime 5 +set g_balance_blaster_secondary_radius 70 +set g_balance_blaster_secondary_refire 0.7 +set g_balance_blaster_secondary_shotangle 0 +set g_balance_blaster_secondary_speed 6000 +set g_balance_blaster_secondary_spread 0 +set g_balance_blaster_switchdelay_drop 0.2 +set g_balance_blaster_switchdelay_raise 0.2 +set g_balance_blaster_weaponreplace "" +set g_balance_blaster_weaponstart 1 +set g_balance_blaster_weaponstartoverride -1 +set g_balance_blaster_weaponthrowable 0 +// }}} +// {{{ #2: Shotgun +set g_balance_shotgun_primary_ammo 1 +set g_balance_shotgun_primary_animtime 0.2 +set g_balance_shotgun_primary_bullets 12 +set g_balance_shotgun_primary_damage 4 +set g_balance_shotgun_primary_force 15 +set g_balance_shotgun_primary_refire 0.75 +set g_balance_shotgun_primary_solidpenetration 3.8 +set g_balance_shotgun_primary_spread 0.12 +set g_balance_shotgun_reload_ammo 0 +set g_balance_shotgun_reload_time 2 +set g_balance_shotgun_secondary 1 +set g_balance_shotgun_secondary_alt_animtime 0.2 +set g_balance_shotgun_secondary_alt_refire 1.2 +set g_balance_shotgun_secondary_animtime 1.15 +set g_balance_shotgun_secondary_damage 70 +set g_balance_shotgun_secondary_force 200 +set g_balance_shotgun_secondary_melee_delay 0.25 +set g_balance_shotgun_secondary_melee_multihit 1 +set g_balance_shotgun_secondary_melee_no_doubleslap 1 +set g_balance_shotgun_secondary_melee_nonplayerdamage 40 +set g_balance_shotgun_secondary_melee_range 120 +set g_balance_shotgun_secondary_melee_swing_side 120 +set g_balance_shotgun_secondary_melee_swing_up 30 +set g_balance_shotgun_secondary_melee_time 0.15 +set g_balance_shotgun_secondary_melee_traces 10 +set g_balance_shotgun_secondary_refire 1.25 +set g_balance_shotgun_switchdelay_drop 0.2 +set g_balance_shotgun_switchdelay_raise 0.2 +set g_balance_shotgun_weaponreplace "" +set g_balance_shotgun_weaponstart 1 +set g_balance_shotgun_weaponstartoverride -1 +set g_balance_shotgun_weaponthrowable 1 +// }}} +// {{{ #3: MachineGun +set g_balance_machinegun_burst 3 +set g_balance_machinegun_burst_ammo 3 +set g_balance_machinegun_burst_animtime 0.3 +set g_balance_machinegun_burst_refire 0.06 +set g_balance_machinegun_burst_refire2 0.45 +set g_balance_machinegun_burst_spread 0 +set g_balance_machinegun_first 1 +set g_balance_machinegun_first_ammo 1 +set g_balance_machinegun_first_damage 14 +set g_balance_machinegun_first_force 3 +set g_balance_machinegun_first_refire 0.125 +set g_balance_machinegun_first_spread 0.03 +set g_balance_machinegun_mode 1 +set g_balance_machinegun_reload_ammo 60 +set g_balance_machinegun_reload_time 2 +set g_balance_machinegun_solidpenetration 63 +set g_balance_machinegun_spread_add 0.012 +set g_balance_machinegun_spread_max 0.05 +set g_balance_machinegun_spread_min 0.02 +set g_balance_machinegun_sustained_ammo 1 +set g_balance_machinegun_sustained_damage 10 +set g_balance_machinegun_sustained_force 3 +set g_balance_machinegun_sustained_refire 0.1 +set g_balance_machinegun_sustained_spread 0.03 +set g_balance_machinegun_switchdelay_drop 0.2 +set g_balance_machinegun_switchdelay_raise 0.2 +set g_balance_machinegun_weaponreplace "" +set g_balance_machinegun_weaponstart 0 +set g_balance_machinegun_weaponstartoverride -1 +set g_balance_machinegun_weaponthrowable 1 +// }}} +// {{{ #4: Mortar +set g_balance_mortar_bouncefactor 0.5 +set g_balance_mortar_bouncestop 0.075 +set g_balance_mortar_primary_ammo 2 +set g_balance_mortar_primary_animtime 0.3 +set g_balance_mortar_primary_damage 55 +set g_balance_mortar_primary_damageforcescale 0 +set g_balance_mortar_primary_edgedamage 25 +set g_balance_mortar_primary_force 250 +set g_balance_mortar_primary_health 15 +set g_balance_mortar_primary_lifetime 5 +set g_balance_mortar_primary_lifetime_stick 0 +set g_balance_mortar_primary_radius 120 +set g_balance_mortar_primary_refire 0.8 +set g_balance_mortar_primary_remote_minbouncecnt 0 +set g_balance_mortar_primary_speed 1900 +set g_balance_mortar_primary_speed_up 225 +set g_balance_mortar_primary_speed_z 0 +set g_balance_mortar_primary_spread 0 +set g_balance_mortar_primary_type 0 +set g_balance_mortar_reload_ammo 0 +set g_balance_mortar_reload_time 2 +set g_balance_mortar_secondary_ammo 2 +set g_balance_mortar_secondary_animtime 0.3 +set g_balance_mortar_secondary_damage 55 +set g_balance_mortar_secondary_damageforcescale 4 +set g_balance_mortar_secondary_edgedamage 30 +set g_balance_mortar_secondary_force 250 +set g_balance_mortar_secondary_health 30 +set g_balance_mortar_secondary_lifetime 5 +set g_balance_mortar_secondary_lifetime_bounce 0.5 +set g_balance_mortar_secondary_lifetime_stick 0 +set g_balance_mortar_secondary_radius 120 +set g_balance_mortar_secondary_refire 0.7 +set g_balance_mortar_secondary_remote_detonateprimary 0 +set g_balance_mortar_secondary_speed 1400 +set g_balance_mortar_secondary_speed_up 150 +set g_balance_mortar_secondary_speed_z 0 +set g_balance_mortar_secondary_spread 0 +set g_balance_mortar_secondary_type 1 +set g_balance_mortar_switchdelay_drop 0.2 +set g_balance_mortar_switchdelay_raise 0.2 +set g_balance_mortar_weaponreplace "" +set g_balance_mortar_weaponstart 0 +set g_balance_mortar_weaponstartoverride -1 +set g_balance_mortar_weaponthrowable 1 +// }}} +// {{{ #5: Mine Layer (MUTATOR WEAPON) +set g_balance_minelayer_ammo 4 +set g_balance_minelayer_animtime 0.4 +set g_balance_minelayer_damage 40 +set g_balance_minelayer_damageforcescale 0 +set g_balance_minelayer_detonatedelay -1 +set g_balance_minelayer_edgedamage 20 +set g_balance_minelayer_force 250 +set g_balance_minelayer_health 15 +set g_balance_minelayer_lifetime 10 +set g_balance_minelayer_lifetime_countdown 0.5 +set g_balance_minelayer_limit 3 +set g_balance_minelayer_protection 0 +set g_balance_minelayer_proximityradius 150 +set g_balance_minelayer_radius 175 +set g_balance_minelayer_refire 1.5 +set g_balance_minelayer_reload_ammo 0 +set g_balance_minelayer_reload_time 2 +set g_balance_minelayer_remote_damage 45 +set g_balance_minelayer_remote_edgedamage 40 +set g_balance_minelayer_remote_force 300 +set g_balance_minelayer_remote_radius 200 +set g_balance_minelayer_speed 1000 +set g_balance_minelayer_switchdelay_drop 0.2 +set g_balance_minelayer_switchdelay_raise 0.2 +set g_balance_minelayer_time 0.5 +set g_balance_minelayer_weaponreplace "" +set g_balance_minelayer_weaponstart 0 +set g_balance_minelayer_weaponstartoverride -1 +set g_balance_minelayer_weaponthrowable 1 +// }}} +// {{{ #6: Electro +set g_balance_electro_combo_comboradius 300 +set g_balance_electro_combo_comboradius_thruwall 200 +set g_balance_electro_combo_damage 50 +set g_balance_electro_combo_edgedamage 25 +set g_balance_electro_combo_force 120 +set g_balance_electro_combo_radius 150 +set g_balance_electro_combo_safeammocheck 1 +set g_balance_electro_combo_speed 2000 +set g_balance_electro_primary_ammo 4 +set g_balance_electro_primary_animtime 0.3 +set g_balance_electro_primary_comboradius 300 +set g_balance_electro_primary_damage 40 +set g_balance_electro_primary_edgedamage 20 +set g_balance_electro_primary_force 200 +set g_balance_electro_primary_lifetime 5 +set g_balance_electro_primary_midaircombo_explode 1 +set g_balance_electro_primary_midaircombo_interval 0.1 +set g_balance_electro_primary_midaircombo_radius 0 +set g_balance_electro_primary_radius 100 +set g_balance_electro_primary_refire 0.6 +set g_balance_electro_primary_speed 2500 +set g_balance_electro_primary_spread 0 +set g_balance_electro_reload_ammo 0 +set g_balance_electro_reload_time 2 +set g_balance_electro_secondary_ammo 2 +set g_balance_electro_secondary_animtime 0.2 +set g_balance_electro_secondary_bouncefactor 0.3 +set g_balance_electro_secondary_bouncestop 0.05 +set g_balance_electro_secondary_count 3 +set g_balance_electro_secondary_damage 30 +set g_balance_electro_secondary_damagedbycontents 1 +set g_balance_electro_secondary_damageforcescale 4 +set g_balance_electro_secondary_edgedamage 15 +set g_balance_electro_secondary_force 50 +set g_balance_electro_secondary_health 5 +set g_balance_electro_secondary_lifetime 4 +set g_balance_electro_secondary_radius 150 +set g_balance_electro_secondary_refire 0.2 +set g_balance_electro_secondary_refire2 1.6 +set g_balance_electro_secondary_speed 1000 +set g_balance_electro_secondary_speed_up 200 +set g_balance_electro_secondary_speed_z 0 +set g_balance_electro_secondary_spread 0 +set g_balance_electro_secondary_stick 0 +set g_balance_electro_secondary_touchexplode 1 +set g_balance_electro_switchdelay_drop 0.2 +set g_balance_electro_switchdelay_raise 0.2 +set g_balance_electro_weaponreplace "" +set g_balance_electro_weaponstart 0 +set g_balance_electro_weaponstartoverride -1 +set g_balance_electro_weaponthrowable 1 +// }}} +// {{{ #7: Crylink +set g_balance_crylink_primary_ammo 3 +set g_balance_crylink_primary_animtime 0.3 +set g_balance_crylink_primary_bouncedamagefactor 0.5 +set g_balance_crylink_primary_bounces 1 +set g_balance_crylink_primary_damage 10 +set g_balance_crylink_primary_edgedamage 5 +set g_balance_crylink_primary_force -50 +set g_balance_crylink_primary_joindelay 0.1 +set g_balance_crylink_primary_joinexplode 1 +set g_balance_crylink_primary_joinexplode_damage 0 +set g_balance_crylink_primary_joinexplode_edgedamage 0 +set g_balance_crylink_primary_joinexplode_force 0 +set g_balance_crylink_primary_joinexplode_radius 0 +set g_balance_crylink_primary_joinspread 0.2 +set g_balance_crylink_primary_linkexplode 1 +set g_balance_crylink_primary_middle_fadetime 5 +set g_balance_crylink_primary_middle_lifetime 5 +set g_balance_crylink_primary_other_fadetime 5 +set g_balance_crylink_primary_other_lifetime 5 +set g_balance_crylink_primary_radius 80 +set g_balance_crylink_primary_refire 0.7 +set g_balance_crylink_primary_shots 6 +set g_balance_crylink_primary_speed 2000 +set g_balance_crylink_primary_spread 0.08 +set g_balance_crylink_reload_ammo 0 +set g_balance_crylink_reload_time 2 +set g_balance_crylink_secondary 1 +set g_balance_crylink_secondary_ammo 3 +set g_balance_crylink_secondary_animtime 0.2 +set g_balance_crylink_secondary_bouncedamagefactor 0.5 +set g_balance_crylink_secondary_bounces 0 +set g_balance_crylink_secondary_damage 8 +set g_balance_crylink_secondary_edgedamage 4 +set g_balance_crylink_secondary_force -200 +set g_balance_crylink_secondary_joindelay 0 +set g_balance_crylink_secondary_joinexplode 0 +set g_balance_crylink_secondary_joinexplode_damage 0 +set g_balance_crylink_secondary_joinexplode_edgedamage 0 +set g_balance_crylink_secondary_joinexplode_force 0 +set g_balance_crylink_secondary_joinexplode_radius 0 +set g_balance_crylink_secondary_joinspread 0 +set g_balance_crylink_secondary_linkexplode 0 +set g_balance_crylink_secondary_middle_fadetime 5 +set g_balance_crylink_secondary_middle_lifetime 5 +set g_balance_crylink_secondary_other_fadetime 2 +set g_balance_crylink_secondary_other_lifetime 2 +set g_balance_crylink_secondary_radius 100 +set g_balance_crylink_secondary_refire 0.7 +set g_balance_crylink_secondary_shots 5 +set g_balance_crylink_secondary_speed 4000 +set g_balance_crylink_secondary_spread 0.08 +set g_balance_crylink_secondary_spreadtype 0 +set g_balance_crylink_switchdelay_drop 0.2 +set g_balance_crylink_switchdelay_raise 0.2 +set g_balance_crylink_weaponreplace "" +set g_balance_crylink_weaponstart 0 +set g_balance_crylink_weaponstartoverride -1 +set g_balance_crylink_weaponthrowable 1 +// }}} +// {{{ #8: Vortex +set g_balance_vortex_charge 0 +set g_balance_vortex_charge_always 0 +set g_balance_vortex_charge_animlimit 0.5 +set g_balance_vortex_charge_limit 1 +set g_balance_vortex_charge_maxspeed 800 +set g_balance_vortex_charge_mindmg 40 +set g_balance_vortex_charge_minspeed 400 +set g_balance_vortex_charge_rate 0.6 +set g_balance_vortex_charge_rot_pause 0 +set g_balance_vortex_charge_rot_rate 0 +set g_balance_vortex_charge_shot_multiplier 0 +set g_balance_vortex_charge_start 0.5 +set g_balance_vortex_charge_velocity_rate 0 +set g_balance_vortex_primary_ammo 6 +set g_balance_vortex_primary_animtime 0.4 +set g_balance_vortex_primary_armorpierce 0 +set g_balance_vortex_primary_damage 65 +set g_balance_vortex_primary_damagefalloff_forcehalflife 0 +set g_balance_vortex_primary_damagefalloff_halflife 0 +set g_balance_vortex_primary_damagefalloff_maxdist 0 +set g_balance_vortex_primary_damagefalloff_mindist 0 +set g_balance_vortex_primary_force 400 +set g_balance_vortex_primary_refire 1.5 +set g_balance_vortex_reload_ammo 0 +set g_balance_vortex_reload_time 2 +set g_balance_vortex_secondary 0 +set g_balance_vortex_secondary_ammo 2 +set g_balance_vortex_secondary_animtime 0 +set g_balance_vortex_secondary_armorpierce 0 +set g_balance_vortex_secondary_chargepool 0 +set g_balance_vortex_secondary_chargepool_pause_regen 1 +set g_balance_vortex_secondary_chargepool_regen 0.15 +set g_balance_vortex_secondary_damage 0 +set g_balance_vortex_secondary_damagefalloff_forcehalflife 0 +set g_balance_vortex_secondary_damagefalloff_halflife 0 +set g_balance_vortex_secondary_damagefalloff_maxdist 0 +set g_balance_vortex_secondary_damagefalloff_mindist 0 +set g_balance_vortex_secondary_force 0 +set g_balance_vortex_secondary_refire 0 +set g_balance_vortex_switchdelay_drop 0.2 +set g_balance_vortex_switchdelay_raise 0.2 +set g_balance_vortex_weaponreplace "" +set g_balance_vortex_weaponstart 0 +set g_balance_vortex_weaponstartoverride -1 +set g_balance_vortex_weaponthrowable 1 +// }}} +// {{{ #9: Hagar +set g_balance_hagar_primary_ammo 1 +set g_balance_hagar_primary_damage 25 +set g_balance_hagar_primary_damageforcescale 0 +set g_balance_hagar_primary_edgedamage 12.5 +set g_balance_hagar_primary_force 100 +set g_balance_hagar_primary_health 15 +set g_balance_hagar_primary_lifetime 5 +set g_balance_hagar_primary_radius 65 +set g_balance_hagar_primary_refire 0.16667 +set g_balance_hagar_primary_speed 2200 +set g_balance_hagar_primary_spread 0 +set g_balance_hagar_reload_ammo 0 +set g_balance_hagar_reload_time 2 +set g_balance_hagar_secondary 1 +set g_balance_hagar_secondary_ammo 1 +set g_balance_hagar_secondary_damage 35 +set g_balance_hagar_secondary_damageforcescale 0 +set g_balance_hagar_secondary_edgedamage 17.5 +set g_balance_hagar_secondary_force 75 +set g_balance_hagar_secondary_health 15 +set g_balance_hagar_secondary_lifetime_min 10 +set g_balance_hagar_secondary_lifetime_rand 0 +set g_balance_hagar_secondary_load 1 +set g_balance_hagar_secondary_load_abort 1 +set g_balance_hagar_secondary_load_animtime 0.2 +set g_balance_hagar_secondary_load_hold 4 +set g_balance_hagar_secondary_load_linkexplode 0 +set g_balance_hagar_secondary_load_max 4 +set g_balance_hagar_secondary_load_releasedeath 0 +set g_balance_hagar_secondary_load_speed 0.5 +set g_balance_hagar_secondary_load_spread 0.075 +set g_balance_hagar_secondary_load_spread_bias 0.5 +set g_balance_hagar_secondary_radius 80 +set g_balance_hagar_secondary_refire 0.5 +set g_balance_hagar_secondary_speed 2000 +set g_balance_hagar_secondary_spread 0 +set g_balance_hagar_switchdelay_drop 0.2 +set g_balance_hagar_switchdelay_raise 0.2 +set g_balance_hagar_weaponreplace "" +set g_balance_hagar_weaponstart 0 +set g_balance_hagar_weaponstartoverride -1 +set g_balance_hagar_weaponthrowable 1 +// }}} +// {{{ #10: Devastator +set g_balance_devastator_ammo 4 +set g_balance_devastator_animtime 0.4 +set g_balance_devastator_damage 80 +set g_balance_devastator_damageforcescale 1 +set g_balance_devastator_detonatedelay 0.02 +set g_balance_devastator_edgedamage 40 +set g_balance_devastator_force 400 +set g_balance_devastator_guidedelay 0.2 +set g_balance_devastator_guidegoal 512 +set g_balance_devastator_guiderate 90 +set g_balance_devastator_guideratedelay 0.01 +set g_balance_devastator_guidestop 0 +set g_balance_devastator_health 30 +set g_balance_devastator_lifetime 10 +set g_balance_devastator_radius 110 +set g_balance_devastator_refire 1.1 +set g_balance_devastator_reload_ammo 0 +set g_balance_devastator_reload_time 2 +set g_balance_devastator_remote_damage 70 +set g_balance_devastator_remote_edgedamage 35 +set g_balance_devastator_remote_force 300 +set g_balance_devastator_remote_jump 1 +set g_balance_devastator_remote_jump_damage 70 +set g_balance_devastator_remote_jump_force 450 +set g_balance_devastator_remote_jump_radius 100 +set g_balance_devastator_remote_jump_velocity_z_add 0 +set g_balance_devastator_remote_jump_velocity_z_max 1500 +set g_balance_devastator_remote_jump_velocity_z_min 400 +set g_balance_devastator_remote_radius 110 +set g_balance_devastator_speed 1300 +set g_balance_devastator_speedaccel 1300 +set g_balance_devastator_speedstart 1000 +set g_balance_devastator_switchdelay_drop 0.2 +set g_balance_devastator_switchdelay_raise 0.2 +set g_balance_devastator_weaponreplace "" +set g_balance_devastator_weaponstart 0 +set g_balance_devastator_weaponstartoverride -1 +set g_balance_devastator_weaponthrowable 1 +// }}} +// {{{ #11: Port-O-Launch +set g_balance_porto_primary_animtime 0.3 +set g_balance_porto_primary_lifetime 5 +set g_balance_porto_primary_refire 1.5 +set g_balance_porto_primary_speed 1000 +set g_balance_porto_secondary 1 +set g_balance_porto_secondary_animtime 0.3 +set g_balance_porto_secondary_lifetime 5 +set g_balance_porto_secondary_refire 1.5 +set g_balance_porto_secondary_speed 1000 +set g_balance_porto_switchdelay_drop 0.2 +set g_balance_porto_switchdelay_raise 0.2 +set g_balance_porto_weaponreplace "" +set g_balance_porto_weaponstart 0 +set g_balance_porto_weaponstartoverride -1 +set g_balance_porto_weaponthrowable 1 +// }}} +// {{{ #12: Vaporizer +set g_balance_vaporizer_primary_ammo 10 +set g_balance_vaporizer_primary_animtime 0.3 +set g_balance_vaporizer_primary_damage 150 +set g_balance_vaporizer_primary_force 800 +set g_balance_vaporizer_primary_refire 1 +set g_balance_vaporizer_reload_ammo 0 +set g_balance_vaporizer_reload_time 0 +set g_balance_vaporizer_secondary_ammo 0 +set g_balance_vaporizer_secondary_animtime 0.2 +set g_balance_vaporizer_secondary_damage 25 +set g_balance_vaporizer_secondary_delay 0 +set g_balance_vaporizer_secondary_edgedamage 12.5 +set g_balance_vaporizer_secondary_force 480 +set g_balance_vaporizer_secondary_force_zscale 1 +set g_balance_vaporizer_secondary_lifetime 5 +set g_balance_vaporizer_secondary_radius 70 +set g_balance_vaporizer_secondary_refire 0.7 +set g_balance_vaporizer_secondary_shotangle 0 +set g_balance_vaporizer_secondary_speed 6000 +set g_balance_vaporizer_secondary_spread 0 +set g_balance_vaporizer_switchdelay_drop 0.2 +set g_balance_vaporizer_switchdelay_raise 0.2 +set g_balance_vaporizer_weaponreplace "" +set g_balance_vaporizer_weaponstart 0 +set g_balance_vaporizer_weaponstartoverride -1 +set g_balance_vaporizer_weaponthrowable 1 +// }}} +// {{{ #13: Grappling Hook +set g_balance_hook_primary_ammo 5 +set g_balance_hook_primary_animtime 0.3 +set g_balance_hook_primary_hooked_ammo 5 +set g_balance_hook_primary_hooked_time_free 2 +set g_balance_hook_primary_hooked_time_max 0 +set g_balance_hook_primary_refire 0.2 +set g_balance_hook_secondary_animtime 0.3 +set g_balance_hook_secondary_damage 25 +set g_balance_hook_secondary_damageforcescale 0 +set g_balance_hook_secondary_duration 1.5 +set g_balance_hook_secondary_edgedamage 5 +set g_balance_hook_secondary_force -2000 +set g_balance_hook_secondary_gravity 5 +set g_balance_hook_secondary_health 15 +set g_balance_hook_secondary_lifetime 5 +set g_balance_hook_secondary_power 3 +set g_balance_hook_secondary_radius 500 +set g_balance_hook_secondary_refire 3 +set g_balance_hook_secondary_speed 0 +set g_balance_hook_switchdelay_drop 0.2 +set g_balance_hook_switchdelay_raise 0.2 +set g_balance_hook_weaponreplace "" +set g_balance_hook_weaponstart 0 +set g_balance_hook_weaponstartoverride -1 +set g_balance_hook_weaponthrowable 1 +// }}} +// {{{ #14: Heavy Laser Assault Cannon (MUTATOR WEAPON) +set g_balance_hlac_primary_ammo 1 +set g_balance_hlac_primary_animtime 0.4 +set g_balance_hlac_primary_damage 18 +set g_balance_hlac_primary_edgedamage 9 +set g_balance_hlac_primary_force 90 +set g_balance_hlac_primary_lifetime 5 +set g_balance_hlac_primary_radius 70 +set g_balance_hlac_primary_refire 0.15 +set g_balance_hlac_primary_speed 9000 +set g_balance_hlac_primary_spread_add 0.0045 +set g_balance_hlac_primary_spread_crouchmod 0.25 +set g_balance_hlac_primary_spread_max 0.25 +set g_balance_hlac_primary_spread_min 0.01 +set g_balance_hlac_reload_ammo 0 +set g_balance_hlac_reload_time 2 +set g_balance_hlac_secondary 1 +set g_balance_hlac_secondary_ammo 10 +set g_balance_hlac_secondary_animtime 0.3 +set g_balance_hlac_secondary_damage 15 +set g_balance_hlac_secondary_edgedamage 7.5 +set g_balance_hlac_secondary_force 90 +set g_balance_hlac_secondary_lifetime 5 +set g_balance_hlac_secondary_radius 70 +set g_balance_hlac_secondary_refire 1 +set g_balance_hlac_secondary_shots 6 +set g_balance_hlac_secondary_speed 9000 +set g_balance_hlac_secondary_spread 0.15 +set g_balance_hlac_secondary_spread_crouchmod 0.5 +set g_balance_hlac_switchdelay_drop 0.2 +set g_balance_hlac_switchdelay_raise 0.2 +set g_balance_hlac_weaponreplace "" +set g_balance_hlac_weaponstart 0 +set g_balance_hlac_weaponstartoverride -1 +set g_balance_hlac_weaponthrowable 1 +// }}} +// {{{ #15: @!#%'n Tuba +set g_balance_tuba_animtime 0.05 +set g_balance_tuba_attenuation 0.5 +set g_balance_tuba_damage 5 +set g_balance_tuba_edgedamage 0 +set g_balance_tuba_fadetime 0.25 +set g_balance_tuba_force 40 +set g_balance_tuba_pitchstep 6 +set g_balance_tuba_radius 200 +set g_balance_tuba_refire 0.05 +set g_balance_tuba_switchdelay_drop 0.2 +set g_balance_tuba_switchdelay_raise 0.2 +set g_balance_tuba_volume 1 +set g_balance_tuba_weaponreplace "" +set g_balance_tuba_weaponstart 0 +set g_balance_tuba_weaponstartoverride -1 +set g_balance_tuba_weaponthrowable 1 +// }}} +// {{{ #16: Rifle (MUTATOR WEAPON) +set g_balance_rifle_bursttime 0 +set g_balance_rifle_primary_ammo 10 +set g_balance_rifle_primary_animtime 0.4 +set g_balance_rifle_primary_bullethail 0 +set g_balance_rifle_primary_burstcost 0 +set g_balance_rifle_primary_damage 80 +set g_balance_rifle_primary_force 100 +set g_balance_rifle_primary_refire 1.2 +set g_balance_rifle_primary_shots 1 +set g_balance_rifle_primary_solidpenetration 62.2 +set g_balance_rifle_primary_spread 0 +set g_balance_rifle_primary_tracer 1 +set g_balance_rifle_reload_ammo 80 +set g_balance_rifle_reload_time 2 +set g_balance_rifle_secondary 1 +set g_balance_rifle_secondary_ammo 10 +set g_balance_rifle_secondary_animtime 0.3 +set g_balance_rifle_secondary_bullethail 0 +set g_balance_rifle_secondary_burstcost 0 +set g_balance_rifle_secondary_damage 20 +set g_balance_rifle_secondary_force 50 +set g_balance_rifle_secondary_refire 0.9 +set g_balance_rifle_secondary_reload 0 +set g_balance_rifle_secondary_shots 4 +set g_balance_rifle_secondary_solidpenetration 15.5 +set g_balance_rifle_secondary_spread 0.04 +set g_balance_rifle_secondary_tracer 0 +set g_balance_rifle_switchdelay_drop 0.2 +set g_balance_rifle_switchdelay_raise 0.2 +set g_balance_rifle_weaponreplace "" +set g_balance_rifle_weaponstart 0 +set g_balance_rifle_weaponstartoverride -1 +set g_balance_rifle_weaponthrowable 1 +// }}} +// {{{ #17: Fireball +set g_balance_fireball_primary_animtime 0.4 +set g_balance_fireball_primary_bfgdamage 100 +set g_balance_fireball_primary_bfgforce 0 +set g_balance_fireball_primary_bfgradius 1000 +set g_balance_fireball_primary_damage 200 +set g_balance_fireball_primary_damageforcescale 0 +set g_balance_fireball_primary_edgedamage 50 +set g_balance_fireball_primary_force 600 +set g_balance_fireball_primary_health 0 +set g_balance_fireball_primary_laserburntime 0.5 +set g_balance_fireball_primary_laserdamage 80 +set g_balance_fireball_primary_laseredgedamage 20 +set g_balance_fireball_primary_laserradius 256 +set g_balance_fireball_primary_lifetime 15 +set g_balance_fireball_primary_radius 200 +set g_balance_fireball_primary_refire 2 +set g_balance_fireball_primary_refire2 0 +set g_balance_fireball_primary_speed 1200 +set g_balance_fireball_primary_spread 0 +set g_balance_fireball_secondary_animtime 0.3 +set g_balance_fireball_secondary_damage 40 +set g_balance_fireball_secondary_damageforcescale 4 +set g_balance_fireball_secondary_damagetime 5 +set g_balance_fireball_secondary_laserburntime 0.5 +set g_balance_fireball_secondary_laserdamage 50 +set g_balance_fireball_secondary_laseredgedamage 20 +set g_balance_fireball_secondary_laserradius 110 +set g_balance_fireball_secondary_lifetime 7 +set g_balance_fireball_secondary_refire 1.5 +set g_balance_fireball_secondary_speed 900 +set g_balance_fireball_secondary_speed_up 100 +set g_balance_fireball_secondary_speed_z 0 +set g_balance_fireball_secondary_spread 0 +set g_balance_fireball_switchdelay_drop 0.2 +set g_balance_fireball_switchdelay_raise 0.2 +set g_balance_fireball_weaponreplace "" +set g_balance_fireball_weaponstart 0 +set g_balance_fireball_weaponstartoverride -1 +set g_balance_fireball_weaponthrowable 0 +// }}} +// {{{ #18: T.A.G. Seeker (MUTATOR WEAPON) +set g_balance_seeker_flac_ammo 1 +set g_balance_seeker_flac_animtime 0.1 +set g_balance_seeker_flac_damage 15 +set g_balance_seeker_flac_edgedamage 10 +set g_balance_seeker_flac_force 50 +set g_balance_seeker_flac_lifetime 0.1 +set g_balance_seeker_flac_lifetime_rand 0.05 +set g_balance_seeker_flac_radius 100 +set g_balance_seeker_flac_refire 0.1 +set g_balance_seeker_flac_speed 3000 +set g_balance_seeker_flac_speed_up 1000 +set g_balance_seeker_flac_speed_z 0 +set g_balance_seeker_flac_spread 0.4 +set g_balance_seeker_missile_accel 1400 +set g_balance_seeker_missile_ammo 2 +set g_balance_seeker_missile_animtime 0.2 +set g_balance_seeker_missile_count 3 +set g_balance_seeker_missile_damage 30 +set g_balance_seeker_missile_damageforcescale 4 +set g_balance_seeker_missile_decel 1400 +set g_balance_seeker_missile_delay 0.25 +set g_balance_seeker_missile_edgedamage 10 +set g_balance_seeker_missile_force 150 +set g_balance_seeker_missile_health 5 +set g_balance_seeker_missile_lifetime 15 +set g_balance_seeker_missile_proxy 0 +set g_balance_seeker_missile_proxy_delay 0.2 +set g_balance_seeker_missile_proxy_maxrange 45 +set g_balance_seeker_missile_radius 80 +set g_balance_seeker_missile_refire 0.5 +set g_balance_seeker_missile_smart 1 +set g_balance_seeker_missile_smart_mindist 800 +set g_balance_seeker_missile_smart_trace_max 2500 +set g_balance_seeker_missile_smart_trace_min 1000 +set g_balance_seeker_missile_speed 700 +set g_balance_seeker_missile_speed_max 1300 +set g_balance_seeker_missile_speed_up 300 +set g_balance_seeker_missile_speed_z 0 +set g_balance_seeker_missile_spread 0 +set g_balance_seeker_missile_turnrate 0.65 +set g_balance_seeker_reload_ammo 0 +set g_balance_seeker_reload_time 2 +set g_balance_seeker_switchdelay_drop 0.2 +set g_balance_seeker_switchdelay_raise 0.2 +set g_balance_seeker_tag_ammo 1 +set g_balance_seeker_tag_animtime 0.2 +set g_balance_seeker_tag_damageforcescale 4 +set g_balance_seeker_tag_health 5 +set g_balance_seeker_tag_lifetime 15 +set g_balance_seeker_tag_refire 0.75 +set g_balance_seeker_tag_speed 5000 +set g_balance_seeker_tag_spread 0 +set g_balance_seeker_tag_tracker_lifetime 10 +set g_balance_seeker_type 0 +set g_balance_seeker_weaponreplace "" +set g_balance_seeker_weaponstart 0 +set g_balance_seeker_weaponstartoverride -1 +set g_balance_seeker_weaponthrowable 1 +// }}} +// {{{ #19: Shockwave +set g_balance_shockwave_blast_animtime 0.3 +set g_balance_shockwave_blast_damage 40 +set g_balance_shockwave_blast_distance 1000 +set g_balance_shockwave_blast_edgedamage 0 +set g_balance_shockwave_blast_force 15 +set g_balance_shockwave_blast_force_forwardbias 50 +set g_balance_shockwave_blast_force_zscale 1 +set g_balance_shockwave_blast_jump_damage 20 +set g_balance_shockwave_blast_jump_edgedamage 0 +set g_balance_shockwave_blast_jump_force 100 +set g_balance_shockwave_blast_jump_force_velocitybias 1 +set g_balance_shockwave_blast_jump_force_zscale 1 +set g_balance_shockwave_blast_jump_multiplier_accuracy 0.5 +set g_balance_shockwave_blast_jump_multiplier_distance 0.5 +set g_balance_shockwave_blast_jump_multiplier_min 0 +set g_balance_shockwave_blast_jump_radius 150 +set g_balance_shockwave_blast_multiplier_accuracy 0.45 +set g_balance_shockwave_blast_multiplier_distance 0.2 +set g_balance_shockwave_blast_multiplier_min 0 +set g_balance_shockwave_blast_refire 0.75 +set g_balance_shockwave_blast_splash_damage 15 +set g_balance_shockwave_blast_splash_edgedamage 0 +set g_balance_shockwave_blast_splash_force 100 +set g_balance_shockwave_blast_splash_force_forwardbias 50 +set g_balance_shockwave_blast_splash_multiplier_accuracy 0.5 +set g_balance_shockwave_blast_splash_multiplier_distance 0.5 +set g_balance_shockwave_blast_splash_multiplier_min 0 +set g_balance_shockwave_blast_splash_radius 70 +set g_balance_shockwave_blast_spread_max 120 +set g_balance_shockwave_blast_spread_min 25 +set g_balance_shockwave_melee_animtime 1.3 +set g_balance_shockwave_melee_damage 80 +set g_balance_shockwave_melee_delay 0.25 +set g_balance_shockwave_melee_force 200 +set g_balance_shockwave_melee_multihit 1 +set g_balance_shockwave_melee_no_doubleslap 1 +set g_balance_shockwave_melee_nonplayerdamage 40 +set g_balance_shockwave_melee_range 120 +set g_balance_shockwave_melee_refire 1.25 +set g_balance_shockwave_melee_swing_side 120 +set g_balance_shockwave_melee_swing_up 30 +set g_balance_shockwave_melee_time 0.15 +set g_balance_shockwave_melee_traces 10 +set g_balance_shockwave_switchdelay_drop 0.2 +set g_balance_shockwave_switchdelay_raise 0.2 +set g_balance_shockwave_weaponreplace "" +set g_balance_shockwave_weaponstart 0 +set g_balance_shockwave_weaponstartoverride -1 +set g_balance_shockwave_weaponthrowable 0 +// }}} +// {{{ #20: Arc +set g_balance_arc_beam_ammo 6 +set g_balance_arc_beam_animtime 0.1 +set g_balance_arc_beam_botaimlifetime 0 +set g_balance_arc_beam_botaimspeed 0 +set g_balance_arc_beam_damage 100 +set g_balance_arc_beam_degreespersegment 1 +set g_balance_arc_beam_distancepersegment 0 +set g_balance_arc_beam_falloff_halflifedist 0 +set g_balance_arc_beam_falloff_maxdist 0 +set g_balance_arc_beam_falloff_mindist 0 +set g_balance_arc_beam_force 600 +set g_balance_arc_beam_healing_amax 0 +set g_balance_arc_beam_healing_aps 50 +set g_balance_arc_beam_healing_hmax 150 +set g_balance_arc_beam_healing_hps 50 +set g_balance_arc_beam_heat 0 +set g_balance_arc_beam_maxangle 10 +set g_balance_arc_beam_nonplayerdamage 80 +set g_balance_arc_beam_range 1000 +set g_balance_arc_beam_refire 0.25 +set g_balance_arc_beam_returnspeed 8 +set g_balance_arc_beam_tightness 0.5 +set g_balance_arc_bolt 0 +set g_balance_arc_bolt_ammo 1 +set g_balance_arc_bolt_damage 25 +set g_balance_arc_bolt_damageforcescale 0 +set g_balance_arc_bolt_edgedamage 12.5 +set g_balance_arc_bolt_force 120 +set g_balance_arc_bolt_health 15 +set g_balance_arc_bolt_lifetime 5 +set g_balance_arc_bolt_radius 65 +set g_balance_arc_bolt_refire 0.16667 +set g_balance_arc_bolt_speed 2300 +set g_balance_arc_bolt_spread 0 +set g_balance_arc_burst_ammo 15 +set g_balance_arc_burst_damage 250 +set g_balance_arc_burst_healing_aps 100 +set g_balance_arc_burst_healing_hps 100 +set g_balance_arc_burst_heat 5 +set g_balance_arc_cooldown 2.5 +set g_balance_arc_cooldown_release 0 +set g_balance_arc_overheat_max 5 +set g_balance_arc_overheat_min 3 +set g_balance_arc_switchdelay_drop 0.2 +set g_balance_arc_switchdelay_raise 0.2 +set g_balance_arc_weaponreplace "" +set g_balance_arc_weaponstart 0 +set g_balance_arc_weaponstartoverride -1 +set g_balance_arc_weaponthrowable 1 +// }}} +// {{{ #21: Overkill Heavy Machine Gun (MUTATOR WEAPON) +set g_balance_okhmg_primary_ammo 1 +set g_balance_okhmg_primary_damage 30 +set g_balance_okhmg_primary_force 10 +set g_balance_okhmg_primary_refire 0.05 +set g_balance_okhmg_primary_solidpenetration 127 +set g_balance_okhmg_primary_spread_add 0.005 +set g_balance_okhmg_primary_spread_max 0.06 +set g_balance_okhmg_primary_spread_min 0.01 +set g_balance_okhmg_reload_ammo 120 +set g_balance_okhmg_reload_time 1 +set g_balance_okhmg_secondary_ammo 0 +set g_balance_okhmg_secondary_animtime 0.2 +set g_balance_okhmg_secondary_damage 25 +set g_balance_okhmg_secondary_delay 0 +set g_balance_okhmg_secondary_edgedamage 12.5 +set g_balance_okhmg_secondary_force 360 +set g_balance_okhmg_secondary_force_zscale 1 +set g_balance_okhmg_secondary_lifetime 5 +set g_balance_okhmg_secondary_radius 70 +set g_balance_okhmg_secondary_refire 0.7 +set g_balance_okhmg_secondary_refire_type 1 +set g_balance_okhmg_secondary_shotangle 0 +set g_balance_okhmg_secondary_speed 6000 +set g_balance_okhmg_secondary_spread 0 +set g_balance_okhmg_switchdelay_drop 0.2 +set g_balance_okhmg_switchdelay_raise 0.2 +set g_balance_okhmg_weaponreplace "" +set g_balance_okhmg_weaponstart 0 +set g_balance_okhmg_weaponstartoverride 0 +set g_balance_okhmg_weaponthrowable 0 +// }}} +// {{{ #22: Overkill MachineGun (MUTATOR WEAPON) +set g_balance_okmachinegun_primary_ammo 1 +set g_balance_okmachinegun_primary_damage 25 +set g_balance_okmachinegun_primary_force 5 +set g_balance_okmachinegun_primary_refire 0.1 +set g_balance_okmachinegun_primary_solidpenetration 100 +set g_balance_okmachinegun_primary_spread_add 0.012 +set g_balance_okmachinegun_primary_spread_max 0.05 +set g_balance_okmachinegun_primary_spread_min 0 +set g_balance_okmachinegun_reload_ammo 30 +set g_balance_okmachinegun_reload_time 1.5 +set g_balance_okmachinegun_secondary_animtime 0.2 +set g_balance_okmachinegun_secondary_damage 25 +set g_balance_okmachinegun_secondary_delay 0 +set g_balance_okmachinegun_secondary_edgedamage 12.5 +set g_balance_okmachinegun_secondary_force 360 +set g_balance_okmachinegun_secondary_force_zscale 1 +set g_balance_okmachinegun_secondary_lifetime 5 +set g_balance_okmachinegun_secondary_radius 70 +set g_balance_okmachinegun_secondary_refire 0.7 +set g_balance_okmachinegun_secondary_refire_type 1 +set g_balance_okmachinegun_secondary_shotangle 0 +set g_balance_okmachinegun_secondary_speed 6000 +set g_balance_okmachinegun_secondary_spread 0 +set g_balance_okmachinegun_switchdelay_drop 0.2 +set g_balance_okmachinegun_switchdelay_raise 0.2 +set g_balance_okmachinegun_weaponreplace "" +set g_balance_okmachinegun_weaponstart 0 +set g_balance_okmachinegun_weaponstartoverride -1 +set g_balance_okmachinegun_weaponthrowable 1 +// }}} +// {{{ #23: Overkill Nex (MUTATOR WEAPON) +set g_balance_oknex_charge 0 +set g_balance_oknex_charge_animlimit 0.5 +set g_balance_oknex_charge_limit 1 +set g_balance_oknex_charge_maxspeed 800 +set g_balance_oknex_charge_mindmg 40 +set g_balance_oknex_charge_minspeed 400 +set g_balance_oknex_charge_rate 0.6 +set g_balance_oknex_charge_rot_pause 0 +set g_balance_oknex_charge_rot_rate 0 +set g_balance_oknex_charge_shot_multiplier 0 +set g_balance_oknex_charge_start 0.5 +set g_balance_oknex_charge_velocity_rate 0 +set g_balance_oknex_primary_ammo 10 +set g_balance_oknex_primary_animtime 0.65 +set g_balance_oknex_primary_damage 100 +set g_balance_oknex_primary_damagefalloff_forcehalflife 0 +set g_balance_oknex_primary_damagefalloff_halflife 0 +set g_balance_oknex_primary_damagefalloff_maxdist 0 +set g_balance_oknex_primary_damagefalloff_mindist 0 +set g_balance_oknex_primary_force 500 +set g_balance_oknex_primary_refire 1 +set g_balance_oknex_reload_ammo 50 +set g_balance_oknex_reload_time 2 +set g_balance_oknex_secondary 2 +set g_balance_oknex_secondary_ammo 0 +set g_balance_oknex_secondary_animtime 0.2 +set g_balance_oknex_secondary_chargepool 0 +set g_balance_oknex_secondary_chargepool_pause_regen 1 +set g_balance_oknex_secondary_chargepool_regen 0.15 +set g_balance_oknex_secondary_damage 25 +set g_balance_oknex_secondary_damagefalloff_forcehalflife 0 +set g_balance_oknex_secondary_damagefalloff_halflife 0 +set g_balance_oknex_secondary_damagefalloff_maxdist 0 +set g_balance_oknex_secondary_damagefalloff_mindist 0 +set g_balance_oknex_secondary_delay 0 +set g_balance_oknex_secondary_edgedamage 12.5 +set g_balance_oknex_secondary_force 360 +set g_balance_oknex_secondary_force_zscale 1 +set g_balance_oknex_secondary_lifetime 5 +set g_balance_oknex_secondary_radius 70 +set g_balance_oknex_secondary_refire 0.7 +set g_balance_oknex_secondary_refire_type 1 +set g_balance_oknex_secondary_shotangle 0 +set g_balance_oknex_secondary_speed 6000 +set g_balance_oknex_secondary_spread 0 +set g_balance_oknex_switchdelay_drop 0.2 +set g_balance_oknex_switchdelay_raise 0.2 +set g_balance_oknex_weaponreplace "" +set g_balance_oknex_weaponstart 0 +set g_balance_oknex_weaponstartoverride -1 +set g_balance_oknex_weaponthrowable 1 +// }}} +// {{{ #24: Overkill Rocket Propelled Chainsaw (MUTATOR WEAPON) +set g_balance_okrpc_primary_ammo 10 +set g_balance_okrpc_primary_animtime 1 +set g_balance_okrpc_primary_damage 150 +set g_balance_okrpc_primary_damage2 500 +set g_balance_okrpc_primary_damageforcescale 2 +set g_balance_okrpc_primary_edgedamage 50 +set g_balance_okrpc_primary_force 400 +set g_balance_okrpc_primary_health 25 +set g_balance_okrpc_primary_lifetime 30 +set g_balance_okrpc_primary_radius 300 +set g_balance_okrpc_primary_refire 1 +set g_balance_okrpc_primary_speed 2500 +set g_balance_okrpc_primary_speedaccel 5000 +set g_balance_okrpc_reload_ammo 10 +set g_balance_okrpc_reload_time 1 +set g_balance_okrpc_secondary_ammo 0 +set g_balance_okrpc_secondary_animtime 0.2 +set g_balance_okrpc_secondary_damage 25 +set g_balance_okrpc_secondary_delay 0 +set g_balance_okrpc_secondary_edgedamage 12.5 +set g_balance_okrpc_secondary_force 360 +set g_balance_okrpc_secondary_force_zscale 1 +set g_balance_okrpc_secondary_lifetime 5 +set g_balance_okrpc_secondary_radius 70 +set g_balance_okrpc_secondary_refire 0.7 +set g_balance_okrpc_secondary_refire_type 1 +set g_balance_okrpc_secondary_shotangle 0 +set g_balance_okrpc_secondary_speed 6000 +set g_balance_okrpc_secondary_spread 0 +set g_balance_okrpc_switchdelay_drop 0.2 +set g_balance_okrpc_switchdelay_raise 0.2 +set g_balance_okrpc_weaponreplace "" +set g_balance_okrpc_weaponstart 0 +set g_balance_okrpc_weaponstartoverride 0 +set g_balance_okrpc_weaponthrowable 0 +// }}} +// {{{ #25: Overkill Shotgun (MUTATOR WEAPON) +set g_balance_okshotgun_primary_ammo 3 +set g_balance_okshotgun_primary_animtime 0.65 +set g_balance_okshotgun_primary_bot_range 512 +set g_balance_okshotgun_primary_bullets 10 +set g_balance_okshotgun_primary_damage 17 +set g_balance_okshotgun_primary_force 80 +set g_balance_okshotgun_primary_refire 0.75 +set g_balance_okshotgun_primary_solidpenetration 3.8 +set g_balance_okshotgun_primary_spread 0.07 +set g_balance_okshotgun_reload_ammo 24 +set g_balance_okshotgun_reload_time 2 +set g_balance_okshotgun_secondary_animtime 0.2 +set g_balance_okshotgun_secondary_damage 25 +set g_balance_okshotgun_secondary_delay 0 +set g_balance_okshotgun_secondary_edgedamage 12.5 +set g_balance_okshotgun_secondary_force 360 +set g_balance_okshotgun_secondary_force_zscale 1 +set g_balance_okshotgun_secondary_lifetime 5 +set g_balance_okshotgun_secondary_radius 70 +set g_balance_okshotgun_secondary_refire 0.7 +set g_balance_okshotgun_secondary_refire_type 1 +set g_balance_okshotgun_secondary_shotangle 0 +set g_balance_okshotgun_secondary_speed 6000 +set g_balance_okshotgun_secondary_spread 0 +set g_balance_okshotgun_switchdelay_drop 0.2 +set g_balance_okshotgun_switchdelay_raise 0.2 +set g_balance_okshotgun_weaponreplace "" +set g_balance_okshotgun_weaponstart 0 +set g_balance_okshotgun_weaponstartoverride -1 +set g_balance_okshotgun_weaponthrowable 1 +// }}} diff --git a/bal-wep-xdf.cfg b/bal-wep-xdf.cfg index 149895e66..1fe4044ca 100644 --- a/bal-wep-xdf.cfg +++ b/bal-wep-xdf.cfg @@ -3,8 +3,8 @@ set g_balance_blaster_primary_animtime 0.2 set g_balance_blaster_primary_damage 20 set g_balance_blaster_primary_delay 0 set g_balance_blaster_primary_edgedamage 10 -set g_balance_blaster_primary_force 300 -set g_balance_blaster_primary_force_zscale 1.25 +set g_balance_blaster_primary_force 375 +set g_balance_blaster_primary_force_zscale 1 set g_balance_blaster_primary_lifetime 5 set g_balance_blaster_primary_radius 60 set g_balance_blaster_primary_refire 0.7 @@ -16,8 +16,8 @@ set g_balance_blaster_secondary_animtime 0.2 set g_balance_blaster_secondary_damage 25 set g_balance_blaster_secondary_delay 0 set g_balance_blaster_secondary_edgedamage 12.5 -set g_balance_blaster_secondary_force 300 -set g_balance_blaster_secondary_force_zscale 1.2 +set g_balance_blaster_secondary_force 360 +set g_balance_blaster_secondary_force_zscale 1 set g_balance_blaster_secondary_lifetime 5 set g_balance_blaster_secondary_radius 70 set g_balance_blaster_secondary_refire 0.7 @@ -401,9 +401,10 @@ set g_balance_devastator_reload_time 2 set g_balance_devastator_remote_damage 70 set g_balance_devastator_remote_edgedamage 35 set g_balance_devastator_remote_force 350 +set g_balance_devastator_remote_jump 0 set g_balance_devastator_remote_jump_damage 70 set g_balance_devastator_remote_jump_force 450 -set g_balance_devastator_remote_jump_radius 0 +set g_balance_devastator_remote_jump_radius 100 set g_balance_devastator_remote_jump_velocity_z_add 0 set g_balance_devastator_remote_jump_velocity_z_max 1500 set g_balance_devastator_remote_jump_velocity_z_min 400 @@ -448,8 +449,8 @@ set g_balance_vaporizer_secondary_animtime 0.2 set g_balance_vaporizer_secondary_damage 25 set g_balance_vaporizer_secondary_delay 0 set g_balance_vaporizer_secondary_edgedamage 12.5 -set g_balance_vaporizer_secondary_force 400 -set g_balance_vaporizer_secondary_force_zscale 1.2 +set g_balance_vaporizer_secondary_force 480 +set g_balance_vaporizer_secondary_force_zscale 1 set g_balance_vaporizer_secondary_lifetime 5 set g_balance_vaporizer_secondary_radius 70 set g_balance_vaporizer_secondary_refire 0.7 @@ -787,7 +788,7 @@ set g_balance_okhmg_primary_ammo 1 set g_balance_okhmg_primary_damage 30 set g_balance_okhmg_primary_force 10 set g_balance_okhmg_primary_refire 0.05 -set g_balance_okhmg_primary_solidpenetration 32 +set g_balance_okhmg_primary_solidpenetration 127 set g_balance_okhmg_primary_spread_add 0.005 set g_balance_okhmg_primary_spread_max 0.06 set g_balance_okhmg_primary_spread_min 0.01 @@ -798,7 +799,7 @@ set g_balance_okhmg_secondary_animtime 0.2 set g_balance_okhmg_secondary_damage 25 set g_balance_okhmg_secondary_delay 0 set g_balance_okhmg_secondary_edgedamage 12.5 -set g_balance_okhmg_secondary_force 300 +set g_balance_okhmg_secondary_force 360 set g_balance_okhmg_secondary_force_zscale 1 set g_balance_okhmg_secondary_lifetime 5 set g_balance_okhmg_secondary_radius 70 @@ -816,25 +817,25 @@ set g_balance_okhmg_weaponthrowable 0 // }}} // {{{ #22: Overkill MachineGun (MUTATOR WEAPON) set g_balance_okmachinegun_primary_ammo 1 -set g_balance_okmachinegun_primary_damage 10 -set g_balance_okmachinegun_primary_force 3 +set g_balance_okmachinegun_primary_damage 25 +set g_balance_okmachinegun_primary_force 5 set g_balance_okmachinegun_primary_refire 0.1 -set g_balance_okmachinegun_primary_solidpenetration 13.1 +set g_balance_okmachinegun_primary_solidpenetration 100 set g_balance_okmachinegun_primary_spread_add 0.012 set g_balance_okmachinegun_primary_spread_max 0.05 -set g_balance_okmachinegun_primary_spread_min 0.02 -set g_balance_okmachinegun_reload_ammo 60 -set g_balance_okmachinegun_reload_time 2 +set g_balance_okmachinegun_primary_spread_min 0 +set g_balance_okmachinegun_reload_ammo 30 +set g_balance_okmachinegun_reload_time 1.5 set g_balance_okmachinegun_secondary_animtime 0.2 -set g_balance_okmachinegun_secondary_damage 20 +set g_balance_okmachinegun_secondary_damage 25 set g_balance_okmachinegun_secondary_delay 0 -set g_balance_okmachinegun_secondary_edgedamage 10 -set g_balance_okmachinegun_secondary_force 300 +set g_balance_okmachinegun_secondary_edgedamage 12.5 +set g_balance_okmachinegun_secondary_force 360 set g_balance_okmachinegun_secondary_force_zscale 1 set g_balance_okmachinegun_secondary_lifetime 5 -set g_balance_okmachinegun_secondary_radius 60 +set g_balance_okmachinegun_secondary_radius 70 set g_balance_okmachinegun_secondary_refire 0.7 -set g_balance_okmachinegun_secondary_refire_type 0 +set g_balance_okmachinegun_secondary_refire_type 1 set g_balance_okmachinegun_secondary_shotangle 0 set g_balance_okmachinegun_secondary_speed 6000 set g_balance_okmachinegun_secondary_spread 0 @@ -846,7 +847,7 @@ set g_balance_okmachinegun_weaponstartoverride -1 set g_balance_okmachinegun_weaponthrowable 1 // }}} // {{{ #23: Overkill Nex (MUTATOR WEAPON) -set g_balance_oknex_charge 1 +set g_balance_oknex_charge 0 set g_balance_oknex_charge_animlimit 0.5 set g_balance_oknex_charge_limit 1 set g_balance_oknex_charge_maxspeed 800 @@ -858,36 +859,36 @@ set g_balance_oknex_charge_rot_rate 0 set g_balance_oknex_charge_shot_multiplier 0 set g_balance_oknex_charge_start 0.5 set g_balance_oknex_charge_velocity_rate 0 -set g_balance_oknex_primary_ammo 6 -set g_balance_oknex_primary_animtime 0.4 -set g_balance_oknex_primary_damage 80 +set g_balance_oknex_primary_ammo 10 +set g_balance_oknex_primary_animtime 0.65 +set g_balance_oknex_primary_damage 100 set g_balance_oknex_primary_damagefalloff_forcehalflife 0 set g_balance_oknex_primary_damagefalloff_halflife 0 set g_balance_oknex_primary_damagefalloff_maxdist 0 set g_balance_oknex_primary_damagefalloff_mindist 0 -set g_balance_oknex_primary_force 400 -set g_balance_oknex_primary_refire 1.5 -set g_balance_oknex_reload_ammo 0 +set g_balance_oknex_primary_force 500 +set g_balance_oknex_primary_refire 1 +set g_balance_oknex_reload_ammo 50 set g_balance_oknex_reload_time 2 -set g_balance_oknex_secondary 0 -set g_balance_oknex_secondary_ammo 2 -set g_balance_oknex_secondary_animtime 0 +set g_balance_oknex_secondary 2 +set g_balance_oknex_secondary_ammo 0 +set g_balance_oknex_secondary_animtime 0.2 set g_balance_oknex_secondary_chargepool 0 set g_balance_oknex_secondary_chargepool_pause_regen 1 set g_balance_oknex_secondary_chargepool_regen 0.15 -set g_balance_oknex_secondary_damage 0 +set g_balance_oknex_secondary_damage 25 set g_balance_oknex_secondary_damagefalloff_forcehalflife 0 set g_balance_oknex_secondary_damagefalloff_halflife 0 set g_balance_oknex_secondary_damagefalloff_maxdist 0 set g_balance_oknex_secondary_damagefalloff_mindist 0 set g_balance_oknex_secondary_delay 0 -set g_balance_oknex_secondary_edgedamage 10 -set g_balance_oknex_secondary_force 0 +set g_balance_oknex_secondary_edgedamage 12.5 +set g_balance_oknex_secondary_force 360 set g_balance_oknex_secondary_force_zscale 1 set g_balance_oknex_secondary_lifetime 5 -set g_balance_oknex_secondary_radius 60 -set g_balance_oknex_secondary_refire 0 -set g_balance_oknex_secondary_refire_type 0 +set g_balance_oknex_secondary_radius 70 +set g_balance_oknex_secondary_refire 0.7 +set g_balance_oknex_secondary_refire_type 1 set g_balance_oknex_secondary_shotangle 0 set g_balance_oknex_secondary_speed 6000 set g_balance_oknex_secondary_spread 0 @@ -919,7 +920,7 @@ set g_balance_okrpc_secondary_animtime 0.2 set g_balance_okrpc_secondary_damage 25 set g_balance_okrpc_secondary_delay 0 set g_balance_okrpc_secondary_edgedamage 12.5 -set g_balance_okrpc_secondary_force 300 +set g_balance_okrpc_secondary_force 360 set g_balance_okrpc_secondary_force_zscale 1 set g_balance_okrpc_secondary_lifetime 5 set g_balance_okrpc_secondary_radius 70 @@ -936,27 +937,27 @@ set g_balance_okrpc_weaponstartoverride 0 set g_balance_okrpc_weaponthrowable 0 // }}} // {{{ #25: Overkill Shotgun (MUTATOR WEAPON) -set g_balance_okshotgun_primary_ammo 1 -set g_balance_okshotgun_primary_animtime 0.2 +set g_balance_okshotgun_primary_ammo 3 +set g_balance_okshotgun_primary_animtime 0.65 set g_balance_okshotgun_primary_bot_range 512 -set g_balance_okshotgun_primary_bullets 12 -set g_balance_okshotgun_primary_damage 4 -set g_balance_okshotgun_primary_force 15 +set g_balance_okshotgun_primary_bullets 10 +set g_balance_okshotgun_primary_damage 17 +set g_balance_okshotgun_primary_force 80 set g_balance_okshotgun_primary_refire 0.75 set g_balance_okshotgun_primary_solidpenetration 3.8 -set g_balance_okshotgun_primary_spread 0.12 -set g_balance_okshotgun_reload_ammo 0 +set g_balance_okshotgun_primary_spread 0.07 +set g_balance_okshotgun_reload_ammo 24 set g_balance_okshotgun_reload_time 2 set g_balance_okshotgun_secondary_animtime 0.2 -set g_balance_okshotgun_secondary_damage 20 +set g_balance_okshotgun_secondary_damage 25 set g_balance_okshotgun_secondary_delay 0 -set g_balance_okshotgun_secondary_edgedamage 10 -set g_balance_okshotgun_secondary_force 300 +set g_balance_okshotgun_secondary_edgedamage 12.5 +set g_balance_okshotgun_secondary_force 360 set g_balance_okshotgun_secondary_force_zscale 1 set g_balance_okshotgun_secondary_lifetime 5 -set g_balance_okshotgun_secondary_radius 60 +set g_balance_okshotgun_secondary_radius 70 set g_balance_okshotgun_secondary_refire 0.7 -set g_balance_okshotgun_secondary_refire_type 0 +set g_balance_okshotgun_secondary_refire_type 1 set g_balance_okshotgun_secondary_shotangle 0 set g_balance_okshotgun_secondary_speed 6000 set g_balance_okshotgun_secondary_spread 0 diff --git a/bal-wep-xonotic.cfg b/bal-wep-xonotic.cfg index 7d552e56b..52d63dfa2 100644 --- a/bal-wep-xonotic.cfg +++ b/bal-wep-xonotic.cfg @@ -3,8 +3,8 @@ set g_balance_blaster_primary_animtime 0.2 set g_balance_blaster_primary_damage 20 set g_balance_blaster_primary_delay 0 set g_balance_blaster_primary_edgedamage 10 -set g_balance_blaster_primary_force 300 -set g_balance_blaster_primary_force_zscale 1.25 +set g_balance_blaster_primary_force 375 +set g_balance_blaster_primary_force_zscale 1 set g_balance_blaster_primary_lifetime 5 set g_balance_blaster_primary_radius 60 set g_balance_blaster_primary_refire 0.7 @@ -16,8 +16,8 @@ set g_balance_blaster_secondary_animtime 0.2 set g_balance_blaster_secondary_damage 25 set g_balance_blaster_secondary_delay 0 set g_balance_blaster_secondary_edgedamage 12.5 -set g_balance_blaster_secondary_force 300 -set g_balance_blaster_secondary_force_zscale 1.2 +set g_balance_blaster_secondary_force 360 +set g_balance_blaster_secondary_force_zscale 1 set g_balance_blaster_secondary_lifetime 5 set g_balance_blaster_secondary_radius 70 set g_balance_blaster_secondary_refire 0.7 @@ -401,9 +401,10 @@ set g_balance_devastator_reload_time 2 set g_balance_devastator_remote_damage 70 set g_balance_devastator_remote_edgedamage 35 set g_balance_devastator_remote_force 300 +set g_balance_devastator_remote_jump 0 set g_balance_devastator_remote_jump_damage 70 set g_balance_devastator_remote_jump_force 450 -set g_balance_devastator_remote_jump_radius 0 +set g_balance_devastator_remote_jump_radius 100 set g_balance_devastator_remote_jump_velocity_z_add 0 set g_balance_devastator_remote_jump_velocity_z_max 1500 set g_balance_devastator_remote_jump_velocity_z_min 400 @@ -448,8 +449,8 @@ set g_balance_vaporizer_secondary_animtime 0.2 set g_balance_vaporizer_secondary_damage 25 set g_balance_vaporizer_secondary_delay 0 set g_balance_vaporizer_secondary_edgedamage 12.5 -set g_balance_vaporizer_secondary_force 400 -set g_balance_vaporizer_secondary_force_zscale 1.2 +set g_balance_vaporizer_secondary_force 480 +set g_balance_vaporizer_secondary_force_zscale 1 set g_balance_vaporizer_secondary_lifetime 5 set g_balance_vaporizer_secondary_radius 70 set g_balance_vaporizer_secondary_refire 0.7 diff --git a/bal-wep-xpm.cfg b/bal-wep-xpm.cfg index 14a8159c0..91743112a 100644 --- a/bal-wep-xpm.cfg +++ b/bal-wep-xpm.cfg @@ -3,8 +3,8 @@ set g_balance_blaster_primary_animtime 0.2 set g_balance_blaster_primary_damage 20 set g_balance_blaster_primary_delay 0 set g_balance_blaster_primary_edgedamage 10 -set g_balance_blaster_primary_force 300 -set g_balance_blaster_primary_force_zscale 1.25 +set g_balance_blaster_primary_force 375 +set g_balance_blaster_primary_force_zscale 1 set g_balance_blaster_primary_lifetime 5 set g_balance_blaster_primary_radius 60 set g_balance_blaster_primary_refire 0.7 @@ -16,8 +16,8 @@ set g_balance_blaster_secondary_animtime 0.2 set g_balance_blaster_secondary_damage 25 set g_balance_blaster_secondary_delay 0 set g_balance_blaster_secondary_edgedamage 12.5 -set g_balance_blaster_secondary_force 300 -set g_balance_blaster_secondary_force_zscale 1.2 +set g_balance_blaster_secondary_force 360 +set g_balance_blaster_secondary_force_zscale 1 set g_balance_blaster_secondary_lifetime 5 set g_balance_blaster_secondary_radius 70 set g_balance_blaster_secondary_refire 0.7 @@ -401,9 +401,10 @@ set g_balance_devastator_reload_time 2 set g_balance_devastator_remote_damage 70 set g_balance_devastator_remote_edgedamage 35 set g_balance_devastator_remote_force 300 +set g_balance_devastator_remote_jump 0 set g_balance_devastator_remote_jump_damage 70 set g_balance_devastator_remote_jump_force 450 -set g_balance_devastator_remote_jump_radius 0 +set g_balance_devastator_remote_jump_radius 100 set g_balance_devastator_remote_jump_velocity_z_add 0 set g_balance_devastator_remote_jump_velocity_z_max 1500 set g_balance_devastator_remote_jump_velocity_z_min 400 @@ -448,8 +449,8 @@ set g_balance_vaporizer_secondary_animtime 0.2 set g_balance_vaporizer_secondary_damage 25 set g_balance_vaporizer_secondary_delay 0 set g_balance_vaporizer_secondary_edgedamage 12.5 -set g_balance_vaporizer_secondary_force 400 -set g_balance_vaporizer_secondary_force_zscale 1.2 +set g_balance_vaporizer_secondary_force 480 +set g_balance_vaporizer_secondary_force_zscale 1 set g_balance_vaporizer_secondary_lifetime 5 set g_balance_vaporizer_secondary_radius 70 set g_balance_vaporizer_secondary_refire 0.7 @@ -787,7 +788,7 @@ set g_balance_okhmg_primary_ammo 1 set g_balance_okhmg_primary_damage 30 set g_balance_okhmg_primary_force 10 set g_balance_okhmg_primary_refire 0.05 -set g_balance_okhmg_primary_solidpenetration 32 +set g_balance_okhmg_primary_solidpenetration 127 set g_balance_okhmg_primary_spread_add 0.005 set g_balance_okhmg_primary_spread_max 0.06 set g_balance_okhmg_primary_spread_min 0.01 @@ -798,7 +799,7 @@ set g_balance_okhmg_secondary_animtime 0.2 set g_balance_okhmg_secondary_damage 25 set g_balance_okhmg_secondary_delay 0 set g_balance_okhmg_secondary_edgedamage 12.5 -set g_balance_okhmg_secondary_force 300 +set g_balance_okhmg_secondary_force 360 set g_balance_okhmg_secondary_force_zscale 1 set g_balance_okhmg_secondary_lifetime 5 set g_balance_okhmg_secondary_radius 70 @@ -816,25 +817,25 @@ set g_balance_okhmg_weaponthrowable 0 // }}} // {{{ #22: Overkill MachineGun (MUTATOR WEAPON) set g_balance_okmachinegun_primary_ammo 1 -set g_balance_okmachinegun_primary_damage 10 -set g_balance_okmachinegun_primary_force 3 +set g_balance_okmachinegun_primary_damage 25 +set g_balance_okmachinegun_primary_force 5 set g_balance_okmachinegun_primary_refire 0.1 -set g_balance_okmachinegun_primary_solidpenetration 13.1 +set g_balance_okmachinegun_primary_solidpenetration 100 set g_balance_okmachinegun_primary_spread_add 0.012 set g_balance_okmachinegun_primary_spread_max 0.05 -set g_balance_okmachinegun_primary_spread_min 0.02 -set g_balance_okmachinegun_reload_ammo 60 -set g_balance_okmachinegun_reload_time 2 +set g_balance_okmachinegun_primary_spread_min 0 +set g_balance_okmachinegun_reload_ammo 30 +set g_balance_okmachinegun_reload_time 1.5 set g_balance_okmachinegun_secondary_animtime 0.2 -set g_balance_okmachinegun_secondary_damage 20 +set g_balance_okmachinegun_secondary_damage 25 set g_balance_okmachinegun_secondary_delay 0 -set g_balance_okmachinegun_secondary_edgedamage 10 -set g_balance_okmachinegun_secondary_force 300 +set g_balance_okmachinegun_secondary_edgedamage 12.5 +set g_balance_okmachinegun_secondary_force 360 set g_balance_okmachinegun_secondary_force_zscale 1 set g_balance_okmachinegun_secondary_lifetime 5 -set g_balance_okmachinegun_secondary_radius 60 +set g_balance_okmachinegun_secondary_radius 70 set g_balance_okmachinegun_secondary_refire 0.7 -set g_balance_okmachinegun_secondary_refire_type 0 +set g_balance_okmachinegun_secondary_refire_type 1 set g_balance_okmachinegun_secondary_shotangle 0 set g_balance_okmachinegun_secondary_speed 6000 set g_balance_okmachinegun_secondary_spread 0 @@ -846,7 +847,7 @@ set g_balance_okmachinegun_weaponstartoverride -1 set g_balance_okmachinegun_weaponthrowable 1 // }}} // {{{ #23: Overkill Nex (MUTATOR WEAPON) -set g_balance_oknex_charge 1 +set g_balance_oknex_charge 0 set g_balance_oknex_charge_animlimit 0.5 set g_balance_oknex_charge_limit 1 set g_balance_oknex_charge_maxspeed 800 @@ -858,36 +859,36 @@ set g_balance_oknex_charge_rot_rate 0 set g_balance_oknex_charge_shot_multiplier 0 set g_balance_oknex_charge_start 0.5 set g_balance_oknex_charge_velocity_rate 0 -set g_balance_oknex_primary_ammo 6 -set g_balance_oknex_primary_animtime 0.4 -set g_balance_oknex_primary_damage 80 +set g_balance_oknex_primary_ammo 10 +set g_balance_oknex_primary_animtime 0.65 +set g_balance_oknex_primary_damage 100 set g_balance_oknex_primary_damagefalloff_forcehalflife 0 set g_balance_oknex_primary_damagefalloff_halflife 0 set g_balance_oknex_primary_damagefalloff_maxdist 0 set g_balance_oknex_primary_damagefalloff_mindist 0 -set g_balance_oknex_primary_force 400 -set g_balance_oknex_primary_refire 1.5 -set g_balance_oknex_reload_ammo 0 +set g_balance_oknex_primary_force 500 +set g_balance_oknex_primary_refire 1 +set g_balance_oknex_reload_ammo 50 set g_balance_oknex_reload_time 2 -set g_balance_oknex_secondary 0 -set g_balance_oknex_secondary_ammo 2 -set g_balance_oknex_secondary_animtime 0 +set g_balance_oknex_secondary 2 +set g_balance_oknex_secondary_ammo 0 +set g_balance_oknex_secondary_animtime 0.2 set g_balance_oknex_secondary_chargepool 0 set g_balance_oknex_secondary_chargepool_pause_regen 1 set g_balance_oknex_secondary_chargepool_regen 0.15 -set g_balance_oknex_secondary_damage 0 +set g_balance_oknex_secondary_damage 25 set g_balance_oknex_secondary_damagefalloff_forcehalflife 0 set g_balance_oknex_secondary_damagefalloff_halflife 0 set g_balance_oknex_secondary_damagefalloff_maxdist 0 set g_balance_oknex_secondary_damagefalloff_mindist 0 set g_balance_oknex_secondary_delay 0 -set g_balance_oknex_secondary_edgedamage 10 -set g_balance_oknex_secondary_force 0 +set g_balance_oknex_secondary_edgedamage 12.5 +set g_balance_oknex_secondary_force 360 set g_balance_oknex_secondary_force_zscale 1 set g_balance_oknex_secondary_lifetime 5 -set g_balance_oknex_secondary_radius 60 -set g_balance_oknex_secondary_refire 0 -set g_balance_oknex_secondary_refire_type 0 +set g_balance_oknex_secondary_radius 70 +set g_balance_oknex_secondary_refire 0.7 +set g_balance_oknex_secondary_refire_type 1 set g_balance_oknex_secondary_shotangle 0 set g_balance_oknex_secondary_speed 6000 set g_balance_oknex_secondary_spread 0 @@ -919,7 +920,7 @@ set g_balance_okrpc_secondary_animtime 0.2 set g_balance_okrpc_secondary_damage 25 set g_balance_okrpc_secondary_delay 0 set g_balance_okrpc_secondary_edgedamage 12.5 -set g_balance_okrpc_secondary_force 300 +set g_balance_okrpc_secondary_force 360 set g_balance_okrpc_secondary_force_zscale 1 set g_balance_okrpc_secondary_lifetime 5 set g_balance_okrpc_secondary_radius 70 @@ -936,27 +937,27 @@ set g_balance_okrpc_weaponstartoverride 0 set g_balance_okrpc_weaponthrowable 0 // }}} // {{{ #25: Overkill Shotgun (MUTATOR WEAPON) -set g_balance_okshotgun_primary_ammo 1 -set g_balance_okshotgun_primary_animtime 0.2 +set g_balance_okshotgun_primary_ammo 3 +set g_balance_okshotgun_primary_animtime 0.65 set g_balance_okshotgun_primary_bot_range 512 -set g_balance_okshotgun_primary_bullets 12 -set g_balance_okshotgun_primary_damage 4 -set g_balance_okshotgun_primary_force 15 +set g_balance_okshotgun_primary_bullets 10 +set g_balance_okshotgun_primary_damage 17 +set g_balance_okshotgun_primary_force 80 set g_balance_okshotgun_primary_refire 0.75 set g_balance_okshotgun_primary_solidpenetration 3.8 -set g_balance_okshotgun_primary_spread 0.12 -set g_balance_okshotgun_reload_ammo 0 +set g_balance_okshotgun_primary_spread 0.07 +set g_balance_okshotgun_reload_ammo 24 set g_balance_okshotgun_reload_time 2 set g_balance_okshotgun_secondary_animtime 0.2 -set g_balance_okshotgun_secondary_damage 20 +set g_balance_okshotgun_secondary_damage 25 set g_balance_okshotgun_secondary_delay 0 -set g_balance_okshotgun_secondary_edgedamage 10 -set g_balance_okshotgun_secondary_force 300 +set g_balance_okshotgun_secondary_edgedamage 12.5 +set g_balance_okshotgun_secondary_force 360 set g_balance_okshotgun_secondary_force_zscale 1 set g_balance_okshotgun_secondary_lifetime 5 -set g_balance_okshotgun_secondary_radius 60 +set g_balance_okshotgun_secondary_radius 70 set g_balance_okshotgun_secondary_refire 0.7 -set g_balance_okshotgun_secondary_refire_type 0 +set g_balance_okshotgun_secondary_refire_type 1 set g_balance_okshotgun_secondary_shotangle 0 set g_balance_okshotgun_secondary_speed 6000 set g_balance_okshotgun_secondary_spread 0 diff --git a/balance-testing.cfg b/balance-testing.cfg new file mode 100644 index 000000000..96426aaa5 --- /dev/null +++ b/balance-testing.cfg @@ -0,0 +1,243 @@ +g_mod_balance Testing + +// {{{ starting gear +set g_balance_health_start 100 +set g_balance_armor_start 0 +set g_start_ammo_shells 15 +set g_start_ammo_nails 0 +set g_start_ammo_rockets 0 +set g_start_ammo_cells 0 +set g_start_ammo_plasma 0 +set g_start_ammo_fuel 0 +set g_random_start_weapons_count 0 +set g_random_start_weapons "machinegun mortar electro crylink vortex hagar devastator" +set g_random_start_shells 15 +set g_random_start_bullets 80 +set g_random_start_rockets 40 +set g_random_start_cells 30 +set g_random_start_plasma 30 +set g_warmup_start_health 100 "starting values when being in warmup-stage" +set g_warmup_start_armor 100 "starting values when being in warmup-stage" +set g_warmup_start_ammo_shells 30 "starting values when being in warmup-stage" +set g_warmup_start_ammo_nails 160 "starting values when being in warmup-stage" +set g_warmup_start_ammo_rockets 80 "starting values when being in warmup-stage" +set g_warmup_start_ammo_cells 90 "starting values when being in warmup-stage" +set g_warmup_start_ammo_plasma 90 "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 200 +set g_lms_start_ammo_shells 60 +set g_lms_start_ammo_nails 320 +set g_lms_start_ammo_rockets 160 +set g_lms_start_ammo_cells 180 +set g_lms_start_ammo_plasma 180 +set g_lms_start_ammo_fuel 0 +set g_balance_nix_roundtime 25 +set g_balance_nix_incrtime 1.6 +set g_balance_nix_ammo_shells 60 +set g_balance_nix_ammo_nails 320 +set g_balance_nix_ammo_rockets 160 +set g_balance_nix_ammo_cells 180 +set g_balance_nix_ammo_plasma 180 +set g_balance_nix_ammo_fuel 100 +set g_balance_nix_ammoincr_shells 2 // eh this will need figured out later I assume +set g_balance_nix_ammoincr_nails 6 +set g_balance_nix_ammoincr_rockets 2 +set g_balance_nix_ammoincr_cells 2 +set g_balance_nix_ammoincr_plasma 2 +set g_balance_nix_ammoincr_fuel 2 +// }}} + +// {{{ pickup items +set g_pickup_ammo_anyway 1 +set g_pickup_weapons_anyway 1 +set g_pickup_shells 15 +set g_pickup_shells_weapon 15 +set g_pickup_shells_max 60 +set g_pickup_nails 80 +set g_pickup_nails_weapon 80 +set g_pickup_nails_max 320 +set g_pickup_rockets 40 +set g_pickup_rockets_weapon 40 +set g_pickup_rockets_max 160 +set g_pickup_cells 30 +set g_pickup_cells_weapon 30 +set g_pickup_cells_max 180 +set g_pickup_plasma 30 +set g_pickup_plasma_weapon 30 +set g_pickup_plasma_max 180 +set g_pickup_fuel 50 +set g_pickup_fuel_weapon 50 +set g_pickup_fuel_jetpack 100 +set g_pickup_fuel_max 100 +set g_pickup_armorsmall 5 +set g_pickup_armorsmall_max 200 +set g_pickup_armorsmall_anyway 1 +set g_pickup_armormedium 25 +set g_pickup_armormedium_max 200 +set g_pickup_armormedium_anyway 1 +set g_pickup_armorbig 50 +set g_pickup_armorbig_max 200 +set g_pickup_armorbig_anyway 1 +set g_pickup_armormega 100 +set g_pickup_armormega_max 200 +set g_pickup_armormega_anyway 1 +set g_pickup_healthsmall 5 +set g_pickup_healthsmall_max 200 +set g_pickup_healthsmall_anyway 1 +set g_pickup_healthmedium 25 +set g_pickup_healthmedium_max 200 +set g_pickup_healthmedium_anyway 1 +set g_pickup_healthbig 50 +set g_pickup_healthbig_max 200 +set g_pickup_healthbig_anyway 1 +set g_pickup_healthmega 100 +set g_pickup_healthmega_max 200 +set g_pickup_healthmega_anyway 1 +set g_pickup_respawntime_short 15 +set g_pickup_respawntime_medium 20 +set g_pickup_respawntime_long 30 +set g_pickup_respawntime_powerup 120 +set g_pickup_respawntime_weapon 10 +set g_pickup_respawntime_superweapon 120 +set g_pickup_respawntime_ammo 10 +set g_pickup_respawntime_initial_random 1 +set g_pickup_respawntimejitter_short 0 +set g_pickup_respawntimejitter_medium 0 +set g_pickup_respawntimejitter_long 0 +set g_pickup_respawntimejitter_powerup 0 +set g_pickup_respawntimejitter_weapon 0 +set g_pickup_respawntimejitter_superweapon 10 +set g_pickup_respawntimejitter_ammo 0 +// }}} + +// {{{ regen/rot +set g_balance_health_regen 0.08 +set g_balance_health_regenlinear 0.5 +set g_balance_pause_health_regen 5 +set g_balance_pause_health_regen_spawn 0 +set g_balance_health_rot 0.02 +set g_balance_health_rotlinear 1 +set g_balance_pause_health_rot 1 +set g_balance_pause_health_rot_spawn 5 +set g_balance_health_regenstable 100 +set g_balance_health_rotstable 100 +set g_balance_health_limit 200 +set g_balance_armor_regen 0 +set g_balance_armor_regenlinear 0 +set g_balance_armor_rot 0.02 +set g_balance_armor_rotlinear 1 +set g_balance_pause_armor_rot 1 +set g_balance_pause_armor_rot_spawn 5 +set g_balance_armor_regenstable 100 +set g_balance_armor_rotstable 100 +set g_balance_armor_limit 200 +set g_balance_armor_blockpercent 0.7 +set g_balance_fuel_regen 0.1 "fuel regeneration (only applies if the player owns IT_FUEL_REGEN)" +set g_balance_fuel_regenlinear 0 +set g_balance_pause_fuel_regen 2 // other than this, fuel uses the health regen counter +set g_balance_fuel_rot 0.05 +set g_balance_fuel_rotlinear 0 +set g_balance_pause_fuel_rot 5 +set g_balance_pause_fuel_rot_spawn 10 +set g_balance_fuel_regenstable 50 +set g_balance_fuel_rotstable 100 +set g_balance_fuel_limit 100 +// }}} + +// {{{ misc +set g_balance_selfdamagepercent 0.65 +set g_weaponspeedfactor 1 "weapon projectile speed multiplier" +set g_weaponratefactor 1 "weapon fire rate multiplier" +set g_weapondamagefactor 1 "weapon damage multiplier" +set g_weaponforcefactor 1 "weapon force multiplier" +set g_weaponspreadfactor 1 "weapon spread multiplier" +set g_balance_firetransfer_time 0.9 +set g_balance_firetransfer_damage 0.8 +set g_throughfloor_damage 0.75 +set g_throughfloor_force 0.75 +set g_projectiles_damage -2 +// possible values: +// -2: absolutely no damage to projectiles (no exceptions) +// -1: no damage other than the exceptions (electro combo, hagar join explode, ML mines) +// 0: only damage from contents (lava/slime) or exceptions +// 1: only self damage or damage from contents or exceptions +// 2: allow all damage to projectiles normally +set g_projectiles_keep_owner 1 +set g_projectiles_newton_style 0 +// possible values: +// 0: absolute velocity projectiles (like Quake) +// 1: relative velocity projectiles, "Newtonian" (like Tribes 2) +// 2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard) +set g_projectiles_newton_style_2_minfactor 0.8 +set g_projectiles_newton_style_2_maxfactor 1.5 +set g_projectiles_spread_style 7 +// possible values: +// 0: forward + solid sphere (like Quake) - varies velocity +// 1: forward + flattened solid sphere +// 2: forward + solid circle +// 3: forward + normal distribution 3D - varies velocity +// 4: forward + normal distribution on a plane +// 5: forward + circle with 1-r falloff +// 6: forward + circle with 1-r^2 falloff +// 7: forward + circle with (1-r)(2-r) falloff +set g_balance_falldamage_deadminspeed 250 +set g_balance_falldamage_minspeed 900 +set g_balance_falldamage_factor 0.20 +set g_balance_falldamage_maxdamage 40 +set g_balance_damagepush_speedfactor 2.5 +set g_balance_contents_damagerate 0.2 // ticrate interval for applying damage with playerdamage/projectiledamage +set g_balance_contents_drowndelay 10 // time under water before a player begins drowning +set g_balance_contents_playerdamage_drowning 20 // damage per second for while player is drowning +set g_balance_contents_playerdamage_lava 50 // damage per second for while player is inside lava +set g_balance_contents_playerdamage_lava_burn 0 // extra burning damage after leaving lava +set g_balance_contents_playerdamage_lava_burn_time 2.5 // time across which the damage is applied (note: not dps!) +set g_balance_contents_playerdamage_slime 30 // damage per second for while player is inside slime +set g_balance_contents_projectiledamage 10000 // instantly kill projectiles upon touching lava/slime +set g_maxpushtime 8.0 "timeout for kill credit when your damage knocks someone into a death trap" +// }}} + +// {{{ powerups +set g_balance_powerup_invincible_takedamage 0.33 // only 1/3rd damage is taken +set g_balance_powerup_invincible_takeforce 0.33 +set g_balance_powerup_invincible_time 30 +set g_balance_powerup_strength_damage 3 +set g_balance_powerup_strength_force 3 +set g_balance_powerup_strength_time 30 +set g_balance_powerup_strength_selfdamage 1.5 +set g_balance_powerup_strength_selfforce 1.5 +set g_balance_superweapons_time 30 +// }}} + +// {{{ jetpack/hook +set g_jetpack_antigravity 0.8 "factor of gravity compensation of the jetpack" +set g_jetpack_acceleration_side 1200 "acceleration of the jetpack in xy direction" +set g_jetpack_acceleration_up 600 "acceleration of the jetpack in z direction (note: you have to factor in gravity here, if antigravity is not 1)" +set g_jetpack_maxspeed_side 1200 "max speed of the jetpack in xy direction" +set g_jetpack_maxspeed_up 600 "max speed of the jetpack in z direction" +set g_jetpack_fuel 8 "fuel per second for jetpack" +set g_jetpack_reverse_thrust 0 "if not 0, downward acceleration when crouching with the jetpack" + +set g_grappling_hook_tarzan 2 // 2: can also pull players +set g_balance_grapplehook_speed_fly 1800 +set g_balance_grapplehook_speed_pull 2000 +set g_balance_grapplehook_force_rubber 2000 +set g_balance_grapplehook_force_rubber_overstretch 1000 +set g_balance_grapplehook_length_min 50 +set g_balance_grapplehook_stretch 50 +set g_balance_grapplehook_airfriction 0.2 +set g_balance_grapplehook_health 50 +set g_balance_grapplehook_damagedbycontents 1 +set g_balance_grapplehook_refire 0.2 +set g_balance_grapplehook_nade_time 0.7 +set g_balance_grapplehook_crouchslide 0 +set g_balance_grapplehook_gravity 0 +set g_balance_grapplehook_pull_frozen 0 +// }}} + +// {{{ port-o-launch +set g_balance_portal_health 200 // these get recharged whenever the portal is used +set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used +// }}} + +exec bal-wep-testing.cfg diff --git a/balance-testingxpm.cfg b/balance-testingxpm.cfg new file mode 100644 index 000000000..7c2da46ce --- /dev/null +++ b/balance-testingxpm.cfg @@ -0,0 +1,243 @@ +g_mod_balance XPM + +// {{{ starting gear +set g_balance_health_start 100 +set g_balance_armor_start 0 +set g_start_ammo_shells 15 +set g_start_ammo_nails 0 +set g_start_ammo_rockets 0 +set g_start_ammo_cells 0 +set g_start_ammo_plasma 0 +set g_start_ammo_fuel 0 +set g_random_start_weapons_count 0 +set g_random_start_weapons "machinegun mortar electro crylink vortex hagar devastator" +set g_random_start_shells 15 +set g_random_start_bullets 80 +set g_random_start_rockets 40 +set g_random_start_cells 30 +set g_random_start_plasma 30 +set g_warmup_start_health 100 "starting values when being in warmup-stage" +set g_warmup_start_armor 100 "starting values when being in warmup-stage" +set g_warmup_start_ammo_shells 30 "starting values when being in warmup-stage" +set g_warmup_start_ammo_nails 160 "starting values when being in warmup-stage" +set g_warmup_start_ammo_rockets 80 "starting values when being in warmup-stage" +set g_warmup_start_ammo_cells 90 "starting values when being in warmup-stage" +set g_warmup_start_ammo_plasma 90 "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 200 +set g_lms_start_ammo_shells 60 +set g_lms_start_ammo_nails 320 +set g_lms_start_ammo_rockets 160 +set g_lms_start_ammo_cells 180 +set g_lms_start_ammo_plasma 180 +set g_lms_start_ammo_fuel 0 +set g_balance_nix_roundtime 25 +set g_balance_nix_incrtime 1.6 +set g_balance_nix_ammo_shells 60 +set g_balance_nix_ammo_nails 320 +set g_balance_nix_ammo_rockets 160 +set g_balance_nix_ammo_cells 180 +set g_balance_nix_ammo_plasma 180 +set g_balance_nix_ammo_fuel 100 +set g_balance_nix_ammoincr_shells 2 // eh this will need figured out later I assume +set g_balance_nix_ammoincr_nails 6 +set g_balance_nix_ammoincr_rockets 2 +set g_balance_nix_ammoincr_cells 2 +set g_balance_nix_ammoincr_plasma 2 +set g_balance_nix_ammoincr_fuel 2 +// }}} + +// {{{ pickup items +set g_pickup_ammo_anyway 1 +set g_pickup_weapons_anyway 1 +set g_pickup_shells 15 +set g_pickup_shells_weapon 15 +set g_pickup_shells_max 60 +set g_pickup_nails 80 +set g_pickup_nails_weapon 80 +set g_pickup_nails_max 320 +set g_pickup_rockets 40 +set g_pickup_rockets_weapon 40 +set g_pickup_rockets_max 160 +set g_pickup_cells 30 +set g_pickup_cells_weapon 30 +set g_pickup_cells_max 180 +set g_pickup_plasma 30 +set g_pickup_plasma_weapon 30 +set g_pickup_plasma_max 180 +set g_pickup_fuel 50 +set g_pickup_fuel_weapon 50 +set g_pickup_fuel_jetpack 100 +set g_pickup_fuel_max 100 +set g_pickup_armorsmall 5 +set g_pickup_armorsmall_max 200 +set g_pickup_armorsmall_anyway 0 +set g_pickup_armormedium 25 +set g_pickup_armormedium_max 100 +set g_pickup_armormedium_anyway 0 +set g_pickup_armorbig 50 +set g_pickup_armorbig_max 100 +set g_pickup_armorbig_anyway 0 +set g_pickup_armormega 100 +set g_pickup_armormega_max 200 +set g_pickup_armormega_anyway 0 +set g_pickup_healthsmall 5 +set g_pickup_healthsmall_max 200 +set g_pickup_healthsmall_anyway 0 +set g_pickup_healthmedium 25 +set g_pickup_healthmedium_max 100 +set g_pickup_healthmedium_anyway 0 +set g_pickup_healthbig 50 +set g_pickup_healthbig_max 100 +set g_pickup_healthbig_anyway 0 +set g_pickup_healthmega 100 +set g_pickup_healthmega_max 200 +set g_pickup_healthmega_anyway 0 +set g_pickup_respawntime_short 15 +set g_pickup_respawntime_medium 20 +set g_pickup_respawntime_long 30 +set g_pickup_respawntime_powerup 120 +set g_pickup_respawntime_weapon 10 +set g_pickup_respawntime_superweapon 120 +set g_pickup_respawntime_ammo 10 +set g_pickup_respawntime_initial_random 1 +set g_pickup_respawntimejitter_short 0 +set g_pickup_respawntimejitter_medium 0 +set g_pickup_respawntimejitter_long 0 +set g_pickup_respawntimejitter_powerup 0 +set g_pickup_respawntimejitter_weapon 0 +set g_pickup_respawntimejitter_superweapon 10 +set g_pickup_respawntimejitter_ammo 0 +// }}} + +// {{{ regen/rot +set g_balance_health_regen 0.08 +set g_balance_health_regenlinear 0.5 +set g_balance_pause_health_regen 5 +set g_balance_pause_health_regen_spawn 0 +set g_balance_health_rot 0.02 +set g_balance_health_rotlinear 1 +set g_balance_pause_health_rot 1 +set g_balance_pause_health_rot_spawn 5 +set g_balance_health_regenstable 100 +set g_balance_health_rotstable 100 +set g_balance_health_limit 200 +set g_balance_armor_regen 0 +set g_balance_armor_regenlinear 0 +set g_balance_armor_rot 0.02 +set g_balance_armor_rotlinear 1 +set g_balance_pause_armor_rot 1 +set g_balance_pause_armor_rot_spawn 5 +set g_balance_armor_regenstable 100 +set g_balance_armor_rotstable 100 +set g_balance_armor_limit 200 +set g_balance_armor_blockpercent 0.7 +set g_balance_fuel_regen 0.1 "fuel regeneration (only applies if the player owns IT_FUEL_REGEN)" +set g_balance_fuel_regenlinear 0 +set g_balance_pause_fuel_regen 2 // other than this, fuel uses the health regen counter +set g_balance_fuel_rot 0.05 +set g_balance_fuel_rotlinear 0 +set g_balance_pause_fuel_rot 5 +set g_balance_pause_fuel_rot_spawn 10 +set g_balance_fuel_regenstable 50 +set g_balance_fuel_rotstable 100 +set g_balance_fuel_limit 100 +// }}} + +// {{{ misc +set g_balance_selfdamagepercent 0.65 +set g_weaponspeedfactor 1 "weapon projectile speed multiplier" +set g_weaponratefactor 1 "weapon fire rate multiplier" +set g_weapondamagefactor 1 "weapon damage multiplier" +set g_weaponforcefactor 1 "weapon force multiplier" +set g_weaponspreadfactor 1 "weapon spread multiplier" +set g_balance_firetransfer_time 0.9 +set g_balance_firetransfer_damage 0.8 +set g_throughfloor_damage 0.75 +set g_throughfloor_force 0.75 +set g_projectiles_damage -2 +// possible values: +// -2: absolutely no damage to projectiles (no exceptions) +// -1: no damage other than the exceptions (electro combo, hagar join explode, ML mines) +// 0: only damage from contents (lava/slime) or exceptions +// 1: only self damage or damage from contents or exceptions +// 2: allow all damage to projectiles normally +set g_projectiles_keep_owner 1 +set g_projectiles_newton_style 0 +// possible values: +// 0: absolute velocity projectiles (like Quake) +// 1: relative velocity projectiles, "Newtonian" (like Tribes 2) +// 2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard) +set g_projectiles_newton_style_2_minfactor 0.8 +set g_projectiles_newton_style_2_maxfactor 1.5 +set g_projectiles_spread_style 7 +// possible values: +// 0: forward + solid sphere (like Quake) - varies velocity +// 1: forward + flattened solid sphere +// 2: forward + solid circle +// 3: forward + normal distribution 3D - varies velocity +// 4: forward + normal distribution on a plane +// 5: forward + circle with 1-r falloff +// 6: forward + circle with 1-r^2 falloff +// 7: forward + circle with (1-r)(2-r) falloff +set g_balance_falldamage_deadminspeed 250 +set g_balance_falldamage_minspeed 900 +set g_balance_falldamage_factor 0.20 +set g_balance_falldamage_maxdamage 40 +set g_balance_damagepush_speedfactor 2.5 +set g_balance_contents_damagerate 0.2 // ticrate interval for applying damage with playerdamage/projectiledamage +set g_balance_contents_drowndelay 10 // time under water before a player begins drowning +set g_balance_contents_playerdamage_drowning 20 // damage per second for while player is drowning +set g_balance_contents_playerdamage_lava 50 // damage per second for while player is inside lava +set g_balance_contents_playerdamage_lava_burn 0 // extra burning damage after leaving lava +set g_balance_contents_playerdamage_lava_burn_time 2.5 // time across which the damage is applied (note: not dps!) +set g_balance_contents_playerdamage_slime 30 // damage per second for while player is inside slime +set g_balance_contents_projectiledamage 10000 // instantly kill projectiles upon touching lava/slime +set g_maxpushtime 8.0 "timeout for kill credit when your damage knocks someone into a death trap" +// }}} + +// {{{ powerups +set g_balance_powerup_invincible_takedamage 0.33 // only 1/3rd damage is taken +set g_balance_powerup_invincible_takeforce 0.33 +set g_balance_powerup_invincible_time 30 +set g_balance_powerup_strength_damage 3 +set g_balance_powerup_strength_force 3 +set g_balance_powerup_strength_time 30 +set g_balance_powerup_strength_selfdamage 1.5 +set g_balance_powerup_strength_selfforce 1.5 +set g_balance_superweapons_time 30 +// }}} + +// {{{ jetpack/hook +set g_jetpack_antigravity 0.8 "factor of gravity compensation of the jetpack" +set g_jetpack_acceleration_side 1200 "acceleration of the jetpack in xy direction" +set g_jetpack_acceleration_up 600 "acceleration of the jetpack in z direction (note: you have to factor in gravity here, if antigravity is not 1)" +set g_jetpack_maxspeed_side 1200 "max speed of the jetpack in xy direction" +set g_jetpack_maxspeed_up 600 "max speed of the jetpack in z direction" +set g_jetpack_fuel 8 "fuel per second for jetpack" +set g_jetpack_reverse_thrust 0 "if not 0, downward acceleration when crouching with the jetpack" + +set g_grappling_hook_tarzan 2 // 2: can also pull players +set g_balance_grapplehook_speed_fly 1800 +set g_balance_grapplehook_speed_pull 2000 +set g_balance_grapplehook_force_rubber 2000 +set g_balance_grapplehook_force_rubber_overstretch 1000 +set g_balance_grapplehook_length_min 50 +set g_balance_grapplehook_stretch 50 +set g_balance_grapplehook_airfriction 0.2 +set g_balance_grapplehook_health 50 +set g_balance_grapplehook_damagedbycontents 1 +set g_balance_grapplehook_refire 0.2 +set g_balance_grapplehook_nade_time 0.7 +set g_balance_grapplehook_crouchslide 0 +set g_balance_grapplehook_gravity 0 +set g_balance_grapplehook_pull_frozen 0 +// }}} + +// {{{ port-o-launch +set g_balance_portal_health 200 // these get recharged whenever the portal is used +set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used +// }}} + +exec bal-wep-testingxpm.cfg diff --git a/common.fr.po b/common.fr.po index 065db416c..c1bc4112f 100644 --- a/common.fr.po +++ b/common.fr.po @@ -18,7 +18,7 @@ msgstr "" "Project-Id-Version: Xonotic\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-05-19 07:23+0200\n" -"PO-Revision-Date: 2019-07-14 15:44+0000\n" +"PO-Revision-Date: 2019-08-29 09:07+0000\n" "Last-Translator: Yannick Le Guen \n" "Language-Team: French (http://www.transifex.com/team-xonotic/xonotic/" "language/fr/)\n" @@ -143,7 +143,7 @@ msgstr "^1La partie a déjà commencé" #: qcsrc/client/hud/panel/infomessages.qc:128 msgid "^1You have no more lives left" -msgstr "^1Vous n'avez plus aucune vie" +msgstr "^1Il ne vous reste plus aucune vie" #: qcsrc/client/hud/panel/infomessages.qc:130 #: qcsrc/client/hud/panel/infomessages.qc:133 @@ -9289,7 +9289,7 @@ msgstr "Retourner la vue horizontalement" #: qcsrc/menu/xonotic/dialog_settings_video.qc:68 msgid "Poor man's left handed mode" -msgstr "Mode mirroir" +msgstr "Mode miroir" #: qcsrc/menu/xonotic/dialog_settings_video.qc:71 msgid "Anisotropy:" diff --git a/common.tr.po b/common.tr.po index bb401e01b..5ee89ac01 100644 --- a/common.tr.po +++ b/common.tr.po @@ -5,13 +5,14 @@ # Translators: # Çağlar Turalı , 2018 # Demiray Muhterem , 2018 +# ibra kap , 2019 msgid "" msgstr "" "Project-Id-Version: Xonotic\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-05-19 07:23+0200\n" -"PO-Revision-Date: 2019-05-19 05:23+0000\n" -"Last-Translator: divVerent \n" +"PO-Revision-Date: 2019-09-11 17:17+0000\n" +"Last-Translator: ibra kap \n" "Language-Team: Turkish (http://www.transifex.com/team-xonotic/xonotic/" "language/tr/)\n" "Language: tr\n" @@ -253,7 +254,7 @@ msgstr "Devam..." #: qcsrc/client/hud/panel/quickmenu.qc:781 #: qcsrc/client/hud/panel/quickmenu.qc:788 msgid "Chat" -msgstr "" +msgstr "Sohbet" #: qcsrc/client/hud/panel/quickmenu.qc:782 msgid "QMCMD^Send public message to" @@ -488,7 +489,7 @@ msgstr "" #: qcsrc/client/hud/panel/quickmenu.qc:847 msgid "QMCMD^Fullscreen" -msgstr "" +msgstr "Tam Ekran" #: qcsrc/client/hud/panel/quickmenu.qc:850 #: qcsrc/client/hud/panel/quickmenu.qc:860 diff --git a/crosshairs.cfg b/crosshairs.cfg index 8e7bc9b4f..82758fa70 100644 --- a/crosshairs.cfg +++ b/crosshairs.cfg @@ -48,6 +48,10 @@ seta crosshair_per_weapon 1 "when 1, each gun will display a different crosshair // side-scrolling crosshair seta crosshair_2d 54 "selects crosshair to use in side-scrolling mode (\"\" uses regular crosshair and 0 is none)" +// third person chase-camera crosshair +seta crosshair_chase 1 "adjust the crosshair while in third person mode to where the shot will actually hit" +seta crosshair_chase_playeralpha 0.25 "opacity of the player while they obstruct the view when crosshair_chase is enabled, can be a value between 0 and 1" + // ========================= // Crosshair ring settings diff --git a/gamemodes-server.cfg b/gamemodes-server.cfg index fc441af95..548a51223 100644 --- a/gamemodes-server.cfg +++ b/gamemodes-server.cfg @@ -226,6 +226,7 @@ set g_ca_round_timelimit 180 "round time limit in seconds" set g_ca_teams_override 0 set g_ca_team_spawns 0 "when 1, players spawn from the team spawnpoints of the map, if any" set g_ca_teams 0 +set g_ca_weaponarena "most" "starting weapons - takes the same options as g_weaponarena" // ================== @@ -370,6 +371,7 @@ set g_freezetag_frozen_maxtime 60 "frozen players will be automatically unfrozen set g_freezetag_teams_override 0 set g_freezetag_team_spawns 0 "when 1, players spawn from the team spawnpoints of the map, if any" set g_freezetag_teams 0 +set g_freezetag_weaponarena "most_available" "starting weapons - takes the same options as g_weaponarena" // ========== @@ -433,6 +435,7 @@ set g_lms_extra_lives 0 set g_lms_regenerate 0 set g_lms_last_join 3 "if g_lms_join_anytime is false, new players can only join if the worst active player has more than (fraglimit - g_lms_last_join) lives" set g_lms_join_anytime 1 "if true, new players can join, but get same amount of lives as the worst player" +set g_lms_weaponarena "most_available" "starting weapons - takes the same options as g_weaponarena" // ========= @@ -542,3 +545,4 @@ set g_invasion_type 0 "type of invasion mode - 0: round-based, 1: hunting, 2: co set g_duel 0 "Duel: frag the opponent more in a one versus one arena battle" //set g_duel_warmup 180 "Have a short warmup period before beginning the actual duel" set g_duel_with_powerups 0 "Enable powerups to spawn in the duel gamemode" +set g_duel_not_dm_maps 0 "when this is set, DM maps will NOT be listed in duel" diff --git a/models/monsters/zombie.dpm_0.sounds b/models/monsters/zombie.dpm_0.sounds index 7a7cff67a..dddb38ce0 100644 --- a/models/monsters/zombie.dpm_0.sounds +++ b/models/monsters/zombie.dpm_0.sounds @@ -4,5 +4,5 @@ sight sound/monsters/zombie/sight 0 //ranged sound/monsters/zombie/ranged 0 //melee sound/monsters/zombie/melee 0 //pain sound/monsters/zombie/pain 0 -spawn sound/monsters/zombie/spawn 0 +//spawn sound/monsters/zombie/spawn 0 idle sound/monsters/zombie/idle 0 diff --git a/mutators.cfg b/mutators.cfg index 2c0bfae53..0fcbed2f2 100644 --- a/mutators.cfg +++ b/mutators.cfg @@ -111,6 +111,7 @@ set g_invincible_projectiles 0 "set to 1 to disable any damage to projectiles in // rocket flying // =============== set g_rocket_flying 0 "set to 1 to enable rocket flying in all balance configs" +set g_rocket_flying_disabledelays 1 "disable detonation delays on rockets and mines" // ===================== @@ -302,8 +303,8 @@ set g_new_toys_use_pickupsound 0 "play the 'new toys, new toys!' roflsound when // ======= // buffs // ======= -set cl_buffs_autoreplace 1 "automatically drop current buff when picking up another" -set g_buffs -1 "enable buffs (requires buff items or powerups)" +seta cl_buffs_autoreplace 1 "automatically drop current buff when picking up another" +set g_buffs -1 "enable buffs (requires buff items or powerups on the map)" set g_buffs_effects 1 "show particle effects from carried buffs" set g_buffs_waypoint_distance 1024 "maximum distance at which buff waypoint can be seen from item" set g_buffs_pickup_anyway 0 "instantly respawn the buff when it is picked up, instead of waiting for the player to drop it" @@ -321,7 +322,7 @@ set g_buffs_ammo 1 "ammo buff: infinite ammunition" set g_buffs_ammo_time 60 "ammo buff carry time" set g_buffs_resistance 1 "resistance buff: greatly reduces damage taken" set g_buffs_resistance_time 60 "resistance buff time" -set g_buffs_resistance_blockpercent 0.7 "damage reduction multiplier, higher values mean less damage" +set g_buffs_resistance_blockpercent 0.5 "damage reduction multiplier, higher values mean less damage" set g_buffs_medic 1 "medic buff: increased regeneration speed, extra health, chance to survive a fatal attack" set g_buffs_medic_time 60 "medic buff carry time" set g_buffs_medic_survive_chance 0.6 "multiplier chance of player surviving a fatal hit" @@ -334,7 +335,7 @@ set g_buffs_medic_heal_range 400 "furthest away players can be from carrier to g set g_buffs_medic_heal_delay 1 "delay between team healing" set g_buffs_vengeance 1 "vengeance buff: attackers also take damage" set g_buffs_vengeance_time 60 "vengeance buff carry time" -set g_buffs_vengeance_damage_multiplier 0.6 "amount of damage dealt the attacker takes when hitting a target with vengeance" +set g_buffs_vengeance_damage_multiplier 0.4 "amount of damage dealt the attacker takes when hitting a target with vengeance" set g_buffs_bash 1 "bash buff: increased knockback force and immunity to knockback" set g_buffs_bash_time 60 "bash buff carry time" set g_buffs_bash_force 2 "bash force multiplier" @@ -354,7 +355,7 @@ set g_buffs_speed_damage_take 1.2 "damage taken multiplier, higher value means m set g_buffs_speed_regen 1.2 "regeneration speed multiplier, higher value means faster health regeneration while holding speed buff" set g_buffs_vampire 1 "vampire buff: attacks to players and monsters heal the carrier" set g_buffs_vampire_time 60 "vampire buff carry time" -set g_buffs_vampire_damage_steal 0.6 "damage stolen multiplier while holding vampire buff" +set g_buffs_vampire_damage_steal 0.4 "damage stolen multiplier while holding vampire buff" set g_buffs_jump 0 "jump buff: greatly increased jump height" set g_buffs_jump_time 60 "jump buff carry time" set g_buffs_jump_height 600 "jump height while holding jump buff" @@ -378,7 +379,7 @@ set g_buffs_magnet_range_buff 100 "range around player that only buffs are picke set g_buffs_luck 1 "luck buff: randomly increased damage" set g_buffs_luck_time 60 "luck buff carry time" set g_buffs_luck_chance 0.15 "chance for 'critical' hit (multiplied damage) with luck buff" -set g_buffs_luck_damagemultiplier 3 "luck damage multiplier" +set g_buffs_luck_damagemultiplier 2 "luck damage multiplier" set g_buffs_flight 0 "flight buff: crouch jump to reverse your gravity!" set g_buffs_flight_time 60 "flight buff carry time" diff --git a/qcsrc/client/autocvars.qh b/qcsrc/client/autocvars.qh index c372be250..d31d12205 100644 --- a/qcsrc/client/autocvars.qh +++ b/qcsrc/client/autocvars.qh @@ -76,7 +76,7 @@ bool autocvar_cl_spawnzoom = 1; float autocvar_cl_spawnzoom_speed = 1; float autocvar_cl_spawnzoom_factor = 2; bool autocvar_cl_stripcolorcodes; -bool autocvar_cl_vehicles_alarm = true; +bool autocvar_cl_vehicles_alarm = false; bool autocvar_cl_vehicles_hud_tactical = true; float autocvar_cl_vehicles_hudscale = 0.5; float autocvar_cl_vehicles_notify_time = 15; @@ -150,6 +150,8 @@ bool autocvar_crosshair_ring_reload; float autocvar_crosshair_ring_reload_alpha; float autocvar_crosshair_ring_reload_size; float autocvar_crosshair_size; +bool autocvar_crosshair_chase = true; +float crosshair_chase_playeralpha = 0.25; int autocvar_ekg; float autocvar_fov; bool autocvar_hud_cursormode = true; diff --git a/qcsrc/client/defs.qh b/qcsrc/client/defs.qh index 7720f071b..5ce4c3e60 100644 --- a/qcsrc/client/defs.qh +++ b/qcsrc/client/defs.qh @@ -111,9 +111,11 @@ vector w_org, w_backoff; float autoswitch; bool cvar_cl_allow_uid2name; +bool cvar_cl_allow_uidranking; float cvar_cl_autoscreenshot; float cvar_cl_autotaunt; float cvar_cl_clippedspectating; +int cvar_cl_gunalign; float cvar_cl_handicap; float cvar_cl_jetpack_jump; float cvar_cl_movement_track_canjump; @@ -129,9 +131,11 @@ bool cvar_cl_weapon_switch_fallback_to_impulse; REPLICATE(autoswitch, bool, "cl_autoswitch"); REPLICATE(cvar_cl_allow_uid2name, bool, "cl_allow_uid2name"); +REPLICATE(cvar_cl_allow_uidranking, bool, "cl_allow_uidranking"); REPLICATE(cvar_cl_autoscreenshot, int, "cl_autoscreenshot"); REPLICATE(cvar_cl_autotaunt, float, "cl_autotaunt"); REPLICATE(cvar_cl_clippedspectating, bool, "cl_clippedspectating"); +REPLICATE(cvar_cl_gunalign, int, "cl_gunalign"); REPLICATE(cvar_cl_handicap, float, "cl_handicap"); REPLICATE(cvar_cl_jetpack_jump, bool, "cl_jetpack_jump"); REPLICATE(cvar_cl_movement_track_canjump, bool, "cl_movement_track_canjump"); @@ -145,11 +149,6 @@ REPLICATE(cvar_cl_cts_noautoswitch, bool, "cl_cts_noautoswitch"); REPLICATE(cvar_cl_weapon_switch_reload, bool, "cl_weapon_switch_reload"); REPLICATE(cvar_cl_weapon_switch_fallback_to_impulse, bool, "cl_weapon_switch_fallback_to_impulse"); /* -// this is also a STAT -// pointless sending this cvars since server can't change gun alignment during the match -int cvar_cl_gunalign; -REPLICATE(cvar_cl_gunalign, int, "cl_gunalign"); - // cvar cl_newusekeysupported doesn't exist float cvar_cl_newusekeysupported; REPLICATE(cvar_cl_newusekeysupported, bool, "cl_newusekeysupported"); diff --git a/qcsrc/client/main.qc b/qcsrc/client/main.qc index c8274fe62..b61f425aa 100644 --- a/qcsrc/client/main.qc +++ b/qcsrc/client/main.qc @@ -143,6 +143,8 @@ void CSQC_Init() registercvar("cl_weapon_switch_reload", "1"); registercvar("cl_weapon_switch_fallback_to_impulse", "1"); + registercvar("cl_allow_uidranking", "1"); + if(autocvar_cl_lockview) cvar_set("cl_lockview", "0"); diff --git a/qcsrc/client/view.qc b/qcsrc/client/view.qc index 7385b4c3a..33f7e9ba4 100644 --- a/qcsrc/client/view.qc +++ b/qcsrc/client/view.qc @@ -291,6 +291,7 @@ void viewmodel_draw(entity this) return; int mask = (intermission || (STAT(HEALTH) <= 0) || autocvar_chase_active) ? 0 : MASK_NORMAL; float a = ((autocvar_cl_viewmodel_alpha) ? bound(-1, autocvar_cl_viewmodel_alpha, this.m_alpha) : this.m_alpha); + int wepskin = this.m_skin; bool invehicle = player_localentnum > maxclients; if (invehicle) a = -1; Weapon wep = this.activeweapon; @@ -304,6 +305,7 @@ void viewmodel_draw(entity this) { e.drawmask = mask; e.alpha = a; + e.skin = wepskin; e.colormap = 256 + c; // colormap == 0 is black, c == 0 is white e.glowmod = g; e.csqcmodel_effects = fx; @@ -712,7 +714,7 @@ vector liquidcolor_prev; float eventchase_current_distance; float eventchase_running; -int WantEventchase(entity this) +int WantEventchase(entity this, bool want_vehiclechase) { if(autocvar_cl_orthoview) return 0; @@ -722,7 +724,7 @@ int WantEventchase(entity this) return 1; if(spectatee_status >= 0) { - if(hud != HUD_NORMAL && (autocvar_cl_eventchase_vehicle || spectatee_status > 0)) + if(want_vehiclechase) return 1; if(MUTATOR_CALLHOOK(WantEventchase, this)) return 1; @@ -972,6 +974,21 @@ void HUD_Crosshair(entity this) // wcross_origin = '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight; if(csqcplayer.viewloc && (csqcplayer.viewloc.spawnflags & VIEWLOC_FREEAIM)) wcross_origin = viewloc_mousepos; + else if(autocvar_chase_active > 0 && autocvar_crosshair_chase) + { + vector player_org = ((csqcplayer) ? csqcplayer.origin + csqcplayer.view_ofs : view_origin); + if(csqcplayer && crosshair_chase_playeralpha && crosshair_chase_playeralpha < 1) + { + traceline(view_origin, view_origin + max_shot_distance * view_forward, MOVE_NORMAL, NULL); + float myalpha = (!csqcplayer.m_alpha) ? 1 : csqcplayer.m_alpha; + if(trace_ent == csqcplayer && STAT(HEALTH) > 0) + csqcplayer.alpha = min(crosshair_chase_playeralpha, myalpha); + else + csqcplayer.alpha = csqcplayer.m_alpha; + } + traceline(player_org, player_org + max_shot_distance * view_forward, MOVE_WORLDONLY, NULL); + wcross_origin = project_3d_to_2d(trace_endpos); + } else wcross_origin = project_3d_to_2d(view_origin + max_shot_distance * view_forward); wcross_origin.z = 0; @@ -1655,7 +1672,7 @@ void CSQC_UpdateView(entity this, float w, float h) else if(autocvar_chase_active == -2) cvar_set("chase_active", "0"); - float vehicle_chase = (hud != HUD_NORMAL && (autocvar_cl_eventchase_vehicle || spectatee_status > 0)); + bool vehicle_chase = (hud != HUD_NORMAL && (autocvar_cl_eventchase_vehicle || spectatee_status > 0)); float vehicle_viewdist = 0; vector vehicle_viewofs = '0 0 0'; @@ -1667,10 +1684,14 @@ void CSQC_UpdateView(entity this, float w, float h) Vehicle info = Vehicles_from(hud); vehicle_viewdist = info.height; vehicle_viewofs = info.view_ofs; + if(vehicle_viewdist < 0) // when set below 0, this vehicle doesn't use third person view (gunner slots) + vehicle_chase = false; } + else + vehicle_chase = false; } - int eventchase = WantEventchase(this); + int eventchase = WantEventchase(this, vehicle_chase); if (eventchase) { vector current_view_origin_override = '0 0 0'; diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index 15c1366ea..a7e7da546 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -50,6 +50,8 @@ const int SERVERFLAG_PLAYERSTATS = 4; // a bit more constant const vector PL_MAX_CONST = '16 16 45'; const vector PL_MIN_CONST = '-16 -16 -24'; +const vector PL_CROUCH_MAX_CONST = '16 16 25'; +const vector PL_CROUCH_MIN_CONST = '-16 -16 -24'; // gametype vote flags const int GTV_FORBIDDEN = 0; // Cannot be voted diff --git a/qcsrc/common/csqcmodel_settings.qh b/qcsrc/common/csqcmodel_settings.qh index 7c5a218b2..96836a38e 100644 --- a/qcsrc/common/csqcmodel_settings.qh +++ b/qcsrc/common/csqcmodel_settings.qh @@ -18,12 +18,17 @@ # define TAG_VIEWLOC_NAME tag_networkviewloc # define TAG_VIEWLOC_TYPE int .float tag_networkviewloc; + +# define ALPHA m_alpha +.float m_alpha; #else # define TAG_ENTITY_NAME tag_entity # define TAG_ENTITY_TYPE entity # define TAG_VIEWLOC_NAME viewloc # define TAG_VIEWLOC_TYPE entity + +# define ALPHA alpha #endif // add properties you want networked to CSQC here @@ -31,7 +36,7 @@ CSQCMODEL_PROPERTY(BIT(0), int, ReadShort, WriteShort, colormap) \ CSQCMODEL_PROPERTY(BIT(1), int, ReadInt24_t, WriteInt24_t, effects) \ CSQCMODEL_PROPERTY(BIT(2), int, ReadByte, WriteByte, modelflags) \ - CSQCMODEL_PROPERTY_SCALED(BIT(3), float, ReadByte, WriteByte, alpha, 254, -1, 254) \ + CSQCMODEL_PROPERTY_SCALED(BIT(3), float, ReadByte, WriteByte, ALPHA, 254, -1, 254) \ CSQCMODEL_PROPERTY(BIT(4), int, ReadByte, WriteByte, skin) \ CSQCMODEL_PROPERTY(BIT(5), float, ReadApproxPastTime, WriteApproxPastTime, death_time) \ CSQCMODEL_PROPERTY(BIT(6), float, ReadByte, WriteByte, solid) \ diff --git a/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc b/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc index cf2821844..4721cb380 100644 --- a/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc +++ b/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc @@ -483,11 +483,6 @@ MUTATOR_HOOKFUNCTION(ca, ClientCommand_Spectate) return MUT_SPECCMD_CONTINUE; } -MUTATOR_HOOKFUNCTION(ca, WantWeapon) -{ - M_ARGV(2, bool) = true; // all weapons -} - MUTATOR_HOOKFUNCTION(ca, HideTeamNagger) { return true; // doesn't work well with the whole spectator as player thing @@ -502,8 +497,8 @@ MUTATOR_HOOKFUNCTION(ca, GetPlayerStatus) MUTATOR_HOOKFUNCTION(ca, SetWeaponArena) { - // most weapons arena - if (M_ARGV(0, string) == "0" || M_ARGV(0, string) == "") M_ARGV(0, string) = "most"; + if (M_ARGV(0, string) == "0" || M_ARGV(0, string) == "") + M_ARGV(0, string) = autocvar_g_ca_weaponarena; } MUTATOR_HOOKFUNCTION(ca, SV_ParseServerCommand) diff --git a/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qh b/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qh index e383687fc..f6420b852 100644 --- a/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qh +++ b/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qh @@ -12,6 +12,7 @@ bool autocvar_g_ca_team_spawns; //int autocvar_g_ca_teams; int autocvar_g_ca_teams_override; float autocvar_g_ca_warmup; +string autocvar_g_ca_weaponarena = "most"; int ca_teams; diff --git a/qcsrc/common/gamemodes/gamemode/ctf/_mod.inc b/qcsrc/common/gamemodes/gamemode/ctf/_mod.inc index c6d756fbb..663a5f829 100644 --- a/qcsrc/common/gamemodes/gamemode/ctf/_mod.inc +++ b/qcsrc/common/gamemodes/gamemode/ctf/_mod.inc @@ -1,4 +1,5 @@ // generated file; do not modify +#include #ifdef CSQC #include #endif diff --git a/qcsrc/common/gamemodes/gamemode/ctf/ctf.qc b/qcsrc/common/gamemodes/gamemode/ctf/ctf.qc new file mode 100644 index 000000000..a6157c588 --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/ctf/ctf.qc @@ -0,0 +1 @@ +#include "ctf.qh" diff --git a/qcsrc/common/gamemodes/gamemode/ctf/sv_ctf.qc b/qcsrc/common/gamemodes/gamemode/ctf/sv_ctf.qc index 939c70e29..03b2ec9d1 100644 --- a/qcsrc/common/gamemodes/gamemode/ctf/sv_ctf.qc +++ b/qcsrc/common/gamemodes/gamemode/ctf/sv_ctf.qc @@ -440,7 +440,8 @@ void ctf_Handle_Throw(entity player, entity receiver, int droptype) // reset the flag setattachment(flag, NULL, ""); - setorigin(flag, player.origin + FLAG_DROP_OFFSET); + tracebox(player.origin - FLAG_DROP_OFFSET, flag.m_mins, flag.m_maxs, player.origin + FLAG_DROP_OFFSET, MOVE_NOMONSTERS, flag); + setorigin(flag, trace_endpos); flag.owner.flagcarried = NULL; GameRules_scoring_vip(flag.owner, false); flag.owner = NULL; diff --git a/qcsrc/common/gamemodes/gamemode/domination/_mod.inc b/qcsrc/common/gamemodes/gamemode/domination/_mod.inc index ccaa150df..a35415a8f 100644 --- a/qcsrc/common/gamemodes/gamemode/domination/_mod.inc +++ b/qcsrc/common/gamemodes/gamemode/domination/_mod.inc @@ -1,4 +1,5 @@ // generated file; do not modify +#include #ifdef CSQC #include #endif diff --git a/qcsrc/common/gamemodes/gamemode/domination/_mod.qh b/qcsrc/common/gamemodes/gamemode/domination/_mod.qh index b48a0a914..869273e85 100644 --- a/qcsrc/common/gamemodes/gamemode/domination/_mod.qh +++ b/qcsrc/common/gamemodes/gamemode/domination/_mod.qh @@ -1,4 +1,5 @@ // generated file; do not modify +#include #ifdef CSQC #include #endif diff --git a/qcsrc/common/gamemodes/gamemode/domination/domination.qc b/qcsrc/common/gamemodes/gamemode/domination/domination.qc new file mode 100644 index 000000000..3e5bebafb --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/domination/domination.qc @@ -0,0 +1 @@ +#include "domination.qh" diff --git a/qcsrc/common/gamemodes/gamemode/domination/domination.qh b/qcsrc/common/gamemodes/gamemode/domination/domination.qh new file mode 100644 index 000000000..6f70f09be --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/domination/domination.qh @@ -0,0 +1 @@ +#pragma once diff --git a/qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qc b/qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qc index 0f37cf1e8..b1feaa991 100644 --- a/qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qc +++ b/qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qc @@ -587,9 +587,8 @@ MUTATOR_HOOKFUNCTION(ft, TeamBalance_CheckAllowedTeams, CBC_ORDER_EXCLUSIVE) MUTATOR_HOOKFUNCTION(ft, SetWeaponArena) { - // most weapons arena if(M_ARGV(0, string) == "0" || M_ARGV(0, string) == "") - M_ARGV(0, string) = "most"; + M_ARGV(0, string) = autocvar_g_freezetag_weaponarena; } MUTATOR_HOOKFUNCTION(ft, FragCenterMessage) diff --git a/qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qh b/qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qh index df138a93d..3eb753020 100644 --- a/qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qh +++ b/qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qh @@ -6,6 +6,8 @@ int autocvar_g_freezetag_point_limit; int autocvar_g_freezetag_point_leadlimit; bool autocvar_g_freezetag_team_spawns; +string autocvar_g_freezetag_weaponarena = "most_available"; + void freezetag_Initialize(); REGISTER_MUTATOR(ft, false) diff --git a/qcsrc/common/gamemodes/gamemode/keepaway/_mod.inc b/qcsrc/common/gamemodes/gamemode/keepaway/_mod.inc index 2ce6f4493..42fb4b0e2 100644 --- a/qcsrc/common/gamemodes/gamemode/keepaway/_mod.inc +++ b/qcsrc/common/gamemodes/gamemode/keepaway/_mod.inc @@ -1,4 +1,5 @@ // generated file; do not modify +#include #ifdef CSQC #include #endif diff --git a/qcsrc/common/gamemodes/gamemode/keepaway/_mod.qh b/qcsrc/common/gamemodes/gamemode/keepaway/_mod.qh index 8536675f3..93eaf396c 100644 --- a/qcsrc/common/gamemodes/gamemode/keepaway/_mod.qh +++ b/qcsrc/common/gamemodes/gamemode/keepaway/_mod.qh @@ -1,4 +1,5 @@ // generated file; do not modify +#include #ifdef CSQC #include #endif diff --git a/qcsrc/common/gamemodes/gamemode/keepaway/keepaway.qc b/qcsrc/common/gamemodes/gamemode/keepaway/keepaway.qc new file mode 100644 index 000000000..fe03dc9a9 --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/keepaway/keepaway.qc @@ -0,0 +1 @@ +#include "keepaway.qh" diff --git a/qcsrc/common/gamemodes/gamemode/keepaway/keepaway.qh b/qcsrc/common/gamemodes/gamemode/keepaway/keepaway.qh new file mode 100644 index 000000000..6f70f09be --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/keepaway/keepaway.qh @@ -0,0 +1 @@ +#pragma once diff --git a/qcsrc/common/gamemodes/gamemode/keyhunt/_mod.inc b/qcsrc/common/gamemodes/gamemode/keyhunt/_mod.inc index 14802494b..52b5f0df8 100644 --- a/qcsrc/common/gamemodes/gamemode/keyhunt/_mod.inc +++ b/qcsrc/common/gamemodes/gamemode/keyhunt/_mod.inc @@ -1,4 +1,5 @@ // generated file; do not modify +#include #ifdef CSQC #include #endif diff --git a/qcsrc/common/gamemodes/gamemode/keyhunt/_mod.qh b/qcsrc/common/gamemodes/gamemode/keyhunt/_mod.qh index defda7497..46f35788e 100644 --- a/qcsrc/common/gamemodes/gamemode/keyhunt/_mod.qh +++ b/qcsrc/common/gamemodes/gamemode/keyhunt/_mod.qh @@ -1,4 +1,5 @@ // generated file; do not modify +#include #ifdef CSQC #include #endif diff --git a/qcsrc/common/gamemodes/gamemode/keyhunt/keyhunt.qc b/qcsrc/common/gamemodes/gamemode/keyhunt/keyhunt.qc new file mode 100644 index 000000000..724a0e6d4 --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/keyhunt/keyhunt.qc @@ -0,0 +1 @@ +#include "keyhunt.qh" diff --git a/qcsrc/common/gamemodes/gamemode/keyhunt/keyhunt.qh b/qcsrc/common/gamemodes/gamemode/keyhunt/keyhunt.qh new file mode 100644 index 000000000..6f70f09be --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/keyhunt/keyhunt.qh @@ -0,0 +1 @@ +#pragma once diff --git a/qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc b/qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc index 6d420c7a9..bd6401d17 100644 --- a/qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc +++ b/qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc @@ -429,9 +429,10 @@ MUTATOR_HOOKFUNCTION(lms, CheckRules_World) return true; } -MUTATOR_HOOKFUNCTION(lms, WantWeapon) +MUTATOR_HOOKFUNCTION(lms, SetWeaponArena) { - M_ARGV(2, bool) = true; // all weapons + if(M_ARGV(0, string) == "0" || M_ARGV(0, string) == "") + M_ARGV(0, string) = autocvar_g_lms_weaponarena; } MUTATOR_HOOKFUNCTION(lms, GetPlayerStatus) diff --git a/qcsrc/common/gamemodes/gamemode/lms/sv_lms.qh b/qcsrc/common/gamemodes/gamemode/lms/sv_lms.qh index 256620a45..996d371fe 100644 --- a/qcsrc/common/gamemodes/gamemode/lms/sv_lms.qh +++ b/qcsrc/common/gamemodes/gamemode/lms/sv_lms.qh @@ -2,8 +2,12 @@ #include #include + .float lms_spectate_warning; + #define autocvar_g_lms_lives_override cvar("g_lms_lives_override") +string autocvar_g_lms_weaponarena = "most_available"; + void lms_Initialize(); REGISTER_MUTATOR(lms, false) diff --git a/qcsrc/common/gamemodes/gamemode/nexball/_mod.inc b/qcsrc/common/gamemodes/gamemode/nexball/_mod.inc index b229dcdf5..4e9fd6b10 100644 --- a/qcsrc/common/gamemodes/gamemode/nexball/_mod.inc +++ b/qcsrc/common/gamemodes/gamemode/nexball/_mod.inc @@ -1,4 +1,5 @@ // generated file; do not modify +#include #ifdef CSQC #include #endif diff --git a/qcsrc/common/gamemodes/gamemode/nexball/_mod.qh b/qcsrc/common/gamemodes/gamemode/nexball/_mod.qh index 0a3d1e238..657280e6a 100644 --- a/qcsrc/common/gamemodes/gamemode/nexball/_mod.qh +++ b/qcsrc/common/gamemodes/gamemode/nexball/_mod.qh @@ -1,4 +1,5 @@ // generated file; do not modify +#include #ifdef CSQC #include #endif diff --git a/qcsrc/common/gamemodes/gamemode/nexball/nexball.qc b/qcsrc/common/gamemodes/gamemode/nexball/nexball.qc new file mode 100644 index 000000000..4b49dba3e --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/nexball/nexball.qc @@ -0,0 +1 @@ +#include "nexball.qh" diff --git a/qcsrc/common/gamemodes/gamemode/nexball/nexball.qh b/qcsrc/common/gamemodes/gamemode/nexball/nexball.qh new file mode 100644 index 000000000..6f70f09be --- /dev/null +++ b/qcsrc/common/gamemodes/gamemode/nexball/nexball.qh @@ -0,0 +1 @@ +#pragma once diff --git a/qcsrc/common/gamemodes/gamemode/nexball/weapon.qh b/qcsrc/common/gamemodes/gamemode/nexball/weapon.qh index 1e3127eb5..ccabc47a5 100644 --- a/qcsrc/common/gamemodes/gamemode/nexball/weapon.qh +++ b/qcsrc/common/gamemodes/gamemode/nexball/weapon.qh @@ -1,7 +1,7 @@ #pragma once CLASS(BallStealer, PortoLaunch) -/* flags */ ATTRIB(BallStealer, spawnflags, int, WEP_TYPE_OTHER | WEP_FLAG_SPECIALATTACK | WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_NOTRUEAIM); +/* flags */ ATTRIB(BallStealer, spawnflags, int, WEP_TYPE_OTHER | WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_NOTRUEAIM); /* impulse */ ATTRIB(BallStealer, impulse, int, 0); /* refname */ ATTRIB(BallStealer, netname, string, "ballstealer"); /* wepname */ ATTRIB(BallStealer, m_name, string, _("Ball Stealer")); diff --git a/qcsrc/common/items/all.qh b/qcsrc/common/items/all.qh index 623f71b39..3ff4a5415 100644 --- a/qcsrc/common/items/all.qh +++ b/qcsrc/common/items/all.qh @@ -4,7 +4,8 @@ #include "item.qh" -REGISTRY(Items, BITS(7)) +// 24 so it matches the limit for the .items field +REGISTRY(Items, 24) #define Items_from(i) _Items_from(i, NULL) #ifdef GAMEQC REGISTRY_DEPENDS(Items, Models) diff --git a/qcsrc/common/items/inventory.qh b/qcsrc/common/items/inventory.qh index 75abe46cc..017ada75c 100644 --- a/qcsrc/common/items/inventory.qh +++ b/qcsrc/common/items/inventory.qh @@ -15,8 +15,8 @@ ENDCLASS(Inventory) REGISTER_NET_LINKED(ENT_CLIENT_INVENTORY) -const int Inventory_groups_major = 16; -const int Inventory_groups_minor = 8; // ceil(Items_MAX / Inventory_groups_major) +const int Inventory_groups_minor = 8; // exactly 1 byte +const int Inventory_groups_major = 3; // ceil(Items_MAX / Inventory_groups_minor) #define G_MAJOR(id) (floor((id) / Inventory_groups_minor)) #define G_MINOR(id) ((id) % Inventory_groups_minor) @@ -28,7 +28,7 @@ NET_HANDLE(ENT_CLIENT_INVENTORY, bool isnew) { make_pure(this); g_inventory = this; - const int majorBits = ReadShort(); + const int majorBits = ReadByte(); for (int i = 0; i < Inventory_groups_major; ++i) { if (!(majorBits & BIT(i))) { continue; @@ -50,6 +50,7 @@ NET_HANDLE(ENT_CLIENT_INVENTORY, bool isnew) #endif #ifdef SVQC +int minorBitsArr[Inventory_groups_major]; void Inventory_Write(Inventory data) { if (!data) { @@ -58,45 +59,37 @@ void Inventory_Write(Inventory data) } TC(Inventory, data); + for (int i = 0; i < Inventory_groups_major; ++i) + minorBitsArr[i] = 0; + int majorBits = 0; FOREACH(Items, true, { .int fld = inv_items[it.m_id]; const bool changed = data.inventory.(fld) != data.(fld); if (changed) { - majorBits = BITSET(majorBits, BIT(G_MAJOR(it.m_id)), true); + int maj = G_MAJOR(it.m_id); + majorBits = BITSET(majorBits, BIT(maj), true); + minorBitsArr[maj] = BITSET(minorBitsArr[maj], BIT(G_MINOR(it.m_id)), true); } }); - WriteShort(MSG_ENTITY, majorBits); + WriteByte(MSG_ENTITY, majorBits); - int minorBits = 0; - int lastMaj = 0; - int maj = 0; - FOREACH(Items, majorBits & BIT(maj = G_MAJOR(it.m_id)), { - .int fld = inv_items[it.m_id]; - const bool changed = data.inventory.(fld) != (data.inventory.(fld) = data.(fld)); - if (changed) { - if (maj != lastMaj) { - lastMaj = maj; -#define X() MACRO_BEGIN \ - if (minorBits) { \ - WriteByte(MSG_ENTITY, minorBits); \ - for (int j = 0; j < Inventory_groups_minor; ++j) { \ - if (!(minorBits & BIT(j))) { \ - continue; \ - } \ - const entity it = Items_from(Inventory_groups_minor * maj + j); \ - WriteByte(MSG_ENTITY, data.inv_items[it.m_id]); \ - } \ - } \ -MACRO_END - X(); - minorBits = 0; - } - minorBits = BITSET(minorBits, BIT(G_MINOR(it.m_id)), true); - } - }); - X(); -#undef X + for (int i = 0; i < Inventory_groups_major; ++i) + { + if (!(majorBits & BIT(i))) + continue; + + const int minorBits = minorBitsArr[i]; + WriteByte(MSG_ENTITY, minorBits); + for (int j = 0; j < Inventory_groups_minor; ++j) + { + if (!(minorBits & BIT(j))) + continue; + + const entity it = Items_from(Inventory_groups_minor * i + j); + WriteByte(MSG_ENTITY, data.inv_items[it.m_id]); + } + } } #endif diff --git a/qcsrc/common/items/item/ammo.qc b/qcsrc/common/items/item/ammo.qc index 3a13a1f81..739d94aca 100644 --- a/qcsrc/common/items/item/ammo.qc +++ b/qcsrc/common/items/item/ammo.qc @@ -2,15 +2,6 @@ #ifdef SVQC -METHOD(Bullets, m_spawnfunc_hookreplace, GameItem(Bullets this, entity e)) -{ - if (autocvar_sv_q3acompat_machineshotgunswap && !Item_IsLoot(e)) - { - return ITEM_Shells; - } - return this; -} - METHOD(Shells, m_spawnfunc_hookreplace, GameItem(Shells this, entity e)) { if (autocvar_sv_q3acompat_machineshotgunswap && !Item_IsLoot(e)) diff --git a/qcsrc/common/mapinfo.qh b/qcsrc/common/mapinfo.qh index 6fbb7ce89..60db1608a 100644 --- a/qcsrc/common/mapinfo.qh +++ b/qcsrc/common/mapinfo.qh @@ -594,10 +594,13 @@ CLASS(Duel, Gametype) } METHOD(Duel, m_isForcedSupported, bool(Gametype this)) { - // force all DM maps to work in duel?! - // TODO: we should really check the size of maps, some DM maps do not work for duel! - if(!(MapInfo_Map_supportedGametypes & this.m_flags) && (MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DEATHMATCH.m_flags)) - return true; + if(!cvar("g_duel_not_dm_maps")) + { + // if this is set, all DM maps support duel too + // TODO: we should really check the size of maps, some DM maps do not work for duel! + if(!(MapInfo_Map_supportedGametypes & this.m_flags) && (MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DEATHMATCH.m_flags)) + return true; // TODO: references another gametype (alternatively, we could check which gamemodes are always enabled and append this if any are supported) + } return false; } ENDCLASS(Duel) diff --git a/qcsrc/common/mapobjects/trigger/jumppads.qc b/qcsrc/common/mapobjects/trigger/jumppads.qc index a61935eb8..f438fbf01 100644 --- a/qcsrc/common/mapobjects/trigger/jumppads.qc +++ b/qcsrc/common/mapobjects/trigger/jumppads.qc @@ -339,13 +339,57 @@ bool trigger_push_testorigin_for_item(entity tracetest_ent, entity item, vector } #endif +#ifdef SVQC +vector trigger_push_get_start_point(entity this) +{ + // calculate a typical start point for the jump + vector org = (this.absmin + this.absmax) * 0.5; + org.z = this.absmax.z - PL_MIN_CONST.z - 7; + return org; +} + +float trigger_push_get_push_time(entity this, vector endpos) +{ + vector org = trigger_push_get_start_point(this); + + float grav = PHYS_GRAVITY(NULL); + + entity t = this.enemy; + if (t) + { + entity e = spawn(); + setsize(e, PL_MIN_CONST, PL_MAX_CONST); + e.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP; + vector v = trigger_push_calculatevelocity(org, t, this.height, e); + vector v2 = trigger_push_calculatevelocity(endpos, t, this.height, e); + delete(e); + return (v.z + v2.z) / grav; + } + else if (!(this.target && this.target != "")) + { + if (!this.team) + { + vector v = this.movedir; + + float t = v.z / grav; + float jump_height = 1/2 * grav * (t ** 2); + float remaining_height = org.z + jump_height - endpos.z; + float v2_z = sqrt(2 * grav * remaining_height); + + return (v.z + v2_z) / grav; + } + } + return 0; +} +#endif + /// if (item != NULL) returns true if the item can be reached by using this jumppad, false otherwise /// if (item == NULL) tests jumppad's trajectory and eventually spawns waypoints for it (return value doesn't matter) bool trigger_push_test(entity this, entity item) { - // first calculate a typical start point for the jump - vector org = (this.absmin + this.absmax) * 0.5; - org.z = this.absmax.z - PL_MIN_CONST.z - 7; +#ifdef SVQC + vector org = trigger_push_get_start_point(this); +#endif if (this.target) { diff --git a/qcsrc/common/mutators/mutator/dodging/_mod.inc b/qcsrc/common/mutators/mutator/dodging/_mod.inc index 99b822d42..05ce178bd 100644 --- a/qcsrc/common/mutators/mutator/dodging/_mod.inc +++ b/qcsrc/common/mutators/mutator/dodging/_mod.inc @@ -1,4 +1,5 @@ // generated file; do not modify +#include #ifdef CSQC #include #endif diff --git a/qcsrc/common/mutators/mutator/dodging/_mod.qh b/qcsrc/common/mutators/mutator/dodging/_mod.qh index d2c0d05c7..3b106c653 100644 --- a/qcsrc/common/mutators/mutator/dodging/_mod.qh +++ b/qcsrc/common/mutators/mutator/dodging/_mod.qh @@ -1,4 +1,5 @@ // generated file; do not modify +#include #ifdef CSQC #include #endif diff --git a/qcsrc/common/mutators/mutator/dodging/dodging.qc b/qcsrc/common/mutators/mutator/dodging/dodging.qc new file mode 100644 index 000000000..9e7ea204f --- /dev/null +++ b/qcsrc/common/mutators/mutator/dodging/dodging.qc @@ -0,0 +1 @@ +#include "dodging.qh" diff --git a/qcsrc/common/mutators/mutator/dodging/dodging.qh b/qcsrc/common/mutators/mutator/dodging/dodging.qh new file mode 100644 index 000000000..6f70f09be --- /dev/null +++ b/qcsrc/common/mutators/mutator/dodging/dodging.qh @@ -0,0 +1 @@ +#pragma once diff --git a/qcsrc/common/mutators/mutator/overkill/_mod.inc b/qcsrc/common/mutators/mutator/overkill/_mod.inc index 017cc2082..227be4626 100644 --- a/qcsrc/common/mutators/mutator/overkill/_mod.inc +++ b/qcsrc/common/mutators/mutator/overkill/_mod.inc @@ -1,15 +1,16 @@ // generated file; do not modify +#include +#include +#include +#include +#include +#include #ifdef CSQC #include #endif #ifdef SVQC #include #endif -#include -#include -#include -#include -#include #ifdef SVQC #include #endif diff --git a/qcsrc/common/mutators/mutator/overkill/_mod.qh b/qcsrc/common/mutators/mutator/overkill/_mod.qh index 7731f17e1..dc2bb0a5b 100644 --- a/qcsrc/common/mutators/mutator/overkill/_mod.qh +++ b/qcsrc/common/mutators/mutator/overkill/_mod.qh @@ -1,12 +1,13 @@ // generated file; do not modify +#include +#include +#include +#include +#include +#include #ifdef CSQC #include #endif #ifdef SVQC #include #endif -#include -#include -#include -#include -#include diff --git a/qcsrc/common/mutators/mutator/overkill/overkill.qc b/qcsrc/common/mutators/mutator/overkill/overkill.qc new file mode 100644 index 000000000..3cb64ce92 --- /dev/null +++ b/qcsrc/common/mutators/mutator/overkill/overkill.qc @@ -0,0 +1 @@ +#include "overkill.qh" diff --git a/qcsrc/common/mutators/mutator/overkill/overkill.qh b/qcsrc/common/mutators/mutator/overkill/overkill.qh new file mode 100644 index 000000000..3f59c932d --- /dev/null +++ b/qcsrc/common/mutators/mutator/overkill/overkill.qh @@ -0,0 +1,2 @@ +#pragma once + diff --git a/qcsrc/common/mutators/mutator/rocketflying/sv_rocketflying.qc b/qcsrc/common/mutators/mutator/rocketflying/sv_rocketflying.qc index d3c1922b9..58e20568e 100644 --- a/qcsrc/common/mutators/mutator/rocketflying/sv_rocketflying.qc +++ b/qcsrc/common/mutators/mutator/rocketflying/sv_rocketflying.qc @@ -1,19 +1,25 @@ #include "sv_rocketflying.qh" string autocvar_g_rocket_flying; +bool autocvar_g_rocket_flying_disabledelays = true; REGISTER_MUTATOR(rocketflying, expr_evaluate(autocvar_g_rocket_flying)); MUTATOR_HOOKFUNCTION(rocketflying, EditProjectile) { entity proj = M_ARGV(1, entity); - if(proj.classname == "rocket" || proj.classname == "mine") + if(autocvar_g_rocket_flying_disabledelays && (proj.classname == "rocket" || proj.classname == "mine")) { // kill detonate delay of rockets proj.spawnshieldtime = time; } } +MUTATOR_HOOKFUNCTION(rocketflying, AllowRocketJumping) +{ + M_ARGV(0, bool) = true; // force rocket jumping +} + MUTATOR_HOOKFUNCTION(rocketflying, BuildMutatorsString) { M_ARGV(0, string) = strcat(M_ARGV(0, string), ":RocketFlying"); diff --git a/qcsrc/common/mutators/mutator/spawn_near_teammate/_mod.inc b/qcsrc/common/mutators/mutator/spawn_near_teammate/_mod.inc index 46496895a..e8306ea08 100644 --- a/qcsrc/common/mutators/mutator/spawn_near_teammate/_mod.inc +++ b/qcsrc/common/mutators/mutator/spawn_near_teammate/_mod.inc @@ -1,4 +1,5 @@ // generated file; do not modify +#include #ifdef CSQC #include #endif diff --git a/qcsrc/common/mutators/mutator/spawn_near_teammate/_mod.qh b/qcsrc/common/mutators/mutator/spawn_near_teammate/_mod.qh index c4cfe5ada..ea2fd49e6 100644 --- a/qcsrc/common/mutators/mutator/spawn_near_teammate/_mod.qh +++ b/qcsrc/common/mutators/mutator/spawn_near_teammate/_mod.qh @@ -1,4 +1,5 @@ // generated file; do not modify +#include #ifdef CSQC #include #endif diff --git a/qcsrc/common/mutators/mutator/spawn_near_teammate/spawn_near_teammate.qc b/qcsrc/common/mutators/mutator/spawn_near_teammate/spawn_near_teammate.qc new file mode 100644 index 000000000..745374770 --- /dev/null +++ b/qcsrc/common/mutators/mutator/spawn_near_teammate/spawn_near_teammate.qc @@ -0,0 +1 @@ +#include "spawn_near_teammate.qh" diff --git a/qcsrc/common/mutators/mutator/spawn_near_teammate/spawn_near_teammate.qh b/qcsrc/common/mutators/mutator/spawn_near_teammate/spawn_near_teammate.qh new file mode 100644 index 000000000..3f59c932d --- /dev/null +++ b/qcsrc/common/mutators/mutator/spawn_near_teammate/spawn_near_teammate.qh @@ -0,0 +1,2 @@ +#pragma once + diff --git a/qcsrc/common/notifications/all.inc b/qcsrc/common/notifications/all.inc index 412521272..393133055 100644 --- a/qcsrc/common/notifications/all.inc +++ b/qcsrc/common/notifications/all.inc @@ -93,18 +93,12 @@ #define N_GNTLOFF 1 #define N__ALWAYS 2 -#define MULTITEAM_ANNCE2(prefix, default, sound, channel, volume, position) \ - MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, default, sprintf(sound, strtolower(STATIC_NAME_TEAM_1)), channel, volume, position) \ - MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_2, prefix##_BLUE, prefix, default, sprintf(sound, strtolower(STATIC_NAME_TEAM_2)), channel, volume, position) -#define MULTITEAM_ANNCE3(prefix, default, sound, channel, volume, position) \ - MULTITEAM_ANNCE2(prefix, default, sound, channel, volume, position) \ - MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_3, prefix##_YELLOW, prefix, default, sprintf(sound, strtolower(STATIC_NAME_TEAM_3)), channel, volume, position) -#define MULTITEAM_ANNCE4(prefix, default, sound, channel, volume, position) \ - MULTITEAM_ANNCE3(prefix, default, sound, channel, volume, position) \ - MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, default, sprintf(sound, strtolower(STATIC_NAME_TEAM_4)), channel, volume, position) -#define MULTITEAM_ANNCE(prefix, teams, default, sound, channel, volume, position) \ - NOTIF_ADD_AUTOCVAR(ANNCE_##prefix, default) \ - MULTITEAM_ANNCE##teams(prefix, default, sound, channel, volume, position) +#define MULTITEAM_ANNCE(prefix, defaultvalue, sound, channel, volume, position) \ + NOTIF_ADD_AUTOCVAR(ANNCE_##prefix, defaultvalue) \ + MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, defaultvalue, sprintf(sound, strtolower(STATIC_NAME_TEAM_1)), channel, volume, position) \ + MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_2, prefix##_BLUE, prefix, defaultvalue, sprintf(sound, strtolower(STATIC_NAME_TEAM_2)), channel, volume, position) \ + MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_3, prefix##_YELLOW, prefix, defaultvalue, sprintf(sound, strtolower(STATIC_NAME_TEAM_3)), channel, volume, position) \ + MSG_ANNCE_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, defaultvalue, sprintf(sound, strtolower(STATIC_NAME_TEAM_4)), channel, volume, position) // MSG_ANNCE_NOTIFICATIONS MSG_ANNCE_NOTIF(ACHIEVEMENT_AIRSHOT, N_GNTLOFF, "airshot", CH_INFO, VOL_BASEVOICE, ATTEN_NONE) @@ -222,45 +216,39 @@ #define N_CONSOLE 1 #define N_CHATCON 2 -#define MULTITEAM_INFO2(prefix, default, strnum, flnum, args, hudargs, icon, normal, gentle, type) \ - MSG_INFO_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, default, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_1)), TCR(normal, type, 1), TCR(gentle, type, 1)) \ - MSG_INFO_NOTIF_TEAM(NUM_TEAM_2, prefix##_BLUE, prefix, default, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_2)), TCR(normal, type, 2), TCR(gentle, type, 2)) -#define MULTITEAM_INFO3(prefix, default, strnum, flnum, args, hudargs, icon, normal, gentle, type) \ - MULTITEAM_INFO2(prefix, default, strnum, flnum, args, hudargs, icon, normal, gentle, type) \ - MSG_INFO_NOTIF_TEAM(NUM_TEAM_3, prefix##_YELLOW, prefix, default, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_3)), TCR(normal, type, 3), TCR(gentle, type, 3)) -#define MULTITEAM_INFO4(prefix, default, strnum, flnum, args, hudargs, icon, normal, gentle, type) \ - MULTITEAM_INFO3(prefix, default, strnum, flnum, args, hudargs, icon, normal, gentle, type) \ - MSG_INFO_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, default, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_4)), TCR(normal, type, 4), TCR(gentle, type, 4)) -#define MULTITEAM_INFO(prefix, teams, default, strnum, flnum, args, hudargs, icon, normal, gentle, type) \ - NOTIF_ADD_AUTOCVAR(INFO_##prefix, default) \ - MULTITEAM_INFO##teams(prefix, default, strnum, flnum, args, hudargs, icon, normal, gentle, type) +#define MULTITEAM_INFO(prefix, defaultvalue, strnum, flnum, args, hudargs, icon, normal, gentle, type) \ + NOTIF_ADD_AUTOCVAR(INFO_##prefix, defaultvalue) \ + MSG_INFO_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, defaultvalue, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_1)), TCR(normal, type, 1), TCR(gentle, type, 1)) \ + MSG_INFO_NOTIF_TEAM(NUM_TEAM_2, prefix##_BLUE, prefix, defaultvalue, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_2)), TCR(normal, type, 2), TCR(gentle, type, 2)) \ + MSG_INFO_NOTIF_TEAM(NUM_TEAM_3, prefix##_YELLOW, prefix, defaultvalue, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_3)), TCR(normal, type, 3), TCR(gentle, type, 3)) \ + MSG_INFO_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, defaultvalue, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_4)), TCR(normal, type, 4), TCR(gentle, type, 4)) // MSG_INFO_NOTIFICATIONS MSG_INFO_NOTIF(CHAT_NOSPECTATORS, N_CHATCON, 0, 0, "", "", "", _("^F4NOTE: ^BGSpectator chat is not sent to players during the match"), "") - MULTITEAM_INFO(CTF_CAPTURE, 4, N_CONSOLE, 1, 0, "s1", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag"), "", FLAG) - MULTITEAM_INFO(CTF_CAPTURE_BROKEN, 4, N_CONSOLE, 2, 2, "s1 f1dtime s2 f2dtime", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds, breaking ^BG%s^BG's previous record of ^F2%s^BG seconds"), "", FLAG) + MULTITEAM_INFO(CTF_CAPTURE, N_CONSOLE, 1, 0, "s1", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag"), "", FLAG) + MULTITEAM_INFO(CTF_CAPTURE_BROKEN, N_CONSOLE, 2, 2, "s1 f1dtime s2 f2dtime", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds, breaking ^BG%s^BG's previous record of ^F2%s^BG seconds"), "", FLAG) MSG_INFO_NOTIF(CTF_CAPTURE_NEUTRAL, N_CONSOLE, 1, 0, "s1", "s1", "notify_neutral_captured", _("^BG%s^BG captured the flag"), "") - MULTITEAM_INFO(CTF_CAPTURE_TIME, 4, N_CONSOLE, 1, 1, "s1 f1dtime", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds"), "", FLAG) - MULTITEAM_INFO(CTF_CAPTURE_UNBROKEN, 4, N_CONSOLE, 2, 2, "s1 f1dtime s2 f2dtime", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag in ^F2%s^BG seconds, failing to break ^BG%s^BG's previous record of ^F1%s^BG seconds"), "", FLAG) - MULTITEAM_INFO(CTF_FLAGRETURN_ABORTRUN, 4, N_CONSOLE, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag was returned to base by its owner"), "", FLAG) + MULTITEAM_INFO(CTF_CAPTURE_TIME, N_CONSOLE, 1, 1, "s1 f1dtime", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds"), "", FLAG) + MULTITEAM_INFO(CTF_CAPTURE_UNBROKEN, N_CONSOLE, 2, 2, "s1 f1dtime s2 f2dtime", "s1", "notify_%s_captured", _("^BG%s^BG captured the ^TC^TT^BG flag in ^F2%s^BG seconds, failing to break ^BG%s^BG's previous record of ^F1%s^BG seconds"), "", FLAG) + MULTITEAM_INFO(CTF_FLAGRETURN_ABORTRUN, N_CONSOLE, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag was returned to base by its owner"), "", FLAG) MSG_INFO_NOTIF(CTF_FLAGRETURN_ABORTRUN_NEUTRAL, N_CONSOLE, 0, 0, "", "", "", _("^BGThe flag was returned by its owner"), "") - MULTITEAM_INFO(CTF_FLAGRETURN_DAMAGED, 4, N_CONSOLE, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag was destroyed and returned to base"), "", FLAG) + MULTITEAM_INFO(CTF_FLAGRETURN_DAMAGED, N_CONSOLE, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag was destroyed and returned to base"), "", FLAG) MSG_INFO_NOTIF(CTF_FLAGRETURN_DAMAGED_NEUTRAL, N_CONSOLE, 0, 0, "", "", "", _("^BGThe flag was destroyed and returned to base"), "") - MULTITEAM_INFO(CTF_FLAGRETURN_DROPPED, 4, N_CONSOLE, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag was dropped in the base and returned itself"), "", FLAG) + MULTITEAM_INFO(CTF_FLAGRETURN_DROPPED, N_CONSOLE, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag was dropped in the base and returned itself"), "", FLAG) MSG_INFO_NOTIF(CTF_FLAGRETURN_DROPPED_NEUTRAL, N_CONSOLE, 0, 0, "", "", "", _("^BGThe flag was dropped in the base and returned itself"), "") - MULTITEAM_INFO(CTF_FLAGRETURN_NEEDKILL, 4, N_CONSOLE, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag fell somewhere it couldn't be reached and returned to base"), "", FLAG) + MULTITEAM_INFO(CTF_FLAGRETURN_NEEDKILL, N_CONSOLE, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag fell somewhere it couldn't be reached and returned to base"), "", FLAG) MSG_INFO_NOTIF(CTF_FLAGRETURN_NEEDKILL_NEUTRAL, N_CONSOLE, 0, 0, "", "", "", _("^BGThe flag fell somewhere it couldn't be reached and returned to base"), "") - MULTITEAM_INFO(CTF_FLAGRETURN_SPEEDRUN, 4, N_CONSOLE, 0, 1, "f1dtime", "", "", _("^BGThe ^TC^TT^BG flag became impatient after ^F1%.2f^BG seconds and returned itself"), "", FLAG) + MULTITEAM_INFO(CTF_FLAGRETURN_SPEEDRUN, N_CONSOLE, 0, 1, "f1dtime", "", "", _("^BGThe ^TC^TT^BG flag became impatient after ^F1%.2f^BG seconds and returned itself"), "", FLAG) MSG_INFO_NOTIF(CTF_FLAGRETURN_SPEEDRUN_NEUTRAL, N_CONSOLE, 0, 1, "f1dtime", "", "", _("^BGThe flag became impatient after ^F1%.2f^BG seconds and returned itself"), "") - MULTITEAM_INFO(CTF_FLAGRETURN_TIMEOUT, 4, N_CONSOLE, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag has returned to the base"), "", FLAG) + MULTITEAM_INFO(CTF_FLAGRETURN_TIMEOUT, N_CONSOLE, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG flag has returned to the base"), "", FLAG) MSG_INFO_NOTIF(CTF_FLAGRETURN_TIMEOUT_NEUTRAL, N_CONSOLE, 0, 0, "", "", "", _("^BGThe flag has returned to the base"), "") - MULTITEAM_INFO(CTF_LOST, 4, N_CONSOLE, 1, 0, "s1", "s1", "notify_%s_lost", _("^BG%s^BG lost the ^TC^TT^BG flag"), "", FLAG) + MULTITEAM_INFO(CTF_LOST, N_CONSOLE, 1, 0, "s1", "s1", "notify_%s_lost", _("^BG%s^BG lost the ^TC^TT^BG flag"), "", FLAG) MSG_INFO_NOTIF(CTF_LOST_NEUTRAL, N_CONSOLE, 1, 0, "s1", "s1", "notify_neutral_lost", _("^BG%s^BG lost the flag"), "") - MULTITEAM_INFO(CTF_PICKUP, 4, N_CONSOLE, 1, 0, "s1", "s1", "notify_%s_taken", _("^BG%s^BG got the ^TC^TT^BG flag"), "", FLAG) + MULTITEAM_INFO(CTF_PICKUP, N_CONSOLE, 1, 0, "s1", "s1", "notify_%s_taken", _("^BG%s^BG got the ^TC^TT^BG flag"), "", FLAG) MSG_INFO_NOTIF(CTF_PICKUP_NEUTRAL, N_CONSOLE, 1, 0, "s1", "s1", "notify_neutral_taken", _("^BG%s^BG got the flag"), "") - MULTITEAM_INFO(CTF_RETURN, 4, N_CONSOLE, 1, 0, "s1", "s1", "notify_%s_returned", _("^BG%s^BG returned the ^TC^TT^BG flag"), "", FLAG) - MULTITEAM_INFO(CTF_RETURN_MONSTER, 4, N_CONSOLE, 1, 0, "s1", "s1", "notify_%s_returned", _("^BG%s^BG returned the ^TC^TT^BG flag"), "", FLAG) + MULTITEAM_INFO(CTF_RETURN, N_CONSOLE, 1, 0, "s1", "s1", "notify_%s_returned", _("^BG%s^BG returned the ^TC^TT^BG flag"), "", FLAG) + MULTITEAM_INFO(CTF_RETURN_MONSTER, N_CONSOLE, 1, 0, "s1", "s1", "notify_%s_returned", _("^BG%s^BG returned the ^TC^TT^BG flag"), "", FLAG) MSG_INFO_NOTIF(COINTOSS, N_CHATCON, 1, 0, "s1", "", "", _("^F2Throwing coin... Result: %s^F2!"), "") @@ -356,7 +344,7 @@ MSG_INFO_NOTIF(DEATH_SELF_VH_WAKI_ROCKET, N_CONSOLE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 couldn't find shelter from a Racer rocket%s%s"), "") MSG_INFO_NOTIF(DEATH_SELF_VOID, N_CONSOLE, 3, 1, "s1 s2 s2loc spree_lost", "s1", "notify_void", "^BG%s^K1 %s^K1%s%s", "") - MULTITEAM_INFO(DEATH_TEAMKILL, 4, N_CONSOLE, 3, 1, "s1 s2 s3loc spree_end", "s2 s1", "notify_teamkill_%s", _("^BG%s^K1 was betrayed by ^BG%s^K1%s%s"), "", NAME) + MULTITEAM_INFO(DEATH_TEAMKILL, N_CONSOLE, 3, 1, "s1 s2 s3loc spree_end", "s2 s1", "notify_teamkill_%s", _("^BG%s^K1 was betrayed by ^BG%s^K1%s%s"), "", NAME) MSG_INFO_NOTIF(DOMINATION_CAPTURE_TIME, N_CONSOLE, 2, 2, "s1 s2 f1 f1points f2", "", "", _("^BG%s^BG%s^BG (%s %s every %s seconds)"), "") @@ -367,7 +355,7 @@ MSG_INFO_NOTIF(FREEZETAG_AUTO_REVIVED, N_CONSOLE, 1, 1, "s1 f1", "", "", _("^BG%s^K3 was automatically revived after %s second(s)"), "") MSG_INFO_NOTIF(FREEZETAG_SELF, N_CONSOLE, 1, 0, "s1", "", "", _("^BG%s^K1 froze themself"), "") - MULTITEAM_INFO(ROUND_TEAM_WIN, 4, N_CONSOLE, 0, 0, "", "", "", _("^TC^TT^BG team wins the round"), "", NAME) + MULTITEAM_INFO(ROUND_TEAM_WIN, N_CONSOLE, 0, 0, "", "", "", _("^TC^TT^BG team wins the round"), "", NAME) MSG_INFO_NOTIF(ROUND_PLAYER_WIN, N_CONSOLE, 1, 0, "s1", "", "", _("^BG%s^BG wins the round"), "") MSG_INFO_NOTIF(ROUND_TIED, N_CONSOLE, 0, 0, "", "", "", _("^BGRound tied"), "") MSG_INFO_NOTIF(ROUND_OVER, N_CONSOLE, 0, 0, "", "", "", _("^BGRound over, there's no winner"), "") @@ -389,29 +377,29 @@ MSG_INFO_NOTIF(CONNECTING, N_CONSOLE, 1, 0, "s1", "", "", _("^BG%s^BG is connecting..."), "") MSG_INFO_NOTIF(JOIN_CONNECT, N_CHATCON, 1, 0, "s1", "", "", _("^BG%s^F3 connected"), "") MSG_INFO_NOTIF(JOIN_PLAY, N_CHATCON, 1, 0, "s1", "", "", _("^BG%s^F3 is now playing"), "") - MULTITEAM_INFO(JOIN_PLAY_TEAM, 4, N_CHATCON, 1, 0, "s1", "", "", _("^BG%s^F3 is now playing on the ^TC^TT team"), "", NAME) + MULTITEAM_INFO(JOIN_PLAY_TEAM, N_CHATCON, 1, 0, "s1", "", "", _("^BG%s^F3 is now playing on the ^TC^TT team"), "", NAME) MSG_INFO_NOTIF(KEEPAWAY_DROPPED, N_CONSOLE, 1, 0, "s1", "s1", "notify_balldropped", _("^BG%s^BG has dropped the ball!"), "") MSG_INFO_NOTIF(KEEPAWAY_PICKUP, N_CONSOLE, 1, 0, "s1", "s1", "notify_ballpickedup", _("^BG%s^BG has picked up the ball!"), "") - MULTITEAM_INFO(KEYHUNT_CAPTURE, 4, N_CONSOLE, 1, 0, "s1", "", "", _("^BG%s^BG captured the keys for the ^TC^TT team"), "", NAME) - MULTITEAM_INFO(KEYHUNT_DROP, 4, N_CONSOLE, 1, 0, "s1", "", "", _("^BG%s^BG dropped the ^TC^TT Key"), "", KEY) - MULTITEAM_INFO(KEYHUNT_LOST, 4, N_CONSOLE, 1, 0, "s1", "", "", _("^BG%s^BG lost the ^TC^TT Key"), "", KEY) - MULTITEAM_INFO(KEYHUNT_PUSHED, 4, N_CONSOLE, 2, 0, "s1 s2", "", "", _("^BG%s^BG pushed %s^BG causing the ^TC^TT Key ^BGdestruction"), "", KEY) - MULTITEAM_INFO(KEYHUNT_DESTROYED, 4, N_CONSOLE, 1, 0, "s1", "", "", _("^BG%s^BG destroyed the ^TC^TT Key"), "", KEY) - MULTITEAM_INFO(KEYHUNT_PICKUP, 4, N_CONSOLE, 1, 0, "s1", "", "", _("^BG%s^BG picked up the ^TC^TT Key"), "", KEY) + MULTITEAM_INFO(KEYHUNT_CAPTURE, N_CONSOLE, 1, 0, "s1", "", "", _("^BG%s^BG captured the keys for the ^TC^TT team"), "", NAME) + MULTITEAM_INFO(KEYHUNT_DROP, N_CONSOLE, 1, 0, "s1", "", "", _("^BG%s^BG dropped the ^TC^TT Key"), "", KEY) + MULTITEAM_INFO(KEYHUNT_LOST, N_CONSOLE, 1, 0, "s1", "", "", _("^BG%s^BG lost the ^TC^TT Key"), "", KEY) + MULTITEAM_INFO(KEYHUNT_PUSHED, N_CONSOLE, 2, 0, "s1 s2", "", "", _("^BG%s^BG pushed %s^BG causing the ^TC^TT Key ^BGdestruction"), "", KEY) + MULTITEAM_INFO(KEYHUNT_DESTROYED, N_CONSOLE, 1, 0, "s1", "", "", _("^BG%s^BG destroyed the ^TC^TT Key"), "", KEY) + MULTITEAM_INFO(KEYHUNT_PICKUP, N_CONSOLE, 1, 0, "s1", "", "", _("^BG%s^BG picked up the ^TC^TT Key"), "", KEY) MSG_INFO_NOTIF(LMS_FORFEIT, N_CHATCON, 1, 0, "s1", "", "", _("^BG%s^F3 forfeited"), "") MSG_INFO_NOTIF(LMS_NOLIVES, N_CONSOLE, 1, 0, "s1", "", "", _("^BG%s^F3 has no more lives left"), "") MSG_INFO_NOTIF(MONSTERS_DISABLED, N_CONSOLE, 0, 0, "", "", "", _("^BGMonsters are currently disabled"), "") - MULTITEAM_INFO(NEXBALL_RETURN_HELD, 4, N_CONSOLE, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG team held the ball for too long"), "", NAME) + MULTITEAM_INFO(NEXBALL_RETURN_HELD, N_CONSOLE, 0, 0, "", "", "", _("^BGThe ^TC^TT^BG team held the ball for too long"), "", NAME) MSG_INFO_NOTIF(ONSLAUGHT_CAPTURE, N_CONSOLE, 2, 0, "s1 s2", "", "", _("^BG%s^BG captured %s^BG control point"), "") - MULTITEAM_INFO(ONSLAUGHT_CPDESTROYED, 4, N_CONSOLE, 2, 0, "s1 s2", "", "", _("^TC^TT^BG team %s^BG control point has been destroyed by %s"), "", NAME) - MULTITEAM_INFO(ONSLAUGHT_GENDESTROYED, 4, N_CONSOLE, 0, 0, "", "", "", _("^TC^TT^BG generator has been destroyed"), "", GENERATOR) - MULTITEAM_INFO(ONSLAUGHT_GENDESTROYED_OVERTIME, 4, N_CONSOLE, 0, 0, "", "", "", _("^TC^TT^BG generator spontaneously combusted due to overtime!"), "", GENERATOR) + MULTITEAM_INFO(ONSLAUGHT_CPDESTROYED, N_CONSOLE, 2, 0, "s1 s2", "", "", _("^TC^TT^BG team %s^BG control point has been destroyed by %s"), "", NAME) + MULTITEAM_INFO(ONSLAUGHT_GENDESTROYED, N_CONSOLE, 0, 0, "", "", "", _("^TC^TT^BG generator has been destroyed"), "", GENERATOR) + MULTITEAM_INFO(ONSLAUGHT_GENDESTROYED_OVERTIME, N_CONSOLE, 0, 0, "", "", "", _("^TC^TT^BG generator spontaneously combusted due to overtime!"), "", GENERATOR) MSG_INFO_NOTIF(POWERUP_INVISIBILITY, N_CONSOLE, 1, 0, "s1", "s1", "strength", _("^BG%s^K1 picked up Invisibility"), "") MSG_INFO_NOTIF(POWERUP_SHIELD, N_CONSOLE, 1, 0, "s1", "s1", "shield", _("^BG%s^K1 picked up Shield"), "") @@ -436,7 +424,7 @@ MULTIICON_INFO(MINIGAME_INVITE, N_CONSOLE, 2, 0, "s2 minigame1_name s1", "s2", "minigame1_d", "minigames/%s/icon_notif", _("^F4You have been invited by ^BG%s^F4 to join their game of ^F2%s^F4 (^F1%s^F4)"), "") - MULTITEAM_INFO(SCORES, 4, N_CONSOLE, 0, 0, "", "", "", _("^TC^TT ^BGteam scores!"), "", NAME) + MULTITEAM_INFO(SCORES, N_CONSOLE, 0, 0, "", "", "", _("^TC^TT ^BGteam scores!"), "", NAME) MSG_INFO_NOTIF(SPECTATE_WARNING, N_CONSOLE, 0, 1, "f1secs", "", "", _("^F2You have to become a player within the next %s, otherwise you will be kicked, because spectating isn't allowed at this time!"), "") @@ -524,18 +512,12 @@ #define N_DISABL 0 #define N_ENABLE 1 -#define MULTITEAM_CENTER2(prefix, default, strnum, flnum, args, cpid, durcnt, normal, gentle, type) \ - MSG_CENTER_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, default, strnum, flnum, args, cpid, durcnt, TCR(normal, type, 1), TCR(gentle, type, 1)) \ - MSG_CENTER_NOTIF_TEAM(NUM_TEAM_2, prefix##_BLUE, prefix, default, strnum, flnum, args, cpid, durcnt, TCR(normal, type, 2), TCR(gentle, type, 2)) -#define MULTITEAM_CENTER3(prefix, default, strnum, flnum, args, cpid, durcnt, normal, gentle, type) \ - MULTITEAM_CENTER2(prefix, default, strnum, flnum, args, cpid, durcnt, normal, gentle, type) \ - MSG_CENTER_NOTIF_TEAM(NUM_TEAM_3, prefix##_YELLOW, prefix, default, strnum, flnum, args, cpid, durcnt, TCR(normal, type, 3), TCR(gentle, type, 3)) -#define MULTITEAM_CENTER4(prefix, default, strnum, flnum, args, cpid, durcnt, normal, gentle, type) \ - MULTITEAM_CENTER3(prefix, default, strnum, flnum, args, cpid, durcnt, normal, gentle, type) \ - MSG_CENTER_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, default, strnum, flnum, args, cpid, durcnt, TCR(normal, type, 4), TCR(gentle, type, 4)) -#define MULTITEAM_CENTER(prefix, teams, default, strnum, flnum, args, cpid, durcnt, normal, gentle, type) \ - NOTIF_ADD_AUTOCVAR(CENTER_##prefix, default) \ - MULTITEAM_CENTER##teams(prefix, default, strnum, flnum, args, cpid, durcnt, normal, gentle, type) +#define MULTITEAM_CENTER(prefix, defaultvalue, strnum, flnum, args, cpid, durcnt, normal, gentle, type) \ + NOTIF_ADD_AUTOCVAR(CENTER_##prefix, defaultvalue) \ + MSG_CENTER_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, defaultvalue, strnum, flnum, args, cpid, durcnt, TCR(normal, type, 1), TCR(gentle, type, 1)) \ + MSG_CENTER_NOTIF_TEAM(NUM_TEAM_2, prefix##_BLUE, prefix, defaultvalue, strnum, flnum, args, cpid, durcnt, TCR(normal, type, 2), TCR(gentle, type, 2)) \ + MSG_CENTER_NOTIF_TEAM(NUM_TEAM_3, prefix##_YELLOW, prefix, defaultvalue, strnum, flnum, args, cpid, durcnt, TCR(normal, type, 3), TCR(gentle, type, 3)) \ + MSG_CENTER_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, defaultvalue, strnum, flnum, args, cpid, durcnt, TCR(normal, type, 4), TCR(gentle, type, 4)) // MSG_CENTER_NOTIFICATIONS MSG_CENTER_NOTIF(ALONE, N_ENABLE, 0, 0, "", CPID_Null, "0 0", _("^F4You are now alone!"), "") @@ -559,18 +541,18 @@ MSG_CENTER_NOTIF(CTF_CAPTURESHIELD_FREE, N_ENABLE, 0, 0, "", CPID_CTF_CAPSHIELD, "0 0", _("^BGYou are now free.\n^BGFeel free to ^F2try to capture^BG the flag again\n^BGif you think you will succeed."), "") MSG_CENTER_NOTIF(CTF_CAPTURESHIELD_INACTIVE, N_ENABLE, 0, 0, "", CPID_CTF_CAPSHIELD, "0 0", _("^BGThis flag is currently inactive"), "") MSG_CENTER_NOTIF(CTF_CAPTURESHIELD_SHIELDED, N_ENABLE, 0, 0, "", CPID_CTF_CAPSHIELD, "0 0", _("^BGYou are now ^F1shielded^BG from the flag(s)\n^BGfor ^F2too many unsuccessful attempts^BG to capture.\n^BGMake some defensive scores before trying again."), "") - MULTITEAM_CENTER(CTF_CAPTURE, 4, N_ENABLE, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou captured the ^TC^TT^BG flag!"), "", FLAG) + MULTITEAM_CENTER(CTF_CAPTURE, N_ENABLE, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou captured the ^TC^TT^BG flag!"), "", FLAG) MSG_CENTER_NOTIF(CTF_CAPTURE_NEUTRAL, N_ENABLE, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou captured the flag!"), "") MSG_CENTER_NOTIF(CTF_FLAG_THROW_PUNISH, N_ENABLE, 0, 1, "f1secs", CPID_CTF_LOWPRIO, "0 0", _("^BGToo many flag throws! Throwing disabled for %s."), "") - MULTITEAM_CENTER(CTF_PASS_OTHER, 4, N_ENABLE, 2, 0, "s1 s2", CPID_CTF_PASS, "0 0", _("^BG%s^BG passed the ^TC^TT^BG flag to %s"), "", FLAG) + MULTITEAM_CENTER(CTF_PASS_OTHER, N_ENABLE, 2, 0, "s1 s2", CPID_CTF_PASS, "0 0", _("^BG%s^BG passed the ^TC^TT^BG flag to %s"), "", FLAG) MSG_CENTER_NOTIF(CTF_PASS_OTHER_NEUTRAL, N_ENABLE, 2, 0, "s1 s2", CPID_CTF_PASS, "0 0", _("^BG%s^BG passed the flag to %s"), "") - MULTITEAM_CENTER(CTF_PASS_RECEIVED, 4, N_ENABLE, 1, 0, "s1", CPID_CTF_PASS, "0 0", _("^BGYou received the ^TC^TT^BG flag from %s"), "", FLAG) + MULTITEAM_CENTER(CTF_PASS_RECEIVED, N_ENABLE, 1, 0, "s1", CPID_CTF_PASS, "0 0", _("^BGYou received the ^TC^TT^BG flag from %s"), "", FLAG) MSG_CENTER_NOTIF(CTF_PASS_RECEIVED_NEUTRAL, N_ENABLE, 1, 0, "s1", CPID_CTF_PASS, "0 0", _("^BGYou received the flag from %s"), "") MSG_CENTER_NOTIF(CTF_PASS_REQUESTED, N_ENABLE, 1, 0, "pass_key s1", CPID_CTF_PASS, "0 0", _("^BGPress ^F2%s^BG to receive the flag from %s^BG"), "") MSG_CENTER_NOTIF(CTF_PASS_REQUESTING, N_ENABLE, 1, 0, "s1", CPID_CTF_PASS, "0 0", _("^BGRequesting %s^BG to pass you the flag"), "") - MULTITEAM_CENTER(CTF_PASS_SENT, 4, N_ENABLE, 1, 0, "s1", CPID_CTF_PASS, "0 0", _("^BGYou passed the ^TC^TT^BG flag to %s"), "", FLAG) + MULTITEAM_CENTER(CTF_PASS_SENT, N_ENABLE, 1, 0, "s1", CPID_CTF_PASS, "0 0", _("^BGYou passed the ^TC^TT^BG flag to %s"), "", FLAG) MSG_CENTER_NOTIF(CTF_PASS_SENT_NEUTRAL, N_ENABLE, 1, 0, "s1", CPID_CTF_PASS, "0 0", _("^BGYou passed the flag to %s"), "") - MULTITEAM_CENTER(CTF_PICKUP, 4, N_ENABLE, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou got the ^TC^TT^BG flag!"), "", FLAG) + MULTITEAM_CENTER(CTF_PICKUP, N_ENABLE, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou got the ^TC^TT^BG flag!"), "", FLAG) MSG_CENTER_NOTIF(CTF_PICKUP_NEUTRAL, N_ENABLE, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou got the flag!"), "") MSG_CENTER_NOTIF(CTF_PICKUP_RETURN, N_ENABLE, 1, 0, "s1", CPID_CTF_LOWPRIO, "0 0", _("^BGYou got your %steam^BG's flag, return it!"), "") MSG_CENTER_NOTIF(CTF_PICKUP_RETURN_ENEMY, N_ENABLE, 1, 0, "s1", CPID_CTF_LOWPRIO, "0 0", _("^BGYou got the %senemy^BG's flag, return it!"), "") @@ -580,12 +562,12 @@ MSG_CENTER_NOTIF(CTF_PICKUP_ENEMY_NEUTRAL_VERBOSE, N_ENABLE, 2, 0, "s1 s2 s1", CPID_CTF_LOWPRIO, "0 0", _("^BGThe %senemy (^BG%s%s)^BG got the flag! Retrieve it!"), "") MSG_CENTER_NOTIF(CTF_PICKUP_ENEMY_TEAM, N_ENABLE, 1, 0, "s1", CPID_CTF_LOWPRIO, "0 0", _("^BGThe %senemy^BG got their flag! Retrieve it!"), "") MSG_CENTER_NOTIF(CTF_PICKUP_ENEMY_TEAM_VERBOSE, N_ENABLE, 2, 0, "s1 s2 s1", CPID_CTF_LOWPRIO, "0 0", _("^BGThe %senemy (^BG%s%s)^BG got their flag! Retrieve it!"), "") - MULTITEAM_CENTER(CTF_PICKUP_TEAM, 4, N_ENABLE, 1, 0, "s1", CPID_CTF_LOWPRIO, "0 0", _("^BGYour %steam mate^BG got the ^TC^TT^BG flag! Protect them!"), "", FLAG) - MULTITEAM_CENTER(CTF_PICKUP_TEAM_VERBOSE, 4, N_ENABLE, 2, 0, "s1 s2 s1", CPID_CTF_LOWPRIO, "0 0", _("^BGYour %steam mate (^BG%s%s)^BG got the ^TC^TT^BG flag! Protect them!"), "", FLAG) + MULTITEAM_CENTER(CTF_PICKUP_TEAM, N_ENABLE, 1, 0, "s1", CPID_CTF_LOWPRIO, "0 0", _("^BGYour %steam mate^BG got the ^TC^TT^BG flag! Protect them!"), "", FLAG) + MULTITEAM_CENTER(CTF_PICKUP_TEAM_VERBOSE, N_ENABLE, 2, 0, "s1 s2 s1", CPID_CTF_LOWPRIO, "0 0", _("^BGYour %steam mate (^BG%s%s)^BG got the ^TC^TT^BG flag! Protect them!"), "", FLAG) MSG_CENTER_NOTIF(CTF_PICKUP_TEAM_NEUTRAL, N_ENABLE, 1, 0, "s1", CPID_CTF_LOWPRIO, "0 0", _("^BGYour %steam mate^BG got the flag! Protect them!"), "") MSG_CENTER_NOTIF(CTF_PICKUP_TEAM_VERBOSE_NEUTRAL, N_ENABLE, 2, 0, "s1 s2 s1", CPID_CTF_LOWPRIO, "0 0", _("^BGYour %steam mate (^BG%s%s)^BG got the flag! Protect them!"), "") MSG_CENTER_NOTIF(CTF_PICKUP_VISIBLE, N_ENABLE, 0, 0, "", CPID_STALEMATE, "0 0", _("^BGEnemies can now see you on radar!"), "") - MULTITEAM_CENTER(CTF_RETURN, 4, N_ENABLE, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou returned the ^TC^TT^BG flag!"), "", FLAG) + MULTITEAM_CENTER(CTF_RETURN, N_ENABLE, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou returned the ^TC^TT^BG flag!"), "", FLAG) MSG_CENTER_NOTIF(CTF_STALEMATE_CARRIER, N_ENABLE, 0, 0, "", CPID_STALEMATE, "0 0", _("^BGStalemate! Enemies can now see you on radar!"), "") MSG_CENTER_NOTIF(CTF_STALEMATE_OTHER, N_ENABLE, 0, 0, "", CPID_STALEMATE, "0 0", _("^BGStalemate! Flag carriers can now be seen by enemies on radar!"), "") @@ -684,8 +666,8 @@ MSG_CENTER_NOTIF(GENERATOR_UNDERATTACK, N_ENABLE, 0, 0, "", CPID_Null, "0 0", _("^BGThe generator is under attack!"), "") - MULTITEAM_CENTER(ROUND_TEAM_LOSS, 4, N_ENABLE, 0, 0, "", CPID_ROUND, "0 0", _("^TC^TT^BG team loses the round"), "", NAME) - MULTITEAM_CENTER(ROUND_TEAM_WIN, 4, N_ENABLE, 0, 0, "", CPID_ROUND, "0 0", _("^TC^TT^BG team wins the round"), "", NAME) + MULTITEAM_CENTER(ROUND_TEAM_LOSS, N_ENABLE, 0, 0, "", CPID_ROUND, "0 0", _("^TC^TT^BG team loses the round"), "", NAME) + MULTITEAM_CENTER(ROUND_TEAM_WIN, N_ENABLE, 0, 0, "", CPID_ROUND, "0 0", _("^TC^TT^BG team wins the round"), "", NAME) MSG_CENTER_NOTIF(ROUND_PLAYER_WIN, N_ENABLE, 1, 0, "s1", CPID_ROUND, "0 0", _("^BG%s^BG wins the round"), "") MSG_CENTER_NOTIF(FREEZETAG_SELF, N_ENABLE, 0, 0, "", CPID_Null, "0 0", _("^K1You froze yourself"), "") @@ -713,11 +695,11 @@ MSG_CENTER_NOTIF(KEEPAWAY_WARN, N_ENABLE, 0, 0, "", CPID_KEEPAWAY_WARN, "0 0", _("^BGKilling people while you don't have the ball gives no points!"), "") MSG_CENTER_NOTIF(KEYHUNT_HELP, N_ENABLE, 0, 0, "", CPID_KEYHUNT, "0 0", _("^BGAll keys are in your team's hands!\nHelp the key carriers to meet!"), "") - MULTITEAM_CENTER(KEYHUNT_INTERFERE, 4, N_ENABLE, 0, 0, "", CPID_KEYHUNT, "0 0", _("^BGAll keys are in ^TC^TT team^BG's hands!\nInterfere ^F4NOW^BG!"), "", NAME) + MULTITEAM_CENTER(KEYHUNT_INTERFERE, N_ENABLE, 0, 0, "", CPID_KEYHUNT, "0 0", _("^BGAll keys are in ^TC^TT team^BG's hands!\nInterfere ^F4NOW^BG!"), "", NAME) MSG_CENTER_NOTIF(KEYHUNT_MEET, N_ENABLE, 0, 0, "", CPID_KEYHUNT, "0 0", _("^BGAll keys are in your team's hands!\nMeet the other key carriers ^F4NOW^BG!"), "") MSG_CENTER_NOTIF(KEYHUNT_ROUNDSTART, N_ENABLE, 0, 1, "", CPID_KEYHUNT_OTHER, "1 f1", _("^F4Round will start in ^COUNT"), "") MSG_CENTER_NOTIF(KEYHUNT_SCAN, N_ENABLE, 0, 1, "", CPID_KEYHUNT_OTHER, "f1 0", _("^BGScanning frequency range..."), "") - MULTITEAM_CENTER(KEYHUNT_START, 4, N_ENABLE, 0, 0, "", CPID_KEYHUNT, "0 0", _("^BGYou are starting with the ^TC^TT Key"), "", KEY) + MULTITEAM_CENTER(KEYHUNT_START, N_ENABLE, 0, 0, "", CPID_KEYHUNT, "0 0", _("^BGYou are starting with the ^TC^TT Key"), "", KEY) MSG_CENTER_NOTIF(LMS_NOLIVES, N_ENABLE, 0, 0, "", CPID_LMS, "0 0", _("^BGYou have no lives left, you must wait until the next match"), "") @@ -735,10 +717,10 @@ MSG_CENTER_NOTIF(NIX_NEWWEAPON, N_ENABLE, 0, 1, "item_wepname", CPID_NIX, "0 0", _("^F2Active weapon: ^F1%s"), "") MSG_CENTER_NOTIF(ONS_CAPTURE, N_ENABLE, 1, 0, "s1", CPID_ONSLAUGHT, "0 0", _("^BGYou captured %s^BG control point"), "") - MULTITEAM_CENTER(ONS_CAPTURE_TEAM, 4, N_ENABLE, 1, 0, "s1", CPID_ONSLAUGHT, "0 0", _("^TC^TT^BG team captured %s^BG control point"), "", NAME) + MULTITEAM_CENTER(ONS_CAPTURE_TEAM, N_ENABLE, 1, 0, "s1", CPID_ONSLAUGHT, "0 0", _("^TC^TT^BG team captured %s^BG control point"), "", NAME) MSG_CENTER_NOTIF(ONS_CONTROLPOINT_SHIELDED, N_ENABLE, 0, 0, "", CPID_ONS_CAPSHIELD, "0 0", _("^BGThis control point currently cannot be captured"), "") MSG_CENTER_NOTIF(ONS_GENERATOR_SHIELDED, N_ENABLE, 0, 0, "", CPID_ONS_CAPSHIELD, "0 0", _("^BGThe enemy generator cannot be destroyed yet\n^F2Capture some control points to unshield it"), "") - MULTITEAM_CENTER(ONS_NOTSHIELDED, 4, N_ENABLE, 0, 0, "", CPID_ONSLAUGHT, "0 0", _("^BGThe ^TCenemy^BG generator is no longer shielded!"), "", NAME) + MULTITEAM_CENTER(ONS_NOTSHIELDED, N_ENABLE, 0, 0, "", CPID_ONSLAUGHT, "0 0", _("^BGThe ^TCenemy^BG generator is no longer shielded!"), "", NAME) MSG_CENTER_NOTIF(ONS_NOTSHIELDED_TEAM, N_ENABLE, 0, 0, "", CPID_ONSLAUGHT, "0 0", _("^K1Your generator is NOT shielded!\n^BGRe-capture control points to shield it!"), "") MSG_CENTER_NOTIF(ONS_TELEPORT, N_ENABLE, 0, 0, "pass_key", CPID_ONSLAUGHT, "0 0", _("^BGPress ^F2%s^BG to teleport"), "") MSG_CENTER_NOTIF(ONS_TELEPORT_ANTISPAM, N_ENABLE, 0, 1, "f1secs", CPID_ONSLAUGHT, "0 0", _("^BGTeleporting disabled for %s"), "") @@ -775,7 +757,7 @@ MSG_CENTER_NOTIF(SUPERWEAPON_LOST, N_ENABLE, 0, 0, "", CPID_POWERUP, "0 0", _("^F2Superweapons have been lost"), "") MSG_CENTER_NOTIF(SUPERWEAPON_PICKUP, N_ENABLE, 0, 0, "", CPID_POWERUP, "0 0", _("^F2You now have a superweapon"), "") - MULTITEAM_CENTER(TEAMCHANGE, 4, N_ENABLE, 0, 1, "", CPID_TEAMCHANGE, "1 f1", _("^K1Changing to ^TC^TT^K1 in ^COUNT"), "", NAME) + MULTITEAM_CENTER(TEAMCHANGE, N_ENABLE, 0, 1, "", CPID_TEAMCHANGE, "1 f1", _("^K1Changing to ^TC^TT^K1 in ^COUNT"), "", NAME) MSG_CENTER_NOTIF(TEAMCHANGE_AUTO, N_ENABLE, 0, 1, "", CPID_TEAMCHANGE, "1 f1", _("^K1Changing team in ^COUNT"), "") MSG_CENTER_NOTIF(TEAMCHANGE_SPECTATE, N_ENABLE, 0, 1, "", CPID_TEAMCHANGE, "1 f1", _("^K1Spectating in ^COUNT"), "") MSG_CENTER_NOTIF(TEAMCHANGE_SUICIDE, N_ENABLE, 0, 1, "", CPID_TEAMCHANGE, "1 f1", _("^K1Suicide in ^COUNT"), "") @@ -801,17 +783,11 @@ #define N_DISABL 0 #define N_ENABLE 1 -#define MULTITEAM_MULTI2(prefix, default, anncepre, infopre, centerpre) \ - MSG_MULTI_NOTIF(prefix##_RED, default, anncepre##_RED, infopre##_RED, centerpre##_RED) \ - MSG_MULTI_NOTIF(prefix##_BLUE, default, anncepre##_BLUE, infopre##_BLUE, centerpre##_BLUE) -#define MULTITEAM_MULTI3(prefix, default, anncepre, infopre, centerpre) \ - MULTITEAM_MULTI2(prefix, default, anncepre, infopre, centerpre) \ - MSG_MULTI_NOTIF(prefix##_YELLOW, default, anncepre##YELLOW, infopre##YELLOW, centerpre##YELLOW) -#define MULTITEAM_MULTI4(prefix, default, anncepre, infopre, centerpre) \ - MULTITEAM_MULTI3(prefix, default, anncepre, infopre, centerpre) \ - MSG_MULTI_NOTIF(prefix##_PINK, default, anncepre##PINK, infopre##PINK, centerpre##PINK) -#define MULTITEAM_MULTI(prefix, teams, default, anncepre, infopre, centerpre) \ - MULTITEAM_MULTI##teams(prefix, default, anncepre, infopre, centerpre) +#define MULTITEAM_MULTI(prefix, defaultvalue, anncepre, infopre, centerpre) \ + MSG_MULTI_NOTIF(prefix##_RED, defaultvalue, anncepre##_RED, infopre##_RED, centerpre##_RED) \ + MSG_MULTI_NOTIF(prefix##_BLUE, defaultvalue, anncepre##_BLUE, infopre##_BLUE, centerpre##_BLUE) \ + MSG_MULTI_NOTIF(prefix##_YELLOW, defaultvalue, anncepre##YELLOW, infopre##YELLOW, centerpre##YELLOW) \ + MSG_MULTI_NOTIF(prefix##_PINK, defaultvalue, anncepre##PINK, infopre##PINK, centerpre##PINK) // MSG_MULTI_NOTIFICATIONS MSG_MULTI_NOTIF(DEATH_MURDER_BUFF, N_ENABLE, NULL, INFO_DEATH_MURDER_BUFF, NULL) @@ -975,19 +951,13 @@ MSG_MULTI_NOTIF(WEAPON_VAPORIZER_MURDER, N_ENABLE, NULL, INFO_WEAPON_VAPORIZER_MURDER, NULL) MSG_MULTI_NOTIF(WEAPON_VORTEX_MURDER, N_ENABLE, NULL, INFO_WEAPON_VORTEX_MURDER, NULL) -#define MULTITEAM_CHOICE2(prefix, default, challow, chtype, optiona, optionb) \ - MSG_CHOICE_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, default, challow, chtype, optiona##_RED, optionb##_RED) \ - MSG_CHOICE_NOTIF_TEAM(NUM_TEAM_2, prefix##_BLUE, prefix, default, challow, chtype, optiona##_BLUE, optionb##_BLUE) -#define MULTITEAM_CHOICE3(prefix, default, challow, chtype, optiona, optionb) \ - MULTITEAM_CHOICE2(prefix, default, challow, chtype, optiona, optionb) \ - MSG_CHOICE_NOTIF_TEAM(NUM_TEAM_3, prefix##_YELLOW, prefix, default, challow, chtype, optiona##_YELLOW, optionb##_YELLOW) -#define MULTITEAM_CHOICE4(prefix, default, challow, chtype, optiona, optionb) \ - MULTITEAM_CHOICE3(prefix, default, challow, chtype, optiona, optionb) \ - MSG_CHOICE_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, default, challow, chtype, optiona##_PINK, optionb##_PINK) -#define MULTITEAM_CHOICE(prefix, teams, default, challow, chtype, optiona, optionb) \ - NOTIF_ADD_AUTOCVAR(CHOICE_##prefix, default) \ +#define MULTITEAM_CHOICE(prefix, defaultvalue, challow, chtype, optiona, optionb) \ + NOTIF_ADD_AUTOCVAR(CHOICE_##prefix, defaultvalue) \ NOTIF_ADD_AUTOCVAR(CHOICE_##prefix##_ALLOWED, challow) \ - MULTITEAM_CHOICE##teams(prefix, default, challow, chtype, optiona, optionb) + MSG_CHOICE_NOTIF_TEAM(NUM_TEAM_1, prefix##_RED, prefix, defaultvalue, challow, chtype, optiona##_RED, optionb##_RED) \ + MSG_CHOICE_NOTIF_TEAM(NUM_TEAM_2, prefix##_BLUE, prefix, defaultvalue, challow, chtype, optiona##_BLUE, optionb##_BLUE) \ + MSG_CHOICE_NOTIF_TEAM(NUM_TEAM_3, prefix##_YELLOW, prefix, defaultvalue, challow, chtype, optiona##_YELLOW, optionb##_YELLOW) \ + MSG_CHOICE_NOTIF_TEAM(NUM_TEAM_4, prefix##_PINK, prefix, defaultvalue, challow, chtype, optiona##_PINK, optionb##_PINK) #undef N_DISABL #undef N_ENABLE @@ -1005,10 +975,10 @@ #define A_ALWAYS 2 // MSG_CHOICE_NOTIFICATIONS - MULTITEAM_CHOICE(CTF_CAPTURE_BROKEN, 4, N_VERBOSE, A_ALWAYS, MSG_INFO, INFO_CTF_CAPTURE, INFO_CTF_CAPTURE_BROKEN) - MULTITEAM_CHOICE(CTF_CAPTURE_TIME, 4, N_VERBOSE, A_ALWAYS, MSG_INFO, INFO_CTF_CAPTURE, INFO_CTF_CAPTURE_TIME) - MULTITEAM_CHOICE(CTF_CAPTURE_UNBROKEN, 4, N_VERBOSE, A_ALWAYS, MSG_INFO, INFO_CTF_CAPTURE, INFO_CTF_CAPTURE_UNBROKEN) - MULTITEAM_CHOICE(CTF_PICKUP_TEAM, 4, N__NORMAL, A_ALWAYS, MSG_CENTER, CENTER_CTF_PICKUP_TEAM, CENTER_CTF_PICKUP_TEAM_VERBOSE) + MULTITEAM_CHOICE(CTF_CAPTURE_BROKEN, N_VERBOSE, A_ALWAYS, MSG_INFO, INFO_CTF_CAPTURE, INFO_CTF_CAPTURE_BROKEN) + MULTITEAM_CHOICE(CTF_CAPTURE_TIME, N_VERBOSE, A_ALWAYS, MSG_INFO, INFO_CTF_CAPTURE, INFO_CTF_CAPTURE_TIME) + MULTITEAM_CHOICE(CTF_CAPTURE_UNBROKEN, N_VERBOSE, A_ALWAYS, MSG_INFO, INFO_CTF_CAPTURE, INFO_CTF_CAPTURE_UNBROKEN) + MULTITEAM_CHOICE(CTF_PICKUP_TEAM, N__NORMAL, A_ALWAYS, MSG_CENTER, CENTER_CTF_PICKUP_TEAM, CENTER_CTF_PICKUP_TEAM_VERBOSE) MSG_CHOICE_NOTIF(CTF_PICKUP_TEAM_NEUTRAL, N__NORMAL, A_ALWAYS, MSG_CENTER, CENTER_CTF_PICKUP_TEAM_NEUTRAL, CENTER_CTF_PICKUP_TEAM_VERBOSE_NEUTRAL) MSG_CHOICE_NOTIF(CTF_PICKUP_ENEMY, N__NORMAL, A_ALWAYS, MSG_CENTER, CENTER_CTF_PICKUP_ENEMY, CENTER_CTF_PICKUP_ENEMY_VERBOSE) MSG_CHOICE_NOTIF(CTF_PICKUP_ENEMY_NEUTRAL, N__NORMAL, A_ALWAYS, MSG_CENTER, CENTER_CTF_PICKUP_ENEMY_NEUTRAL, CENTER_CTF_PICKUP_ENEMY_NEUTRAL_VERBOSE) diff --git a/qcsrc/common/notifications/all.qc b/qcsrc/common/notifications/all.qc index b8e0d5c69..663269c93 100644 --- a/qcsrc/common/notifications/all.qc +++ b/qcsrc/common/notifications/all.qc @@ -761,7 +761,7 @@ void Create_Notification_Entity_Choice(entity notif, #ifdef SVQC void Notification_GetCvars(entity this) { - FOREACH(Notifications, it.nent_type == MSG_CHOICE, { + FOREACH(Notifications, it.nent_type == MSG_CHOICE && (!it.nent_teamnum || it.nent_teamnum == NUM_TEAM_1), { GetCvars_handleFloat( this, CS(this), diff --git a/qcsrc/common/notifications/all.qh b/qcsrc/common/notifications/all.qh index 2d775d4f2..ee39b1881 100644 --- a/qcsrc/common/notifications/all.qh +++ b/qcsrc/common/notifications/all.qh @@ -295,7 +295,7 @@ void Send_Notification_WOCOVA( // MAKE SURE THIS IS ALWAYS SYNCHRONIZED WITH THE DUMP // NOTIFICATIONS FUNCTION IN THE .QC FILE! -#define NOTIF_ADD_AUTOCVAR(name,default) float autocvar_notification_##name = default; +#define NOTIF_ADD_AUTOCVAR(name,defaultvalue) float autocvar_notification_##name = defaultvalue; float autocvar_notification_show_location = false; string autocvar_notification_show_location_string = ""; //_(" at the %s"); @@ -699,7 +699,9 @@ REGISTRY_SORT(Notifications); STATIC_INIT(Notifications) { FOREACH(Notifications, true, it.m_id = i); } REGISTRY_CHECK(Notifications) -const int NOTIF_CHOICE_MAX = 50; +const int NOTIF_CHOICE_MAX = 20; +// NOTE: a team choice is actually made of 4 choices (one per team) with the same nent_choice_idx +// thus they are counted as 1 in nent_choice_count int nent_choice_count = 0; .int nent_choice_idx; .int msg_choice_choices[NOTIF_CHOICE_MAX]; // set on each player containing MSG_CHOICE choices @@ -707,12 +709,11 @@ int nent_choice_count = 0; bool notif_error; bool notif_global_error; -STATIC_INIT_LATE(Notif_Choices) { - int c = 0; - FOREACH(Notifications, it.nent_type == MSG_CHOICE, { c++; }); - if (c > NOTIF_CHOICE_MAX) { - LOG_FATALF("Too many MSG_CHOICE notifications (%d)", c); - } +STATIC_INIT_LATE(Notif_Choices) +{ + if (nent_choice_count > NOTIF_CHOICE_MAX) + LOG_FATALF("Too many MSG_CHOICE notifications (%d), hit NOTIF_CHOICE_MAX (%d) limit", + nent_choice_count, NOTIF_CHOICE_MAX); } string Get_Notif_CvarName(Notification notif) @@ -736,16 +737,16 @@ Notification Get_Notif_Ent(MSG net_type, int net_name) return it; } -#define MSG_ANNCE_NOTIF_TEAM(teamnum, name, cvarname, default, sound, channel, volume, position) \ - MSG_ANNCE_NOTIF_(teamnum, ANNCE_##name, ANNCE_##cvarname, default, sound, channel, volume, position) +#define MSG_ANNCE_NOTIF_TEAM(teamnum, name, cvarname, defaultvalue, sound, channel, volume, position) \ + MSG_ANNCE_NOTIF_(teamnum, ANNCE_##name, ANNCE_##cvarname, defaultvalue, sound, channel, volume, position) -#define MSG_ANNCE_NOTIF(name, default, sound, channel, volume, position) \ - NOTIF_ADD_AUTOCVAR(ANNCE_##name, default) \ - MSG_ANNCE_NOTIF_(0, ANNCE_##name, ANNCE_##name, default, sound, channel, volume, position) +#define MSG_ANNCE_NOTIF(name, defaultvalue, sound, channel, volume, position) \ + NOTIF_ADD_AUTOCVAR(ANNCE_##name, defaultvalue) \ + MSG_ANNCE_NOTIF_(0, ANNCE_##name, ANNCE_##name, defaultvalue, sound, channel, volume, position) -#define MSG_ANNCE_NOTIF_(teamnum, name, cvarname, default, sound, channel, volume, position) \ +#define MSG_ANNCE_NOTIF_(teamnum, name, cvarname, defaultvalue, sound, channel, volume, position) \ REGISTER(Notifications, name, m_id, new_pure(msg_annce_notification)) { \ - Create_Notification_Entity (this, default, ACVNN(cvarname), MSG_ANNCE, strtoupper(#name), teamnum); \ + Create_Notification_Entity (this, defaultvalue, ACVNN(cvarname), MSG_ANNCE, strtoupper(#name), teamnum); \ Create_Notification_Entity_Annce(this, ACVNN(cvarname), strtoupper(#name), \ channel, /* channel */ \ sound, /* snd */ \ @@ -753,16 +754,16 @@ Notification Get_Notif_Ent(MSG net_type, int net_name) position); /* position */ \ } -#define MSG_INFO_NOTIF_TEAM(teamnum, name, cvarname, default, strnum, flnum, args, hudargs, icon, normal, gentle) \ - MSG_INFO_NOTIF_(teamnum, INFO_##name, INFO_##cvarname, default, strnum, flnum, args, hudargs, icon, normal, gentle) +#define MSG_INFO_NOTIF_TEAM(teamnum, name, cvarname, defaultvalue, strnum, flnum, args, hudargs, icon, normal, gentle) \ + MSG_INFO_NOTIF_(teamnum, INFO_##name, INFO_##cvarname, defaultvalue, strnum, flnum, args, hudargs, icon, normal, gentle) -#define MSG_INFO_NOTIF(name, default, strnum, flnum, args, hudargs, icon, normal, gentle) \ - NOTIF_ADD_AUTOCVAR(INFO_##name, default) \ - MSG_INFO_NOTIF_(0, INFO_##name, INFO_##name, default, strnum, flnum, args, hudargs, icon, normal, gentle) +#define MSG_INFO_NOTIF(name, defaultvalue, strnum, flnum, args, hudargs, icon, normal, gentle) \ + NOTIF_ADD_AUTOCVAR(INFO_##name, defaultvalue) \ + MSG_INFO_NOTIF_(0, INFO_##name, INFO_##name, defaultvalue, strnum, flnum, args, hudargs, icon, normal, gentle) -#define MSG_INFO_NOTIF_(teamnum, name, cvarname, default, strnum, flnum, args, hudargs, icon, normal, gentle) \ +#define MSG_INFO_NOTIF_(teamnum, name, cvarname, defaultvalue, strnum, flnum, args, hudargs, icon, normal, gentle) \ REGISTER(Notifications, name, m_id, new_pure(msg_info_notification)) { \ - Create_Notification_Entity (this, default, ACVNN(cvarname), MSG_INFO, strtoupper(#name), teamnum); \ + Create_Notification_Entity (this, defaultvalue, ACVNN(cvarname), MSG_INFO, strtoupper(#name), teamnum); \ Create_Notification_Entity_InfoCenter(this, ACVNN(cvarname), strtoupper(#name), strnum, flnum, \ args, /* args */ \ hudargs, /* hudargs */ \ @@ -774,12 +775,12 @@ Notification Get_Notif_Ent(MSG net_type, int net_name) } .string nent_iconargs; -#define MULTIICON_INFO(name, default, strnum, flnum, args, hudargs, iconargs, icon, normal, gentle) \ - MULTIICON_INFO_(INFO_##name, default, strnum, flnum, args, hudargs, iconargs, icon, normal, gentle) -#define MULTIICON_INFO_(name, default, strnum, flnum, args, hudargs, iconargs, icon, normal, gentle) \ - NOTIF_ADD_AUTOCVAR(name, default) \ +#define MULTIICON_INFO(name, defaultvalue, strnum, flnum, args, hudargs, iconargs, icon, normal, gentle) \ + MULTIICON_INFO_(INFO_##name, defaultvalue, strnum, flnum, args, hudargs, iconargs, icon, normal, gentle) +#define MULTIICON_INFO_(name, defaultvalue, strnum, flnum, args, hudargs, iconargs, icon, normal, gentle) \ + NOTIF_ADD_AUTOCVAR(name, defaultvalue) \ REGISTER(Notifications, name, m_id, new_pure(msg_info_notification)) { \ - Create_Notification_Entity (this, default, ACVNN(name), MSG_INFO, strtoupper(#name), 0); \ + Create_Notification_Entity (this, defaultvalue, ACVNN(name), MSG_INFO, strtoupper(#name), 0); \ Create_Notification_Entity_InfoCenter(this, ACVNN(name), strtoupper(#name), strnum, flnum, \ args, /* args */ \ hudargs, /* hudargs */ \ @@ -791,16 +792,16 @@ Notification Get_Notif_Ent(MSG net_type, int net_name) this.nent_iconargs = iconargs; \ } -#define MSG_CENTER_NOTIF_TEAM(teamnum, name, cvarname, default, strnum, flnum, args, cpid, durcnt, normal, gentle) \ - MSG_CENTER_NOTIF_(teamnum, CENTER_##name, CENTER_##cvarname, default, strnum, flnum, args, cpid, durcnt, normal, gentle) +#define MSG_CENTER_NOTIF_TEAM(teamnum, name, cvarname, defaultvalue, strnum, flnum, args, cpid, durcnt, normal, gentle) \ + MSG_CENTER_NOTIF_(teamnum, CENTER_##name, CENTER_##cvarname, defaultvalue, strnum, flnum, args, cpid, durcnt, normal, gentle) -#define MSG_CENTER_NOTIF(name, default, strnum, flnum, args, cpid, durcnt, normal, gentle) \ - NOTIF_ADD_AUTOCVAR(CENTER_##name, default) \ - MSG_CENTER_NOTIF_(0, CENTER_##name, CENTER_##name, default, strnum, flnum, args, cpid, durcnt, normal, gentle) +#define MSG_CENTER_NOTIF(name, defaultvalue, strnum, flnum, args, cpid, durcnt, normal, gentle) \ + NOTIF_ADD_AUTOCVAR(CENTER_##name, defaultvalue) \ + MSG_CENTER_NOTIF_(0, CENTER_##name, CENTER_##name, defaultvalue, strnum, flnum, args, cpid, durcnt, normal, gentle) -#define MSG_CENTER_NOTIF_(teamnum, name, cvarname, default, strnum, flnum, args, cpid, durcnt, normal, gentle) \ +#define MSG_CENTER_NOTIF_(teamnum, name, cvarname, defaultvalue, strnum, flnum, args, cpid, durcnt, normal, gentle) \ REGISTER(Notifications, name, m_id, new_pure(msg_center_notification)) { \ - Create_Notification_Entity (this, default, ACVNN(cvarname), MSG_CENTER, strtoupper(#name), teamnum); \ + Create_Notification_Entity (this, defaultvalue, ACVNN(cvarname), MSG_CENTER, strtoupper(#name), teamnum); \ Create_Notification_Entity_InfoCenter(this, ACVNN(cvarname), strtoupper(#name), strnum, flnum, \ args, /* args */ \ "", /* hudargs */ \ @@ -811,28 +812,30 @@ Notification Get_Notif_Ent(MSG net_type, int net_name) gentle); /* gentle */ \ } -#define MSG_MULTI_NOTIF(name, default, anncename, infoname, centername) \ - NOTIF_ADD_AUTOCVAR(name, default) \ +#define MSG_MULTI_NOTIF(name, defaultvalue, anncename, infoname, centername) \ + NOTIF_ADD_AUTOCVAR(name, defaultvalue) \ REGISTER(Notifications, name, m_id, new_pure(msg_multi_notification)) { \ - Create_Notification_Entity (this, default, ACVNN(name), MSG_MULTI, strtoupper(#name), 0); \ + Create_Notification_Entity (this, defaultvalue, ACVNN(name), MSG_MULTI, strtoupper(#name), 0); \ Create_Notification_Entity_Multi(this, ACVNN(name), strtoupper(#name), \ anncename, /* anncename */ \ infoname, /* infoname */ \ centername); /* centername */ \ } -#define MSG_CHOICE_NOTIF_TEAM(teamnum, name, cvarname, default, challow, chtype, optiona, optionb) \ - MSG_CHOICE_NOTIF_(teamnum, CHOICE_##name, CHOICE_##cvarname, default, challow, chtype, optiona, optionb) +#define MSG_CHOICE_NOTIF_TEAM(teamnum, name, cvarname, defaultvalue, challow, chtype, optiona, optionb) \ + MSG_CHOICE_NOTIF_(teamnum, CHOICE_##name, CHOICE_##cvarname, defaultvalue, challow, chtype, optiona, optionb) -#define MSG_CHOICE_NOTIF(name, default, challow, chtype, optiona, optionb) \ - NOTIF_ADD_AUTOCVAR(CHOICE_##name, default) \ +#define MSG_CHOICE_NOTIF(name, defaultvalue, challow, chtype, optiona, optionb) \ + NOTIF_ADD_AUTOCVAR(CHOICE_##name, defaultvalue) \ NOTIF_ADD_AUTOCVAR(CHOICE_##name##_ALLOWED, challow) \ - MSG_CHOICE_NOTIF_(0, CHOICE_##name, CHOICE_##name, default, challow, chtype, optiona, optionb) + MSG_CHOICE_NOTIF_(0, CHOICE_##name, CHOICE_##name, defaultvalue, challow, chtype, optiona, optionb) -#define MSG_CHOICE_NOTIF_(teamnum, name, cvarname, default, challow, chtype, optiona, optionb) \ +#define MSG_CHOICE_NOTIF_(teamnum, name, cvarname, defaultvalue, challow, chtype, optiona, optionb) \ REGISTER(Notifications, name, m_id, new_pure(msg_choice_notification)) { \ - this.nent_choice_idx = nent_choice_count++; \ - Create_Notification_Entity (this, default, ACVNN(cvarname), MSG_CHOICE, strtoupper(#name), teamnum); \ + this.nent_choice_idx = nent_choice_count; \ + if (!teamnum || teamnum == NUM_TEAM_4) \ + nent_choice_count++; \ + Create_Notification_Entity (this, defaultvalue, ACVNN(cvarname), MSG_CHOICE, strtoupper(#name), teamnum); \ Create_Notification_Entity_Choice(this, ACVNN(cvarname), strtoupper(#name), \ challow, /* challow_def */ \ autocvar_notification_##cvarname##_ALLOWED, /* challow_var */ \ diff --git a/qcsrc/common/playerstats.qc b/qcsrc/common/playerstats.qc index 2c9bbcde8..cf272e563 100644 --- a/qcsrc/common/playerstats.qc +++ b/qcsrc/common/playerstats.qc @@ -152,6 +152,8 @@ void PlayerStats_GameReport_FinalizePlayer(entity p) if(latency) PlayerStats_GameReport_Event_Player(p, PLAYERSTATS_AVGLATENCY, latency); } + + db_put(PS_GR_OUT_DB, sprintf("%s:_ranked", p.playerstats_id), ftos(CS(p).cvar_cl_allow_uidranking)); } strfree(p.playerstats_id); @@ -376,6 +378,10 @@ void PlayerStats_GameReport_Handler(entity fh, entity pass, float status) url_fputs(fh, sprintf("t %s\n", tt)); } + // elo ranking enabled + nn = db_get(PS_GR_OUT_DB, sprintf("%s:_ranked", p)); + if(nn != "") { url_fputs(fh, sprintf("r %s\n", nn)); } + // output player events for(e = PS_GR_OUT_EVL; (en = db_get(PS_GR_OUT_DB, sprintf("*:%s", e))) != ""; e = en) { diff --git a/qcsrc/common/stats.qh b/qcsrc/common/stats.qh index e35115d3e..a27e99b62 100644 --- a/qcsrc/common/stats.qh +++ b/qcsrc/common/stats.qh @@ -43,8 +43,12 @@ const int MAX_CL_STATS = 256; #endif #ifdef SVQC +/// all the weapons actually spawned in the map, does not include filtered items vector weaponsInMap; +/// all the weapons placed by the mapper (weaponreplace applied), ignores most filters +vector weaponsInMapAll; #endif + REGISTER_STAT(WEAPONS, vectori) REGISTER_STAT(WEAPONSINMAP, vectori, weaponsInMap) @@ -370,14 +374,6 @@ int autocvar_sv_wallclip; #endif REGISTER_STAT(MOVEVARS_WALLCLIP, int, autocvar_sv_wallclip) - -#ifdef CSQC -noref int autocvar_cl_gunalign; -#endif -#ifdef SVQC -.int cvar_cl_gunalign; -#endif - REGISTER_STAT(GUNALIGN, int) #ifdef SVQC SPECTATE_COPYFIELD(_STAT(GUNALIGN)) diff --git a/qcsrc/common/t_items.qc b/qcsrc/common/t_items.qc index 4a3712a25..d349f48c5 100644 --- a/qcsrc/common/t_items.qc +++ b/qcsrc/common/t_items.qc @@ -356,8 +356,8 @@ bool ItemSend(entity this, entity to, int sf) { WriteShort(MSG_ENTITY, this.colormap); WriteByte(MSG_ENTITY, this.glowmod.x * 255.0); - WriteByte(MSG_ENTITY, this.glowmod.y * 255.0); - WriteByte(MSG_ENTITY, this.glowmod.z * 255.0); + WriteByte(MSG_ENTITY, this.glowmod.y * 255.0); + WriteByte(MSG_ENTITY, this.glowmod.z * 255.0); } if(sf & ISF_DROP) @@ -402,7 +402,7 @@ bool have_pickup_item(entity this) return true; } -void Item_Show (entity e, int mode) +void Item_Show(entity e, int mode) { e.effects &= ~(EF_ADDITIVE | EF_STARDUST | EF_FULLBRIGHT | EF_NODEPTHTEST); e.ItemStatus &= ~ITS_STAYWEP; @@ -479,13 +479,13 @@ float Item_ItemsTime_UpdateTime(entity e, float t); void Item_ItemsTime_SetTime(entity e, float t); void Item_ItemsTime_SetTimesForAllPlayers(); -void Item_Respawn (entity this) +void Item_Respawn(entity this) { Item_Show(this, 1); sound(this, CH_TRIGGER, this.itemdef.m_respawnsound, VOL_BASE, ATTEN_NORM); // play respawn sound setorigin(this, this.origin); - if (Item_ItemsTime_Allow(this.itemdef) || (STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS)) + if (Item_ItemsTime_Allow(this.itemdef) || (STAT(WEAPONS, this) & WEPSET_SUPERWEAPONS)) { float t = Item_ItemsTime_UpdateTime(this, 0); Item_ItemsTime_SetTime(this, t); @@ -499,7 +499,7 @@ void Item_Respawn (entity this) Send_Effect(EFFECT_ITEM_RESPAWN, CENTER_OR_VIEWOFS(this), '0 0 0', 1); } -void Item_RespawnCountdown (entity this) +void Item_RespawnCountdown(entity this) { if(this.item_respawncounter >= ITEM_RESPAWN_TICKS) { @@ -624,7 +624,7 @@ float adjust_respawntime(float normal_respawntime) { } } TeamBalance_Destroy(balance); - + if (players >= 2) { return normal_respawntime * (r / (players + o) + l); } else { @@ -780,14 +780,14 @@ bool Item_GiveTo(entity item, entity player) } } bool pickedup = false; - pickedup = (pickedup || Item_GiveAmmoTo(item, player, RES_HEALTH, item.max_health)); - pickedup = (pickedup || Item_GiveAmmoTo(item, player, RES_ARMOR, item.max_armorvalue)); - pickedup = (pickedup || Item_GiveAmmoTo(item, player, RES_SHELLS, g_pickup_shells_max)); - pickedup = (pickedup || Item_GiveAmmoTo(item, player, RES_BULLETS, g_pickup_nails_max)); - pickedup = (pickedup || Item_GiveAmmoTo(item, player, RES_ROCKETS, g_pickup_rockets_max)); - pickedup = (pickedup || Item_GiveAmmoTo(item, player, RES_CELLS, g_pickup_cells_max)); - pickedup = (pickedup || Item_GiveAmmoTo(item, player, RES_PLASMA, g_pickup_plasma_max)); - pickedup = (pickedup || Item_GiveAmmoTo(item, player, RES_FUEL, g_pickup_fuel_max)); + pickedup |= Item_GiveAmmoTo(item, player, RES_HEALTH, item.max_health); + pickedup |= Item_GiveAmmoTo(item, player, RES_ARMOR, item.max_armorvalue); + pickedup |= Item_GiveAmmoTo(item, player, RES_SHELLS, g_pickup_shells_max); + pickedup |= Item_GiveAmmoTo(item, player, RES_BULLETS, g_pickup_nails_max); + pickedup |= Item_GiveAmmoTo(item, player, RES_ROCKETS, g_pickup_rockets_max); + pickedup |= Item_GiveAmmoTo(item, player, RES_CELLS, g_pickup_cells_max); + pickedup |= Item_GiveAmmoTo(item, player, RES_PLASMA, g_pickup_plasma_max); + pickedup |= Item_GiveAmmoTo(item, player, RES_FUEL, g_pickup_fuel_max); if (item.itemdef.instanceOfWeaponPickup) { WepSet w; @@ -1008,8 +1008,8 @@ void Item_FindTeam(entity this) }); e = RandomSelection_chosen_ent; - e.state = 0; - Item_Show(e, 1); + if (!e) + return; IL_EACH(g_items, it.team == this.team, { @@ -1021,11 +1021,11 @@ void Item_FindTeam(entity this) Item_Show(it, -1); it.state = 1; // state 1 = initially hidden item, apparently } + else + Item_Reset(it); it.effects &= ~EF_NODRAW; } }); - - Item_Reset(this); } } @@ -1172,7 +1172,7 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default { string itemname = def.m_name; Model itemmodel = def.m_model; - Sound pickupsound = def.m_sound; + Sound pickupsound = def.m_sound; float(entity player, entity item) pickupevalfunc = def.m_pickupevalfunc; float pickupbasevalue = def.m_botvalue; int itemflags = def.m_itemflags; @@ -1180,10 +1180,10 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default startitem_failed = false; this.item_model_ent = itemmodel; - this.item_pickupsound_ent = pickupsound; + this.item_pickupsound_ent = pickupsound; - if(def.m_iteminit) - def.m_iteminit(def, this); + if(def.m_iteminit) + def.m_iteminit(def, this); if(!this.respawntime) // both need to be set { @@ -1317,7 +1317,7 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default || (def.instanceOfHealth && def != ITEM_HealthSmall) || (def.instanceOfArmor && def != ITEM_ArmorSmall) || (itemid & (IT_KEY1 | IT_KEY2)) - ) + ) { if(!this.target || this.target == "") this.target = "###item###"; // for finding the nearest item using findnearest @@ -1360,7 +1360,7 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default } this.state = 0; - if(this.team) // broken, no idea why. + if(this.team) { if(!this.cnt) this.cnt = 1; // item probability weight @@ -1584,8 +1584,8 @@ spawnfunc(target_items) for(int j = 0; j < n; ++j) { FOREACH(Weapons, it != WEP_Null && W_UndeprecateName(argv(j)) == it.netname, { - it.wr_init(it); - break; + it.wr_init(it); + break; }); } } diff --git a/qcsrc/common/t_items.qh b/qcsrc/common/t_items.qh index a0321c244..5c916866f 100644 --- a/qcsrc/common/t_items.qh +++ b/qcsrc/common/t_items.qh @@ -1,6 +1,6 @@ #pragma once -const int AMMO_COUNT = 4; // amount of ammo types to show in the inventory panel +const int AMMO_COUNT = 4; // amount of ammo types to show in the ammo panel // item networking const int ISF_LOCATION = BIT(1); diff --git a/qcsrc/common/turrets/turret/phaser_weapon.qc b/qcsrc/common/turrets/turret/phaser_weapon.qc index 0a3627631..6b5b4fae8 100644 --- a/qcsrc/common/turrets/turret/phaser_weapon.qc +++ b/qcsrc/common/turrets/turret/phaser_weapon.qc @@ -42,7 +42,7 @@ METHOD(PhaserTurretAttack, wr_think, void(entity thiswep, entity actor, .entity beam.attack_finished_single[0] = actor.attack_finished_single[0]; actor.attack_finished_single[0] = time; // + autocvar_sys_ticrate; - setattachment(beam,actor.tur_head, "tag_fire"); + setattachment(beam, actor.tur_head, "tag_fire"); soundat (actor, trace_endpos, CH_SHOTS, SND(NEXIMPACT), VOL_BASE, ATTEN_NORM); if (!isPlayer) @@ -53,17 +53,18 @@ METHOD(PhaserTurretAttack, wr_think, void(entity thiswep, entity actor, .entity void beam_think(entity this) { - if ((time > this.cnt) || (IS_DEAD(this.owner))) + entity actor = this.owner; + if ((time > this.cnt) || (IS_DEAD(actor))) { - this.owner.attack_finished_single[0] = time + this.owner.shot_refire; - this.owner.fireflag = 2; - this.owner.tur_head.frame = 10; + actor.attack_finished_single[0] = time + actor.shot_refire; + actor.fireflag = 2; + actor.tur_head.frame = 10; sound (this, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, ATTEN_NORM); delete(this); return; } - turret_do_updates(this.owner); + turret_do_updates(actor); if (time - this.shot_spread > 0) { @@ -71,20 +72,18 @@ void beam_think(entity this) sound (this, CH_SHOTS_SINGLE, SND_TUR_PHASER, VOL_BASE, ATTEN_NORM); } - this.nextthink = time + this.ticrate; - this.owner.attack_finished_single[0] = time + frametime; - FireImoBeam ( this.owner, this.tur_shotorg, - this.tur_shotorg + this.tur_shotdir_updated * this.target_range, - '-1 -1 -1' * this.shot_radius, - '1 1 1' * this.shot_radius, - this.shot_force, + actor.attack_finished_single[0] = time + frametime; + FireImoBeam ( actor, actor.tur_shotorg, + actor.tur_shotorg + actor.tur_shotdir_updated * actor.target_range, + '-1 -1 -1' * actor.shot_radius, + '1 1 1' * actor.shot_radius, + actor.shot_force, this.shot_dmg, 0.75, DEATH_TURRET_PHASER.m_id); - this.scale = vlen(this.owner.tur_shotorg - trace_endpos) / 256; - + this.scale = vlen(actor.tur_shotorg - trace_endpos) / 256; } #endif diff --git a/qcsrc/common/turrets/util.qc b/qcsrc/common/turrets/util.qc index 817487c6d..6857ccad8 100644 --- a/qcsrc/common/turrets/util.qc +++ b/qcsrc/common/turrets/util.qc @@ -28,72 +28,88 @@ void FireImoBeam(entity this, vector start, vector end, vector smin, vector smax float bforce, float f_dmg, float f_velfactor, int deathtype) { - vector hitloc, force, endpoint, dir; - entity ent; - - dir = normalize(end - start); - force = dir * bforce; + vector dir = normalize(end - start); + vector force = dir * bforce; // go a little bit into the wall because we need to hit this wall later end = end + dir; // trace multiple times until we hit a wall, each obstacle will be made unsolid. // note down which entities were hit so we can damage them later + entity o = this; while (1) { - tracebox(start, smin, smax, end, false, this); + if(CS(this).antilag_debug) + WarpZone_tracebox_antilag (this, start, smin, smax, end, false, o, CS(this).antilag_debug); + else + WarpZone_tracebox_antilag (this, start, smin, smax, end, false, o, ANTILAG_LATENCY(this)); + if(o && WarpZone_trace_firstzone) + { + o = NULL; + continue; + } // if it is NULL we can't hurt it so stop now if (trace_ent == NULL || trace_fraction == 1) break; - if (trace_ent.solid == SOLID_BSP) - break; - // make the entity non-solid so we can hit the next one + IL_PUSH(g_railgunhit, trace_ent); trace_ent.railgunhit = true; trace_ent.railgunhitloc = end; trace_ent.railgunhitsolidbackup = trace_ent.solid; + trace_ent.railgundistance = vlen(WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos) - start); + trace_ent.railgunforce = WarpZone_TransformVelocity(WarpZone_trace_transform, force); // stop if this is a wall + if (trace_ent.solid == SOLID_BSP) + break; // make the entity non-solid trace_ent.solid = SOLID_NOT; } - endpoint = trace_endpos; + vector endpoint = trace_endpos; + entity endent = trace_ent; + float endq3surfaceflags = trace_dphitq3surfaceflags; // find all the entities the railgun hit and restore their solid state - ent = findfloat(NULL, railgunhit, true); - while (ent) + IL_EACH(g_railgunhit, it.railgunhit, { - // restore their solid type - ent.solid = ent.railgunhitsolidbackup; - ent = findfloat(ent, railgunhit, true); - } + it.solid = it.railgunhitsolidbackup; + }); + + /* + Unlike the railgun, this does NOT check for targets close by + */ // find all the entities the railgun hit and hurt them - ent = findfloat(NULL, railgunhit, true); - while (ent) + IL_EACH(g_railgunhit, it.railgunhit, { - // get the details we need to call the damage function - hitloc = ent.railgunhitloc; - ent.railgunhitloc = '0 0 0'; - ent.railgunhitsolidbackup = SOLID_NOT; - ent.railgunhit = false; + // removal from the list is handled below + /* no falloff applied */ // apply the damage - if (ent.takedamage) + if (it.takedamage) { - Damage (ent, this, this, f_dmg, deathtype, DMG_NOWEP, hitloc, force); - ent.velocity = ent.velocity * f_velfactor; - //ent.alpha = 0.25 + random() * 0.75; + Damage(it, this, this, f_dmg, deathtype, DMG_NOWEP, it.railgunhitloc, it.railgunforce); + // slow down the target + it.velocity = it.velocity * f_velfactor; } - // advance to the next entity - ent = findfloat(ent, railgunhit, true); - } + it.railgunhitloc = '0 0 0'; + it.railgunhitsolidbackup = SOLID_NOT; + it.railgunhit = false; + it.railgundistance = 0; + }); + + IL_CLEAR(g_railgunhit); + + /* no accuracy, as a weapon entity is not attached */ + trace_endpos = endpoint; + trace_ent = endent; + trace_dphitq3surfaceflags = endq3surfaceflags; } #ifdef TURRET_DEBUG diff --git a/qcsrc/common/util.qh b/qcsrc/common/util.qh index 2033aa94b..756e02cf5 100644 --- a/qcsrc/common/util.qh +++ b/qcsrc/common/util.qh @@ -201,7 +201,7 @@ void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t #else #define GENTLE autocvar_sv_gentle #endif - #define normal_or_gentle(normal, gentle) (GENTLE ? ((gentle != "") ? gentle : normal) : normal) + #define normal_or_gentle(normal, gentle) ((GENTLE && (gentle != "")) ? gentle : normal) #endif #ifdef GAMEQC diff --git a/qcsrc/common/vehicles/sv_vehicles.qc b/qcsrc/common/vehicles/sv_vehicles.qc index c8e47dabc..6785a9f21 100644 --- a/qcsrc/common/vehicles/sv_vehicles.qc +++ b/qcsrc/common/vehicles/sv_vehicles.qc @@ -777,17 +777,12 @@ void vehicles_impact(entity this, float _minspeed, float _speedfac, float _maxpa if(this.play_time < time) { - float wc = vlen(this.velocity - this.oldvelocity); - //dprint("oldvel: ", vtos(this.oldvelocity), "\n"); - //dprint("vel: ", vtos(this.velocity), "\n"); - if(_minspeed < wc) + if(vdist(this.velocity - this.oldvelocity, >, _minspeed)) { + float wc = vlen(this.velocity - this.oldvelocity); float take = min(_speedfac * wc, _maxpain); - Damage (this, NULL, NULL, take, DEATH_FALL.m_id, DMG_NOWEP, this.origin, '0 0 0'); + Damage(this, NULL, NULL, take, DEATH_FALL.m_id, DMG_NOWEP, this.origin, '0 0 0'); this.play_time = time + 0.25; - - //dprint("wc: ", ftos(wc), "\n"); - //dprint("take: ", ftos(take), "\n"); } } } @@ -924,12 +919,12 @@ void vehicles_touch(entity this, entity toucher) // Vehicle currently in use if(this.owner) { - if(!weaponLocked(this.owner)) if(toucher != NULL) if((this.origin_z + this.maxs_z) > (toucher.origin_z)) if(vehicles_crushable(toucher)) + if(!weaponLocked(this.owner)) { - if(vdist(this.velocity, >=, 30)) + if(vdist(this.velocity, >=, autocvar_g_vehicles_crush_minspeed)) Damage(toucher, this, this.owner, autocvar_g_vehicles_crush_dmg, DEATH_VH_CRUSH.m_id, DMG_NOWEP, '0 0 0', normalize(toucher.origin - this.origin) * autocvar_g_vehicles_crush_force); return; // Dont do selfdamage when hitting "soft targets". diff --git a/qcsrc/common/vehicles/sv_vehicles.qh b/qcsrc/common/vehicles/sv_vehicles.qh index 9870814d3..0d707b52f 100644 --- a/qcsrc/common/vehicles/sv_vehicles.qh +++ b/qcsrc/common/vehicles/sv_vehicles.qh @@ -12,6 +12,7 @@ AUTOCVAR(g_vehicles_steal, bool, true, "allow stealing enemy vehicles in teampla AUTOCVAR(g_vehicles_steal_show_waypoint, bool, true, "show a waypoint above the thief"); float autocvar_g_vehicles_crush_dmg = 70; float autocvar_g_vehicles_crush_force = 50; +float autocvar_g_vehicles_crush_minspeed = 100; bool autocvar_g_vehicles_delayspawn = true; float autocvar_g_vehicles_delayspawn_jitter = 10; float autocvar_g_vehicles_allow_bots; diff --git a/qcsrc/common/weapons/weapon/crylink.qc b/qcsrc/common/weapons/weapon/crylink.qc index 358914635..db14a6030 100644 --- a/qcsrc/common/weapons/weapon/crylink.qc +++ b/qcsrc/common/weapons/weapon/crylink.qc @@ -43,9 +43,15 @@ void W_Crylink_Dequeue(entity e) W_Crylink_Dequeue_Raw(e.crylink_owner, e.queueprev, e, e.queuenext); } +void W_Crylink_DeleteLink(entity this) +{ + if(this.classname != "spike_oktoremove") + W_Crylink_Dequeue(this); + delete_fn(this); +} + void W_Crylink_Reset(entity this) { - W_Crylink_Dequeue(this); delete(this); } @@ -263,7 +269,6 @@ void W_Crylink_Touch(entity this, entity toucher) else if(finalhit) { // just unlink - W_Crylink_Dequeue(this); delete(this); return; } @@ -278,7 +283,6 @@ void W_Crylink_Touch(entity this, entity toucher) void W_Crylink_Fadethink(entity this) { - W_Crylink_Dequeue(this); delete(this); } @@ -308,6 +312,7 @@ void W_Crylink_Attack(Weapon thiswep, entity actor, .entity weaponentity) for(counter = 0; counter < shots; ++counter) { proj = new(spike); + proj.dtor = W_Crylink_DeleteLink; proj.reset = W_Crylink_Reset; proj.realowner = proj.owner = actor; proj.crylink_owner = actor; @@ -420,6 +425,7 @@ void W_Crylink_Attack2(Weapon thiswep, entity actor, .entity weaponentity) for(counter = 0; counter < shots; ++counter) { proj = new(spike); + proj.dtor = W_Crylink_DeleteLink; proj.weaponentity_fld = weaponentity; proj.reset = W_Crylink_Reset; proj.realowner = proj.owner = actor; diff --git a/qcsrc/common/weapons/weapon/devastator.qc b/qcsrc/common/weapons/weapon/devastator.qc index 5654488dd..fc42f39d7 100644 --- a/qcsrc/common/weapons/weapon/devastator.qc +++ b/qcsrc/common/weapons/weapon/devastator.qc @@ -71,8 +71,11 @@ void W_Devastator_DoRemoteExplode(entity this, .entity weaponentity) bool handled_as_rocketjump = false; entity head = NULL; + bool allow_rocketjump = WEP_CVAR(devastator, remote_jump); + MUTATOR_CALLHOOK(AllowRocketJumping, allow_rocketjump); + allow_rocketjump = M_ARGV(0, bool); - if(WEP_CVAR(devastator, remote_jump_radius)) + if(allow_rocketjump && WEP_CVAR(devastator, remote_jump_radius)) { head = WarpZone_FindRadius( this.origin, @@ -314,7 +317,7 @@ void W_Devastator_Attack(Weapon thiswep, entity actor, .entity weaponentity, int if(WEP_CVAR(devastator, detonatedelay) >= 0) missile.spawnshieldtime = time + WEP_CVAR(devastator, detonatedelay); else - missile.spawnshieldtime = -1; + missile.spawnshieldtime = -1; // NOTE: proximity based when rocket jumping missile.pushltime = time + WEP_CVAR(devastator, guidedelay); missile.classname = "rocket"; missile.bot_dodge = true; diff --git a/qcsrc/common/weapons/weapon/devastator.qh b/qcsrc/common/weapons/weapon/devastator.qh index 33814a5e1..679f75499 100644 --- a/qcsrc/common/weapons/weapon/devastator.qh +++ b/qcsrc/common/weapons/weapon/devastator.qh @@ -40,6 +40,7 @@ CLASS(Devastator, Weapon) P(class, prefix, remote_damage, float, NONE) \ P(class, prefix, remote_edgedamage, float, NONE) \ P(class, prefix, remote_force, float, NONE) \ + P(class, prefix, remote_jump, float, NONE) \ P(class, prefix, remote_jump_damage, float, NONE) \ P(class, prefix, remote_jump_force, float, NONE) \ P(class, prefix, remote_jump_radius, float, NONE) \ diff --git a/qcsrc/common/weapons/weapon/machinegun.qc b/qcsrc/common/weapons/weapon/machinegun.qc index 2d88a9deb..5a55b7e8b 100644 --- a/qcsrc/common/weapons/weapon/machinegun.qc +++ b/qcsrc/common/weapons/weapon/machinegun.qc @@ -2,15 +2,6 @@ #ifdef SVQC -METHOD(MachineGun, m_spawnfunc_hookreplace, Weapon(MachineGun this, entity e)) -{ - if (autocvar_sv_q3acompat_machineshotgunswap && !Item_IsLoot(e)) - { - return WEP_SHOCKWAVE; - } - return this; -} - void W_MachineGun_MuzzleFlash_Think(entity this) { this.frame += 2; @@ -199,10 +190,14 @@ METHOD(MachineGun, wr_aim, void(entity thiswep, entity actor, .entity weaponenti } METHOD(MachineGun, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire)) { - if(WEP_CVAR(machinegun, reload_ammo) && actor.(weaponentity).clip_load < min(max(WEP_CVAR(machinegun, sustained_ammo), WEP_CVAR(machinegun, first_ammo)), WEP_CVAR(machinegun, burst_ammo))) { // forced reload + // forced reload - wait until the bulletcounter is 0 so a burst loop can finish + if(WEP_CVAR(machinegun, reload_ammo) + && actor.(weaponentity).clip_load < min(max(WEP_CVAR(machinegun, sustained_ammo), WEP_CVAR(machinegun, first_ammo)), WEP_CVAR(machinegun, burst_ammo)) + && actor.(weaponentity).misc_bulletcounter >= 0) + { thiswep.wr_reload(thiswep, actor, weaponentity); - } else - if(WEP_CVAR(machinegun, mode) == 1) + } + else if(WEP_CVAR(machinegun, mode) == 1) { if(fire & 1) if(weapon_prepareattack(thiswep, actor, weaponentity, false, 0)) @@ -211,6 +206,7 @@ METHOD(MachineGun, wr_think, void(entity thiswep, entity actor, .entity weaponen W_MachineGun_Attack_Auto(thiswep, actor, weaponentity, fire); } + // You can "shoot" more rounds than what's "used", and vice versa. if(fire & 2) if(weapon_prepareattack(thiswep, actor, weaponentity, true, 0)) { @@ -221,10 +217,18 @@ METHOD(MachineGun, wr_think, void(entity thiswep, entity actor, .entity weaponen w_ready(thiswep, actor, weaponentity, fire); return; } - - W_DecreaseAmmo(thiswep, actor, WEP_CVAR(machinegun, burst_ammo), weaponentity); - - actor.(weaponentity).misc_bulletcounter = WEP_CVAR(machinegun, burst) * -1; + + // We don't want to shoot 3 rounds if there's 2 left in the mag, so we'll use a fraction. + // Also keep the fraction <= 1 otherwise we'd mag dump in one burst. + float burst_fraction = min(1, actor.(weaponentity).clip_load / WEP_CVAR(machinegun, burst_ammo)); + int to_shoot = floor(WEP_CVAR(machinegun, burst) * burst_fraction); + + // We also don't want to use 3 rounds if there's only 2 left. + int to_use = min(WEP_CVAR(machinegun, burst_ammo), actor.(weaponentity).clip_load); + W_DecreaseAmmo(thiswep, actor, to_use, weaponentity); + + // Bursting counts up to 0 from a negative. + actor.(weaponentity).misc_bulletcounter = -to_shoot; W_MachineGun_Attack_Burst(thiswep, actor, weaponentity, fire); } } @@ -268,15 +272,16 @@ METHOD(MachineGun, wr_checkammo1, bool(entity thiswep, entity actor, .entity wea METHOD(MachineGun, wr_checkammo2, bool(entity thiswep, entity actor, .entity weaponentity)) { float ammo_amount; + float burst_ammo_per_shot = WEP_CVAR(machinegun, burst_ammo) / WEP_CVAR(machinegun, burst); if(WEP_CVAR(machinegun, mode) == 1) - ammo_amount = GetResource(actor, thiswep.ammo_type) >= WEP_CVAR(machinegun, burst_ammo); + ammo_amount = GetResource(actor, thiswep.ammo_type) >= burst_ammo_per_shot; else ammo_amount = GetResource(actor, thiswep.ammo_type) >= WEP_CVAR(machinegun, first_ammo); if(WEP_CVAR(machinegun, reload_ammo)) { if(WEP_CVAR(machinegun, mode) == 1) - ammo_amount += actor.(weaponentity).(weapon_load[thiswep.m_id]) >= WEP_CVAR(machinegun, burst_ammo); + ammo_amount += actor.(weaponentity).(weapon_load[thiswep.m_id]) >= burst_ammo_per_shot; else ammo_amount += actor.(weaponentity).(weapon_load[thiswep.m_id]) >= WEP_CVAR(machinegun, first_ammo); } @@ -284,6 +289,8 @@ METHOD(MachineGun, wr_checkammo2, bool(entity thiswep, entity actor, .entity wea } METHOD(MachineGun, wr_reload, void(entity thiswep, entity actor, .entity weaponentity)) { + if(actor.(weaponentity).misc_bulletcounter < 0) + return; W_Reload(actor, weaponentity, min(max(WEP_CVAR(machinegun, sustained_ammo), WEP_CVAR(machinegun, first_ammo)), WEP_CVAR(machinegun, burst_ammo)), SND_RELOAD); } METHOD(MachineGun, wr_suicidemessage, Notification(entity thiswep)) diff --git a/qcsrc/common/weapons/weapon/shockwave.qc b/qcsrc/common/weapons/weapon/shockwave.qc index cdd0a0f92..94f84ba5b 100644 --- a/qcsrc/common/weapons/weapon/shockwave.qc +++ b/qcsrc/common/weapons/weapon/shockwave.qc @@ -3,6 +3,8 @@ REGISTER_NET_TEMP(TE_CSQC_SHOCKWAVEPARTICLE) #ifdef SVQC +// enable when shockwave replaces shotgun +#if 0 METHOD(Shockwave, m_spawnfunc_hookreplace, Weapon(Shockwave this, entity e)) { //if(autocvar_sv_q3acompat_machineshockwaveswap) // WEAPONTODO @@ -12,6 +14,7 @@ METHOD(Shockwave, m_spawnfunc_hookreplace, Weapon(Shockwave this, entity e)) } return this; } +#endif const float MAX_SHOCKWAVE_HITS = 10; //#define DEBUG_SHOCKWAVE diff --git a/qcsrc/common/weapons/weapon/shotgun.qc b/qcsrc/common/weapons/weapon/shotgun.qc index a3bf16145..18e75fad2 100644 --- a/qcsrc/common/weapons/weapon/shotgun.qc +++ b/qcsrc/common/weapons/weapon/shotgun.qc @@ -2,13 +2,31 @@ #ifdef SVQC +METHOD(Shotgun, m_spawnfunc_hookreplace, Weapon(Shotgun this, entity e)) +{ + if (autocvar_sv_q3acompat_machineshotgunswap && !Item_IsLoot(e)) + { + return WEP_MACHINEGUN; + } + return this; +} + void W_Shotgun_Attack(Weapon thiswep, entity actor, .entity weaponentity, float isprimary, float ammocount, float damage, float bullets, float spread, float solidpenetration, float force, entity bullet_trail_effect) { W_DecreaseAmmo(thiswep, actor, ammocount, weaponentity); W_SetupShot(actor, weaponentity, true, 5, SND_SHOTGUN_FIRE, ((isprimary) ? CH_WEAPON_A : CH_WEAPON_SINGLE), damage * bullets, thiswep.m_id); + + // TRICK: do the antilag outside the regular fireBullet function, so it isn't performed unnecessarily on every single bullet! + float lag = antilag_getlag(actor); + if(lag && bullets > 0) + antilag_takeback_all(actor, lag); + for(int sc = 0;sc < bullets;sc = sc + 1) - fireBullet(actor, weaponentity, w_shotorg, w_shotdir, spread, solidpenetration, damage, force, thiswep.m_id, bullet_trail_effect); + fireBullet_antilag(actor, weaponentity, w_shotorg, w_shotdir, spread, solidpenetration, damage, force, thiswep.m_id, bullet_trail_effect, false); + + if(lag && bullets > 0) + antilag_restore_all(actor); Send_Effect(EFFECT_SHOTGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, ammocount); diff --git a/qcsrc/common/wepent.qc b/qcsrc/common/wepent.qc index 9193c4ef1..38ef3bd1f 100644 --- a/qcsrc/common/wepent.qc +++ b/qcsrc/common/wepent.qc @@ -73,6 +73,10 @@ MACRO_END PROP(false, clip_size, WEPENT_SET_NORMAL, \ { WriteShort(chan, this.clip_size); }, \ { (viewmodels[this.m_wepent_slot]).clip_size = ReadShort(); }) \ + \ + PROP(false, skin, WEPENT_SET_NORMAL, \ + { WriteShort(chan, this.skin); }, \ + { (viewmodels[this.m_wepent_slot]).m_skin = ReadShort(); }) \ \ /**/ diff --git a/qcsrc/common/wepent.qh b/qcsrc/common/wepent.qh index 556f58194..6d7128c33 100644 --- a/qcsrc/common/wepent.qh +++ b/qcsrc/common/wepent.qh @@ -37,6 +37,8 @@ REGISTER_NET_TEMP(CLIENT_WEPENT) .float m_alpha; + .int m_skin; + // only for Porto .bool angles_held_status; .vector angles_held; diff --git a/qcsrc/lib/csqcmodel/cl_model.qc b/qcsrc/lib/csqcmodel/cl_model.qc index 12be0dbaa..ccf675117 100644 --- a/qcsrc/lib/csqcmodel/cl_model.qc +++ b/qcsrc/lib/csqcmodel/cl_model.qc @@ -277,6 +277,9 @@ NET_HANDLE(ENT_CLIENT_MODEL, bool isnew) this.csqcmodel_teleported = 1; } + if(sf & BIT(3)) + this.alpha = this.m_alpha; + if(sf & BIT(14)) viewloc_SetTags(this); diff --git a/qcsrc/lib/csqcmodel/cl_model.qh b/qcsrc/lib/csqcmodel/cl_model.qh index b5d9f8bd3..621186844 100644 --- a/qcsrc/lib/csqcmodel/cl_model.qh +++ b/qcsrc/lib/csqcmodel/cl_model.qh @@ -27,7 +27,8 @@ #define CSQCMODEL_ENDIF #define CSQCMODEL_PROPERTY(flag,t,r,w,f) \ .t f; -#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) CSQCMODEL_PROPERTY(flag,t,r,w,f) +#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) \ + .t f; ALLPROPERTIES #undef CSQCMODEL_PROPERTY_SCALED #undef CSQCMODEL_PROPERTY diff --git a/qcsrc/lib/csqcmodel/sv_model.qc b/qcsrc/lib/csqcmodel/sv_model.qc index 584bfc23f..70e2c1a15 100644 --- a/qcsrc/lib/csqcmodel/sv_model.qc +++ b/qcsrc/lib/csqcmodel/sv_model.qc @@ -48,7 +48,11 @@ bool CSQCModel_Send(entity this, entity to, int sf) { \ w(MSG_ENTITY, this.csqcmodel_##f); \ } -#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) CSQCMODEL_PROPERTY(flag,t,r,w,f) +#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) \ + if(sf & flag) \ + { \ + w(MSG_ENTITY, this.csqcmodel_##f); \ + } ALLPROPERTIES #undef CSQCMODEL_PROPERTY_SCALED #undef CSQCMODEL_PROPERTY diff --git a/qcsrc/lib/csqcmodel/sv_model.qh b/qcsrc/lib/csqcmodel/sv_model.qh index e963f12a1..f70ecea88 100644 --- a/qcsrc/lib/csqcmodel/sv_model.qh +++ b/qcsrc/lib/csqcmodel/sv_model.qh @@ -34,7 +34,9 @@ void CSQCModel_UnlinkEntity(entity e); #define CSQCMODEL_PROPERTY(flag,t,r,w,f) \ .t f; \ .t csqcmodel_##f; -#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) CSQCMODEL_PROPERTY(flag,t,r,w,f) +#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) \ + .t f; \ + .t csqcmodel_##f; ALLPROPERTIES #undef CSQCMODEL_PROPERTY_SCALED #undef CSQCMODEL_PROPERTY diff --git a/qcsrc/menu/xonotic/_mod.inc b/qcsrc/menu/xonotic/_mod.inc index 00a9e5403..3f324ba39 100644 --- a/qcsrc/menu/xonotic/_mod.inc +++ b/qcsrc/menu/xonotic/_mod.inc @@ -59,6 +59,7 @@ #include #include #include +#include #include #include #include @@ -70,7 +71,6 @@ #include #include #include -#include #include #include #include diff --git a/qcsrc/menu/xonotic/_mod.qh b/qcsrc/menu/xonotic/_mod.qh index 5d72a5617..1b3e09081 100644 --- a/qcsrc/menu/xonotic/_mod.qh +++ b/qcsrc/menu/xonotic/_mod.qh @@ -59,6 +59,7 @@ #include #include #include +#include #include #include #include @@ -70,7 +71,6 @@ #include #include #include -#include #include #include #include diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_profile.qc b/qcsrc/menu/xonotic/dialog_multiplayer_profile.qc index f87e0dbbe..4405d98de 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer_profile.qc +++ b/qcsrc/menu/xonotic/dialog_multiplayer_profile.qc @@ -131,7 +131,12 @@ void XonoticProfileTab_fill(entity me) me.TD(me, 1, 2.5, e = makeXonoticCheckBox(0, "cl_allow_uid2name", _("Allow player statistics to use your nickname"))); e.sendCvars = true; setDependent(e, "cl_allow_uidtracking", 1, 1); - me.gotoRC(me, 4, 3.1); // TOP RIGHT + me.TR(me); + me.TDempty(me, 0.25); + me.TD(me, 1, 2.5, e = makeXonoticCheckBox(0, "cl_allow_uidranking", _("Allow player statistics to rank you in leaderboards"))); + e.sendCvars = true; + setDependent(e, "cl_allow_uidtracking", 1, 1); + me.gotoRC(me, 4.5, 3.1); // TOP RIGHT //me.gotoRC(me, 12.5, 3.1); // BOTTOM RIGHT //me.gotoRC(me, 12.5, 0); // BOTTOM LEFT me.TDempty(me, 0.25); diff --git a/qcsrc/menu/xonotic/dialog_settings_misc.qc b/qcsrc/menu/xonotic/dialog_settings_misc.qc index 1c7da7291..ca812d304 100644 --- a/qcsrc/menu/xonotic/dialog_settings_misc.qc +++ b/qcsrc/menu/xonotic/dialog_settings_misc.qc @@ -36,8 +36,8 @@ void XonoticMiscSettingsTab_fill(entity me) _("Specify your network speed"))); e.addValue(e, _("56k"), "4000"); e.addValue(e, _("ISDN"), "7000"); - e.addValue(e, _("Slow ADSL"), "15000"); - e.addValue(e, _("Fast ADSL"), "20000"); + e.addValue(e, _("Slow ADSL"), "20000"); + e.addValue(e, _("Fast ADSL"), "40000"); e.addValue(e, _("Broadband"), "66666"); e.configureXonoticTextSliderValues(e); me.TR(me); @@ -87,15 +87,13 @@ void XonoticMiscSettingsTab_fill(entity me) me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Maximum:"))); me.TD(me, 1, 2, e = makeXonoticTextSlider("cl_maxfps")); ADDVALUE_FPS(30); - ADDVALUE_FPS(40); - ADDVALUE_FPS(50); ADDVALUE_FPS(60); - ADDVALUE_FPS(70); - ADDVALUE_FPS(80); ADDVALUE_FPS(100); ADDVALUE_FPS(125); ADDVALUE_FPS(150); ADDVALUE_FPS(200); + ADDVALUE_FPS(250); + ADDVALUE_FPS(400); e.addValue(e, ZCTX(_("MAXFPS^Unlimited")), "0"); e.configureXonoticTextSliderValues(e); me.TR(me); @@ -103,14 +101,13 @@ void XonoticMiscSettingsTab_fill(entity me) me.TD(me, 1, 2, e = makeXonoticTextSlider("cl_minfps")); e.addValue(e, ZCTX(_("TRGT^Disabled")), "0"); ADDVALUE_FPS(30); - ADDVALUE_FPS(40); - ADDVALUE_FPS(50); ADDVALUE_FPS(60); - ADDVALUE_FPS(80); ADDVALUE_FPS(100); ADDVALUE_FPS(125); ADDVALUE_FPS(150); ADDVALUE_FPS(200); + ADDVALUE_FPS(250); + ADDVALUE_FPS(400); e.configureXonoticTextSliderValues(e); me.TR(me); me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Idle limit:"))); diff --git a/qcsrc/menu/xonotic/keybinder.qc b/qcsrc/menu/xonotic/keybinder.qc index 6e59b8b1f..4f6e4a04a 100644 --- a/qcsrc/menu/xonotic/keybinder.qc +++ b/qcsrc/menu/xonotic/keybinder.qc @@ -122,6 +122,7 @@ void KeyBinds_Read() KEYBIND_DEF("kill" , _("respawn")); KEYBIND_DEF("quickmenu" , _("quick menu")); KEYBIND_DEF("menu_showsandboxtools" , _("sandbox menu")); + KEYBIND_DEF("wpeditor_menu" , _("waypoint editor menu")); KEYBIND_DEF("+button8" , _("drag object")); KEYBIND_EMPTY_LINE(); diff --git a/qcsrc/menu/xonotic/statslist.qc b/qcsrc/menu/xonotic/statslist.qc index 2c600b6f5..7d19516cf 100644 --- a/qcsrc/menu/xonotic/statslist.qc +++ b/qcsrc/menu/xonotic/statslist.qc @@ -41,12 +41,11 @@ string XonoticStatsList_convertDate(string input) default: return input; // failed, why? } - return sprintf( - "%s %s, %d", - monthname, - count_ordinal(stof(substring(input, 8, 2))), - stof(substring(input, 0, 4)) - ); + string date = ZCTX(_("DATE^%m %d, %Y")); + date = strreplace("%Y", substring(input, 0, 4), date); + date = strreplace("%d", ftos(stof(substring(input, 8, 2))), date); // ftos-stof removes leading 0 + date = strreplace("%m", monthname, date); + return date; } void XonoticStatsList_getStats(entity me) diff --git a/qcsrc/server/antilag.qc b/qcsrc/server/antilag.qc index c6e26e09e..93ca6acf9 100644 --- a/qcsrc/server/antilag.qc +++ b/qcsrc/server/antilag.qc @@ -148,6 +148,16 @@ void antilag_restore_all(entity ignore) }); } +float antilag_getlag(entity e) +{ + float lag = ((IS_REAL_CLIENT(e)) ? ANTILAG_LATENCY(e) : 0); + bool noantilag = ((IS_CLIENT(e)) ? CS(e).cvar_cl_noantilag : false); + if(autocvar_g_antilag == 0 || noantilag || lag < 0.001) + lag = 0; + + return lag; +} + /* ================== traceline_antilag diff --git a/qcsrc/server/antilag.qh b/qcsrc/server/antilag.qh index c3be5553a..f02803387 100644 --- a/qcsrc/server/antilag.qh +++ b/qcsrc/server/antilag.qh @@ -9,6 +9,8 @@ void antilag_clear(entity e, entity store); void antilag_takeback_all(entity ignore, float lag); void antilag_restore_all(entity ignore); +float antilag_getlag(entity e); // returns antilag latency for clients, plus any modifiers (such as noantilag) + .float antilag_debug; #define ANTILAG_LATENCY(e) min(0.4, CS(e).ping * 0.001) diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index 4b71e28e8..7f3c0b720 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -91,7 +91,8 @@ float autocvar_g_balance_selfdamagepercent; float autocvar_g_ballistics_density_corpse; float autocvar_g_ballistics_density_player; float autocvar_g_ballistics_mindistance; -bool autocvar_g_ballistics_penetrate_clips; +bool autocvar_g_ballistics_penetrate_clips = true; +float autocvar_g_ballistics_solidpenetration_exponent = 0.25; float autocvar_g_ban_default_bantime; float autocvar_g_ban_default_masksize; float autocvar_g_ban_sync_interval; @@ -157,6 +158,7 @@ bool autocvar_g_maplist_votable_suggestions; bool autocvar_g_maplist_votable_suggestions_override_mostrecent; float autocvar_g_maplist_votable_timeout; bool autocvar_g_maplist_ignore_sizes; +bool autocvar_g_maplist_sizes_count_bots = true; int autocvar_g_maxplayers; float autocvar_g_maxplayers_spectator_blocktime; float autocvar_g_maxpushtime; diff --git a/qcsrc/server/bot/api.qh b/qcsrc/server/bot/api.qh index 35b52e3d9..f8285f634 100644 --- a/qcsrc/server/bot/api.qh +++ b/qcsrc/server/bot/api.qh @@ -7,13 +7,22 @@ const int WAYPOINTFLAG_GENERATED = BIT(23); const int WAYPOINTFLAG_ITEM = BIT(22); const int WAYPOINTFLAG_TELEPORT = BIT(21); // teleports, warpzones and jumppads -const int WAYPOINTFLAG_NORELINK = BIT(20); +//const int WAYPOINTFLAG_NORELINK = BIT(20); // deprecated, see explanation below. Do not recycle this bit. const int WAYPOINTFLAG_PERSONAL = BIT(19); const int WAYPOINTFLAG_PROTECTED = BIT(18); // Useless WP detection never kills these. const int WAYPOINTFLAG_USEFUL = BIT(17); // Useless WP detection temporary flag. const int WAYPOINTFLAG_DEAD_END = BIT(16); // Useless WP detection temporary flag. const int WAYPOINTFLAG_LADDER = BIT(15); const int WAYPOINTFLAG_JUMP = BIT(14); +const int WAYPOINTFLAG_CUSTOM_JP = BIT(13); // jumppad with different destination waypoint (changed in the editor) +const int WAYPOINTFLAG_CROUCH = BIT(12); +const int WAYPOINTFLAG_SUPPORT = BIT(11); + +// removed WAYPOINTFLAG_NORELINK since it breaks backward compatibility +// e.g. support waypoints would have no outgoing links in old Xonotic versions +// In general, old Xonotic versions should spawn a normal waypoint for each unknown waypoint type +const int WAYPOINTFLAG_NORELINK__DEPRECATED = BIT(20); +const int WPFLAGMASK_NORELINK = (WAYPOINTFLAG_TELEPORT | WAYPOINTFLAG_LADDER | WAYPOINTFLAG_JUMP | WAYPOINTFLAG_CUSTOM_JP | WAYPOINTFLAG_SUPPORT); float bot_custom_weapon; float bot_weapons_close[Weapons_MAX]; @@ -48,8 +57,8 @@ float skill; .float wp24mincost, wp25mincost, wp26mincost, wp27mincost, wp28mincost, wp29mincost, wp30mincost, wp31mincost; .float wpconsidered; .float wpcost; -.float wphardwired; .int wpflags; +.entity wphw00, wphw01, wphw02, wphw03, wphw04, wphw05, wphw06, wphw07; bool bot_aim(entity this, .entity weaponentity, float shotspeed, float shotspeedupward, float maxshottime, float applygravity); void bot_aim_reset(entity this); @@ -98,6 +107,7 @@ void navigation_goalrating_timeout_set(entity this); void navigation_goalrating_timeout_force(entity this); void navigation_goalrating_timeout_expire(entity this, float seconds); bool navigation_goalrating_timeout(entity this); +void navigation_goalrating_timeout_extend_if_needed(entity this, float seconds); bool navigation_goalrating_timeout_can_be_anticipated(entity this); void navigation_markroutes(entity this, entity fixed_source_waypoint); void navigation_markroutes_inverted(entity fixed_source_waypoint); @@ -118,9 +128,11 @@ void waypoint_spawnforitem(entity e); void waypoint_spawnforitem_force(entity e, vector org); void waypoint_spawnforteleporter(entity e, vector destination, float timetaken, entity tracetest_ent); void waypoint_spawnforteleporter_wz(entity e, entity tracetest_ent); -void waypoint_spawn_fromeditor(entity pl); +void waypoint_spawn_fromeditor(entity pl, bool at_crosshair, bool is_jump_wp, bool is_crouch_wp, bool is_support_wp); entity waypoint_spawn(vector m1, vector m2, float f); void waypoint_unreachable(entity pl); +void waypoint_start_hardwiredlink(entity pl, bool at_crosshair); +void waypoint_lock(entity pl); void waypoint_getSymmetricalOrigin_cmd(entity caller, bool save, int arg_idx); void waypoint_getSymmetricalAxis_cmd(entity caller, bool save, int arg_idx); diff --git a/qcsrc/server/bot/default/bot.qc b/qcsrc/server/bot/default/bot.qc index 90338d202..40afed179 100644 --- a/qcsrc/server/bot/default/bot.qc +++ b/qcsrc/server/bot/default/bot.qc @@ -580,6 +580,7 @@ void bot_calculate_stepheightvec() stepheightvec = autocvar_sv_stepheight * '0 0 1'; jumpheight_vec = (autocvar_sv_jumpvelocity ** 2) / (2 * autocvar_sv_gravity) * '0 0 1'; jumpstepheightvec = stepheightvec + jumpheight_vec * 0.85; // reduce it a bit to make the jumps easy + jumpheight_time = autocvar_sv_jumpvelocity / autocvar_sv_gravity; } bool bot_fixcount() @@ -756,7 +757,7 @@ void bot_serverframe() if(botframe_cachedwaypointlinks) { if(!botframe_loadedforcedlinks) - waypoint_load_links_hardwired(); + waypoint_load_hardwiredlinks(); } else { diff --git a/qcsrc/server/bot/default/havocbot/havocbot.qc b/qcsrc/server/bot/default/havocbot/havocbot.qc index 2b2dfbf3c..4e32ce99a 100644 --- a/qcsrc/server/bot/default/havocbot/havocbot.qc +++ b/qcsrc/server/bot/default/havocbot/havocbot.qc @@ -89,6 +89,9 @@ void havocbot_ai(entity this) bot_strategytoken_taken = true; } + if (this.goalcurrent && wasfreed(this.goalcurrent)) + navigation_clearroute(this); + if(IS_DEAD(this) || STAT(FROZEN, this)) { if (this.goalcurrent) @@ -267,7 +270,7 @@ void havocbot_bunnyhop(entity this, vector dir) if(this.aistatus & AI_STATUS_ATTACKING) return; - if(IS_PLAYER(this.goalcurrent)) + if (!this.goalcurrent || IS_PLAYER(this.goalcurrent)) return; if((this.aistatus & AI_STATUS_RUNNING) && vdist(this.velocity, <, autocvar_sv_maxspeed * 0.75) @@ -280,7 +283,7 @@ void havocbot_bunnyhop(entity this, vector dir) return; } - if(this.waterlevel > WATERLEVEL_WETFEET) + if(this.waterlevel > WATERLEVEL_WETFEET || IS_DUCKED(this)) { this.aistatus &= ~AI_STATUS_RUNNING; return; @@ -292,8 +295,6 @@ void havocbot_bunnyhop(entity this, vector dir) this.bot_timelastseengoal = 0; } - vector gco = get_closer_dest(this.goalcurrent, this.origin); - // Run only to visible goals if(IS_ONGROUND(this)) if(vdist(vec2(this.velocity), >=, autocvar_sv_maxspeed)) @@ -304,6 +305,7 @@ void havocbot_bunnyhop(entity this, vector dir) // seen it before if(this.bot_timelastseengoal) { + vector gco = get_closer_dest(this.goalcurrent, this.origin); // for a period of time if(time - this.bot_timelastseengoal > autocvar_bot_ai_bunnyhop_firstjumpdelay) { @@ -323,9 +325,10 @@ void havocbot_bunnyhop(entity this, vector dir) if(this.aistatus & AI_STATUS_ROAMING) if(this.goalcurrent.classname == "waypoint") - if(!(this.goalcurrent.wpflags & WAYPOINTFLAG_PERSONAL)) + if (!(this.goalcurrent.wpflags & WAYPOINTFLAG_PERSONAL)) if(fabs(gco.z - this.origin.z) < this.maxs.z - this.mins.z) - if(this.goalstack01 && !wasfreed(this.goalstack01)) + if (this.goalstack01 && !wasfreed(this.goalstack01)) + if (!(this.goalstack01.wpflags & WAYPOINTFLAG_JUMP)) { vector gno = (this.goalstack01.absmin + this.goalstack01.absmax) * 0.5; vector deviation = vectoangles(gno - this.origin) - vectoangles(gco - this.origin); @@ -372,6 +375,8 @@ void havocbot_bunnyhop(entity this, vector dir) // return true when bot isn't getting closer to the current goal bool havocbot_checkgoaldistance(entity this, vector gco) { + if (this.bot_stop_moving_timeout > time) + return false; float curr_dist_z = max(20, fabs(this.origin.z - gco.z)); float curr_dist_2d = max(20, vlen(vec2(this.origin - gco))); float distance_time = this.goalcurrent_distance_time; @@ -438,6 +443,8 @@ void havocbot_movetogoal(entity this) CS(this).movement = '0 0 0'; maxspeed = autocvar_sv_maxspeed; + PHYS_INPUT_BUTTON_CROUCH(this) = boolean(this.goalcurrent.wpflags & WAYPOINTFLAG_CROUCH); + PHYS_INPUT_BUTTON_JETPACK(this) = false; // Jetpack navigation if(this.navigation_jetpack_goal) @@ -640,7 +647,8 @@ void havocbot_movetogoal(entity this) return; } - else if(!this.jumppadcount && !this.goalcurrent.wphardwired + else if(!this.jumppadcount && !waypoint_is_hardwiredlink(this.goalcurrent_prev, this.goalcurrent) + && !(this.goalcurrent_prev && this.goalcurrent_prev.wpflags & WAYPOINTFLAG_JUMP) && GetResource(this, RES_HEALTH) + GetResource(this, RES_ARMOR) > ROCKETJUMP_DAMAGE()) { if(this.velocity.z < 0) @@ -955,7 +963,26 @@ void havocbot_movetogoal(entity this) vector flat_diff = vec2(diff); offset = max(32, current_speed * cos(deviation.y * DEG2RAD) * 0.3) * flatdir; vector actual_destorg = this.origin + offset; - if (!this.goalstack01 || this.goalcurrent.wpflags & (WAYPOINTFLAG_TELEPORT | WAYPOINTFLAG_LADDER)) + if (this.goalcurrent_prev && (this.goalcurrent_prev.wpflags & WAYPOINTFLAG_JUMP)) + { + if (time > this.bot_stop_moving_timeout + && fabs(deviation.y) > 20 && current_speed > maxspeed * 0.4 + && vdist(vec2(this.origin - this.goalcurrent_prev.origin), <, 50)) + { + this.bot_stop_moving_timeout = time + 0.1; + } + if (current_speed > autocvar_sv_maxspeed * 0.9 + && vlen2(flat_diff) < vlen2(vec2(this.goalcurrent_prev.origin - destorg)) + && vdist(vec2(this.origin - this.goalcurrent_prev.origin), >, 50) + && vdist(vec2(this.origin - this.goalcurrent_prev.origin), <, 150) + ) + { + PHYS_INPUT_BUTTON_JUMP(this) = true; + // avoid changing route while bot is jumping a gap + navigation_goalrating_timeout_extend_if_needed(this, 1.5); + } + } + else if (!this.goalstack01 || (this.goalcurrent.wpflags & (WAYPOINTFLAG_TELEPORT | WAYPOINTFLAG_LADDER))) { if (vlen2(flat_diff) < vlen2(offset)) { @@ -991,10 +1018,20 @@ void havocbot_movetogoal(entity this) turning = true; } - LABEL(jump_check); + LABEL(jumpobstacle_check); dir = flatdir = normalize(actual_destorg - this.origin); - if (turning || fabs(deviation.y) < 50) // don't even try to jump if deviation is too high + bool jump_forbidden = false; + if (!turning && fabs(deviation.y) > 50) + jump_forbidden = true; + else if (IS_DUCKED(this)) + { + tracebox(this.origin, PL_MIN_CONST, PL_MAX_CONST, this.origin, false, this); + if (trace_startsolid) + jump_forbidden = true; + } + + if (!jump_forbidden) { tracebox(this.origin, this.mins, this.maxs, actual_destorg, false, this); if (trace_fraction < 1 && trace_plane_normal.z < 0.7) @@ -1010,7 +1047,7 @@ void havocbot_movetogoal(entity this) actual_destorg = destorg; turning = false; this.bot_tracewalk_time = time + 0.25; - goto jump_check; + goto jumpobstacle_check; } s = trace_fraction; // don't artificially reduce max jump height in real-time @@ -1074,7 +1111,9 @@ void havocbot_movetogoal(entity this) bool unreachable = false; s = CONTENT_SOLID; - if(trace_fraction == 1 && this.jumppadcount == 0 && !this.goalcurrent.wphardwired ) + if (trace_fraction == 1 && !this.jumppadcount + && !waypoint_is_hardwiredlink(this.goalcurrent_prev, this.goalcurrent) + && !(this.goalcurrent_prev && (this.goalcurrent_prev.wpflags & WAYPOINTFLAG_JUMP))) if((IS_ONGROUND(this)) || (this.aistatus & AI_STATUS_RUNNING) || (this.aistatus & AI_STATUS_ROAMING) || PHYS_INPUT_BUTTON_JUMP(this)) { // Look downwards @@ -1121,7 +1160,7 @@ void havocbot_movetogoal(entity this) } // slow down if bot is in the air and goal is under it - if (!this.goalcurrent.wphardwired + if (!waypoint_is_hardwiredlink(this.goalcurrent_prev, this.goalcurrent) && vdist(flat_diff, <, 250) && this.origin.z - destorg.z > 120 && (!IS_ONGROUND(this) || vdist(vec2(this.velocity), >, maxspeed * 0.3))) { @@ -1216,9 +1255,7 @@ void havocbot_movetogoal(entity this) havocbot_keyboard_movement(this, destorg); // Bunnyhop! - //if(this.aistatus & AI_STATUS_ROAMING) - if(!bunnyhop_forbidden && this.goalcurrent) - if(skill+this.bot_moveskill >= autocvar_bot_ai_bunnyhop_skilloffset) + if (!bunnyhop_forbidden && skill + this.bot_moveskill >= autocvar_bot_ai_bunnyhop_skilloffset) havocbot_bunnyhop(this, dir); if (dir * v_up >= autocvar_sv_jumpvelocity * 0.5 && IS_ONGROUND(this)) diff --git a/qcsrc/server/bot/default/navigation.qc b/qcsrc/server/bot/default/navigation.qc index d63e15878..c666fa94e 100644 --- a/qcsrc/server/bot/default/navigation.qc +++ b/qcsrc/server/bot/default/navigation.qc @@ -47,6 +47,11 @@ bool navigation_goalrating_timeout(entity this) return this.bot_strategytime < time; } +void navigation_goalrating_timeout_extend_if_needed(entity this, float seconds) +{ + this.bot_strategytime = max(this.bot_strategytime, time + seconds); +} + #define MAX_CHASE_DISTANCE 700 bool navigation_goalrating_timeout_can_be_anticipated(entity this) { @@ -917,7 +922,7 @@ entity navigation_findnearestwaypoint_withdist_except(entity ent, float walkfrom vector pm2 = ent.origin + ent.maxs; // do two scans, because box test is cheaper - IL_EACH(g_waypoints, it != ent && it != except && !(it.wpflags & WAYPOINTFLAG_TELEPORT), + IL_EACH(g_waypoints, it != ent && it != except && !(it.wpflags & (WAYPOINTFLAG_TELEPORT | WAYPOINTFLAG_JUMP)), { if(boxesoverlap(pm1, pm2, it.absmin, it.absmax)) { @@ -948,7 +953,7 @@ entity navigation_findnearestwaypoint_withdist_except(entity ent, float walkfrom waypoint_clearlinks(ent); // initialize wpXXmincost fields IL_EACH(g_waypoints, it != ent, { - if(walkfromwp && (it.wpflags & WAYPOINTFLAG_NORELINK)) + if (walkfromwp && (it.wpflags & WPFLAGMASK_NORELINK)) continue; set_tracewalk_dest(ent, it.origin, false); @@ -964,7 +969,7 @@ entity navigation_findnearestwaypoint_withdist_except(entity ent, float walkfrom // box check failed, try walk IL_EACH(g_waypoints, it != ent, { - if(walkfromwp && (it.wpflags & WAYPOINTFLAG_NORELINK)) + if (walkfromwp && (it.wpflags & WPFLAGMASK_NORELINK)) continue; v = it.origin; @@ -1577,7 +1582,7 @@ bool navigation_shortenpath(entity this) next = this.goalstack01; // if for some reason the bot is closer to the next goal, pop the current one - if (!IS_MOVABLE(next) // already checked in the previous case + if (!IS_MOVABLE(next) && !(this.goalcurrent.wpflags & (WAYPOINTFLAG_TELEPORT | WAYPOINTFLAG_JUMP)) && vlen2(this.goalcurrent.origin - next.origin) > vlen2(next.origin - this.origin) && checkpvs(this.origin + this.view_ofs, next)) { @@ -1771,7 +1776,7 @@ entity navigation_get_really_close_waypoint(entity this) if(vdist(wp.origin - this.origin, >, 50)) { wp = NULL; - IL_EACH(g_waypoints, !(it.wpflags & WAYPOINTFLAG_TELEPORT), + IL_EACH(g_waypoints, !(it.wpflags & (WAYPOINTFLAG_TELEPORT | WAYPOINTFLAG_JUMP)), { if(vdist(it.origin - this.origin, <, 50)) { diff --git a/qcsrc/server/bot/default/navigation.qh b/qcsrc/server/bot/default/navigation.qh index d002ae29d..026d326b9 100644 --- a/qcsrc/server/bot/default/navigation.qh +++ b/qcsrc/server/bot/default/navigation.qh @@ -10,6 +10,7 @@ float navigation_testtracewalk; vector jumpstepheightvec; vector stepheightvec; vector jumpheight_vec; +float jumpheight_time; entity navigation_bestgoal; @@ -29,6 +30,8 @@ entity navigation_bestgoal; .float goalcurrent_distance_2d; .float goalcurrent_distance_time; +// final goal (item, object or player) is also saved in this field +.entity goalentity; .float goalentity_lock_timeout; .bool goalentity_shouldbefrozen; diff --git a/qcsrc/server/bot/default/waypoints.qc b/qcsrc/server/bot/default/waypoints.qc index 6bc907701..7a40f18e8 100644 --- a/qcsrc/server/bot/default/waypoints.qc +++ b/qcsrc/server/bot/default/waypoints.qc @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -259,6 +260,99 @@ vector waypoint_getSymmetricalPoint(vector org, int ctf_flags) return new_org; } +void crosshair_trace_waypoints(entity pl); +void waypoint_lock(entity pl) +{ + crosshair_trace_waypoints(pl); + pl.wp_locked = trace_ent; +} + +bool waypoint_has_hardwiredlinks(entity wp) +{ + if (!wp) + return false; + return (wp.wphw00 != NULL); +} + +bool waypoint_is_hardwiredlink(entity wp_from, entity wp_to) +{ + if (!(wp_from && wp_to)) + return false; + + if (!wp_from.wphw00) return false; else if (wp_from.wphw00 == wp_to) return true; + if (!wp_from.wphw01) return false; else if (wp_from.wphw01 == wp_to) return true; + if (!wp_from.wphw02) return false; else if (wp_from.wphw02 == wp_to) return true; + if (!wp_from.wphw03) return false; else if (wp_from.wphw03 == wp_to) return true; + if (!wp_from.wphw04) return false; else if (wp_from.wphw04 == wp_to) return true; + if (!wp_from.wphw05) return false; else if (wp_from.wphw05 == wp_to) return true; + if (!wp_from.wphw06) return false; else if (wp_from.wphw06 == wp_to) return true; + if (!wp_from.wphw07) return false; else if (wp_from.wphw07 == wp_to) return true; + + return false; +} + +void waypoint_setupmodel(entity wp); +void waypoint_mark_hardwiredlink(entity wp_from, entity wp_to) +{ + if (!(wp_from && wp_to)) + return; + + if (!wp_from.wphw00 || wp_from.wphw00 == wp_to) { wp_from.wphw00 = wp_to; waypoint_setupmodel(wp_from); return; } + if (!wp_from.wphw01 || wp_from.wphw01 == wp_to) { wp_from.wphw01 = wp_to; return; } + if (!wp_from.wphw02 || wp_from.wphw02 == wp_to) { wp_from.wphw02 = wp_to; return; } + if (!wp_from.wphw03 || wp_from.wphw03 == wp_to) { wp_from.wphw03 = wp_to; return; } + if (!wp_from.wphw04 || wp_from.wphw04 == wp_to) { wp_from.wphw04 = wp_to; return; } + if (!wp_from.wphw05 || wp_from.wphw05 == wp_to) { wp_from.wphw05 = wp_to; return; } + if (!wp_from.wphw06 || wp_from.wphw06 == wp_to) { wp_from.wphw06 = wp_to; return; } + if (!wp_from.wphw07 || wp_from.wphw07 == wp_to) { wp_from.wphw07 = wp_to; return; } + + return; +} + +void waypoint_unmark_hardwiredlink(entity wp_from, entity wp_to) +{ + if (!(wp_from && wp_to)) + return; + + int removed = -1; + if (removed < 0 && wp_from.wphw00 == wp_to) removed = 0; + if (removed < 0 && wp_from.wphw01 == wp_to) removed = 1; + if (removed < 0 && wp_from.wphw02 == wp_to) removed = 2; + if (removed < 0 && wp_from.wphw03 == wp_to) removed = 3; + if (removed < 0 && wp_from.wphw04 == wp_to) removed = 4; + if (removed < 0 && wp_from.wphw05 == wp_to) removed = 5; + if (removed < 0 && wp_from.wphw06 == wp_to) removed = 6; + if (removed < 0 && wp_from.wphw07 == wp_to) removed = 7; + + if (removed >= 0) + { + if (removed <= 0) wp_from.wphw00 = wp_from.wphw01; + if (removed <= 1) wp_from.wphw01 = wp_from.wphw02; + if (removed <= 2) wp_from.wphw02 = wp_from.wphw03; + if (removed <= 3) wp_from.wphw03 = wp_from.wphw04; + if (removed <= 4) wp_from.wphw04 = wp_from.wphw05; + if (removed <= 5) wp_from.wphw05 = wp_from.wphw06; + if (removed <= 6) wp_from.wphw06 = wp_from.wphw07; + if (removed <= 7) wp_from.wphw07 = NULL; + if (!wp_from.wphw00) + waypoint_setupmodel(wp_from); + } + + return; +} + +void waypoint_restore_hardwiredlinks(entity wp) +{ + if (wp.wphw00) waypoint_addlink(wp, wp.wphw00); + if (wp.wphw01) waypoint_addlink(wp, wp.wphw01); + if (wp.wphw02) waypoint_addlink(wp, wp.wphw02); + if (wp.wphw03) waypoint_addlink(wp, wp.wphw03); + if (wp.wphw04) waypoint_addlink(wp, wp.wphw04); + if (wp.wphw05) waypoint_addlink(wp, wp.wphw05); + if (wp.wphw06) waypoint_addlink(wp, wp.wphw06); + if (wp.wphw07) waypoint_addlink(wp, wp.wphw07); +} + void waypoint_setupmodel(entity wp) { if (autocvar_g_waypointeditor) @@ -270,11 +364,23 @@ void waypoint_setupmodel(entity wp) setsize(wp, m1, m2); wp.effects = EF_LOWPRECISION; if (wp.wpflags & WAYPOINTFLAG_ITEM) - wp.colormod = '1 0 0'; + wp.colormod = '1 0 0'; // red else if (wp.wpflags & WAYPOINTFLAG_GENERATED) - wp.colormod = '1 1 0'; - else if (wp.wphardwired) - wp.colormod = '0.5 0 1'; + wp.colormod = '1 1 0'; // yellow + else if (wp.wpflags & WAYPOINTFLAG_SUPPORT) + wp.colormod = '0 1 0'; // green + else if (wp.wpflags & WAYPOINTFLAG_CUSTOM_JP) + wp.colormod = '1 0.5 0'; // orange + else if (wp.wpflags & WAYPOINTFLAG_TELEPORT) + wp.colormod = '1 0.5 0'; // orange + else if (wp.wpflags & WAYPOINTFLAG_LADDER) + wp.colormod = '1 0.5 0'; // orange + else if (wp.wpflags & WAYPOINTFLAG_JUMP) + wp.colormod = '1 0.5 0'; // orange + else if (wp.wpflags & WAYPOINTFLAG_CROUCH) + wp.colormod = '0 1 1'; // cyan + else if (waypoint_has_hardwiredlinks(wp)) + wp.colormod = '0.5 0 1'; // purple else wp.colormod = '1 1 1'; } @@ -282,21 +388,54 @@ void waypoint_setupmodel(entity wp) wp.model = ""; } +string waypoint_get_type_name(entity wp) +{ + if (wp.wpflags & WAYPOINTFLAG_ITEM) return "^1Item waypoint"; + else if (wp.wpflags & WAYPOINTFLAG_CROUCH) return "^5Crouch waypoint"; + else if (wp.wpflags & WAYPOINTFLAG_JUMP) return "^xf80Jump waypoint"; + else if (wp.wpflags & WAYPOINTFLAG_SUPPORT) return "^2Support waypoint"; + else if (waypoint_has_hardwiredlinks(wp)) return "^x80fHardwired waypoint"; + else if (wp.wpflags & WAYPOINTFLAG_LADDER) return "^3Ladder waypoint"; + else if (wp.wpflags & WAYPOINTFLAG_TELEPORT) + { + if (!wp.wpisbox) return "^3Warpzone waypoint"; + else if (wp.wpflags & WAYPOINTFLAG_CUSTOM_JP) return "^3Custom jumppad waypoint"; + else + { + IL_EACH(g_jumppads, boxesoverlap(wp.absmin, wp.absmax, it.absmin, it.absmax), + { return "^3Jumppad waypoint"; }); + return "^3Teleport waypoint"; + } + } + + return "^7Waypoint"; +} + +entity waypoint_get(vector m1, vector m2) +{ + if (m1 == m2) + { + m1 -= '8 8 8'; + m2 += '8 8 8'; + } + IL_EACH(g_waypoints, boxesoverlap(m1, m2, it.absmin, it.absmax), { return it; }); + + return NULL; +} + +.float createdtime; entity waypoint_spawn(vector m1, vector m2, float f) { if(!(f & (WAYPOINTFLAG_PERSONAL | WAYPOINTFLAG_GENERATED)) && m1 == m2) { - vector em1 = m1 - '8 8 8'; - vector em2 = m2 + '8 8 8'; - IL_EACH(g_waypoints, boxesoverlap(em1, em2, it.absmin, it.absmax), - { - return it; - }); + entity wp_found = waypoint_get(m1, m2); + if (wp_found) + return wp_found; } // spawn only one destination waypoint for teleports teleporting player to the exact same spot // otherwise links loaded from file would be applied only to the first destination // waypoint since link format doesn't specify waypoint entities but just positions - if((f & WAYPOINTFLAG_GENERATED) && !(f & (WAYPOINTFLAG_NORELINK | WAYPOINTFLAG_PERSONAL)) && m1 == m2) + if((f & WAYPOINTFLAG_GENERATED) && !(f & (WPFLAGMASK_NORELINK | WAYPOINTFLAG_PERSONAL)) && m1 == m2) { IL_EACH(g_waypoints, boxesoverlap(m1, m2, it.absmin, it.absmax), { @@ -309,6 +448,7 @@ entity waypoint_spawn(vector m1, vector m2, float f) w.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP; w.wpflags = f; w.solid = SOLID_TRIGGER; + w.createdtime = time; setorigin(w, (m1 + m2) * 0.5); setsize(w, m1 - w.origin, m2 - w.origin); if (w.size) @@ -316,7 +456,10 @@ entity waypoint_spawn(vector m1, vector m2, float f) if(!w.wpisbox) { - setsize(w, PL_MIN_CONST - '1 1 0', PL_MAX_CONST + '1 1 0'); + if (f & WAYPOINTFLAG_CROUCH) + setsize(w, PL_CROUCH_MIN_CONST - '1 1 0', PL_CROUCH_MAX_CONST + '1 1 0'); + else + setsize(w, PL_MIN_CONST - '1 1 0', PL_MAX_CONST + '1 1 0'); if(!move_out_of_solid(w)) { if(!(f & WAYPOINTFLAG_GENERATED)) @@ -345,10 +488,114 @@ entity waypoint_spawn(vector m1, vector m2, float f) return w; } -void waypoint_spawn_fromeditor(entity pl) +float trigger_push_get_push_time(entity this, vector endpos); +void waypoint_addlink_for_custom_jumppad(entity wp_from, entity wp_to) +{ + entity jp = NULL; + IL_EACH(g_jumppads, boxesoverlap(wp_from.absmin, wp_from.absmax, it.absmin, it.absmax), + { + jp = it; + break; + }); + if (!jp) + return; + + float cost = trigger_push_get_push_time(jp, wp_to.origin); + wp_from.wp00 = wp_to; + wp_from.wp00mincost = cost; + jp.nearestwaypoint = wp_from; + jp.nearestwaypointtimeout = -1; +} + +bool start_wp_is_spawned; +vector start_wp_origin; +bool start_wp_is_hardwired; +bool start_wp_is_support; + +void waypoint_clear_start_wp_globals(entity pl, bool warn) +{ + start_wp_is_spawned = false; + start_wp_origin = '0 0 0'; + pl.wp_locked = NULL; + start_wp_is_hardwired = false; + start_wp_is_support = false; + if (warn) + LOG_INFO("^xf80Start waypoint has been cleared.\n"); +} + +void waypoint_start_hardwiredlink(entity pl, bool at_crosshair) +{ + entity wp = pl.nearestwaypoint; + if (at_crosshair) + { + crosshair_trace_waypoints(pl); + wp = trace_ent; + } + string err = ""; + if (start_wp_is_spawned && !start_wp_is_hardwired) + err = "can't hardwire while in the process of creating a special link"; + else if (!wp) + { + if (at_crosshair) + err = "couldn't find any waypoint at crosshair"; + else + err = "couldn't find any waypoint nearby"; + } + else if (wp.wpflags & WPFLAGMASK_NORELINK) + err = "can't hardwire a waypoint with special links"; + + if (err == "") + { + start_wp_is_hardwired = true; + start_wp_is_spawned = true; + start_wp_origin = wp.origin; + pl.wp_locked = wp; + LOG_INFOF("^x80fWaypoint %s marked as hardwired link origin.\n", vtos(wp.origin)); + } + else + { + start_wp_is_hardwired = false; + LOG_INFO("Error: ", err, "\n"); + } +} + +void waypoint_spawn_fromeditor(entity pl, bool at_crosshair, bool is_jump_wp, bool is_crouch_wp, bool is_support_wp) { - entity e; + if (WAYPOINT_VERSION < waypoint_version_loaded) + { + LOG_INFOF("^1Editing waypoints with a higher version number (%f) is not allowed.\n" + "Update Xonotic to make them editable.", waypoint_version_loaded); + return; + } + + entity e = NULL, jp = NULL; vector org = pl.origin; + if (at_crosshair) + { + crosshair_trace_waypoints(pl); + org = trace_endpos; + if (!trace_ent) + org.z -= PL_MIN_CONST.z; + if (!(start_wp_is_hardwired || start_wp_is_support)) + IL_EACH(g_jumppads, boxesoverlap(org + PL_MIN_CONST, org + PL_MAX_CONST, it.absmin, it.absmax), + { + jp = it; + break; + }); + if (!jp && !start_wp_is_spawned && trace_ent) + { + if (trace_ent.wpflags & (WAYPOINTFLAG_JUMP)) + is_jump_wp = true; + else if (trace_ent.wpflags & (WAYPOINTFLAG_SUPPORT)) + is_support_wp = true; + } + } + if (jp || is_jump_wp || is_support_wp) + { + if (start_wp_is_spawned) + start_wp_is_spawned = false; + LOG_INFO("^xf80Spawning start waypoint...\n"); + } int ctf_flags = havocbot_symmetry_origin_order; bool sym = ((autocvar_g_waypointeditor_symmetrical > 0 && ctf_flags >= 2) || (autocvar_g_waypointeditor_symmetrical < 0)); @@ -358,7 +605,7 @@ void waypoint_spawn_fromeditor(entity pl) ctf_flags = 2; int wp_num = ctf_flags; - if(!PHYS_INPUT_BUTTON_CROUCH(pl)) + if(!PHYS_INPUT_BUTTON_CROUCH(pl) && !at_crosshair && !is_jump_wp && !is_support_wp) { // snap waypoint to item's origin if close enough IL_EACH(g_items, true, @@ -373,18 +620,169 @@ void waypoint_spawn_fromeditor(entity pl) }); } + vector start_org = '0 0 0'; + if (start_wp_is_spawned) + { + if (!start_wp_is_hardwired) + LOG_INFO("^xf80Spawning destination waypoint...\n"); + start_org = start_wp_origin; + } + + // save org as it can be modified spawning symmetrycal waypoints + vector initial_origin = '0 0 0'; + bool initial_origin_is_set = false; + LABEL(add_wp); - e = waypoint_spawn(org, org, 0); + + if (jp) + { + e = NULL; + IL_EACH(g_waypoints, (it.wpflags & WPFLAGMASK_NORELINK) + && boxesoverlap(org + PL_MIN_CONST, org + PL_MAX_CONST, it.absmin, it.absmax), + { + e = it; break; + }); + if (!e) + e = waypoint_spawn(jp.absmin - PL_MAX_CONST + '1 1 1', jp.absmax - PL_MIN_CONST + '-1 -1 -1', WAYPOINTFLAG_TELEPORT); + if (!pl.wp_locked) + pl.wp_locked = e; + } + else if (is_jump_wp || is_support_wp) + { + int type_flag = (is_jump_wp) ? WAYPOINTFLAG_JUMP : WAYPOINTFLAG_SUPPORT; + + entity wp_found = waypoint_get(org, org); + if (wp_found && !(wp_found.wpflags & type_flag)) + { + LOG_INFOF("Error: can't spawn a %s waypoint over an existent waypoint of a different type\n", (is_jump_wp) ? "Jump" : "Support"); + return; + } + e = waypoint_spawn(org, org, type_flag); + if (!pl.wp_locked) + pl.wp_locked = e; + } + else + e = waypoint_spawn(org, org, (is_crouch_wp) ? WAYPOINTFLAG_CROUCH : 0); if(!e) { LOG_INFOF("Couldn't spawn waypoint at %v\n", org); + if (start_wp_is_spawned) + waypoint_clear_start_wp_globals(pl, true); return; } - waypoint_schedulerelink(e); - bprint(strcat("Waypoint spawned at ", vtos(e.origin), "\n")); - if(sym) + + if (!initial_origin_is_set) + { + initial_origin = e.origin; + initial_origin_is_set = true; + } + + entity start_wp = NULL; + if (start_wp_is_spawned) + { + IL_EACH(g_waypoints, (start_wp_is_hardwired || (it.wpflags & WPFLAGMASK_NORELINK)) + && boxesoverlap(start_org, start_org, it.absmin, it.absmax), + { + start_wp = it; break; + }); + if(!start_wp) + { + // should not happen + LOG_INFOF("Couldn't find start waypoint at %v\n", start_org); + waypoint_clear_start_wp_globals(pl, true); + return; + } + if (start_wp_is_hardwired) + { + if (waypoint_is_hardwiredlink(start_wp, e)) + { + waypoint_unmark_hardwiredlink(start_wp, e); + waypoint_removelink(start_wp, e); + string s = strcat(vtos(start_wp.origin), "*", vtos(e.origin)); + LOG_INFOF("^x80fRemoved hardwired link %s.\n", s); + } + else + { + if (e.createdtime == time) + { + LOG_INFO("Error: hardwired links can be created only between 2 existing (and unconnected) waypoints.\n"); + waypoint_remove(e); + waypoint_clear_start_wp_globals(pl, true); + waypoint_spawn_fromeditor(pl, at_crosshair, is_jump_wp, is_crouch_wp, is_support_wp); + return; + } + if (start_wp == e) + { + LOG_INFO("Error: start and destination waypoints coincide.\n"); + waypoint_clear_start_wp_globals(pl, true); + return; + } + if (waypoint_islinked(start_wp, e)) + { + LOG_INFO("Error: waypoints are already linked.\n"); + waypoint_clear_start_wp_globals(pl, true); + return; + } + waypoint_addlink(start_wp, e); + waypoint_mark_hardwiredlink(start_wp, e); + string s = strcat(vtos(start_wp.origin), "*", vtos(e.origin)); + LOG_INFOF("^x80fAdded hardwired link %s.\n", s); + } + } + else + { + if (start_wp_is_support) + { + if (e.SUPPORT_WP) + { + LOG_INFOF("Waypoint %v has already a support waypoint, delete it first.\n", e.origin); + waypoint_clear_start_wp_globals(pl, true); + return; + } + // clear all links to e + IL_EACH(g_waypoints, it != e, + { + if (waypoint_islinked(it, e) && !waypoint_is_hardwiredlink(it, e)) + waypoint_removelink(it, e); + }); + } + waypoint_addlink(start_wp, e); + } + } + + if (!(jp || is_jump_wp || is_support_wp || start_wp_is_hardwired)) + waypoint_schedulerelink(e); + + string wp_type_str = waypoint_get_type_name(e); + + bprint(strcat(wp_type_str, "^7 spawned at ", vtos(e.origin), "\n")); + + if (start_wp_is_spawned) + { + pl.wp_locked = NULL; + if (!start_wp_is_hardwired) + waypoint_schedulerelink(start_wp); + if (start_wp.wpflags & WAYPOINTFLAG_TELEPORT) + { + if (start_wp.wp00_original == start_wp.wp00) + start_wp.wpflags &= ~WAYPOINTFLAG_CUSTOM_JP; + else + start_wp.wpflags |= WAYPOINTFLAG_CUSTOM_JP; + } + } + + if (sym) { - org = waypoint_getSymmetricalPoint(e.origin, ctf_flags); + org = waypoint_getSymmetricalPoint(org, ctf_flags); + if (jp) + { + IL_EACH(g_jumppads, boxesoverlap(org + PL_MIN_CONST, org + PL_MAX_CONST, it.absmin, it.absmax), + { + jp = it; break; + }); + } + if (start_wp_is_spawned) + start_org = waypoint_getSymmetricalPoint(start_org, ctf_flags); if (vdist(org - pl.origin, >, 32)) { if(wp_num > 2) @@ -394,20 +792,52 @@ void waypoint_spawn_fromeditor(entity pl) goto add_wp; } } + if (jp || is_jump_wp || is_support_wp) + { + if (!start_wp_is_spawned) + { + // we've just created a custom jumppad waypoint + // the next one created by the user will be the destination waypoint + start_wp_is_spawned = true; + start_wp_origin = initial_origin; + if (is_support_wp) + start_wp_is_support = true; + } + } + else if (start_wp_is_spawned) + { + waypoint_clear_start_wp_globals(pl, false); + } } void waypoint_remove(entity wp) { IL_EACH(g_waypoints, it != wp, { + if (it.SUPPORT_WP == wp) + { + it.SUPPORT_WP = NULL; + waypoint_schedulerelink(it); // restore incoming links + } if (waypoint_islinked(it, wp)) + { + if (waypoint_is_hardwiredlink(it, wp)) + waypoint_unmark_hardwiredlink(it, wp); waypoint_removelink(it, wp); + } }); delete(wp); } void waypoint_remove_fromeditor(entity pl) { + if (WAYPOINT_VERSION < waypoint_version_loaded) + { + LOG_INFOF("^1Editing waypoints with a higher version number (%f) is not allowed.\n" + "Update Xonotic to make them editable.", waypoint_version_loaded); + return; + } + entity e = navigation_findnearestwaypoint(pl, false); int ctf_flags = havocbot_symmetry_origin_order; @@ -421,11 +851,17 @@ void waypoint_remove_fromeditor(entity pl) LABEL(remove_wp); if (!e) return; - if (e.wpflags & WAYPOINTFLAG_GENERATED) return; - if (e.wphardwired) + if (e.wpflags & WAYPOINTFLAG_GENERATED) { - LOG_INFO("^1Warning: ^7Removal of hardwired waypoints is not allowed in the editor. Please remove links from/to this waypoint (", vtos(e.origin), ") by hand from maps/", mapname, ".waypoints.hardwired\n"); + if (start_wp_is_spawned) + waypoint_clear_start_wp_globals(pl, true); + return; + } + + if (waypoint_has_hardwiredlinks(e)) + { + LOG_INFO("Can't remove a waypoint with hardwired links, remove links with \"wpeditor hardwire\" first\n"); return; } @@ -443,6 +879,7 @@ void waypoint_remove_fromeditor(entity pl) } bprint(strcat("Waypoint removed at ", vtos(e.origin), "\n")); + te_explosion(e.origin); waypoint_remove(e); if (sym && wp_sym) @@ -454,11 +891,14 @@ void waypoint_remove_fromeditor(entity pl) sym = false; goto remove_wp; } + + if (start_wp_is_spawned) + waypoint_clear_start_wp_globals(pl, true); } void waypoint_removelink(entity from, entity to) { - if (from == to || (from.wpflags & WAYPOINTFLAG_NORELINK)) + if (from == to || ((from.wpflags & WPFLAGMASK_NORELINK) && !(from.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT)))) return; entity fromwp31_prev = from.wp31; @@ -567,12 +1007,18 @@ float waypoint_getlinearcost(float dist) return dist / (autocvar_sv_maxspeed * 1.25); return dist / autocvar_sv_maxspeed; } + float waypoint_getlinearcost_underwater(float dist) { // NOTE: underwater speed factor is hardcoded in the engine too, see SV_WaterMove return dist / (autocvar_sv_maxspeed * 0.7); } +float waypoint_getlinearcost_crouched(float dist) +{ + return dist / (autocvar_sv_maxspeed * 0.5); +} + float waypoint_gettravelcost(vector from, vector to, entity from_ent, entity to_ent) { bool submerged_from = navigation_check_submerged_state(from_ent, from); @@ -581,19 +1027,32 @@ float waypoint_gettravelcost(vector from, vector to, entity from_ent, entity to_ if (submerged_from && submerged_to) return waypoint_getlinearcost_underwater(vlen(to - from)); + if ((from_ent.wpflags & WAYPOINTFLAG_CROUCH) && (to_ent.wpflags & WAYPOINTFLAG_CROUCH)) + return waypoint_getlinearcost_crouched(vlen(to - from)); + float c = waypoint_getlinearcost(vlen(to - from)); float height = from.z - to.z; if(height > jumpheight_vec.z && autocvar_sv_gravity > 0) { - float height_cost = sqrt(height / (autocvar_sv_gravity / 2)); + float height_cost; // fall cost + if (from_ent.wpflags & WAYPOINTFLAG_JUMP) + height_cost = jumpheight_time + sqrt((height + jumpheight_vec.z) / (autocvar_sv_gravity / 2)); + else + height_cost = sqrt(height / (autocvar_sv_gravity / 2)); c = waypoint_getlinearcost(vlen(vec2(to - from))); // xy distance cost if(height_cost > c) c = height_cost; } + // consider half path underwater if (submerged_from || submerged_to) return (c + waypoint_getlinearcost_underwater(vlen(to - from))) / 2; + + // consider half path crouched + if ((from_ent.wpflags & WAYPOINTFLAG_CROUCH) || (to_ent.wpflags & WAYPOINTFLAG_CROUCH)) + return (c + waypoint_getlinearcost_crouched(vlen(to - from))) / 2; + return c; } @@ -624,7 +1083,7 @@ void waypoint_addlink_customcost(entity from, entity to, float c) { if (from == to || waypoint_islinked(from, to)) return; - if (c == -1 && (from.wpflags & WAYPOINTFLAG_NORELINK)) + if (c == -1 && (from.wpflags & WPFLAGMASK_NORELINK) && !(from.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT))) return; if(c == -1) @@ -667,7 +1126,13 @@ void waypoint_addlink_customcost(entity from, entity to, float c) void waypoint_addlink(entity from, entity to) { - waypoint_addlink_customcost(from, to, -1); + if ((from.wpflags & WPFLAGMASK_NORELINK) && !(from.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT))) + waypoint_addlink_for_custom_jumppad(from, to); + else + waypoint_addlink_customcost(from, to, -1); + + if (from.wpflags & WAYPOINTFLAG_SUPPORT) + to.SUPPORT_WP = from; } // relink this spawnfunc_waypoint @@ -690,8 +1155,10 @@ void waypoint_think(entity this) { if (boxesoverlap(this.absmin, this.absmax, it.absmin, it.absmax)) { - waypoint_addlink(this, it); - waypoint_addlink(it, this); + if (!(this.wpflags & WPFLAGMASK_NORELINK)) + waypoint_addlink(this, it); + if (!(it.wpflags & WPFLAGMASK_NORELINK)) + waypoint_addlink(it, this); } else { @@ -711,7 +1178,22 @@ void waypoint_think(entity this) dv = ev - sv; dv.z = 0; - if(vdist(dv, >=, 1050)) // max search distance in XY + int maxdist = 1050; + vector m1 = PL_MIN_CONST; + vector m2 = PL_MAX_CONST; + + if ((this.wpflags & WAYPOINTFLAG_CROUCH) || (it.wpflags & WAYPOINTFLAG_CROUCH)) + { + m1 = PL_CROUCH_MIN_CONST; + m2 = PL_CROUCH_MAX_CONST; + // links from crouch wp to normal wp (and viceversa) are very short to avoid creating many links + // that would be wasted due to rough travel cost calculation (the longer link is, the higher cost is) + // links from crouch wp to crouch wp can be as long as normal links + if (!((this.wpflags & WAYPOINTFLAG_CROUCH) && (it.wpflags & WAYPOINTFLAG_CROUCH))) + maxdist = 100; + } + + if (vdist(dv, >=, maxdist)) // max search distance in XY { ++relink_lengthculled; continue; @@ -721,30 +1203,45 @@ void waypoint_think(entity this) //traceline(this.origin, it.origin, false, NULL); //if (trace_fraction == 1) - if (this.wpisbox) + if (this.wpisbox || (this.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT)) // forbid outgoing links + || it.SUPPORT_WP) // forbid incoming links + { relink_walkculled += 0.5; + } else { - if (tracewalk(this, sv, PL_MIN_CONST, PL_MAX_CONST, ev2, ev2_height, MOVE_NOMONSTERS)) + if (tracewalk(this, sv, m1, m2, ev2, ev2_height, MOVE_NOMONSTERS)) waypoint_addlink(this, it); else relink_walkculled += 0.5; } - if (it.wpisbox) + // reverse direction + if (it.wpisbox || (it.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT)) // forbid incoming links + || this.SUPPORT_WP) // forbid outgoing links + { relink_walkculled += 0.5; + } else { - if (tracewalk(this, ev, PL_MIN_CONST, PL_MAX_CONST, sv2, sv2_height, MOVE_NOMONSTERS)) + if (tracewalk(this, ev, m1, m2, sv2, sv2_height, MOVE_NOMONSTERS)) waypoint_addlink(it, this); else relink_walkculled += 0.5; } } }); + + // waypoint_clearlinks preserves references to old hardwired links (.wphwXX links) + // so they can be restored here when a wp is spawned over an existing one + waypoint_restore_hardwiredlinks(this); + navigation_testtracewalk = 0; this.wplinked = true; this.dphitcontentsmask = dphitcontentsmask_save; + + setthink(this, func_null); + this.nextthink = 0; } void waypoint_clearlinks(entity wp) @@ -761,6 +1258,8 @@ void waypoint_clearlinks(entity wp) wp.wp16mincost = wp.wp17mincost = wp.wp18mincost = wp.wp19mincost = wp.wp20mincost = wp.wp21mincost = wp.wp22mincost = wp.wp23mincost = f; wp.wp24mincost = wp.wp25mincost = wp.wp26mincost = wp.wp27mincost = wp.wp28mincost = wp.wp29mincost = wp.wp30mincost = wp.wp31mincost = f; + // don't remove references to hardwired links (.wphwXX fields) + wp.wplinked = false; } @@ -775,7 +1274,7 @@ void waypoint_schedulerelink(entity wp) wp.enemy = NULL; if (!(wp.wpflags & WAYPOINTFLAG_PERSONAL)) wp.owner = NULL; - if (!(wp.wpflags & WAYPOINTFLAG_NORELINK)) + if (!(wp.wpflags & WPFLAGMASK_NORELINK)) waypoint_clearlinks(wp); // schedule an actual relink on next frame setthink(wp, waypoint_think); @@ -803,7 +1302,7 @@ void waypoint_schedulerelinkall() { waypoint_schedulerelink(it); }); - waypoint_load_links_hardwired(); + waypoint_load_hardwiredlinks(); } #define GET_GAMETYPE_EXTENSION() ((g_race) ? ".race" : "") @@ -933,6 +1432,8 @@ bool waypoint_load_links() ++c; waypoint_addlink(wp_from, wp_to); + if (wp_from.wp00_original && wp_from.wp00_original != wp_from.wp00) + wp_from.wpflags |= WAYPOINTFLAG_CUSTOM_JP; } fclose(file); @@ -955,7 +1456,7 @@ bool waypoint_load_links() return true; } -void waypoint_load_or_remove_links_hardwired(bool removal_mode) +void waypoint_load_hardwiredlinks() { string s; float file, tokens, c = 0, found; @@ -978,11 +1479,11 @@ void waypoint_load_or_remove_links_hardwired(bool removal_mode) if (file < 0) { - if(!removal_mode) - LOG_TRACE("waypoint links load from ", filename, " failed"); + LOG_TRACE("waypoint links load from ", filename, " failed"); return; } + bool is_special = false; while ((s = fgets(file))) { if(substring(s, 0, 2)=="//") @@ -991,6 +1492,14 @@ void waypoint_load_or_remove_links_hardwired(bool removal_mode) if(substring(s, 0, 1)=="#") continue; + // special links start with *, so old xonotic versions don't load them + is_special = false; + if (substring(s, 0, 1) == "*") + { + is_special = true; + s = substring(s, 1, -1); + } + tokens = tokenizebyseparator(s, "*"); if (tokens!=2) @@ -1017,8 +1526,8 @@ void waypoint_load_or_remove_links_hardwired(bool removal_mode) if(!found) { - if(!removal_mode) - LOG_INFO("NOTICE: Can not find origin waypoint for the hardwired link ", s, ". Path skipped"); + s = strcat(((is_special) ? "special link " : "hardwired link "), s); + LOG_INFO("NOTICE: Can not find origin waypoint of the ", s, ". Path skipped"); continue; } } @@ -1039,29 +1548,28 @@ void waypoint_load_or_remove_links_hardwired(bool removal_mode) if(!found) { - if(!removal_mode) - LOG_INFO("NOTICE: Can not find destination waypoint for the hardwired link ", s, ". Path skipped"); + s = strcat(((is_special) ? "special link " : "hardwired link "), s); + LOG_INFO("NOTICE: Can not find destination waypoint of the ", s, ". Path skipped"); continue; } ++c; - if(removal_mode) + + if (!is_special) { - waypoint_removelink(wp_from, wp_to); - continue; + waypoint_addlink(wp_from, wp_to); + waypoint_mark_hardwiredlink(wp_from, wp_to); + } else if (wp_from.wpflags & WPFLAGMASK_NORELINK + && ((wp_from.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT)) + || (wp_from.wpisbox && wp_from.wpflags & WAYPOINTFLAG_TELEPORT))) + { + waypoint_addlink(wp_from, wp_to); } - - waypoint_addlink(wp_from, wp_to); - wp_from.wphardwired = true; - wp_to.wphardwired = true; - waypoint_setupmodel(wp_from); - waypoint_setupmodel(wp_to); } fclose(file); - LOG_TRACE(((removal_mode) ? "unloaded " : "loaded "), - ftos(c), " waypoint links from maps/", mapname, ".waypoints.hardwired"); + LOG_TRACE("loaded ", ftos(c), " waypoint links from maps/", mapname, ".waypoints.hardwired"); } entity waypoint_get_link(entity w, float i) @@ -1104,12 +1612,63 @@ entity waypoint_get_link(entity w, float i) } } +// Save all hardwired waypoint links to a file +void waypoint_save_hardwiredlinks() +{ + string gt_ext = GET_GAMETYPE_EXTENSION(); + + string filename = sprintf("maps/%s.waypoints.hardwired", strcat(mapname, gt_ext)); + int file = fopen(filename, FILE_WRITE); + if (file < 0) + { + LOG_TRACE("waypoint hardwired links ", filename, " creation failed"); + return; + } + + // write hardwired links to file + int count = 0; + fputs(file, "// HARDWIRED LINKS\n"); + IL_EACH(g_waypoints, waypoint_has_hardwiredlinks(it), + { + for (int j = 0; j < 32; ++j) + { + entity link = waypoint_get_link(it, j); + if (waypoint_is_hardwiredlink(it, link)) + { + // NOTE: vtos rounds vector components to 1 decimal place + string s = strcat(vtos(it.origin), "*", vtos(link.origin), "\n"); + fputs(file, s); + ++count; + } + } + }); + + // write special links to file + int count2 = 0; + fputs(file, "\n// SPECIAL LINKS\n"); + IL_EACH(g_waypoints, it.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT | WAYPOINTFLAG_CUSTOM_JP), + { + for (int j = 0; j < 32; ++j) + { + entity link = waypoint_get_link(it, j); + if (link) + { + // NOTE: vtos rounds vector components to 1 decimal place + string s = strcat("*", vtos(it.origin), "*", vtos(link.origin), "\n"); + fputs(file, s); + ++count2; + } + } + }); + + fclose(file); + + LOG_INFOF("saved %d hardwired links and %d special links to %s", count, count2, filename); +} + // Save all waypoint links to a file void waypoint_save_links() { - // temporarily remove hardwired links so they don't get saved among normal links - waypoint_remove_links_hardwired(); - string gt_ext = GET_GAMETYPE_EXTENSION(); string filename = sprintf("maps/%s.waypoints.cache", strcat(mapname, gt_ext)); @@ -1125,12 +1684,12 @@ void waypoint_save_links() fputs(file, strcat("//", "WAYPOINT_TIME ", waypoint_time, "\n")); int c = 0; - IL_EACH(g_waypoints, true, + IL_EACH(g_waypoints, !(it.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT | WAYPOINTFLAG_CUSTOM_JP)), { for(int j = 0; j < 32; ++j) { entity link = waypoint_get_link(it, j); - if(link) + if (link && !waypoint_is_hardwiredlink(it, link)) { // NOTE: vtos rounds vector components to 1 decimal place string s = strcat(vtos(it.origin), "*", vtos(link.origin), "\n"); @@ -1144,13 +1703,17 @@ void waypoint_save_links() botframe_cachedwaypointlinks = true; LOG_INFOF("saved %d waypoint links to %s", c, filename); - - waypoint_load_links_hardwired(); } // save waypoints to gamedir/data/maps/mapname.waypoints void waypoint_saveall() { + if (WAYPOINT_VERSION < waypoint_version_loaded) + { + LOG_INFOF("^1Overwriting waypoints with a higher version number (%f) is not allowed.\n" + "Update Xonotic to make them editable.", waypoint_version_loaded); + return; + } string gt_ext = GET_GAMETYPE_EXTENSION(); string filename = sprintf("maps/%s.waypoints", strcat(mapname, gt_ext)); @@ -1216,8 +1779,11 @@ void waypoint_saveall() }); fclose(file); waypoint_save_links(); + waypoint_save_hardwiredlinks(); + botframe_loadedforcedlinks = false; + waypoint_version_loaded = WAYPOINT_VERSION; LOG_INFOF("saved %d waypoints to %s", c, filename); } @@ -1225,7 +1791,7 @@ void waypoint_saveall() float waypoint_loadall() { string s; - float file, cwp, cwb, fl; + int file, cwp, cwb, fl; vector m1, m2; cwp = 0; cwb = 0; @@ -1292,6 +1858,7 @@ float waypoint_loadall() if (!s) break; fl = stof(s); + fl &= ~WAYPOINTFLAG_NORELINK__DEPRECATED; waypoint_spawn(m1, m2, fl); if (m1 == m2) cwp = cwp + 1; @@ -1299,6 +1866,7 @@ float waypoint_loadall() cwb = cwb + 1; } fclose(file); + waypoint_version_loaded = ver; LOG_TRACE("loaded ", ftos(cwp), " waypoints and ", ftos(cwb), " wayboxes from maps/", mapname, ".waypoints"); if (autocvar_g_waypointeditor && autocvar_g_waypointeditor_symmetrical_allowload) @@ -1333,6 +1901,10 @@ float waypoint_loadall() LOG_INFO(strcat("g_waypointeditor_symmetrical", " has been set to ", cvar_string("g_waypointeditor_symmetrical"))); } + if (WAYPOINT_VERSION < waypoint_version_loaded) + LOG_INFOF("^1Editing waypoints with a higher version number (%f) is not allowed.\n" + "Update Xonotic to make them editable.", waypoint_version_loaded); + return cwp + cwb; } @@ -1393,9 +1965,10 @@ void waypoint_spawnforteleporter_boxes(entity e, int teleport_flag, vector org1, { entity w; entity dw; - w = waypoint_spawn(org1, org2, WAYPOINTFLAG_GENERATED | teleport_flag | WAYPOINTFLAG_NORELINK); + w = waypoint_spawn(org1, org2, WAYPOINTFLAG_GENERATED | teleport_flag); dw = waypoint_spawn(destination1, destination2, WAYPOINTFLAG_GENERATED); // one way link to the destination + w.wp00_original = dw; w.wp00 = dw; w.wp00mincost = timetaken; // this is just for jump pads // the teleporter's nearest spawnfunc_waypoint is this one @@ -1472,7 +2045,7 @@ void waypoint_showlink(entity wp1, entity wp2, int display_type) if (!(wp1 && wp2)) return; - if (wp1.wphardwired && wp2.wphardwired) + if (waypoint_is_hardwiredlink(wp1, wp2) || (wp1.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT | WAYPOINTFLAG_CUSTOM_JP))) te_beam(NULL, wp1.origin, wp2.origin); else if (display_type == 1) te_lightning2(NULL, wp1.origin, wp2.origin); @@ -1489,22 +2062,22 @@ void waypoint_showlinks_to(entity wp, int display_type) void waypoint_showlinks_from(entity wp, int display_type) { - waypoint_showlink(wp.wp00, wp, display_type); waypoint_showlink(wp.wp16, wp, display_type); - waypoint_showlink(wp.wp01, wp, display_type); waypoint_showlink(wp.wp17, wp, display_type); - waypoint_showlink(wp.wp02, wp, display_type); waypoint_showlink(wp.wp18, wp, display_type); - waypoint_showlink(wp.wp03, wp, display_type); waypoint_showlink(wp.wp19, wp, display_type); - waypoint_showlink(wp.wp04, wp, display_type); waypoint_showlink(wp.wp20, wp, display_type); - waypoint_showlink(wp.wp05, wp, display_type); waypoint_showlink(wp.wp21, wp, display_type); - waypoint_showlink(wp.wp06, wp, display_type); waypoint_showlink(wp.wp22, wp, display_type); - waypoint_showlink(wp.wp07, wp, display_type); waypoint_showlink(wp.wp23, wp, display_type); - waypoint_showlink(wp.wp08, wp, display_type); waypoint_showlink(wp.wp24, wp, display_type); - waypoint_showlink(wp.wp09, wp, display_type); waypoint_showlink(wp.wp25, wp, display_type); - waypoint_showlink(wp.wp10, wp, display_type); waypoint_showlink(wp.wp26, wp, display_type); - waypoint_showlink(wp.wp11, wp, display_type); waypoint_showlink(wp.wp27, wp, display_type); - waypoint_showlink(wp.wp12, wp, display_type); waypoint_showlink(wp.wp28, wp, display_type); - waypoint_showlink(wp.wp13, wp, display_type); waypoint_showlink(wp.wp29, wp, display_type); - waypoint_showlink(wp.wp14, wp, display_type); waypoint_showlink(wp.wp30, wp, display_type); - waypoint_showlink(wp.wp15, wp, display_type); waypoint_showlink(wp.wp31, wp, display_type); + waypoint_showlink(wp, wp.wp00, display_type); waypoint_showlink(wp, wp.wp16, display_type); + waypoint_showlink(wp, wp.wp01, display_type); waypoint_showlink(wp, wp.wp17, display_type); + waypoint_showlink(wp, wp.wp02, display_type); waypoint_showlink(wp, wp.wp18, display_type); + waypoint_showlink(wp, wp.wp03, display_type); waypoint_showlink(wp, wp.wp19, display_type); + waypoint_showlink(wp, wp.wp04, display_type); waypoint_showlink(wp, wp.wp20, display_type); + waypoint_showlink(wp, wp.wp05, display_type); waypoint_showlink(wp, wp.wp21, display_type); + waypoint_showlink(wp, wp.wp06, display_type); waypoint_showlink(wp, wp.wp22, display_type); + waypoint_showlink(wp, wp.wp07, display_type); waypoint_showlink(wp, wp.wp23, display_type); + waypoint_showlink(wp, wp.wp08, display_type); waypoint_showlink(wp, wp.wp24, display_type); + waypoint_showlink(wp, wp.wp09, display_type); waypoint_showlink(wp, wp.wp25, display_type); + waypoint_showlink(wp, wp.wp10, display_type); waypoint_showlink(wp, wp.wp26, display_type); + waypoint_showlink(wp, wp.wp11, display_type); waypoint_showlink(wp, wp.wp27, display_type); + waypoint_showlink(wp, wp.wp12, display_type); waypoint_showlink(wp, wp.wp28, display_type); + waypoint_showlink(wp, wp.wp13, display_type); waypoint_showlink(wp, wp.wp29, display_type); + waypoint_showlink(wp, wp.wp14, display_type); waypoint_showlink(wp, wp.wp30, display_type); + waypoint_showlink(wp, wp.wp15, display_type); waypoint_showlink(wp, wp.wp31, display_type); } void crosshair_trace_waypoints(entity pl) @@ -1515,15 +2088,18 @@ void crosshair_trace_waypoints(entity pl) setsize(it, '-16 -16 -16', '16 16 16'); }); - crosshair_trace(pl); + WarpZone_crosshair_trace(pl); IL_EACH(g_waypoints, true, { it.solid = SOLID_TRIGGER; if (!it.wpisbox) setsize(it, '0 0 0', '0 0 0'); }); + if (trace_ent.classname != "waypoint") trace_ent = NULL; + else if (!trace_ent.wpisbox) + trace_endpos = trace_ent.origin; } void botframe_showwaypointlinks() @@ -1538,8 +2114,6 @@ void botframe_showwaypointlinks() it.wp_aimed = NULL; if (wasfreed(it.wp_locked)) it.wp_locked = NULL; - if (PHYS_INPUT_BUTTON_USE(it)) - it.wp_locked = it.wp_aimed; entity head = it.wp_locked; if (!head) head = navigation_findnearestwaypoint(it, false); @@ -1547,7 +2121,7 @@ void botframe_showwaypointlinks() it.nearestwaypointtimeout = time + 2; // while I'm at it... if (IS_ONGROUND(it) || it.waterlevel > WATERLEVEL_NONE || it.wp_locked) display_type = 1; // default - else if(head && (head.wphardwired)) + else if(waypoint_has_hardwiredlinks(head)) display_type = 2; // only hardwired if (display_type) @@ -1574,13 +2148,14 @@ void botframe_showwaypointlinks() wp = trace_ent; if (wp != it.wp_aimed) { - str = sprintf("\necho ^2WP info^7: entity: %d, flags: %d, origin: '%s'\n", etof(wp), wp.wpflags, vtos(wp.origin)); + string wp_type_str = waypoint_get_type_name(wp); + str = sprintf("\necho Entity %d: %s^7, flags: %d, origin: %s\n", etof(wp), wp_type_str, wp.wpflags, vtos(wp.origin)); if (wp.wpisbox) - str = strcat(str, sprintf("echo \" absmin: '%s', absmax: '%s'\"\n", vtos(wp.absmin), vtos(wp.absmax))); + str = strcat(str, sprintf("echo \" absmin: %s, absmax: %s\"\n", vtos(wp.absmin), vtos(wp.absmax))); stuffcmd(it, str); - str = sprintf("entity: %d\nflags: %d\norigin: \'%s\'", etof(wp), wp.wpflags, vtos(wp.origin)); + str = sprintf("Entity %d: %s^7\nflags: %d\norigin: %s", etof(wp), wp_type_str, wp.wpflags, vtos(wp.origin)); if (wp.wpisbox) - str = strcat(str, sprintf(" \nabsmin: '%s'\nabsmax: '%s'", vtos(wp.absmin), vtos(wp.absmax))); + str = strcat(str, sprintf(" \nabsmin: %s\nabsmax: %s", vtos(wp.absmin), vtos(wp.absmax))); debug_text_3d(wp.origin, str, 0, 7, '0 0 0'); } } @@ -1648,7 +2223,7 @@ float botframe_autowaypoints_fix_from(entity p, float walkfromwp, entity wp, .en } float bestdist = maxdist; - IL_EACH(g_waypoints, it != wp && !(it.wpflags & WAYPOINTFLAG_NORELINK), + IL_EACH(g_waypoints, it != wp && !(it.wpflags & WPFLAGMASK_NORELINK), { float d = vlen(wp.origin - it.origin) + vlen(it.origin - porg); if(d < bestdist) diff --git a/qcsrc/server/bot/default/waypoints.qh b/qcsrc/server/bot/default/waypoints.qh index 0b69dcbb8..25356446a 100644 --- a/qcsrc/server/bot/default/waypoints.qh +++ b/qcsrc/server/bot/default/waypoints.qh @@ -6,7 +6,8 @@ // increase by 0.01 when changes require only waypoint relinking // increase by 1 when changes require to manually edit waypoints // max 2 decimal places, always specified -const float WAYPOINT_VERSION = 1.02; +const float WAYPOINT_VERSION = 1.04; +float waypoint_version_loaded; string waypoint_time; // fields you can query using prvm_global server to get some statistics about waypoint linking culling @@ -21,23 +22,42 @@ float botframe_cachedwaypointlinks; .entity wp00, wp01, wp02, wp03, wp04, wp05, wp06, wp07, wp08, wp09, wp10, wp11, wp12, wp13, wp14, wp15; .entity wp16, wp17, wp18, wp19, wp20, wp21, wp22, wp23, wp24, wp25, wp26, wp27, wp28, wp29, wp30, wp31; +// used by jumppads to store original destination wp, used in case it gets changed in the editor +.entity wp00_original; + .float wp00mincost, wp01mincost, wp02mincost, wp03mincost, wp04mincost, wp05mincost, wp06mincost, wp07mincost; .float wp08mincost, wp09mincost, wp10mincost, wp11mincost, wp12mincost, wp13mincost, wp14mincost, wp15mincost; .float wp16mincost, wp17mincost, wp18mincost, wp19mincost, wp20mincost, wp21mincost, wp22mincost, wp23mincost; .float wp24mincost, wp25mincost, wp26mincost, wp27mincost, wp28mincost, wp29mincost, wp30mincost, wp31mincost; -.float wpfire, wpcost, wpconsidered, wpisbox, wplinked, wphardwired; +// hardwired links are saved to the .wpXX fields among normal links +// AND to the supporting .wphwXX fields to allow identifying them precisely +// these links are not sorted, unlike normal links +.entity wphw00, wphw01, wphw02, wphw03, wphw04, wphw05, wphw06, wphw07; + +.float wpcost; +.int wpfire, wpconsidered, wpisbox, wplinked; .int wpflags; .entity wp_aimed; .entity wp_locked; .vector wpnearestpoint; +// holds reference to the support waypoint, if any +.entity goalentity; +#define SUPPORT_WP goalentity + /* * Functions */ spawnfunc(waypoint); + +bool waypoint_has_hardwiredlinks(entity wp); +bool waypoint_is_hardwiredlink(entity wp_from, entity wp_to); +void waypoint_mark_hardwiredlink(entity wp_from, entity wp_to); +void waypoint_unmark_hardwiredlink(entity wp_from, entity wp_to); + void waypoint_removelink(entity from, entity to); int waypoint_getlinknum(entity from, entity to); bool waypoint_islinked(entity from, entity to); @@ -66,11 +86,9 @@ void botframe_showwaypointlinks(); float waypoint_loadall(); bool waypoint_load_links(); -#define waypoint_load_links_hardwired() waypoint_load_or_remove_links_hardwired(false) -#define waypoint_remove_links_hardwired() waypoint_load_or_remove_links_hardwired(true) -void waypoint_load_or_remove_links_hardwired(bool removal_mode); +void waypoint_load_hardwiredlinks(); -void waypoint_spawn_fromeditor(entity pl); +void waypoint_spawn_fromeditor(entity pl, bool at_crosshair, bool is_jump_wp, bool is_crouch_wp, bool is_support_wp); entity waypoint_spawn(vector m1, vector m2, float f); entity waypoint_spawnpersonal(entity this, vector position); diff --git a/qcsrc/server/bot/null/bot_null.qc b/qcsrc/server/bot/null/bot_null.qc index bdca146c2..a7f8e99f1 100644 --- a/qcsrc/server/bot/null/bot_null.qc +++ b/qcsrc/server/bot/null/bot_null.qc @@ -39,6 +39,6 @@ void waypoint_spawnforitem(entity e) { } void waypoint_spawnforitem_force(entity e, vector org) { } void waypoint_spawnforteleporter(entity e, vector destination, float timetaken, entity tracetest_ent) { } void waypoint_spawnforteleporter_wz(entity e, entity tracetest_ent) { } -void waypoint_spawn_fromeditor(entity pl) { } +void waypoint_spawn_fromeditor(entity pl, bool at_crosshair, bool is_jump_wp, bool is_crouch_wp, bool is_support_wp) { } entity waypoint_spawn(vector m1, vector m2, float f) { return NULL; } #endif diff --git a/qcsrc/server/client.qh b/qcsrc/server/client.qh index bc4a60e1a..b20a8af93 100644 --- a/qcsrc/server/client.qh +++ b/qcsrc/server/client.qh @@ -98,7 +98,7 @@ CLASS(Client, Object) ATTRIB(Client, zoomstate, bool, this.zoomstate); ATTRIB(Client, just_joined, bool, this.just_joined); ATTRIB(Client, race_completed, bool, this.race_completed); - ATTRIBARRAY(Client, msg_choice_choices, int, 50); // TODO: actually NOTIF_CHOICE_MAX + ATTRIBARRAY(Client, msg_choice_choices, int, 20); // TODO: actually NOTIF_CHOICE_MAX ATTRIB(Client, latency_sum, float, this.latency_sum); ATTRIB(Client, latency_cnt, int, this.latency_cnt); ATTRIB(Client, latency_time, float, this.latency_time); diff --git a/qcsrc/server/command/cmd.qc b/qcsrc/server/command/cmd.qc index 83c476833..4606638f6 100644 --- a/qcsrc/server/command/cmd.qc +++ b/qcsrc/server/command/cmd.qc @@ -184,10 +184,11 @@ void ClientCommand_wpeditor(entity caller, int request, int argc) { if (argv(1) == "spawn") { + string s = argv(2); if (!IS_PLAYER(caller)) sprint(caller, "ERROR: this command works only if you are player\n"); else - waypoint_spawn_fromeditor(caller); + waypoint_spawn_fromeditor(caller, (s == "crosshair"), (s == "jump"), (s == "crouch"), (s == "support")); return; } else if (argv(1) == "remove") @@ -198,6 +199,17 @@ void ClientCommand_wpeditor(entity caller, int request, int argc) waypoint_remove_fromeditor(caller); return; } + else if (argv(1) == "hardwire") + { + string s = argv(2); + waypoint_start_hardwiredlink(caller, (s == "crosshair")); + return; + } + else if (argv(1) == "lock") + { + waypoint_lock(caller); + return; + } else if (argv(1) == "unreachable") { if (!IS_PLAYER(caller)) @@ -240,13 +252,28 @@ void ClientCommand_wpeditor(entity caller, int request, int argc) case CMD_REQUEST_USAGE: { sprint(caller, "\nUsage:^3 cmd wpeditor action\n"); - sprint(caller, " Where 'action' can be: spawn, remove, unreachable, saveall, relinkall,\n"); - sprint(caller, " symorigin get|set\n"); - sprint(caller, " symorigin get|set p1 p2 ... pX\n"); - sprint(caller, " symaxis get|set p1 p2\n"); - sprint(caller, " where p1 p2 ... pX are positions \"x y z\" (z can be omitted)\n"); - sprint(caller, " symorigin and symaxis commands are useful to determine origin/axis of symmetry" - " on maps without ctf flags or where flags aren't perfectly symmetrical\n"); + sprint(caller, " Where 'action' can be:\n"); + sprint(caller, " ^5spawn^7: spawns a waypoint at player's position\n"); + sprint(caller, " ^5remove^7: removes player's nearest waypoint\n"); + sprint(caller, " ^5unreachable^7: reveals waypoints and items unreachable from the current position and spawnpoints without a nearest waypoint\n"); + sprint(caller, " ^5saveall^7: saves all waypoints and links to file\n"); + sprint(caller, " ^5relinkall^7: relinks all waypoints as if they were respawned\n"); + sprint(caller, " ^5spawn crosshair^7: spawns a waypoint at crosshair's position\n"); + sprint(caller, " ^7 in general useful to create special and hardwired links with ease from existing waypoints\n"); + sprint(caller, " ^7 in particular it's the only way to create custom jumppad waypoints (spawn another waypoint to create destination))\n"); + sprint(caller, " ^5spawn jump^7: spawns a jump waypoint (place it at least 60 qu before jump start, spawn another waypoint to create destination)\n"); + sprint(caller, " ^5spawn crouch^7: spawns a crouch waypoint (it links only to very close waypoints)\n"); + sprint(caller, " ^5spawn support^7: spawns a support waypoint (spawn another waypoint to create destination from which all incoming links are removed)\n"); + sprint(caller, " ^7 useful to replace links to problematic jumppad/teleport waypoints\n"); + sprint(caller, " ^5hardwire^7: marks the nearest waypoint as origin of a new hardwired link (spawn another waypoint over an existing one to create destination)\n"); + sprint(caller, " ^5hardwire crosshair^7: marks the waypoint at crosshair instead of the nearest waypoint\n"); + sprint(caller, " ^5lock^7: locks link display of the aimed waypoint (unlocks if no waypoint is found at crosshair's position)\n"); + sprint(caller, " ^5symorigin get|set\n"); + sprint(caller, " ^5symorigin get|set p1 p2 ... pX\n"); + sprint(caller, " ^5symaxis get|set p1 p2\n"); + sprint(caller, " ^7 where p1 p2 ... pX are positions (\"x y z\", z can be omitted) that you know are perfectly symmetrical" + " so you can determine origin/axis of symmetry of maps without ctf flags or where flags aren't perfectly symmetrical\n"); + sprint(caller, " See 'wpeditor_menu' for a selectable list of various commands and useful settings to edit waypoints.\n"); return; } } @@ -735,6 +762,12 @@ void ClientCommand_voice(entity caller, int request, int argc, string command) sprint(caller, sprintf("Invalid voice. Use one of: %s\n", allvoicesamples)); return; } + if (IS_DEAD(caller)) + { + // don't warn the caller when trying to taunt while dead, just don't play any sounds! + // we still allow them to see warnings if it's invalid, so a dead player can find out the sounds in peace + return; + } string msg = ""; if (argc >= 3) msg = substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2)); diff --git a/qcsrc/server/command/vote.qc b/qcsrc/server/command/vote.qc index d79c2418d..a5cc73834 100644 --- a/qcsrc/server/command/vote.qc +++ b/qcsrc/server/command/vote.qc @@ -440,6 +440,8 @@ void ReadyRestart_force() restart_mapalreadyrestarted = false; // reset this var, needed when cvar sv_ready_restart_repeatable is in use // disable the warmup global for the server + if(warmup_stage) + localcmd("\nsv_hook_warmupend\n"); warmup_stage = 0; // once the game is restarted the game is in match stage // reset the .ready status of all players (also spectators) diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index b52649a34..b1d73f6a3 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -163,6 +163,7 @@ float default_player_alpha; float default_weapon_alpha; .float cvar_cl_handicap; +.int cvar_cl_gunalign; .float cvar_cl_clippedspectating; .float cvar_cl_autoscreenshot; .float cvar_cl_jetpack_jump; @@ -181,6 +182,7 @@ float default_weapon_alpha; .float cvar_cl_allow_uid2name; .float cvar_cl_allow_uidtracking; +.bool cvar_cl_allow_uidranking; .string stored_netname; string gamemode_name; @@ -190,9 +192,6 @@ string W_Apply_Weaponreplace(string in); void FixIntermissionClient(entity e); void FixClientCvars(entity e); -// WEAPONTODO: remove this -//WepSet weaponsInMap; - .float respawn_countdown; // next number to count float bot_waypoints_for_items; @@ -333,7 +332,7 @@ string deathmessage; .float cvar_cl_weaponimpulsemode; .int selectweapon; // last selected weapon of the player -.float ballistics_density; // wall piercing factor, larger = bullet can pass through more +.float ballistics_density; //const int FROZEN_NOT = 0; const int FROZEN_NORMAL = 1; diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index 2c5b9dea3..a044c2a46 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -266,6 +266,7 @@ void cvar_changes_init() BADCVAR("g_domination"); BADCVAR("g_domination_default_teams"); BADCVAR("g_duel"); + BADCVAR("g_duel_not_dm_maps"); BADCVAR("g_freezetag"); BADCVAR("g_freezetag_teams"); BADCVAR("g_invasion_teams"); @@ -283,8 +284,10 @@ void cvar_changes_init() BADCVAR("g_race_qualifying_timelimit"); BADCVAR("g_race_qualifying_timelimit_override"); BADCVAR("g_runematch"); + BADCVAR("g_shootfromeye"); BADCVAR("g_snafu"); BADCVAR("g_tdm"); + BADCVAR("g_tdm_on_dm_maps"); BADCVAR("g_tdm_teams"); BADCVAR("g_vip"); BADCVAR("leadlimit"); @@ -292,6 +295,8 @@ void cvar_changes_init() BADCVAR("teamplay"); BADCVAR("timelimit"); BADCVAR("g_mapinfo_ignore_warnings"); + BADCVAR("g_maplist_ignore_sizes"); + BADCVAR("g_maplist_sizes_count_bots"); // long BADCVAR("hostname"); @@ -320,6 +325,7 @@ void cvar_changes_init() BADCVAR("captureleadlimit_override"); BADCVAR("condump_stripcolors"); BADCVAR("gameversion"); + BADCVAR("fs_gamedir"); BADCVAR("g_allow_oldvortexbeam"); BADCVAR("g_balance_kill_delay"); BADCVAR("g_buffs_pickup_anyway"); @@ -339,6 +345,7 @@ void cvar_changes_init() BADCVAR("g_jump_grunt"); BADCVAR("g_keyhunt_point_leadlimit"); BADCVAR("g_nexball_goalleadlimit"); + BADCVAR("g_new_toys_autoreplace"); BADCVAR("g_new_toys_use_pickupsound"); BADCVAR("g_physics_predictall"); BADCVAR("g_piggyback"); @@ -403,6 +410,7 @@ void cvar_changes_init() BADCVAR("g_ban_sync_uri"); BADCVAR("g_buffs"); BADCVAR("g_ca_teams_override"); + BADCVAR("g_ctf_fullbrightflags"); BADCVAR("g_ctf_ignore_frags"); BADCVAR("g_ctf_leaderboard"); BADCVAR("g_domination_point_limit"); @@ -422,6 +430,9 @@ void cvar_changes_init() BADCVAR("g_physics_clientselect"); BADCVAR("g_pinata"); BADCVAR("g_powerups"); + BADCVAR("g_player_brightness"); + BADCVAR("g_rocket_flying"); + BADCVAR("g_rocket_flying_disabledelays"); BADCVAR("g_spawnshieldtime"); BADCVAR("g_start_delay"); BADCVAR("g_superspectate"); @@ -475,6 +486,18 @@ void cvar_changes_init() BADCVAR("g_grappling_hook"); BADCVAR("g_jetpack"); + // temporary for testing + // TODO remove before 0.8.3 release + BADCVAR("g_ca_weaponarena"); + BADCVAR("g_freezetag_weaponarena"); + BADCVAR("g_lms_weaponarena"); + + if(cvar_string("g_mod_balance") == "Testing") + { + // (temporary) while using the Testing balance, any weapon balance cvars are allowed to be changed + BADPREFIX("g_balance_"); + } + #undef BADPRESUFFIX #undef BADPREFIX #undef BADCVAR @@ -954,7 +977,7 @@ spawnfunc(worldspawn) // physics/balance/config changes that count as mod if(cvar_string("g_mod_physics") != cvar_defstring("g_mod_physics")) modname = cvar_string("g_mod_physics"); - if(cvar_string("g_mod_balance") != cvar_defstring("g_mod_balance")) + if(cvar_string("g_mod_balance") != cvar_defstring("g_mod_balance") && cvar_string("g_mod_balance") != "Testing") modname = cvar_string("g_mod_balance"); if(cvar_string("g_mod_config") != cvar_defstring("g_mod_config")) modname = cvar_string("g_mod_config"); @@ -1040,18 +1063,21 @@ bool MapHasRightSize(string map) // open map size restriction file string opensize_msg = strcat("opensize ", map); float fh = fopen(strcat("maps/", map, ".sizes"), FILE_READ); + int pcount = player_count; + if(!autocvar_g_maplist_sizes_count_bots) + pcount -= currentbots; if(fh >= 0) { opensize_msg = strcat(opensize_msg, ": ok, "); int mapmin = stoi(fgets(fh)); int mapmax = stoi(fgets(fh)); fclose(fh); - if(player_count < mapmin) + if(pcount < mapmin) { LOG_TRACE(opensize_msg, "not enough"); return false; } - if(mapmax && player_count > mapmax) + if(mapmax && pcount > mapmax) { LOG_TRACE(opensize_msg, "too many"); return false; diff --git a/qcsrc/server/ipban.qc b/qcsrc/server/ipban.qc index 7c6fcbafe..9d74477b4 100644 --- a/qcsrc/server/ipban.qc +++ b/qcsrc/server/ipban.qc @@ -202,12 +202,21 @@ void OnlineBanList_Think(entity this) float i, n; if(autocvar_g_ban_sync_uri == "") - goto killme; + { + delete(this); + return; + } if(autocvar_g_ban_sync_interval == 0) // < 0 is okay, it means "sync on level start only" - goto killme; + { + delete(this); + return; + } argc = tokenize_console(autocvar_g_ban_sync_trusted_servers); if(argc == 0) - goto killme; + { + delete(this); + return; + } string s = argv(0); for(i = 1; i < argc; ++i) s = strcat(s, ";", argv(i)); strcpy(OnlineBanList_Servers, s); @@ -231,14 +240,13 @@ void OnlineBanList_Think(entity this) uri_get(strcat(argv(i), "?", uri), URI_GET_IPBAN + i); // 1000 = "banlist" callback target } - if(autocvar_g_ban_sync_interval > 0) - this.nextthink = time + max(60, autocvar_g_ban_sync_interval * 60); - else - goto killme; - return; + if(autocvar_g_ban_sync_interval <= 0) + { + delete(this); + return; + } -LABEL(killme) - delete(this); + this.nextthink = time + max(60, autocvar_g_ban_sync_interval * 60); } const float BAN_MAX = 256; diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 854e39781..026e1d7ce 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -390,6 +390,8 @@ REPLICATE(autoswitch, bool, "cl_autoswitch"); REPLICATE(cvar_cl_allow_uid2name, bool, "cl_allow_uid2name"); +REPLICATE(cvar_cl_allow_uidranking, bool, "cl_allow_uidranking"); + REPLICATE(cvar_cl_autoscreenshot, int, "cl_autoscreenshot"); REPLICATE(cvar_cl_autotaunt, float, "cl_autotaunt"); @@ -398,6 +400,8 @@ REPLICATE(cvar_cl_clippedspectating, bool, "cl_clippedspectating"); REPLICATE(cvar_cl_handicap, float, "cl_handicap"); +REPLICATE(cvar_cl_gunalign, int, "cl_gunalign"); + REPLICATE(cvar_cl_jetpack_jump, bool, "cl_jetpack_jump"); REPLICATE(cvar_cl_movement_track_canjump, bool, "cl_movement_track_canjump"); @@ -487,13 +491,12 @@ string playername(entity p, bool team_colorize) return p.netname; } -float want_weapon(entity weaponinfo, float allguns) // WEAPONTODO: what still needs done? +float want_weapon(entity weaponinfo, float allguns) { - int i = weaponinfo.m_id; int d = 0; bool allow_mutatorblocked = false; - if(!i) + if(!weaponinfo.m_id) return 0; bool mutator_returnvalue = MUTATOR_CALLHOOK(WantWeapon, weaponinfo, d, allguns, allow_mutatorblocked); @@ -511,7 +514,7 @@ float want_weapon(entity weaponinfo, float allguns) // WEAPONTODO: what still ne float t = weaponinfo.weaponstartoverride; - //print(strcat("want_weapon: ", weaponinfo.netname, " - d: ", ftos(d), ", t: ", ftos(t), ". \n")); + //LOG_INFOF("want_weapon: %s - d: %d t: %d\n", weaponinfo.netname, d, t); // bit order in t: // 1: want or not @@ -525,10 +528,90 @@ float want_weapon(entity weaponinfo, float allguns) // WEAPONTODO: what still ne return t; } +/// Weapons the player normally starts with outside weapon arena. +WepSet weapons_start() +{ + WepSet ret = '0 0 0'; + FOREACH(Weapons, it != WEP_Null, { + int w = want_weapon(it, false); + if (w & 1) + ret |= it.m_wepset; + }); + return ret; +} + +WepSet weapons_all() +{ + WepSet ret = '0 0 0'; + FOREACH(Weapons, it != WEP_Null, { + if (!(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_SPECIALATTACK))) + ret |= it.m_wepset; + }); + return ret; +} + +WepSet weapons_devall() +{ + WepSet ret = '0 0 0'; + FOREACH(Weapons, it != WEP_Null, + { + ret |= it.m_wepset; + }); + return ret; +} + +WepSet weapons_most() +{ + WepSet ret = '0 0 0'; + FOREACH(Weapons, it != WEP_Null, { + if ((it.spawnflags & WEP_FLAG_NORMAL) && !(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_HIDDEN | WEP_FLAG_SPECIALATTACK))) + ret |= it.m_wepset; + }); + return ret; +} + +void weaponarena_available_all_update(entity this) +{ + if (weaponsInMapAll) + { + start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_start() | (weaponsInMapAll & weapons_all()); + } + else + { + // if no weapons are available on the map, just fall back to all weapons arena + start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_all(); + } +} + +void weaponarena_available_devall_update(entity this) +{ + if (weaponsInMapAll) + { + start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_start() | weaponsInMapAll; + } + else + { + // if no weapons are available on the map, just fall back to devall weapons arena + start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_devall(); + } +} + +void weaponarena_available_most_update(entity this) +{ + if (weaponsInMapAll) + { + start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_start() | (weaponsInMapAll & weapons_most()); + } + else + { + // if no weapons are available on the map, just fall back to most weapons arena + start_weapons = warmup_start_weapons = g_weaponarena_weapons = weapons_most(); + } +} + void readplayerstartcvars() { float i, t; - string s; // initialize starting values for players start_weapons = '0 0 0'; @@ -550,7 +633,7 @@ void readplayerstartcvars() g_weaponarena = 0; g_weaponarena_weapons = '0 0 0'; - s = cvar_string("g_weaponarena"); + string s = cvar_string("g_weaponarena"); MUTATOR_CALLHOOK(SetWeaponArena, s); s = M_ARGV(0, string); @@ -567,28 +650,43 @@ void readplayerstartcvars() { g_weaponarena = 1; g_weaponarena_list = "All Weapons"; - FOREACH(Weapons, it != WEP_Null, { - if(!(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_SPECIALATTACK))) - g_weaponarena_weapons |= (it.m_wepset); - }); + g_weaponarena_weapons = weapons_all(); } else if (s == "devall") { g_weaponarena = 1; - g_weaponarena_list = "All Weapons"; // TODO: report as more than just all weapons? - FOREACH(Weapons, it != WEP_Null, - { - g_weaponarena_weapons |= (it.m_wepset); - }); + g_weaponarena_list = "Dev All Weapons"; + g_weaponarena_weapons = weapons_devall(); } else if (s == "most") { g_weaponarena = 1; g_weaponarena_list = "Most Weapons"; - FOREACH(Weapons, it != WEP_Null, { - if ((it.spawnflags & WEP_FLAG_NORMAL) && !(it.spawnflags & (WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_HIDDEN | WEP_FLAG_SPECIALATTACK))) - g_weaponarena_weapons |= (it.m_wepset); - }); + g_weaponarena_weapons = weapons_most(); + } + else if (s == "all_available") + { + g_weaponarena = 1; + g_weaponarena_list = "All Available Weapons"; + + // this needs to run after weaponsInMapAll is initialized + InitializeEntity(NULL, weaponarena_available_all_update, INITPRIO_FINDTARGET); + } + else if (s == "devall_available") + { + g_weaponarena = 1; + g_weaponarena_list = "Dev All Available Weapons"; + + // this needs to run after weaponsInMapAll is initialized + InitializeEntity(NULL, weaponarena_available_devall_update, INITPRIO_FINDTARGET); + } + else if (s == "most_available") + { + g_weaponarena = 1; + g_weaponarena_list = "Most Available Weapons"; + + // this needs to run after weaponsInMapAll is initialized + InitializeEntity(NULL, weaponarena_available_most_update, INITPRIO_FINDTARGET); } else if (s == "none") { @@ -657,56 +755,48 @@ void readplayerstartcvars() start_ammo_plasma = cvar("g_start_ammo_plasma"); start_ammo_fuel = cvar("g_start_ammo_fuel"); random_start_weapons_count = cvar("g_random_start_weapons_count"); - SetResource(random_start_ammo, RES_SHELLS, cvar( - "g_random_start_shells")); - SetResource(random_start_ammo, RES_BULLETS, cvar( - "g_random_start_bullets")); - SetResource(random_start_ammo, RES_ROCKETS, - cvar("g_random_start_rockets")); - SetResource(random_start_ammo, RES_CELLS, cvar( - "g_random_start_cells")); - SetResource(random_start_ammo, RES_PLASMA, cvar( - "g_random_start_plasma")); + SetResource(random_start_ammo, RES_SHELLS, cvar("g_random_start_shells")); + SetResource(random_start_ammo, RES_BULLETS, cvar("g_random_start_bullets")); + SetResource(random_start_ammo, RES_ROCKETS,cvar("g_random_start_rockets")); + SetResource(random_start_ammo, RES_CELLS, cvar("g_random_start_cells")); + SetResource(random_start_ammo, RES_PLASMA, cvar("g_random_start_plasma")); } - if (warmup_stage) + warmup_start_ammo_shells = start_ammo_shells; + warmup_start_ammo_nails = start_ammo_nails; + warmup_start_ammo_rockets = start_ammo_rockets; + warmup_start_ammo_cells = start_ammo_cells; + warmup_start_ammo_plasma = start_ammo_plasma; + warmup_start_ammo_fuel = start_ammo_fuel; + warmup_start_health = start_health; + warmup_start_armorvalue = start_armorvalue; + warmup_start_weapons = start_weapons; + warmup_start_weapons_default = start_weapons_default; + warmup_start_weapons_defaultmask = start_weapons_defaultmask; + + if (!g_weaponarena) { - warmup_start_ammo_shells = start_ammo_shells; - warmup_start_ammo_nails = start_ammo_nails; - warmup_start_ammo_rockets = start_ammo_rockets; - warmup_start_ammo_cells = start_ammo_cells; - warmup_start_ammo_plasma = start_ammo_plasma; - warmup_start_ammo_fuel = start_ammo_fuel; - warmup_start_health = start_health; - warmup_start_armorvalue = start_armorvalue; - warmup_start_weapons = start_weapons; - warmup_start_weapons_default = start_weapons_default; - warmup_start_weapons_defaultmask = start_weapons_defaultmask; - - if (!g_weaponarena && !g_ca && !g_freezetag) - { - warmup_start_ammo_shells = cvar("g_warmup_start_ammo_shells"); - warmup_start_ammo_nails = cvar("g_warmup_start_ammo_nails"); - warmup_start_ammo_rockets = cvar("g_warmup_start_ammo_rockets"); - warmup_start_ammo_cells = cvar("g_warmup_start_ammo_cells"); - warmup_start_ammo_plasma = cvar("g_warmup_start_ammo_plasma"); - warmup_start_ammo_fuel = cvar("g_warmup_start_ammo_fuel"); - warmup_start_health = cvar("g_warmup_start_health"); - warmup_start_armorvalue = cvar("g_warmup_start_armor"); - warmup_start_weapons = '0 0 0'; - warmup_start_weapons_default = '0 0 0'; - warmup_start_weapons_defaultmask = '0 0 0'; - FOREACH(Weapons, it != WEP_Null, { - int w = want_weapon(it, g_warmup_allguns); - WepSet s = (it.m_wepset); - if(w & 1) - warmup_start_weapons |= s; - if(w & 2) - warmup_start_weapons_default |= s; - if(w & 4) - warmup_start_weapons_defaultmask |= s; - }); - } + warmup_start_ammo_shells = cvar("g_warmup_start_ammo_shells"); + warmup_start_ammo_nails = cvar("g_warmup_start_ammo_nails"); + warmup_start_ammo_rockets = cvar("g_warmup_start_ammo_rockets"); + warmup_start_ammo_cells = cvar("g_warmup_start_ammo_cells"); + warmup_start_ammo_plasma = cvar("g_warmup_start_ammo_plasma"); + warmup_start_ammo_fuel = cvar("g_warmup_start_ammo_fuel"); + warmup_start_health = cvar("g_warmup_start_health"); + warmup_start_armorvalue = cvar("g_warmup_start_armor"); + warmup_start_weapons = '0 0 0'; + warmup_start_weapons_default = '0 0 0'; + warmup_start_weapons_defaultmask = '0 0 0'; + FOREACH(Weapons, it != WEP_Null, { + int w = want_weapon(it, g_warmup_allguns); + WepSet s = it.m_wepset; + if(w & 1) + warmup_start_weapons |= s; + if(w & 2) + warmup_start_weapons_default |= s; + if(w & 4) + warmup_start_weapons_defaultmask |= s; + }); } if (g_jetpack) @@ -727,16 +817,16 @@ void readplayerstartcvars() start_ammo_cells = max(0, start_ammo_cells); start_ammo_plasma = max(0, start_ammo_plasma); start_ammo_fuel = max(0, start_ammo_fuel); - SetResource(random_start_ammo, RES_SHELLS, max(0, - GetResource(random_start_ammo, RES_SHELLS))); - SetResource(random_start_ammo, RES_BULLETS, max(0, - GetResource(random_start_ammo, RES_BULLETS))); - SetResource(random_start_ammo, RES_ROCKETS, max(0, - GetResource(random_start_ammo, RES_ROCKETS))); - SetResource(random_start_ammo, RES_CELLS, max(0, - GetResource(random_start_ammo, RES_CELLS))); - SetResource(random_start_ammo, RES_PLASMA, max(0, - GetResource(random_start_ammo, RES_PLASMA))); + SetResource(random_start_ammo, RES_SHELLS, + max(0, GetResource(random_start_ammo, RES_SHELLS))); + SetResource(random_start_ammo, RES_BULLETS, + max(0, GetResource(random_start_ammo, RES_BULLETS))); + SetResource(random_start_ammo, RES_ROCKETS, + max(0, GetResource(random_start_ammo, RES_ROCKETS))); + SetResource(random_start_ammo, RES_CELLS, + max(0, GetResource(random_start_ammo, RES_CELLS))); + SetResource(random_start_ammo, RES_PLASMA, + max(0, GetResource(random_start_ammo, RES_PLASMA))); warmup_start_ammo_shells = max(0, warmup_start_ammo_shells); warmup_start_ammo_nails = max(0, warmup_start_ammo_nails); @@ -751,9 +841,9 @@ void precache_playermodel(string m) float globhandle, i, n; string f; - if(substring(m, -9,5) == "_lod1") + if(substring(m, -9, 5) == "_lod1") return; - if(substring(m, -9,5) == "_lod2") + if(substring(m, -9, 5) == "_lod2") return; precache_model(m); f = strcat(substring(m, 0, -5), "_lod1", substring(m, -4, -1)); @@ -1106,11 +1196,6 @@ bool WarpZone_Projectile_Touch_ImpactFilter_Callback(entity this, entity toucher return false; // no checks here else if(this.classname == "grapplinghook") RemoveHook(this); - else if(this.classname == "spike") - { - W_Crylink_Dequeue(this); - delete(this); - } else delete(this); return true; diff --git a/qcsrc/server/mutators/events.qh b/qcsrc/server/mutators/events.qh index 1ca629078..a310c6cca 100644 --- a/qcsrc/server/mutators/events.qh +++ b/qcsrc/server/mutators/events.qh @@ -1231,3 +1231,10 @@ MUTATOR_HOOKABLE(GetPlayerLimit, EV_GetPlayerLimit); /**/ o(string, MUTATOR_ARGV_1_string) \ /**/ MUTATOR_HOOKABLE(LogDeath_AppendItemCodes, EV_LogDeath_AppendItemCodes); + +/** Allows disabling or enabling rocket jumping independently of balance, use the parameter to force a preferred setting */ +#define EV_AllowRocketJumping(i, o) \ + /** allow_rocketjump */ i(bool, MUTATOR_ARGV_0_bool) \ + /**/ o(bool, MUTATOR_ARGV_0_bool) \ + /**/ +MUTATOR_HOOKABLE(AllowRocketJumping, EV_AllowRocketJumping); diff --git a/qcsrc/server/player.qc b/qcsrc/server/player.qc index c39f59e72..9e67050cb 100644 --- a/qcsrc/server/player.qc +++ b/qcsrc/server/player.qc @@ -398,7 +398,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, if(sound_allowed(MSG_BROADCAST, attacker)) { - if (save > 10) + if (save > 10 && (dh - take) > 0) // don't play armor sound if the attack is fatal sound (this, CH_SHOTS, SND_ARMORIMPACT, VOL_BASE, ATTEN_NORM); else if (take > 30) sound (this, CH_SHOTS, SND_BODYIMPACT2, VOL_BASE, ATTEN_NORM); diff --git a/qcsrc/server/sv_main.qc b/qcsrc/server/sv_main.qc index 6b5b19d79..54c974433 100644 --- a/qcsrc/server/sv_main.qc +++ b/qcsrc/server/sv_main.qc @@ -324,14 +324,17 @@ void SV_OnEntityPreSpawnFunction(entity this) if (this.gametypefilter != "") if (!isGametypeInFilter(MapInfo_LoadedGametype, teamplay, have_team_spawns, this.gametypefilter)) { - goto cleanup; + delete(this); + return; } if (this.cvarfilter != "" && !expr_evaluate(this.cvarfilter)) { - goto cleanup; + delete(this); + return; } if (DoesQ3ARemoveThisEntity(this)) { - goto cleanup; + delete(this); + return; } set_movetype(this, this.movetype); @@ -356,11 +359,9 @@ void SV_OnEntityPreSpawnFunction(entity this) #undef X if (MUTATOR_CALLHOOK(OnEntityPreSpawn, this)) { - goto cleanup; + delete(this); + return; } - return; -LABEL(cleanup) - delete(this); } void WarpZone_PostInitialize_Callback() diff --git a/qcsrc/server/weapons/spawning.qc b/qcsrc/server/weapons/spawning.qc index ba17d3f1f..23a3ee67d 100644 --- a/qcsrc/server/weapons/spawning.qc +++ b/qcsrc/server/weapons/spawning.qc @@ -26,22 +26,21 @@ string W_Apply_Weaponreplace(string in) return out; } -void weapon_defaultspawnfunc(entity this, Weapon e) +void weapon_defaultspawnfunc(entity this, Weapon wpn) { - Weapon wpn = e; - e = wpn = wpn.m_spawnfunc_hookreplace(wpn, this); + wpn = wpn.m_spawnfunc_hookreplace(wpn, this); this.classname = wpn.m_canonical_spawnfunc; if (!Item_IsLoot(this) && !this.m_isreplaced) { - if (e.spawnflags & WEP_FLAG_MUTATORBLOCKED) + if (wpn.spawnflags & WEP_FLAG_MUTATORBLOCKED) { LOG_WARNF("Attempted to spawn a mutator-blocked weapon rejected: prvm_edict server %i", this); startitem_failed = true; return; } - string s = W_Apply_Weaponreplace(e.netname); - MUTATOR_CALLHOOK(SetWeaponreplace, this, e, s); + string s = W_Apply_Weaponreplace(wpn.netname); + MUTATOR_CALLHOOK(SetWeaponreplace, this, wpn, s); s = M_ARGV(2, string); if (s == "") { @@ -79,6 +78,9 @@ void weapon_defaultspawnfunc(entity this, Weapon e) } } + if(!Item_IsLoot(this)) + weaponsInMapAll |= WepSet_FromWeapon(wpn); + if (!Item_IsDefinitionAllowed(wpn.m_pickup)) { delete(this); diff --git a/qcsrc/server/weapons/tracing.qc b/qcsrc/server/weapons/tracing.qc index 99fa2df74..06bebeba2 100644 --- a/qcsrc/server/weapons/tracing.qc +++ b/qcsrc/server/weapons/tracing.qc @@ -330,25 +330,19 @@ void fireBullet_trace_callback(vector start, vector hit, vector end) fireBullet_last_hit = NULL; } -void fireBullet(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect) +void fireBullet_antilag(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect, bool do_antilag) { - vector end; - dir = normalize(dir + randomvec() * spread); - end = start + dir * max_shot_distance; + vector end = start + dir * max_shot_distance; fireBullet_last_hit = NULL; fireBullet_trace_callback_eff = tracer_effect; - float solid_penetration_left = 1; + float solid_penetration_fraction = 1; + float damage_fraction = 1; float total_damage = 0; - float lag = ((IS_REAL_CLIENT(this)) ? ANTILAG_LATENCY(this) : 0); - if(lag < 0.001) - lag = 0; - bool noantilag = ((IS_CLIENT(this)) ? CS(this).cvar_cl_noantilag : false); - if(autocvar_g_antilag == 0 || noantilag) - lag = 0; // only do hitscan, but no antilag + float lag = ((do_antilag) ? antilag_getlag(this) : 0); if(lag) antilag_takeback_all(this, lag); @@ -361,7 +355,6 @@ void fireBullet(entity this, .entity weaponentity, vector start, vector dir, flo for (;;) { - // TODO also show effect while tracing WarpZone_TraceBox_ThroughZone(start, '0 0 0', '0 0 0', end, false, WarpZone_trace_forent, NULL, fireBullet_trace_callback); dir = WarpZone_TransformVelocity(WarpZone_trace_transform, dir); end = WarpZone_TransformOrigin(WarpZone_trace_transform, end); @@ -399,7 +392,7 @@ void fireBullet(entity this, .entity weaponentity, vector start, vector dir, flo is_weapclip = true; if(!hit || hit.solid == SOLID_BSP || hit.solid == SOLID_SLIDEBOX) - Damage_DamageInfo(start, damage * solid_penetration_left, 0, 0, max(1, force) * dir * solid_penetration_left, dtype, hit.species, this); + Damage_DamageInfo(start, damage * damage_fraction, 0, 0, max(1, force) * dir * damage_fraction, dtype, hit.species, this); if (hit && hit != WarpZone_trace_forent && hit != fireBullet_last_hit) // Avoid self-damage (except after going through a warp); avoid hitting the same entity twice (engine bug). { @@ -408,13 +401,13 @@ void fireBullet(entity this, .entity weaponentity, vector start, vector dir, flo MUTATOR_CALLHOOK(FireBullet_Hit, this, hit, start, end, damage, this.(weaponentity)); damage = M_ARGV(4, float); bool gooddamage = accuracy_isgooddamage(this, hit); - Damage(hit, this, this, damage * solid_penetration_left, dtype, weaponentity, start, force * dir * solid_penetration_left); + Damage(hit, this, this, damage * damage_fraction, dtype, weaponentity, start, force * dir * damage_fraction); // calculate hits for ballistic weapons if(gooddamage) { // do not exceed 100% - float added_damage = min(damage - total_damage, damage * solid_penetration_left); - total_damage += damage * solid_penetration_left; + float added_damage = min(damage - total_damage, damage * damage_fraction); + total_damage += damage * damage_fraction; accuracy_add(this, this.(weaponentity).m_weapon, 0, added_damage); } } @@ -436,9 +429,9 @@ void fireBullet(entity this, .entity weaponentity, vector start, vector dir, flo else if(hitstore.ballistics_density < 0) maxdist = vlen(hit.maxs - hit.mins) + 1; // -1: infinite travel distance else if(hitstore.ballistics_density == 0) - maxdist = max_solid_penetration * solid_penetration_left; + maxdist = max_solid_penetration * solid_penetration_fraction; else - maxdist = max_solid_penetration * solid_penetration_left * hitstore.ballistics_density; + maxdist = max_solid_penetration * solid_penetration_fraction / hitstore.ballistics_density; if(maxdist <= autocvar_g_ballistics_mindistance) break; @@ -450,10 +443,10 @@ void fireBullet(entity this, .entity weaponentity, vector start, vector dir, flo break; float dist_taken = max(autocvar_g_ballistics_mindistance, vlen(trace_endpos - start)); - // fraction_used_of_what_is_left = dist_taken / maxdist - // solid_penetration_left = solid_penetration_left - solid_penetration_left * fraction_used_of_what_is_left - solid_penetration_left *= 1 - dist_taken / maxdist; - solid_penetration_left = max(solid_penetration_left, 0); + float fraction_used_of_what_is_left = dist_taken / maxdist; + solid_penetration_fraction -= solid_penetration_fraction * fraction_used_of_what_is_left; + solid_penetration_fraction = max(solid_penetration_fraction, 0); + damage_fraction = pow(solid_penetration_fraction, autocvar_g_ballistics_solidpenetration_exponent); // Only show effect when going through a player (invisible otherwise) if (hit && (hit.solid != SOLID_BSP)) @@ -463,7 +456,7 @@ void fireBullet(entity this, .entity weaponentity, vector start, vector dir, flo start = trace_endpos; if(hit.solid == SOLID_BSP) - Damage_DamageInfo(start, 0, 0, 0, max(1, force) * normalize(dir) * -solid_penetration_left, dtype, 0, this); + Damage_DamageInfo(start, 0, 0, 0, max(1, force) * normalize(dir) * -damage_fraction, dtype, 0, this); } if(lag) @@ -473,3 +466,8 @@ void fireBullet(entity this, .entity weaponentity, vector start, vector dir, flo if(this) this.dphitcontentsmask = oldsolid; } + +void fireBullet(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect) +{ + fireBullet_antilag(this, weaponentity, start, dir, spread, max_solid_penetration, damage, force, dtype, tracer_effect, true); +} diff --git a/qcsrc/server/weapons/tracing.qh b/qcsrc/server/weapons/tracing.qh index 9e39ecc35..5acbda9a5 100644 --- a/qcsrc/server/weapons/tracing.qh +++ b/qcsrc/server/weapons/tracing.qh @@ -57,4 +57,5 @@ void FireRailgunBullet (entity this, .entity weaponentity, vector start, vector entity fireBullet_trace_callback_eff; entity fireBullet_last_hit; void fireBullet_trace_callback(vector start, vector hit, vector end); +void fireBullet_antilag(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect, bool do_antilag); void fireBullet(entity this, .entity weaponentity, vector start, vector dir, float spread, float max_solid_penetration, float damage, float force, float dtype, entity tracer_effect); diff --git a/qcsrc/server/weapons/weaponsystem.qc b/qcsrc/server/weapons/weaponsystem.qc index b75881127..f1655b632 100644 --- a/qcsrc/server/weapons/weaponsystem.qc +++ b/qcsrc/server/weapons/weaponsystem.qc @@ -163,6 +163,7 @@ void CL_ExteriorWeaponentity_Think(entity this) Weapon wep = this.owner.(weaponentity).m_weapon; if (wep) this.glowmod = weaponentity_glowmod(wep, this.owner, this.owner.clientcolors, this.owner.(weaponentity)); this.colormap = this.owner.colormap; + this.skin = w_ent.skin; CSQCMODEL_AUTOUPDATE(this); } @@ -808,7 +809,6 @@ void W_Reload(entity actor, .entity weaponentity, float sent_ammo_min, Sound sen } } } - if (this) { if (this.wframe == WFRAME_RELOAD) return; diff --git a/ruleset-overkill.cfg b/ruleset-overkill.cfg index 28b3d90a5..f74c1e9b0 100644 --- a/ruleset-overkill.cfg +++ b/ruleset-overkill.cfg @@ -36,5 +36,3 @@ g_spawn_near_teammate "!g_assault !g_freezetag" g_spawn_near_teammate_ignore_spawnpoint 1 g_spawnshieldtime 0.5 g_respawn_delay_forced 2 - -g_buffs_resistance_blockpercent 0.5 diff --git a/sound/misc/armor1.ogg b/sound/misc/armor1.ogg new file mode 100644 index 000000000..b781feb2d Binary files /dev/null and b/sound/misc/armor1.ogg differ diff --git a/sound/misc/armor1.wav b/sound/misc/armor1.wav deleted file mode 100644 index 4ee623088..000000000 Binary files a/sound/misc/armor1.wav and /dev/null differ diff --git a/sound/misc/armor10.ogg b/sound/misc/armor10.ogg new file mode 100644 index 000000000..5f8c14288 Binary files /dev/null and b/sound/misc/armor10.ogg differ diff --git a/sound/misc/armor10.wav b/sound/misc/armor10.wav deleted file mode 100644 index 7ba2edf9f..000000000 Binary files a/sound/misc/armor10.wav and /dev/null differ diff --git a/sound/misc/armor17_5.ogg b/sound/misc/armor17_5.ogg new file mode 100644 index 000000000..6931ed70e Binary files /dev/null and b/sound/misc/armor17_5.ogg differ diff --git a/sound/misc/armor17_5.wav b/sound/misc/armor17_5.wav deleted file mode 100644 index eafad599a..000000000 Binary files a/sound/misc/armor17_5.wav and /dev/null differ diff --git a/sound/misc/armor25.ogg b/sound/misc/armor25.ogg new file mode 100644 index 000000000..a5a02fabb Binary files /dev/null and b/sound/misc/armor25.ogg differ diff --git a/sound/misc/armor25.wav b/sound/misc/armor25.wav deleted file mode 100644 index 9aea70caf..000000000 Binary files a/sound/misc/armor25.wav and /dev/null differ diff --git a/sound/misc/armorimpact.ogg b/sound/misc/armorimpact.ogg new file mode 100644 index 000000000..9f3274da0 Binary files /dev/null and b/sound/misc/armorimpact.ogg differ diff --git a/sound/misc/armorimpact.wav b/sound/misc/armorimpact.wav deleted file mode 100644 index 28c18dbe1..000000000 Binary files a/sound/misc/armorimpact.wav and /dev/null differ diff --git a/sound/misc/footstep01.ogg b/sound/misc/footstep01.ogg new file mode 100644 index 000000000..6091a39b0 Binary files /dev/null and b/sound/misc/footstep01.ogg differ diff --git a/sound/misc/footstep01.wav b/sound/misc/footstep01.wav deleted file mode 100644 index 56272291d..000000000 Binary files a/sound/misc/footstep01.wav and /dev/null differ diff --git a/sound/misc/footstep02.ogg b/sound/misc/footstep02.ogg new file mode 100644 index 000000000..1d6b99595 Binary files /dev/null and b/sound/misc/footstep02.ogg differ diff --git a/sound/misc/footstep02.wav b/sound/misc/footstep02.wav deleted file mode 100644 index 736746c39..000000000 Binary files a/sound/misc/footstep02.wav and /dev/null differ diff --git a/sound/misc/footstep03.ogg b/sound/misc/footstep03.ogg new file mode 100644 index 000000000..d453ad754 Binary files /dev/null and b/sound/misc/footstep03.ogg differ diff --git a/sound/misc/footstep03.wav b/sound/misc/footstep03.wav deleted file mode 100644 index 2137b65d4..000000000 Binary files a/sound/misc/footstep03.wav and /dev/null differ diff --git a/sound/misc/footstep04.ogg b/sound/misc/footstep04.ogg new file mode 100644 index 000000000..caacad509 Binary files /dev/null and b/sound/misc/footstep04.ogg differ diff --git a/sound/misc/footstep04.wav b/sound/misc/footstep04.wav deleted file mode 100644 index 06ba93c98..000000000 Binary files a/sound/misc/footstep04.wav and /dev/null differ diff --git a/sound/misc/footstep05.ogg b/sound/misc/footstep05.ogg new file mode 100644 index 000000000..4075ed992 Binary files /dev/null and b/sound/misc/footstep05.ogg differ diff --git a/sound/misc/footstep05.wav b/sound/misc/footstep05.wav deleted file mode 100644 index e16d6b350..000000000 Binary files a/sound/misc/footstep05.wav and /dev/null differ diff --git a/sound/misc/footstep06.ogg b/sound/misc/footstep06.ogg new file mode 100644 index 000000000..be9e2b449 Binary files /dev/null and b/sound/misc/footstep06.ogg differ diff --git a/sound/misc/footstep06.wav b/sound/misc/footstep06.wav deleted file mode 100644 index fff0370a6..000000000 Binary files a/sound/misc/footstep06.wav and /dev/null differ diff --git a/sound/misc/gib.ogg b/sound/misc/gib.ogg new file mode 100644 index 000000000..2b297593b Binary files /dev/null and b/sound/misc/gib.ogg differ diff --git a/sound/misc/gib.wav b/sound/misc/gib.wav deleted file mode 100644 index a26e9ad1d..000000000 Binary files a/sound/misc/gib.wav and /dev/null differ diff --git a/sound/misc/gib_splat01.ogg b/sound/misc/gib_splat01.ogg new file mode 100644 index 000000000..ba8c8c75f Binary files /dev/null and b/sound/misc/gib_splat01.ogg differ diff --git a/sound/misc/gib_splat01.wav b/sound/misc/gib_splat01.wav deleted file mode 100644 index 9c29b67bb..000000000 Binary files a/sound/misc/gib_splat01.wav and /dev/null differ diff --git a/sound/misc/gib_splat02.ogg b/sound/misc/gib_splat02.ogg new file mode 100644 index 000000000..de5da8d02 Binary files /dev/null and b/sound/misc/gib_splat02.ogg differ diff --git a/sound/misc/gib_splat02.wav b/sound/misc/gib_splat02.wav deleted file mode 100644 index 1b86c1ff0..000000000 Binary files a/sound/misc/gib_splat02.wav and /dev/null differ diff --git a/sound/misc/gib_splat03.ogg b/sound/misc/gib_splat03.ogg new file mode 100644 index 000000000..8e7a2b4ad Binary files /dev/null and b/sound/misc/gib_splat03.ogg differ diff --git a/sound/misc/gib_splat03.wav b/sound/misc/gib_splat03.wav deleted file mode 100644 index a71d8ea8c..000000000 Binary files a/sound/misc/gib_splat03.wav and /dev/null differ diff --git a/sound/misc/gib_splat04.ogg b/sound/misc/gib_splat04.ogg new file mode 100644 index 000000000..7cf3d76b9 Binary files /dev/null and b/sound/misc/gib_splat04.ogg differ diff --git a/sound/misc/gib_splat04.wav b/sound/misc/gib_splat04.wav deleted file mode 100644 index 3c1b6d7af..000000000 Binary files a/sound/misc/gib_splat04.wav and /dev/null differ diff --git a/sound/misc/hitground1.ogg b/sound/misc/hitground1.ogg index 8cfae10f6..816dc141f 100644 Binary files a/sound/misc/hitground1.ogg and b/sound/misc/hitground1.ogg differ diff --git a/sound/misc/hitground2.ogg b/sound/misc/hitground2.ogg index 1f8a7441b..744b19e43 100644 Binary files a/sound/misc/hitground2.ogg and b/sound/misc/hitground2.ogg differ diff --git a/sound/misc/hitground3.ogg b/sound/misc/hitground3.ogg index 73974a4de..2945bb04f 100644 Binary files a/sound/misc/hitground3.ogg and b/sound/misc/hitground3.ogg differ diff --git a/sound/misc/hitground4.ogg b/sound/misc/hitground4.ogg index 0c40620d1..d2d8f3bf0 100644 Binary files a/sound/misc/hitground4.ogg and b/sound/misc/hitground4.ogg differ diff --git a/sound/misc/itempickup.ogg b/sound/misc/itempickup.ogg index e9a780b6d..7ef4ac55d 100644 Binary files a/sound/misc/itempickup.ogg and b/sound/misc/itempickup.ogg differ diff --git a/sound/misc/itemrespawn.ogg b/sound/misc/itemrespawn.ogg index 503620a8c..518c7e88c 100644 Binary files a/sound/misc/itemrespawn.ogg and b/sound/misc/itemrespawn.ogg differ diff --git a/sound/misc/mediumhealth.ogg b/sound/misc/mediumhealth.ogg index f04e8d619..c5bc17f67 100644 Binary files a/sound/misc/mediumhealth.ogg and b/sound/misc/mediumhealth.ogg differ diff --git a/sound/misc/megahealth.ogg b/sound/misc/megahealth.ogg index 6b250ebbd..c142b5602 100644 Binary files a/sound/misc/megahealth.ogg and b/sound/misc/megahealth.ogg differ diff --git a/sound/misc/metalhitground1.ogg b/sound/misc/metalhitground1.ogg index 03bee0109..d3cdc975e 100644 Binary files a/sound/misc/metalhitground1.ogg and b/sound/misc/metalhitground1.ogg differ diff --git a/sound/misc/metalhitground2.ogg b/sound/misc/metalhitground2.ogg index 50f315f27..70395f197 100644 Binary files a/sound/misc/metalhitground2.ogg and b/sound/misc/metalhitground2.ogg differ diff --git a/sound/misc/metalhitground3.ogg b/sound/misc/metalhitground3.ogg index 0f3edb106..585df2f45 100644 Binary files a/sound/misc/metalhitground3.ogg and b/sound/misc/metalhitground3.ogg differ diff --git a/sound/misc/metalhitground4.ogg b/sound/misc/metalhitground4.ogg index ad2b26255..2045297aa 100644 Binary files a/sound/misc/metalhitground4.ogg and b/sound/misc/metalhitground4.ogg differ diff --git a/sound/misc/minihealth.ogg b/sound/misc/minihealth.ogg index 502b34a90..f952a8cdf 100644 Binary files a/sound/misc/minihealth.ogg and b/sound/misc/minihealth.ogg differ diff --git a/sound/misc/missile_fly.ogg b/sound/misc/missile_fly.ogg new file mode 100644 index 000000000..13e43e6c1 Binary files /dev/null and b/sound/misc/missile_fly.ogg differ diff --git a/sound/misc/missile_fly.wav b/sound/misc/missile_fly.wav deleted file mode 100644 index a2cd05669..000000000 Binary files a/sound/misc/missile_fly.wav and /dev/null differ diff --git a/sound/misc/poweroff.ogg b/sound/misc/poweroff.ogg new file mode 100644 index 000000000..983e2412a Binary files /dev/null and b/sound/misc/poweroff.ogg differ diff --git a/sound/misc/poweroff.wav b/sound/misc/poweroff.wav deleted file mode 100644 index 044527656..000000000 Binary files a/sound/misc/poweroff.wav and /dev/null differ diff --git a/sound/misc/powerup.ogg b/sound/misc/powerup.ogg index 517f88bbb..f4d9488ac 100644 Binary files a/sound/misc/powerup.ogg and b/sound/misc/powerup.ogg differ diff --git a/sound/misc/powerup_shield.ogg b/sound/misc/powerup_shield.ogg index 5169fb1e6..4381a2617 100644 Binary files a/sound/misc/powerup_shield.ogg and b/sound/misc/powerup_shield.ogg differ diff --git a/sound/misc/shield_respawn.ogg b/sound/misc/shield_respawn.ogg new file mode 100644 index 000000000..cb45c9fdd Binary files /dev/null and b/sound/misc/shield_respawn.ogg differ diff --git a/sound/misc/shield_respawn.wav b/sound/misc/shield_respawn.wav deleted file mode 100644 index fa0ac1f37..000000000 Binary files a/sound/misc/shield_respawn.wav and /dev/null differ diff --git a/sound/misc/spawn.ogg b/sound/misc/spawn.ogg index 2b5664aea..6c9210ef2 100644 Binary files a/sound/misc/spawn.ogg and b/sound/misc/spawn.ogg differ diff --git a/sound/misc/strength_respawn.ogg b/sound/misc/strength_respawn.ogg new file mode 100644 index 000000000..fcf5725e3 Binary files /dev/null and b/sound/misc/strength_respawn.ogg differ diff --git a/sound/misc/strength_respawn.wav b/sound/misc/strength_respawn.wav deleted file mode 100644 index 3f7ffa281..000000000 Binary files a/sound/misc/strength_respawn.wav and /dev/null differ diff --git a/sound/misc/teleport.ogg b/sound/misc/teleport.ogg index 8034299a4..55680f519 100644 Binary files a/sound/misc/teleport.ogg and b/sound/misc/teleport.ogg differ diff --git a/sound/misc/typehit.ogg b/sound/misc/typehit.ogg new file mode 100644 index 000000000..080e1bdd9 Binary files /dev/null and b/sound/misc/typehit.ogg differ diff --git a/sound/misc/typehit.wav b/sound/misc/typehit.wav deleted file mode 100644 index c76503559..000000000 Binary files a/sound/misc/typehit.wav and /dev/null differ diff --git a/sound/nexball/bounce.ogg b/sound/nexball/bounce.ogg index 5a16bdfcd..4bac6b03e 100644 Binary files a/sound/nexball/bounce.ogg and b/sound/nexball/bounce.ogg differ diff --git a/sound/nexball/drop.ogg b/sound/nexball/drop.ogg index f77b01b22..92fea7763 100644 Binary files a/sound/nexball/drop.ogg and b/sound/nexball/drop.ogg differ diff --git a/sound/weapons/crylink_fire.ogg b/sound/weapons/crylink_fire.ogg index bb18f53f1..eef18326a 100644 Binary files a/sound/weapons/crylink_fire.ogg and b/sound/weapons/crylink_fire.ogg differ diff --git a/sound/weapons/crylink_fire2.ogg b/sound/weapons/crylink_fire2.ogg index f10d6dd0c..b2aa78eff 100644 Binary files a/sound/weapons/crylink_fire2.ogg and b/sound/weapons/crylink_fire2.ogg differ diff --git a/sound/weapons/crylink_impact.ogg b/sound/weapons/crylink_impact.ogg index d60c7bc39..5813c4cb6 100644 Binary files a/sound/weapons/crylink_impact.ogg and b/sound/weapons/crylink_impact.ogg differ diff --git a/sound/weapons/crylink_impact2.ogg b/sound/weapons/crylink_impact2.ogg index 26c7af5d8..be84bfe2f 100644 Binary files a/sound/weapons/crylink_impact2.ogg and b/sound/weapons/crylink_impact2.ogg differ diff --git a/sound/weapons/electro_fire.ogg b/sound/weapons/electro_fire.ogg index 18b3e156d..ea534b6d5 100644 Binary files a/sound/weapons/electro_fire.ogg and b/sound/weapons/electro_fire.ogg differ diff --git a/sound/weapons/electro_fire2.ogg b/sound/weapons/electro_fire2.ogg index a7192fa89..d501a5bfb 100644 Binary files a/sound/weapons/electro_fire2.ogg and b/sound/weapons/electro_fire2.ogg differ diff --git a/sound/weapons/electro_impact_combo.ogg b/sound/weapons/electro_impact_combo.ogg index 7301d3e06..1822e0e6e 100644 Binary files a/sound/weapons/electro_impact_combo.ogg and b/sound/weapons/electro_impact_combo.ogg differ diff --git a/sound/weapons/fireball_fire.ogg b/sound/weapons/fireball_fire.ogg new file mode 100644 index 000000000..01b57ae4a Binary files /dev/null and b/sound/weapons/fireball_fire.ogg differ diff --git a/sound/weapons/fireball_fire.wav b/sound/weapons/fireball_fire.wav deleted file mode 100644 index 9f8ca1dcb..000000000 Binary files a/sound/weapons/fireball_fire.wav and /dev/null differ diff --git a/sound/weapons/fireball_fire2.ogg b/sound/weapons/fireball_fire2.ogg new file mode 100644 index 000000000..13797be2e Binary files /dev/null and b/sound/weapons/fireball_fire2.ogg differ diff --git a/sound/weapons/fireball_fire2.wav b/sound/weapons/fireball_fire2.wav deleted file mode 100644 index 34526aeca..000000000 Binary files a/sound/weapons/fireball_fire2.wav and /dev/null differ diff --git a/sound/weapons/fireball_fly.ogg b/sound/weapons/fireball_fly.ogg index 05c6d375f..c26c7103c 100644 Binary files a/sound/weapons/fireball_fly.ogg and b/sound/weapons/fireball_fly.ogg differ diff --git a/sound/weapons/fireball_fly2.ogg b/sound/weapons/fireball_fly2.ogg index 4e7a929f3..00da23c24 100644 Binary files a/sound/weapons/fireball_fly2.ogg and b/sound/weapons/fireball_fly2.ogg differ diff --git a/sound/weapons/fireball_impact2.ogg b/sound/weapons/fireball_impact2.ogg new file mode 100644 index 000000000..9e6c9479b Binary files /dev/null and b/sound/weapons/fireball_impact2.ogg differ diff --git a/sound/weapons/fireball_impact2.wav b/sound/weapons/fireball_impact2.wav deleted file mode 100644 index eec5a57c3..000000000 Binary files a/sound/weapons/fireball_impact2.wav and /dev/null differ diff --git a/sound/weapons/fireball_prefire2.ogg b/sound/weapons/fireball_prefire2.ogg new file mode 100644 index 000000000..a9224fc5b Binary files /dev/null and b/sound/weapons/fireball_prefire2.ogg differ diff --git a/sound/weapons/fireball_prefire2.wav b/sound/weapons/fireball_prefire2.wav deleted file mode 100644 index bf76fae2c..000000000 Binary files a/sound/weapons/fireball_prefire2.wav and /dev/null differ diff --git a/sound/weapons/grenade_impact.ogg b/sound/weapons/grenade_impact.ogg index 8175cd7aa..82da52c1c 100644 Binary files a/sound/weapons/grenade_impact.ogg and b/sound/weapons/grenade_impact.ogg differ diff --git a/sound/weapons/hagar_fire.ogg b/sound/weapons/hagar_fire.ogg index fcb68c00b..da045a45c 100644 Binary files a/sound/weapons/hagar_fire.ogg and b/sound/weapons/hagar_fire.ogg differ diff --git a/sound/weapons/hook_impact.ogg b/sound/weapons/hook_impact.ogg index eed76405c..62973e1af 100644 Binary files a/sound/weapons/hook_impact.ogg and b/sound/weapons/hook_impact.ogg differ diff --git a/sound/weapons/hookbomb_fire.ogg b/sound/weapons/hookbomb_fire.ogg index 2d2e8a96c..6cac03be5 100644 Binary files a/sound/weapons/hookbomb_fire.ogg and b/sound/weapons/hookbomb_fire.ogg differ diff --git a/sound/weapons/lasergun_fire.ogg b/sound/weapons/lasergun_fire.ogg index ea5122e04..f837baf6f 100644 Binary files a/sound/weapons/lasergun_fire.ogg and b/sound/weapons/lasergun_fire.ogg differ diff --git a/sound/weapons/minstanexfire.ogg b/sound/weapons/minstanexfire.ogg index d08710985..1dec6ff82 100644 Binary files a/sound/weapons/minstanexfire.ogg and b/sound/weapons/minstanexfire.ogg differ diff --git a/sound/weapons/missile_fly.ogg b/sound/weapons/missile_fly.ogg new file mode 100644 index 000000000..13e43e6c1 Binary files /dev/null and b/sound/weapons/missile_fly.ogg differ diff --git a/sound/weapons/nexfire.ogg b/sound/weapons/nexfire.ogg index 5d28b731c..c576c0a16 100644 Binary files a/sound/weapons/nexfire.ogg and b/sound/weapons/nexfire.ogg differ diff --git a/sound/weapons/neximpact.ogg b/sound/weapons/neximpact.ogg index 948a99638..b6476d8bf 100644 Binary files a/sound/weapons/neximpact.ogg and b/sound/weapons/neximpact.ogg differ diff --git a/sound/weapons/nexwhoosh1.ogg b/sound/weapons/nexwhoosh1.ogg index 36f1183da..f0f2b3a20 100644 Binary files a/sound/weapons/nexwhoosh1.ogg and b/sound/weapons/nexwhoosh1.ogg differ diff --git a/sound/weapons/nexwhoosh2.ogg b/sound/weapons/nexwhoosh2.ogg index 38ffa22f3..57ac5e60a 100644 Binary files a/sound/weapons/nexwhoosh2.ogg and b/sound/weapons/nexwhoosh2.ogg differ diff --git a/sound/weapons/nexwhoosh3.ogg b/sound/weapons/nexwhoosh3.ogg index 3db8d4b44..a5764f79e 100644 Binary files a/sound/weapons/nexwhoosh3.ogg and b/sound/weapons/nexwhoosh3.ogg differ diff --git a/sound/weapons/reload.ogg b/sound/weapons/reload.ogg index 2edb3739c..ef67597f4 100644 Binary files a/sound/weapons/reload.ogg and b/sound/weapons/reload.ogg differ diff --git a/sound/weapons/rocket_fire.ogg b/sound/weapons/rocket_fire.ogg index 5f2cb3a83..f0d6b5fbf 100644 Binary files a/sound/weapons/rocket_fire.ogg and b/sound/weapons/rocket_fire.ogg differ diff --git a/sound/weapons/rocket_impact.ogg b/sound/weapons/rocket_impact.ogg index 56b114e65..92704cb9c 100644 Binary files a/sound/weapons/rocket_impact.ogg and b/sound/weapons/rocket_impact.ogg differ diff --git a/sound/weapons/rocket_mode.ogg b/sound/weapons/rocket_mode.ogg index ca1d8cc1e..fd02d133c 100644 Binary files a/sound/weapons/rocket_mode.ogg and b/sound/weapons/rocket_mode.ogg differ diff --git a/sound/weapons/shotgun_fire.ogg b/sound/weapons/shotgun_fire.ogg index 8d4f607c7..41e89c348 100644 Binary files a/sound/weapons/shotgun_fire.ogg and b/sound/weapons/shotgun_fire.ogg differ diff --git a/sound/weapons/shotgun_melee.ogg b/sound/weapons/shotgun_melee.ogg index 0562b559e..cb72feb59 100644 Binary files a/sound/weapons/shotgun_melee.ogg and b/sound/weapons/shotgun_melee.ogg differ diff --git a/sound/weapons/strength_fire.ogg b/sound/weapons/strength_fire.ogg index 8d27e4fde..db284e926 100644 Binary files a/sound/weapons/strength_fire.ogg and b/sound/weapons/strength_fire.ogg differ diff --git a/sound/weapons/unavailable.ogg b/sound/weapons/unavailable.ogg new file mode 100644 index 000000000..7d1bec5e5 Binary files /dev/null and b/sound/weapons/unavailable.ogg differ diff --git a/sound/weapons/unavailable.wav b/sound/weapons/unavailable.wav deleted file mode 100644 index b75c8c571..000000000 Binary files a/sound/weapons/unavailable.wav and /dev/null differ diff --git a/sound/weapons/uzi_fire.ogg b/sound/weapons/uzi_fire.ogg index 24c73a4c0..9dc389949 100644 Binary files a/sound/weapons/uzi_fire.ogg and b/sound/weapons/uzi_fire.ogg differ diff --git a/sound/weapons/weapon_switch.ogg b/sound/weapons/weapon_switch.ogg index 5a7756b06..8c40e1f23 100644 Binary files a/sound/weapons/weapon_switch.ogg and b/sound/weapons/weapon_switch.ogg differ diff --git a/sound/weapons/weaponpickup.ogg b/sound/weapons/weaponpickup.ogg index 4e1c1fbd1..55ee48894 100644 Binary files a/sound/weapons/weaponpickup.ogg and b/sound/weapons/weaponpickup.ogg differ diff --git a/vehicles.cfg b/vehicles.cfg index 489d82b15..d3a2c0bc5 100644 --- a/vehicles.cfg +++ b/vehicles.cfg @@ -11,6 +11,7 @@ set g_vehicles_teams 1 "allow team specific vehicles" set g_vehicles_teleportable 0 set g_vehicles_crush_dmg 70 set g_vehicles_crush_force 50 +set g_vehicles_crush_minspeed 100 set g_vehicles_allow_bots 0 set g_vehicles_exit_attempts 25 set g_vehicles_thinkrate 0.1 diff --git a/wpeditor.txt b/wpeditor.txt new file mode 100644 index 000000000..19d23ff72 --- /dev/null +++ b/wpeditor.txt @@ -0,0 +1,26 @@ +// open this quick menu with: quickmenu file "" wpeditor.txt +"Spawn" "wpeditor spawn" +"Remove" "wpeditor remove" +"Save all" "wpeditor saveall" +"Spawn at crosshair" "wpeditor spawn crosshair" +"Spawn jump" "wpeditor spawn jump" +"Spawn crouch" "wpeditor spawn crouch" +"Spawn support" "wpeditor spawn support" +"Hardwire/Unhw at crosshair" "wpeditor hardwire crosshair" +"Hardwire/Unhardwire" "wpeditor hardwire" +"Lock/Unlock" "wpeditor lock" +"Relink all" "wpeditor relinkall" +"Find unreachable" "wpeditor unreachable" +"Show help in console" "cmd help wpeditor" +"Settings" + "Waypoint editor" "toggle g_waypointeditor" + "On screen console messages" "toggle con_notify 4 0" + "Bot in map" "toggle bot_number" + "Bots can't fire" "toggle bot_nofire" + "Show bot's path to goal" "toggle bot_debug_goalstack" + "Show tracewalk path" "toggle bot_debug_tracewalk" + "No time limit" "timelimit 0" + "Cheats" "toggle sv_cheats" + "God mode on/off" "god" + "Fly mode on/off" "fly" +"Settings" \ No newline at end of file diff --git a/xonotic-client.cfg b/xonotic-client.cfg index fa9b9ca00..dfa3c0c57 100644 --- a/xonotic-client.cfg +++ b/xonotic-client.cfg @@ -166,6 +166,7 @@ seta cl_leanmodel_highpass1 0.2 "gun leaning pre-highpass averaging time" seta cl_leanmodel_highpass 0.2 "gun leaning highpass averaging time" seta cl_leanmodel_lowpass 0.05 "gun leaning lowpass averaging time" +cl_maxfps_alwayssleep 0 // gives up some processing time to other applications each frame, default is 1 (not necessary since Xonotic caps FPS by default) cl_rollangle 0 // amount of view tilt when strafing, default is 2.0 v_kicktime 0 // how long damage kicks of the view last, default is 0 seconds gl_polyblend 0 // whether to use screen tints, this has now been replaced by a better system in CSQC @@ -193,7 +194,7 @@ seta cl_autotaunt 0 "automatically taunt enemies when fragging them" seta cl_voice_directional 1 "0 = all voices are non-directional, 1 = all voices are directional, 2 = only taunts are directional" seta cl_voice_directional_taunt_attenuation 0.5 "this defines the distance from which taunts can be heard" -seta cl_hitsound 1 "play a hit notifier sound when you have hit an enemy, 1: same pitch 2: increase pitch with more damage 3: decrease pitch with more damage" +seta cl_hitsound 1 "play a hit notifier sound when you have hit an enemy, 1: same pitch 2: decrease pitch with more damage 3: increase pitch with more damage" set cl_hitsound_antispam_time 0.05 "don't play the hitsound more often than this" seta cl_hitsound_min_pitch 0.75 "minimum pitch of hit sound" seta cl_hitsound_max_pitch 1.5 "maximum pitch of hit sound" @@ -233,6 +234,8 @@ cl_movement 1 cl_movement_track_canjump 0 cl_stairsmoothspeed 200 +alias wpeditor_menu "quickmenu file \"\" wpeditor.txt" + alias g_waypointeditor_spawn "wpeditor spawn" alias g_waypointeditor_remove "wpeditor remove" alias g_waypointeditor_relinkall "wpeditor relinkall" @@ -446,7 +449,7 @@ seta cl_damagetext_2d_overlap_offset "0 -15 0" "Offset 2D damage text by this mu seta cl_damagetext_2d_close_range 125 "Always use 2D damagetext for hits closer that this" seta cl_damagetext_2d_out_of_view 1 "Always use 2D damagetext for hits that occurred off-screen" -seta cl_vehicles_alarm 1 "Play an alarm sound when the vehicle you are driving is heavily damaged" +seta cl_vehicles_alarm 0 "Play an alarm sound when the vehicle you are driving is heavily damaged" seta cl_vehicles_hud_tactical 1 seta cl_vehicles_hudscale 0.5 seta cl_vehicles_notify_time 15 @@ -608,6 +611,7 @@ makesaved music_playlist_list0 makesaved music_playlist_random0 cl_netfps 60 // should match or be a multiple of sys_ticrate +_cl_rate 40000 // fast adsl gl_texture_anisotropy 8 seta gl_texturecompression 0 // FIXME the description is wrong - when this is 0, e.g. gl_texturecompression_sky still takes effect @@ -618,7 +622,7 @@ gl_texturecompression_lightcubemaps 0 gl_texturecompression_q3bsplightmaps 0 gl_texturecompression_sky 1 -cl_maxfps 200 +cl_maxfps 250 seta menu_mouse_absolute 1 "use the OS mouse pointer motion for menu" seta menu_mouse_speed 1 "speed multiplier for the mouse in the menu (does not affect in-game aiming)" @@ -807,7 +811,7 @@ set cl_db_saveasdump 0 "write client.db in dump format (loads slower, easier to // uid2name seta cl_allow_uid2name -1 "-1 = ask if the player wants to disable/enable this feature, 0 = disable, 1 = enable uid2name (allows showing your name in race rankings for instance)" seta cl_allow_uidtracking 1 "-1 = ask if the player wants to disable/enable this feature, 0 = disable, 1 = enable uid tracking (allows associating your data with your player ID)" -// FIXME set to -1 before release, once we have a dialog for this! +seta cl_allow_uidranking 1 "0 = disable, 1 = enable uid ranking (allows statistics like elo to rank you in leaderboards)" // polygonoffset for submodel SUCKS SUCKS SUCKS (only a hack for quake1, we don't need that) r_polygonoffset_submodel_offset 0 diff --git a/xonotic-server.cfg b/xonotic-server.cfg index d261e262e..89a04782f 100644 --- a/xonotic-server.cfg +++ b/xonotic-server.cfg @@ -32,6 +32,8 @@ set g_warmup_allow_timeout 0 "allow calling timeouts in the warmup-stage (if sv_ set g_warmup_allguns 1 "provide more weapons on start while in warmup: 0 = normal start weapons, 1 = all guns available on the map, 2 = all normal weapons" set g_warmup_majority_factor 0.8 "minimum percentage of players ready needed for warmup to end" +alias sv_hook_warmupend + set g_chat_nospectators 0 "if 0 spec/observer chat is always visible to the player, if 1 it is never visible to players, if 2 it is only visible to players during warmup stage" set sv_vote_nospectators 0 "only players can call a vote (thus spectators and observers can't call a vote): 0 = all people can vote, 1 = spectators can vote in warmup stage, 2 = only players can vote (no exceptions)." @@ -195,7 +197,7 @@ set g_pickup_items -1 "if set to 0 all items (health, armor, ammo, weapons...) a set g_pickup_respawntime_scaling_reciprocal 0 "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `reciprocal` (with `offset` and `linear` set to 0) can be used to achieve a constant number of items spawned *per player*" set g_pickup_respawntime_scaling_offset 0 "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `offset` offsets the curve left or right - the results are not intuitive and I recommend plotting the respawn time and the number of items per player to see what's happening" set g_pickup_respawntime_scaling_linear 1 "Multiply respawn time by `reciprocal / (p + offset) + linear` where `p` is the current number of players, takes effect with 2 or more players present, `linear` can be used to simply scale the respawn time linearly" -set g_weaponarena "0" "put in a list of weapons to enable a weapon arena mode, or try \"all\" or \"most\"" +set g_weaponarena "0" "put in a list of weapons to enable a weapon arena mode, or try \"all\", \"most\", \"all_available\" or \"most_available\" (available only gives the weapon if the map normally has it as a pickup item)" set g_weaponarena_random "0" "if set to a number, only that weapon count is given on every spawn (randomly)" set g_weaponarena_random_with_blaster "1" "additionally, always provide the blaster in random weapon arena games" set g_spawnpoints_auto_move_out_of_solid 0 "if set to 1 you will see a warning if a spawn point was placed inside a solid" @@ -213,6 +215,7 @@ set g_maplist_selectrandom 0 "if 1, a random map will be chosen as next map - DE set g_maplist_shuffle 1 "new randomization method: like selectrandom, but avoid playing the same maps in short succession. This works by taking out the first element and inserting it into g_maplist with a bias to the end of the list" set g_maplist_check_waypoints 0 "when 1, maps are skipped if there currently are bots, but the map has no waypoints" set g_maplist_ignore_sizes 0 "when 1, all maps are shown in the map list regardless of player count" +set g_maplist_sizes_count_bots 1 "include the number of bots currently in the server when counting the number of players for size restrictions" set g_items_mindist 4000 "starting distance for the fading of items" set g_items_maxdist 4500 "maximum distance at which an item can be viewed, after which it will be invisible" @@ -420,15 +423,11 @@ set g_ban_sync_trusted_servers_verify 0 "when set to 1, additional bans sent by set g_showweaponspawns 1 "1: display waypoints for weapon spawns found on the map when a weapon key is pressed and the weapon is not owned; 2: for dropped weapons too; 3: for all the weapons sharing the same impulse" -// ballistics use physical units, but qu based -// Quake-Newton: 1 qN = 1 qu * 1 g / 1 s^2 -// Quake-Joule: 1 qJ = 1 qN * 1 qu -// Quake-Pascal: 1 qPa = 1 qN / 1 qu^2 - -set g_ballistics_mindistance 2 "enable ballistics starting from 2 qu" -set g_ballistics_density_player 0.50 "players are 2x as easy to pass through as walls" -set g_ballistics_density_corpse 0.10 "corpses are 10x as easy to pass through as walls" -set g_ballistics_penetrate_clips 0 "allow ballistics to pass through weapon clips" +set g_ballistics_mindistance 2 "when shooting through walls thinner than this, treat them as this thick (useful because patches (curved surfaces) have no thickness)" +set g_ballistics_density_player 0.50 "how hard players are to shoot through compared to walls" +set g_ballistics_density_corpse 0.10 "how hard corpses are to shoot through compared to walls" +set g_ballistics_penetrate_clips 1 "allow ballistics to pass through weapon clips" +set g_ballistics_solidpenetration_exponent 0.25 "how fast damage falls off when bullets pass through walls - 1 means linear, lower values mean slower initial falloff but faster once there's little solidpenetration left (damage_fraction = solidpen_fraction^exp for solidpen_fraction between 0 and 1)" sv_status_show_qcstatus 1 "Xonotic uses this field instead of frags" set g_full_getstatus_responses 0 "this currently breaks qstat" @@ -493,6 +492,8 @@ set g_maxspeed 0 "player speed limit, faster players are killed (0 for unlimited // sv_cullentities_trace is 1, so the client doesn't have to sv_cullentities_trace 1 +// due to a bug in the engine, the default setting of this (16) spams the network with item updates +sv_cullentities_trace_eyejitter 0 // less "lagging" of other players, but also less PL tolerant... let's try this sv_clmovement_inputtimeout 0.066 // slightly less than 2 frames, so only one frame can be compensated