-// {{{ weapon replacement
-// NOTE: this only replaces weapons on the map
-// use g_start_weapon_* to also replace the on-startup weapons!
-// example: g_weaponreplace_nex "nex minstanex", then Nexes become MinstaNexes 50% of the times
-// set the cvars to "0" to totally disable a weapon
-set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun"
-set g_weaponreplace_laser ""
-set g_weaponreplace_shotgun ""
-set g_weaponreplace_uzi ""
-set g_weaponreplace_grenadelauncher ""
-set g_weaponreplace_electro ""
-set g_weaponreplace_crylink ""
-set g_weaponreplace_nex ""
-set g_weaponreplace_hagar ""
-set g_weaponreplace_rocketlauncher ""
-set g_weaponreplace_porto ""
-set g_weaponreplace_minstanex ""
-set g_weaponreplace_hook ""
-set g_weaponreplace_hlac ""
-set g_weaponreplace_campingrifle ""
-set g_weaponreplace_tuba ""
-set g_weaponreplace_fireball ""
-set g_weaponreplace_seeker ""
-set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun (for Q3A map compatibility)"
-// }}}
-
// {{{ starting gear
set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_hlac 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_hlac -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
set g_start_weapon_campingrifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_fireball 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_seeker 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_seeker -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
set g_balance_health_start 100
set g_balance_armor_start 0
set g_start_ammo_shells 45
// }}}
// {{{ pickup items
+set g_pickup_ammo_anyway 0
+set g_pickup_weapons_anyway 0
set g_pickup_shells 30
set g_pickup_shells_max 120
set g_pickup_nails 80
set g_pickup_fuel_max 999
set g_pickup_armorsmall 10
set g_pickup_armorsmall_max 100
+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_armorlarge 100
set g_pickup_armorlarge_max 100
+set g_pickup_armorlarge_anyway 0
set g_pickup_healthsmall 10
set g_pickup_healthsmall_max 200
+set g_pickup_healthsmall_anyway 0
set g_pickup_healthmedium 25
set g_pickup_healthmedium_max 200
+set g_pickup_healthmedium_anyway 0
set g_pickup_healthlarge 50
set g_pickup_healthlarge_max 200
+set g_pickup_healthlarge_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_balance_campingrifle_primary_ammo 10
set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
set g_balance_campingrifle_primary_burstcost 0.35 // require same cooldown as secondary, note it's smaller than primary refire time
+set g_balance_campingrifle_primary_bullethail 0
set g_balance_campingrifle_secondary_damage 15
set g_balance_campingrifle_secondary_headshotaddeddamage 25
set g_balance_campingrifle_secondary_spread 0.02
set g_balance_campingrifle_secondary_ammo 4
set g_balance_campingrifle_secondary_bulletconstant 130 // 18.3qu
set g_balance_campingrifle_secondary_burstcost 0.35
+set g_balance_campingrifle_secondary_bullethail 0
// }}}
// {{{ tuba
set g_balance_tuba_refire 0.05
-// {{{ weapon replacement
-// NOTE: this only replaces weapons on the map
-// use g_start_weapon_* to also replace the on-startup weapons!
-// example: g_weaponreplace_nex "nex minstanex", then Nexes become MinstaNexes 50% of the times
-// set the cvars to "0" to totally disable a weapon
-set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun"
-set g_weaponreplace_laser ""
-set g_weaponreplace_shotgun ""
-set g_weaponreplace_uzi ""
-set g_weaponreplace_grenadelauncher ""
-set g_weaponreplace_electro ""
-set g_weaponreplace_crylink ""
-set g_weaponreplace_nex ""
-set g_weaponreplace_hagar ""
-set g_weaponreplace_rocketlauncher ""
-set g_weaponreplace_porto ""
-set g_weaponreplace_minstanex ""
-set g_weaponreplace_hook ""
-set g_weaponreplace_hlac ""
-set g_weaponreplace_campingrifle ""
-set g_weaponreplace_tuba ""
-set g_weaponreplace_fireball ""
-set g_weaponreplace_seeker ""
-set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun (for Q3A map compatibility)"
-// }}}
-
// {{{ starting gear
set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
// }}}
// {{{ pickup items
+set g_pickup_ammo_anyway 0
+set g_pickup_weapons_anyway 0
set g_pickup_shells 15
set g_pickup_shells_max 999
set g_pickup_nails 80
set g_pickup_fuel_max 999
set g_pickup_armorsmall 5
set g_pickup_armorsmall_max 999
+set g_pickup_armorsmall_anyway 0
set g_pickup_armormedium 25
set g_pickup_armormedium_max 999
+set g_pickup_armormedium_anyway 0
set g_pickup_armorbig 50
set g_pickup_armorbig_max 999
+set g_pickup_armorbig_anyway 0
set g_pickup_armorlarge 100
set g_pickup_armorlarge_max 999
+set g_pickup_armorlarge_anyway 0
set g_pickup_healthsmall 5
set g_pickup_healthsmall_max 999
+set g_pickup_healthsmall_anyway 0
set g_pickup_healthmedium 25
set g_pickup_healthmedium_max 999
+set g_pickup_healthmedium_anyway 0
set g_pickup_healthlarge 50
set g_pickup_healthlarge_max 999
+set g_pickup_healthlarge_anyway 0
set g_pickup_healthmega 100
set g_pickup_healthmega_max 999
+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_balance_campingrifle_primary_ammo 10
set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
set g_balance_campingrifle_primary_burstcost 0
+set g_balance_campingrifle_primary_bullethail 0 // empty magazine on shot
set g_balance_campingrifle_secondary_damage 35
set g_balance_campingrifle_secondary_headshotaddeddamage 15 // 50 damage only on head
set g_balance_campingrifle_secondary_spread 0.008
set g_balance_campingrifle_secondary_ammo 10
set g_balance_campingrifle_secondary_bulletconstant 130 // 18.3qu
set g_balance_campingrifle_secondary_burstcost 0
+set g_balance_campingrifle_secondary_bullethail 0 // empty magazine on shot
// }}}
// {{{ tuba
set g_balance_tuba_refire 0.05
-// {{{ weapon replacement
-// NOTE: this only replaces weapons on the map
-// use g_start_weapon_* to also replace the on-startup weapons!
-// example: g_weaponreplace_nex "nex minstanex", then Nexes become MinstaNexes 50% of the times
-// set the cvars to "0" to totally disable a weapon
-set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun"
-set g_weaponreplace_laser ""
-set g_weaponreplace_shotgun ""
-set g_weaponreplace_uzi ""
-set g_weaponreplace_grenadelauncher ""
-set g_weaponreplace_electro ""
-set g_weaponreplace_crylink ""
-set g_weaponreplace_nex ""
-set g_weaponreplace_hagar ""
-set g_weaponreplace_rocketlauncher ""
-set g_weaponreplace_porto ""
-set g_weaponreplace_minstanex ""
-set g_weaponreplace_hook ""
-set g_weaponreplace_hlac 0 // I don't particularly like this weapon.
-set g_weaponreplace_campingrifle ""
-set g_weaponreplace_tuba ""
-set g_weaponreplace_fireball 0 // Don't kill me div0, just for now until I figure out a good balance for it.
-set g_weaponreplace_seeker ""
-set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun (for Q3A map compatibility)"
-// }}}
-
// {{{ starting gear
set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
set g_start_weapon_fireball 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
set g_start_weapon_seeker 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_balance_health_start 100
+set g_balance_health_start 125
set g_balance_armor_start 0
-set g_start_ammo_shells 45
+set g_start_ammo_shells 30
set g_start_ammo_nails 0
set g_start_ammo_rockets 0
set g_start_ammo_cells 0
set g_warmup_start_ammo_cells 50 "starting values when being in warmup-stage"
set g_warmup_start_ammo_fuel 0 "starting values when being in warmup-stage"
set g_lms_start_health 200
-set g_lms_start_armor 100
-set g_lms_start_ammo_shells 50
-set g_lms_start_ammo_nails 150
-set g_lms_start_ammo_rockets 50
-set g_lms_start_ammo_cells 50
+set g_lms_start_armor 200
+set g_lms_start_ammo_shells 120
+set g_lms_start_ammo_nails 400
+set g_lms_start_ammo_rockets 120
+set g_lms_start_ammo_cells 200
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 15
-set g_balance_nix_ammo_nails 45
-set g_balance_nix_ammo_rockets 15
-set g_balance_nix_ammo_cells 15
+set g_balance_nix_ammo_shells 120
+set g_balance_nix_ammo_nails 400
+set g_balance_nix_ammo_rockets 120
+set g_balance_nix_ammo_cells 200
set g_balance_nix_ammo_fuel 0
set g_balance_nix_ammoincr_shells 2
set g_balance_nix_ammoincr_nails 6
// }}}
// {{{ pickup items
+set g_pickup_ammo_anyway 1
+set g_pickup_weapons_anyway 1
set g_pickup_shells 30
set g_pickup_shells_max 120
set g_pickup_nails 80
set g_pickup_fuel_jetpack 50
set g_pickup_fuel_max 999
set g_pickup_armorsmall 10
-set g_pickup_armorsmall_max 100
+set g_pickup_armorsmall_max 200
+set g_pickup_armorsmall_anyway 1
set g_pickup_armormedium 25
-set g_pickup_armormedium_max 100
+set g_pickup_armormedium_max 200
+set g_pickup_armormedium_anyway 1
set g_pickup_armorbig 50
-set g_pickup_armorbig_max 100
+set g_pickup_armorbig_max 200
+set g_pickup_armorbig_anyway 1
set g_pickup_armorlarge 100
-set g_pickup_armorlarge_max 100
+set g_pickup_armorlarge_max 200
+set g_pickup_armorlarge_anyway 1
set g_pickup_healthsmall 10
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_healthlarge 50
set g_pickup_healthlarge_max 200
+set g_pickup_healthlarge_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_balance_armor_regen 0
set g_balance_armor_regenlinear 0
set g_balance_armor_rot 0
-set g_balance_armor_rotlinear 0
+set g_balance_armor_rotlinear 3
set g_balance_pause_armor_rot 1
set g_balance_pause_armor_rot_spawn 1
set g_balance_armor_regenstable 100
// }}}
// {{{ misc
-set g_balance_selfdamagepercent 0.6
+set g_balance_selfdamagepercent 0.75
set g_balance_weaponswitchdelay 0.15
set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
set g_weaponratefactor 1 "weapon fire rate multiplier"
// {{{ shotgun
set g_balance_shotgun_primary_bullets 6
set g_balance_shotgun_primary_damage 8
-set g_balance_shotgun_primary_force 0
+set g_balance_shotgun_primary_force 15
set g_balance_shotgun_primary_spread 0.11
set g_balance_shotgun_primary_refire 0.5
set g_balance_shotgun_primary_animtime 0.2
set g_balance_shotgun_secondary 1
set g_balance_shotgun_secondary_bullets 6
set g_balance_shotgun_secondary_damage 8
-set g_balance_shotgun_secondary_force 0
+set g_balance_shotgun_secondary_force 15
set g_balance_shotgun_secondary_spread 0.17
set g_balance_shotgun_secondary_refire 1.35
set g_balance_shotgun_secondary_animtime 0.2
// {{{ uzi
set g_balance_uzi_first 1
set g_balance_uzi_first_damage 12
-set g_balance_uzi_first_force 0
+set g_balance_uzi_first_force 5
set g_balance_uzi_first_spread 0.015
set g_balance_uzi_first_refire 0.15
set g_balance_uzi_first_ammo 1
set g_balance_uzi_sustained_damage 7
-set g_balance_uzi_sustained_force 0
+set g_balance_uzi_sustained_force 5
set g_balance_uzi_sustained_spread 0.05
set g_balance_uzi_sustained_refire 0.075
set g_balance_uzi_sustained_ammo 1
set g_balance_crylink_primary_damage 14
set g_balance_crylink_primary_edgedamage 0
set g_balance_crylink_primary_force -55
-set g_balance_crylink_primary_radius 80
+set g_balance_crylink_primary_radius 50
set g_balance_crylink_primary_speed 7000
-set g_balance_crylink_primary_spread 0.01
+set g_balance_crylink_primary_spread 0.02
set g_balance_crylink_primary_shots 4
set g_balance_crylink_primary_bounces 1
set g_balance_crylink_primary_refire 0.4
set g_balance_crylink_secondary_bounces 0
set g_balance_crylink_secondary_refire 0.1
set g_balance_crylink_secondary_animtime 0.1
-set g_balance_crylink_secondary_ammo 1
+set g_balance_crylink_secondary_ammo 2
set g_balance_crylink_secondary_bouncedamagefactor 0.5
set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000
// }}}
// {{{ nex
set g_balance_nex_damage 90
-set g_balance_nex_force 200
+set g_balance_nex_force 300
set g_balance_nex_refire 1.5
set g_balance_nex_animtime 0.3
set g_balance_nex_ammo 5
set g_balance_rocketlauncher_ammo 3
set g_balance_rocketlauncher_health 40
set g_balance_rocketlauncher_damageforcescale 4
-set g_balance_rocketlauncher_detonatedelay -1 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
+set g_balance_rocketlauncher_detonatedelay 0.05 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
set g_balance_rocketlauncher_guiderate 140 // max degrees per second
set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
set g_balance_campingrifle_primary_damage 50
set g_balance_campingrifle_primary_headshotaddeddamage 50
set g_balance_campingrifle_primary_spread 0
-set g_balance_campingrifle_primary_force 0
+set g_balance_campingrifle_primary_force 50
set g_balance_campingrifle_primary_speed 35000
set g_balance_campingrifle_primary_lifetime 5
set g_balance_campingrifle_primary_refire 0.7
set g_balance_campingrifle_primary_ammo 10
set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
set g_balance_campingrifle_primary_burstcost 0.35 // require same cooldown as secondary, note it's smaller than primary refire time
+set g_balance_campingrifle_primary_bullethail 0
set g_balance_campingrifle_secondary_damage 15
set g_balance_campingrifle_secondary_headshotaddeddamage 25
set g_balance_campingrifle_secondary_spread 0.02
-set g_balance_campingrifle_secondary_force 0
+set g_balance_campingrifle_secondary_force 30
set g_balance_campingrifle_secondary_speed 20000
set g_balance_campingrifle_secondary_lifetime 5
set g_balance_campingrifle_secondary_refire 0.1
set g_balance_campingrifle_secondary_ammo 4
set g_balance_campingrifle_secondary_bulletconstant 130 // 18.3qu
set g_balance_campingrifle_secondary_burstcost 0.35
+set g_balance_campingrifle_secondary_bullethail 0
// }}}
// {{{ tuba
set g_balance_tuba_refire 0.05
-// {{{ weapon replacement
-// NOTE: this only replaces weapons on the map
-// use g_start_weapon_* to also replace the on-startup weapons!
-// example: g_weaponreplace_nex "nex minstanex", then Nexes become MinstaNexes 50% of the times
-// set the cvars to "0" to totally disable a weapon
-set g_weaponreplace_laser ""
-set g_weaponreplace_shotgun "uzi"
-set g_weaponreplace_uzi "shotgun"
-set g_weaponreplace_grenadelauncher ""
-set g_weaponreplace_electro ""
-set g_weaponreplace_crylink ""
-set g_weaponreplace_nex ""
-set g_weaponreplace_hagar ""
-set g_weaponreplace_rocketlauncher ""
-set g_weaponreplace_porto ""
-set g_weaponreplace_minstanex ""
-set g_weaponreplace_hook 0
-set g_weaponreplace_hlac 0
-set g_weaponreplace_campingrifle 0
-set g_weaponreplace_tuba ""
-set g_weaponreplace_fireball 0
-set g_weaponreplace_seeker 0
-set sv_q3acompat_machineshotgunswap 0
-// }}}
-
// {{{ starting gear
set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
set g_start_weapon_shotgun -2 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
// }}}
// {{{ pickup items
+set g_pickup_ammo_anyway 0
+set g_pickup_weapons_anyway 0
set g_pickup_shells 10
set g_pickup_shells_max 30
set g_pickup_nails 30
set g_pickup_fuel_max 999
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 200
+set g_pickup_armormedium_anyway 0
set g_pickup_armorbig 50
set g_pickup_armorbig_max 200
+set g_pickup_armorbig_anyway 0
set g_pickup_armorlarge 100
set g_pickup_armorlarge_max 200
+set g_pickup_armorlarge_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_healthlarge 50
set g_pickup_healthlarge_max 100
+set g_pickup_healthlarge_anyway 0
set g_pickup_healthmega 100
set g_pickup_healthmega_max 200
+set g_pickup_healthmega_anyway 0
set g_pickup_respawntime_short 30
set g_pickup_respawntime_medium 30
set g_pickup_respawntime_long 30
set g_balance_campingrifle_primary_ammo 10
set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
set g_balance_campingrifle_primary_burstcost 0.35 // require same cooldown as secondary, note it's smaller than primary refire time
+set g_balance_campingrifle_primary_bullethail 0
set g_balance_campingrifle_secondary_damage 15
set g_balance_campingrifle_secondary_headshotaddeddamage 25
set g_balance_campingrifle_secondary_spread 0.02
set g_balance_campingrifle_secondary_ammo 4
set g_balance_campingrifle_secondary_bulletconstant 130 // 18.3qu
set g_balance_campingrifle_secondary_burstcost 0.35
+set g_balance_campingrifle_secondary_bullethail 0
// }}}
// {{{ tuba
set g_balance_tuba_refire 0.05
exec defaultXonotic.cfg
-
-// we're not xonotic 2.6 yet
-//exec default25.cfg
+++ /dev/null
-cl_netfps 20
-sys_ticrate 0.05
-sv_gameplayfix_delayprojectiles 1
-exec physics25.cfg
-exec balance25.cfg
+++ /dev/null
-cl_netfps 60
-sys_ticrate 0.0166667
-sv_gameplayfix_delayprojectiles 0
-exec physics26.cfg
-exec balance.cfg
--- /dev/null
+// Samual's mod configuration file
+exec defaultXonotic.cfg
+
+// weapon replace options
+set g_weaponreplace_laser ""
+set g_weaponreplace_shotgun ""
+set g_weaponreplace_uzi ""
+set g_weaponreplace_grenadelauncher ""
+set g_weaponreplace_electro ""
+set g_weaponreplace_crylink ""
+set g_weaponreplace_nex ""
+set g_weaponreplace_hagar ""
+set g_weaponreplace_rocketlauncher ""
+set g_weaponreplace_porto ""
+set g_weaponreplace_minstanex ""
+set g_weaponreplace_hook ""
+set g_weaponreplace_hlac 0 // Maybe will be enabled later after I figure out what I want to do with it
+set g_weaponreplace_campingrifle ""
+set g_weaponreplace_tuba ""
+set g_weaponreplace_fireball 0 // Same with this
+set g_weaponreplace_seeker 0 // Same with this
+set sv_q3acompat_machineshotgunswap 0
+
+// other options
+set sv_fragmessage_information_ping 1
+set sv_fragmessage_information_handicap 2
+set sv_fragmessage_information_stats 1
+set sv_fragmessage_information_typefrag 1
+
+exec physicsSamual.cfg
+exec balanceSamual.cfg
--- /dev/null
+exec defaultXonotic.cfg
+
+set g_weaponreplace_laser ""
+set g_weaponreplace_shotgun "uzi"
+set g_weaponreplace_uzi "shotgun"
+set g_weaponreplace_grenadelauncher ""
+set g_weaponreplace_electro ""
+set g_weaponreplace_crylink ""
+set g_weaponreplace_nex ""
+set g_weaponreplace_hagar ""
+set g_weaponreplace_rocketlauncher ""
+set g_weaponreplace_porto ""
+set g_weaponreplace_minstanex ""
+set g_weaponreplace_hook 0
+set g_weaponreplace_hlac 0
+set g_weaponreplace_campingrifle 0
+set g_weaponreplace_tuba ""
+set g_weaponreplace_fireball 0
+set g_weaponreplace_seeker 0
+set sv_q3acompat_machineshotgunswap 0
+
+exec physicsXPM.cfg
+exec balanceXPM.cfg
cl_bob 0.01 // how much view moves up/down when moving (does not move if cl_bobcycle is 0, but still enables cl_bobmodel), default is 0.02
cl_bobmodel 1 // whether to have gun model move around on screen when moving (only works if cl_bob is not 0), default is 1
cl_leanmodel 1 // enables weapon leaning effect when looking around
+cl_leanmodel_side_speed 1 "gun leaning sideways speed"
+cl_leanmodel_side_limit 35 "gun leaning sideways limit"
+cl_leanmodel_side_highpass1 30 "gun leaning sideways pre-highpass in 1/s"
+cl_leanmodel_side_highpass 3 "gun leaning sideways highpass in 1/s"
+cl_leanmodel_side_lowpass 20 "gun leaning sideways lowpass in 1/s"
+cl_leanmodel_up_speed 1 "gun leaning upward speed"
+cl_leanmodel_up_limit 50 "gun leaning upward limit"
+cl_leanmodel_up_highpass1 5 "gun leaning upward pre-highpass in 1/s"
+cl_leanmodel_up_highpass 15 "gun leaning upward highpass in 1/s"
+cl_leanmodel_up_lowpass 20 "gun leaning upward lowpass in 1/s"
cl_followmodel 1 // enables weapon pushing / pulling effect when walking
+cl_followmodel_side_speed 0.5 "gun following sideways speed"
+cl_followmodel_side_limit 6 "gun following sideways limit"
+cl_followmodel_side_highpass1 30 "gun following sideways pre-highpass in 1/s"
+cl_followmodel_side_highpass 5 "gun following sideways highpass in 1/s"
+cl_followmodel_side_lowpass 10 "gun following sideways lowpass in 1/s"
+cl_followmodel_up_speed 1 "gun following upward speed"
+cl_followmodel_up_limit 5 "gun following upward limit"
+cl_followmodel_up_highpass1 60 "gun following upward pre-highpass in 1/s"
+cl_followmodel_up_highpass 2 "gun following upward highpass in 1/s"
+cl_followmodel_up_lowpass 10 "gun following upward lowpass in 1/s"
+
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.5 // whether to use screen tints, default is 1
set g_telefrags_avoid 0
set g_teleport_maxspeed 0 "maximum speed that a player can keep when going through a teleporter (if a misc_teleporter_dest also has a cap the smallest one of these will be used), 0 = don't limit, -1 = keep no speed"
-set g_respawn_ghosts 1 "if 1 dead bodies become ghosts and float away when the player respawns"
+set g_respawn_ghosts 0 "if 1 dead bodies become ghosts and float away when the player respawns"
set g_respawn_ghosts_speed 5 "the speed with which respawn ghosts float and rotate"
set g_respawn_ghosts_maxtime 6 "maximum amount of time a respawn ghost can last, minimum time is half this value. 0 disables and ghosts fade when the body would"
set sv_pogostick 1 "don't require releasing the space bar for jumping again"
set sv_doublejump 0 "allow Quake 2-style double jumps"
-set sv_jumpspeedcap_min "" "wont perform a doublejump if z-axis speed is higher than sv_jumpvelocity * this"
-set sv_jumpspeedcap_max "" "wont perform a doublejump if z-axis speed is higher than sv_jumpvelocity * this"
-set sv_jumpspeedcap_max_disable_on_ramps 0 "disable max jumpspeedcap on ramps to preserve the old rampjump style"
+set sv_jumpspeedcap_min "" "lower bound on the baseline velocity of a jump; final velocity will be >= (jumpheight * min + jumpheight)"
+set sv_jumpspeedcap_max "" "upper bound on the baseline velocity of a jump; final velocity will be <= (jumpheight * max + jumpheight)"
+set sv_jumpspeedcap_max_disable_on_ramps 0 "disable upper baseline velocity bound on ramps to preserve the old rampjump style"
seta sv_precacheplayermodels 1
seta sv_precacheweapons 0
set g_ballistics_materialconstant 1414213562
set g_ballistics_mindistance 16
+set g_ballistics_density_player 0.50 // players are 2x as easy to pass as walls
+set g_ballistics_density_corpse 0.10 // corpses are 10x as easy to pass as walls
// unit: qJ / qu^3 (energy needed per volume unit of solid to push/burn away
// parameter: bullet constant: mass / area in g/qu^2
// = mass / (pi/4 * caliber^2)
set sv_pitch_min -35 "minimum aiming angle for shooting direction display of the gun"
set sv_pitch_max 35 "maximum aiming angle for shooting direction display of the gun"
-set sv_pitch_fixyaw 1 "workaround to fix the aiming direction on stupidly made player models, FIXME fix the models and set this to 0"
+set sv_pitch_fixyaw 0 "workaround to fix the aiming direction on stupidly made player models, FIXME fix the models and set this to 0"
set rescan_pending 0 "set to 1 to schedule a fs_rescan at the end of this match"
// sucks less than the old one
cl_decals_newsystem 1
+
+// NOTE: this only replaces weapons on the map
+// use g_start_weapon_* to also replace the on-startup weapons!
+// example: g_weaponreplace_nex "nex minstanex", then Nexes become MinstaNexes 50% of the times
+// set the cvars to "0" to totally disable a weapon
+set g_weaponreplace_laser ""
+set g_weaponreplace_shotgun ""
+set g_weaponreplace_uzi ""
+set g_weaponreplace_grenadelauncher ""
+set g_weaponreplace_electro ""
+set g_weaponreplace_crylink ""
+set g_weaponreplace_nex ""
+set g_weaponreplace_hagar ""
+set g_weaponreplace_rocketlauncher ""
+set g_weaponreplace_porto ""
+set g_weaponreplace_minstanex ""
+set g_weaponreplace_hook ""
+set g_weaponreplace_hlac ""
+set g_weaponreplace_campingrifle ""
+set g_weaponreplace_tuba ""
+set g_weaponreplace_fireball ""
+set g_weaponreplace_seeker ""
+set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun (for Q3A map compatibility in mapinfo files)"
+
+set g_movement_highspeed 1 "movement speed modification factor (only changes movement when above maxspeed)"
--- /dev/null
+0 36 15.000000 0 // dieone
+36 20 15.000000 0 // dietwo
+56 15 15.000000 1 // draw
+71 20 15.000000 1 // duck
+91 21 30.000000 1 // duckwalk
+112 16 15.000000 0 // duckjump
+128 15 5.000000 1 // duckidle
+143 41 5.000000 1 // idle
+184 21 25.000000 0 // jump
+205 15 15.000000 0 // painone
+220 17 15.000000 0 // paintwo
+237 3 15.000000 1 // shoot
+240 21 15.000000 1 // taunt
+261 21 35.000000 1 // run
+282 21 35.000000 1 // runbackwards
+303 21 35.000000 1 // strafeleft
+324 21 35.000000 1 // straferight
+345 2 15.000000 0 // deadone
+347 2 15.000000 0 // deadtwo
+349 21 35.000000 1 // forwardright
+370 21 35.000000 1 // forwardleft
+391 21 35.000000 1 // backright
+412 21 30.000000 1 // backleft
--- /dev/null
+name Ignis
+species human
+sex Male
+weight 88
+age 31
+
+Heavyweight Xonotic Solider
--- /dev/null
+0 36 15.000000 0 // dieone
+36 20 15.000000 0 // dietwo
+56 15 15.000000 1 // draw
+71 20 15.000000 1 // duck
+91 21 30.000000 1 // duckwalk
+112 16 15.000000 0 // duckjump
+128 15 5.000000 1 // duckidle
+143 41 5.000000 1 // idle
+184 21 25.000000 0 // jump
+205 15 15.000000 0 // painone
+220 17 15.000000 0 // paintwo
+237 3 15.000000 1 // shoot
+240 21 15.000000 1 // taunt
+261 21 35.000000 1 // run
+282 21 35.000000 1 // runbackwards
+303 21 35.000000 1 // strafeleft
+324 21 35.000000 1 // straferight
+345 2 15.000000 0 // deadone
+347 2 15.000000 0 // deadtwo
+349 21 35.000000 1 // forwardright
+370 21 35.000000 1 // forwardleft
+391 21 35.000000 1 // backright
+412 21 30.000000 1 // backleft
--- /dev/null
+name Ignis - HalfMasked
+species human
+sex Male
+weight 90
+age 31
+
+Heavyweight Xonotic Solider
--- /dev/null
+0 36 15.000000 0 // dieone
+36 20 15.000000 0 // dietwo
+56 15 15.000000 1 // draw
+71 20 15.000000 1 // duck
+91 21 30.000000 1 // duckwalk
+112 16 15.000000 0 // duckjump
+128 15 5.000000 1 // duckidle
+143 41 5.000000 1 // idle
+184 21 25.000000 0 // jump
+205 15 15.000000 0 // painone
+220 17 15.000000 0 // paintwo
+237 3 15.000000 1 // shoot
+240 21 15.000000 1 // taunt
+261 21 35.000000 1 // run
+282 21 35.000000 1 // runbackwards
+303 21 35.000000 1 // strafeleft
+324 21 35.000000 1 // straferight
+345 2 15.000000 0 // deadone
+347 2 15.000000 0 // deadtwo
+349 21 35.000000 1 // forwardright
+370 21 35.000000 1 // forwardleft
+391 21 35.000000 1 // backright
+412 21 30.000000 1 // backleft
--- /dev/null
+name Ignis - Masked
+species human
+sex Male
+weight 92
+age 31
+
+Heavyweight Xonotic Solider
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
-71 10 15.000000 1 // duck
-81 11 15.000000 1 // duckwalk
-92 16 15.000000 0 // duckjump
-108 15 5.000000 1 // duckidle
-123 16 5.000000 1 // idle
-139 16 15.000000 0 // jump
-155 15 15.000000 0 // painone
-170 17 15.000000 0 // paintwo
-187 3 15.000000 1 // shoot
-190 35 15.000000 1 // taunt
-225 12 20.000000 1 // run
-237 12 20.000000 1 // runbackwards
-249 12 20.000000 1 // strafeleft
-261 12 20.000000 1 // straferight
-273 2 15.000000 0 // deadone
-275 2 15.000000 0 // deadtwo
-277 12 20.000000 1 // forwardright
-289 12 20.000000 1 // forwardleft
-301 12 20.000000 1 // backright
-313 12 20.000000 1 // backleft
+0 36 20.000000 0 // dieone
+36 27 20.000000 0 // dietwo
+63 15 15.000000 1 // draw
+78 20 15.000000 1 // duck
+98 11 15.000000 1 // duckwalk
+109 16 15.000000 0 // duckjump
+125 15 5.000000 1 // duckidle
+140 16 5.000000 1 // idle
+156 16 15.000000 0 // jump
+172 15 15.000000 0 // painone
+187 17 15.000000 0 // paintwo
+204 5 15.000000 1 // shoot
+209 21 15.000000 1 // taunt
+230 21 40.000000 1 // run
+251 21 40.000000 1 // runbackwards
+272 21 40.000000 1 // strafeleft
+293 21 40.000000 1 // straferight
+314 2 15.000000 0 // deadone
+316 2 15.000000 0 // deadtwo
+318 21 40.000000 1 // forwardright
+339 21 40.000000 1 // forwardleft
+360 21 40.000000 1 // backright
+381 21 40.000000 1 // backleft
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
-71 10 15.000000 1 // duck
-81 11 15.000000 1 // duckwalk
-92 16 15.000000 0 // duckjump
-108 15 5.000000 1 // duckidle
-123 16 5.000000 1 // idle
-139 16 15.000000 0 // jump
-155 15 15.000000 0 // painone
-170 17 15.000000 0 // paintwo
-187 3 15.000000 1 // shoot
-190 35 15.000000 1 // taunt
-225 12 20.000000 1 // run
-237 12 20.000000 1 // runbackwards
-249 12 20.000000 1 // strafeleft
-261 12 20.000000 1 // straferight
-273 2 15.000000 0 // deadone
-275 2 15.000000 0 // deadtwo
-277 12 20.000000 1 // forwardright
-289 12 20.000000 1 // forwardleft
-301 12 20.000000 1 // backright
-313 12 20.000000 1 // backleft
+0 36 20.000000 0 // dieone
+36 27 20.000000 0 // dietwo
+63 15 15.000000 1 // draw
+78 20 15.000000 1 // duck
+98 11 15.000000 1 // duckwalk
+109 16 15.000000 0 // duckjump
+125 15 5.000000 1 // duckidle
+140 16 5.000000 1 // idle
+156 16 15.000000 0 // jump
+172 15 15.000000 0 // painone
+187 17 15.000000 0 // paintwo
+204 5 15.000000 1 // shoot
+209 21 15.000000 1 // taunt
+230 21 40.000000 1 // run
+251 21 40.000000 1 // runbackwards
+272 21 40.000000 1 // strafeleft
+293 21 40.000000 1 // straferight
+314 2 15.000000 0 // deadone
+316 2 15.000000 0 // deadtwo
+318 21 40.000000 1 // forwardright
+339 21 40.000000 1 // forwardleft
+360 21 40.000000 1 // backright
+381 21 40.000000 1 // backleft
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 2.5
sv_airstrafeaccelerate 70
sv_maxairstrafespeed 30
+sv_airstrafeaccel_qw 0
sv_aircontrol 150
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
// 2.0-2.4.2 physics minus QW-bunnyhopping-bug, faster onground accel, CPMA air control
sv_gravity 800
sv_maxspeed 400
-sv_maxairspeed 220
+sv_maxairspeed 400
sv_stopspeed 100
-sv_accelerate 12
-sv_airaccelerate 8
+sv_accelerate 15
+sv_airaccelerate 2
sv_friction 7
edgefriction 1
sv_stepheight 34
sv_jumpvelocity 300
sv_wateraccelerate -1
sv_waterfriction -1
-sv_airaccel_sideways_friction -0.125
-sv_airaccel_qw -0.965
-sv_airstopaccelerate 0
-sv_airstrafeaccelerate 0
-sv_maxairstrafespeed 0
-sv_aircontrol 100
-sv_aircontrol_power 3
+sv_airaccel_sideways_friction -0.2
+sv_airaccel_qw -0.9475
+sv_airstopaccelerate 2.5
+sv_airstrafeaccelerate 42
+sv_maxairstrafespeed 100
+sv_airstrafeaccel_qw -0.99
+sv_aircontrol 125
+sv_aircontrol_power 2.5
sv_warsowbunny_turnaccel 0
sv_warsowbunny_accel 0.1593
sv_warsowbunny_topspeed 925
sv_doublejump 0
sv_jumpspeedcap_min ""
sv_jumpspeedcap_max ""
-sv_jumpspeedcap_max_disable_on_ramps 0
+sv_jumpspeedcap_max_disable_on_ramps 1
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
-sv_gravity 880
+// Mix of 2.3 physics and NANL physics, goal of going for faster movement
+sv_gravity 800
sv_maxspeed 420
sv_maxairspeed 235
sv_stopspeed 200
sv_accelerate 6
sv_airaccelerate 6
sv_friction 4
-edgefriction 0
+edgefriction 1
sv_stepheight 34
-sv_jumpvelocity 330
+sv_jumpvelocity 300
sv_wateraccelerate -1
sv_waterfriction -1
sv_airaccel_sideways_friction 0.3
sv_airstopaccelerate 0
sv_airstrafeaccelerate 0
sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 2.5
sv_airstrafeaccelerate 70
sv_maxairstrafespeed 30
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 9 // activates warsow movement mode
sv_airstopaccelerate 2.5
sv_airstrafeaccelerate 70
sv_maxairstrafespeed 30
+sv_airstrafeaccel_qw 0
sv_aircontrol 150
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
sv_airstopaccelerate 2
sv_airstrafeaccelerate 70
sv_maxairstrafespeed 30
+sv_airstrafeaccel_qw 0
sv_aircontrol 0
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 6 // activates warsow movement mode
sv_airstopaccelerate 2.5
sv_airstrafeaccelerate 70
sv_maxairstrafespeed 30
+sv_airstrafeaccel_qw 1
sv_aircontrol 150
sv_aircontrol_power 2
sv_warsowbunny_turnaccel 0
const float STAT_SHOTORG = 46; // compressShotOrigin
const float STAT_LEADLIMIT = 47;
const float STAT_BULLETS_LOADED = 48;
+
+// see DP source, quakedef.h
+const float STAT_MOVEVARS_AIRSTRAFEACCEL_QW = 223;
+const float STAT_MOVEVARS_AIRACCEL_QW = 254;
+
const float CTF_STATE_ATTACK = 1;
const float CTF_STATE_DEFEND = 2;
const float CTF_STATE_COMMANDER = 3;
{
me.value = me.delta + me.startValue;
me.finished = TRUE;
+ me.setter(me.object, me.value);
}
void setterDummy(entity obj, float objValue)
CLASS(AnimHost) EXTENDS(Object)
METHOD(AnimHost, addAnim, void(entity, entity))
METHOD(AnimHost, removeAnim, void(entity, entity))
+ METHOD(AnimHost, removeAllAnim, void(entity))
+ METHOD(AnimHost, removeObjAnim, void(entity, entity))
METHOD(AnimHost, stopAllAnim, void(entity))
+ METHOD(AnimHost, stopObjAnim, void(entity, entity))
+ METHOD(AnimHost, resumeAllAnim, void(entity))
+ METHOD(AnimHost, resumeObjAnim, void(entity, entity))
METHOD(AnimHost, finishAllAnim, void(entity))
+ METHOD(AnimHost, finishObjAnim, void(entity, entity))
METHOD(AnimHost, tickAll, void(entity))
ATTRIB(AnimHost, firstChild, entity, NULL)
ATTRIB(AnimHost, lastChild, entity, NULL)
me.lastChild = p;
}
+void removeAllAnimAnimHost(entity me)
+{
+ entity e, tmp;
+ for(e = me.firstChild; e; e = e.nextSibling)
+ {
+ tmp = e;
+ e = tmp.prevSibling;
+ me.removeAnim(me, tmp);
+ }
+}
+
+void removeObjAnimAnimHost(entity me, entity obj)
+{
+ entity e, tmp;
+ for(e = me.firstChild; e; e = e.nextSibling)
+ {
+ if (e.object == obj)
+ {
+ tmp = e;
+ e = tmp.prevSibling;
+ me.removeAnim(me, tmp);
+ }
+ }
+}
+
void stopAllAnimAnimHost(entity me)
{
entity e;
}
}
+void stopObjAnimAnimHost(entity me, entity obj)
+{
+ entity e;
+ for(e = me.firstChild; e; e = e.nextSibling)
+ {
+ if (e.object == obj)
+ {
+ e.stopAnim(e);
+ }
+ }
+}
+
+void resumeAllAnimAnimHost(entity me)
+{
+ entity e;
+ for(e = me.firstChild; e; e = e.nextSibling)
+ {
+ e.resumeAnim(e);
+ }
+}
+
+void resumeObjAnimAnimHost(entity me, entity obj)
+{
+ entity e;
+ for(e = me.firstChild; e; e = e.nextSibling)
+ {
+ if (e.object == obj)
+ {
+ e.resumeAnim(e);
+ }
+ }
+}
+
void finishAllAnimAnimHost(entity me)
{
entity e, tmp;
tmp = e;
e = tmp.prevSibling;
me.removeAnim(me, tmp);
- e.finishAnim(tmp);
+ tmp.finishAnim(tmp);
+ }
+}
+
+void finishObjAnimAnimHost(entity me, entity obj)
+{
+ entity e, tmp;
+ for(e = me.firstChild; e; e = e.nextSibling)
+ {
+ if (e.object == obj)
+ {
+ tmp = e;
+ e = tmp.prevSibling;
+ me.removeAnim(me, tmp);
+ tmp.finishAnim(tmp);
+ }
}
}
METHOD(Slider, valueToText, string(entity, float))
METHOD(Slider, toString, string(entity))
METHOD(Slider, setValue, void(entity, float))
+ METHOD(Slider, setSliderValue, void(entity, float))
METHOD(Slider, showNotify, void(entity))
ATTRIB(Slider, src, string, string_null)
ATTRIB(Slider, focusable, float, 1)
ATTRIB(Slider, value, float, 0)
+ ATTRIB(Slider, animated, float, 1)
+ ATTRIB(Slider, sliderValue, float, 0)
ATTRIB(Slider, valueMin, float, 0)
ATTRIB(Slider, valueMax, float, 0)
ATTRIB(Slider, valueStep, float, 0)
#ifdef IMPLEMENTATION
void setValueSlider(entity me, float val)
{
+ if (me.animated) {
+ anim.stopObjAnim(anim, me);
+ anim.removeObjAnim(anim, me);
+ makeHostedEasing(me, setSliderValueSlider, easingQuadInOut, 1, me.sliderValue, val);
+ } else {
+ me.setSliderValue(me, val);
+ }
me.value = val;
}
+void setSliderValueSlider(entity me, float val)
+{
+ me.sliderValue = val;
+}
string toStringSlider(entity me)
{
return strcat(ftos(me.value), " (", me.valueToText(me, me.value), ")");
void configureSliderValuesSlider(entity me, float theValueMin, float theValue, float theValueMax, float theValueStep, float theValueKeyStep, float theValuePageStep)
{
me.value = theValue;
+ me.sliderValue = theValue;
me.valueStep = theValueStep;
me.valueMin = theValueMin;
me.valueMax = theValueMax;
float mouseDragSlider(entity me, vector pos)
{
float hit;
- float v;
+ float v, animed;
if(me.disabled)
return 0;
+
+ anim.finishObjAnim(anim, me);
+ animed = me.animated;
+ me.animated = false;
+
if(me.pressed)
{
hit = 1;
else
me.setValue(me, me.previousValue);
}
+
+ me.animated = animed;
+
return 1;
}
float mousePressSlider(entity me, vector pos)
if(me.disabled)
draw_alpha *= me.disabledAlpha;
draw_ButtonPicture('0 0 0', strcat(me.src, "_s"), eX * (1 - me.textSpace) + eY, me.color2, 1);
- if(almost_in_bounds(me.valueMin, me.value, me.valueMax))
+ if(almost_in_bounds(me.valueMin, me.sliderValue, me.valueMax))
{
- controlLeft = (me.value - me.valueMin) / (me.valueMax - me.valueMin) * (1 - me.textSpace - me.controlWidth);
+ controlLeft = (me.sliderValue - me.valueMin) / (me.valueMax - me.valueMin) * (1 - me.textSpace - me.controlWidth);
if(me.disabled)
draw_Picture(eX * controlLeft, strcat(me.src, "_d"), eX * me.controlWidth + eY, me.colorD, 1);
else if(me.pressed)
drawLabel(me);
me.text = string_null; // TEMPSTRING!
}
-#endif
\ No newline at end of file
+#endif
for(i = 0; i < me.nValues; ++i)
if(me.valueToIdentifier(me, i) == id)
{
- me.value = i;
+ setValueSlider( me, i );
return;
}
- me.value = -1;
+ setValueSlider( me, -1 );
}
string getIdentifierTextSlider(entity me)
{
{
if(val != me.value)
{
- me.value = val;
+ setValueSlider( me, val );
me.saveCvars(me);
}
}
if not(me.cvarName)
return;
- me.value = cvar(me.cvarName);
+ me.setValue( me, cvar(me.cvarName) );
}
void saveCvarsXonoticSlider(entity me)
{
v = cvar(me.cvarName);
if(v >= 0.98)
- me.value = 0;
+ setValueSlider( me, 0 );
else if(v < 0.0005)
- me.value = -1000000;
+ setValueSlider( me, -1000000 );
else
- me.value = 0.1 * floor(0.5 + 10.0 * log10(cvar(me.cvarName)) * 10);
+ setValueSlider( me, 0.1 * floor(0.5 + 10.0 * log10(cvar(me.cvarName)) * 10) );
}
void saveCvarsXonoticDecibelsSlider(entity me)
{
{
if(val != me.value)
{
- me.value = val;
+ setValueSlider( me, val );
me.saveCvars(me);
}
}
else
name = bot_name;
+ self.cleanname = strzone(name);
+
+ // number bots with identical names
+ float i;
+ i = 0;
+ FOR_EACH_CLIENT(p)
+ {
+ if(clienttype(p) == CLIENTTYPE_BOT)
+ if(p.cleanname == name)
+ ++i;
+ }
+ if (i)
+ name = strcat(name, "(", ftos(i), ")");
+
// pick the model and skin
if(substring(bot_model, -4, 1) != ".")
bot_model = strcat(bot_model, ".iqm");
{
if (clienttype(self) != CLIENTTYPE_BOT)
return;
+ if(self.cleanname)
+ strunzone(self.cleanname);
if(self.netname_freeme)
strunzone(self.netname_freeme);
if(self.playermodel_freeme)
strunzone(self.playermodel_freeme);
if(self.playerskin_freeme)
strunzone(self.playerskin_freeme);
+ self.cleanname = string_null;
self.netname_freeme = string_null;
self.playermodel_freeme = string_null;
self.playerskin_freeme = string_null;
entity player_list;
.entity nextbot;
.entity nextplayer;
+.string cleanname;
.string netname_freeme;
.string playermodel_freeme;
.string playerskin_freeme;
self.nextthink = 0;
self.hook_time = 0;
self.dmg_team = 0;
+ self.ballistics_density = cvar("g_ballistics_density_player");
self.metertime = 0;
float sv_airstopaccelerate;
float sv_airstrafeaccelerate;
float sv_maxairstrafespeed;
+float sv_airstrafeaccel_qw;
float sv_aircontrol;
float sv_aircontrol_power;
float sv_warsowbunny_airforwardaccel;
void PlayerJump (void)
{
float mjumpheight;
+ float doublejump;
+
+ doublejump = FALSE;
+ if (sv_doublejump)
+ {
+ tracebox(self.origin + '0 0 0.01', self.mins, self.maxs, self.origin - '0 0 0.01', MOVE_NORMAL, self);
+ if (trace_fraction < 1 && trace_plane_normal_z > 0.7)
+ doublejump = TRUE;
+ }
mjumpheight = cvar("sv_jumpvelocity");
if (self.waterlevel >= WATERLEVEL_SWIMMING)
return;
}
+ if (!doublejump)
if (!(self.flags & FL_ONGROUND))
return;
mjumpheight = mjumpheight * cvar("g_minstagib_speed_jumpheight");
}
+ // sv_jumpspeedcap_min/sv_jumpspeedcap_max act as baseline
+ // velocity bounds. Final velocity is bound between (jumpheight *
+ // min + jumpheight) and (jumpheight * max + jumpheight);
+
if(cvar_string("sv_jumpspeedcap_min") != "")
- self.velocity_z = max(cvar("sv_jumpvelocity") * cvar("sv_jumpspeedcap_min"), self.velocity_z);
- if(cvar_string("sv_jumpspeedcap_max") != "") {
- if(trace_fraction < 1 && trace_plane_normal_z < 0.98 && cvar("sv_jumpspeedcap_max_disable_on_ramps")) {
- // don't do jump speedcaps on ramps to preserve old xonotic ramjump style
- //print("Trace plane normal z: ", ftos(trace_plane_normal_z), ", disabling speed cap!\n");
+ {
+ float minjumpspeed;
+
+ minjumpspeed = mjumpheight * cvar("sv_jumpspeedcap_min");
+
+ if (self.velocity_z < minjumpspeed)
+ mjumpheight += minjumpspeed - self.velocity_z;
+ }
+
+ if(cvar_string("sv_jumpspeedcap_max") != "")
+ {
+ // don't do jump speedcaps on ramps to preserve old xonotic ramjump style
+ tracebox(self.origin + '0 0 0.01', self.mins, self.maxs, self.origin - '0 0 0.01', MOVE_NORMAL, self);
+
+ if(!(trace_fraction < 1 && trace_plane_normal_z < 0.98 && cvar("sv_jumpspeedcap_max_disable_on_ramps")))
+ {
+ float maxjumpspeed;
+
+ maxjumpspeed = mjumpheight * cvar("sv_jumpspeedcap_max");
+
+ if (self.velocity_z > maxjumpspeed)
+ mjumpheight -= self.velocity_z - maxjumpspeed;
}
- else
- self.velocity_z = min(cvar("sv_jumpvelocity") * cvar("sv_jumpspeedcap_max"), self.velocity_z) + trace_ent.velocity_z;
}
if(!(self.lastflags & FL_ONGROUND))
{
if(mv_x == 0 && mv_y == 0)
return 0; // avoid division by zero
- angle = RAD2DEG * atan2(mv_y, mv_x);
+ angle -= RAD2DEG * atan2(mv_y, mv_x);
angle = remainder(angle, 360) / 45;
if(angle > 1)
return 0;
return 1 - fabs(angle);
}
+float GeomLerp(float a, float lerp, float b)
+{
+ if(a == 0)
+ {
+ if(lerp < 1)
+ return 0;
+ else
+ return b;
+ }
+ if(b == 0)
+ {
+ if(lerp > 0)
+ return 0;
+ else
+ return a;
+ }
+ return a * pow(fabs(b / a), lerp);
+}
+
void CPM_PM_Aircontrol(vector wishdir, float wishspeed)
{
float zspeed, xyspeed, dot, k;
string GetMapname(void);
float speedaward_lastupdate;
float speedaward_lastsent;
-.float jumppadusetime;
+var float autocvar_g_movement_highspeed = 1;
void SV_PlayerPhysics()
{
local vector wishvel, wishdir, v;
float not_allowed_to_move;
string c;
+ // fix physics stats for g_movement_highspeed
+ self.stat_sv_airaccel_qw = copysign(bound(0, 1-(1-fabs(sv_airaccel_qw))*autocvar_g_movement_highspeed, 1), sv_airaccel_qw);
+ if(sv_airstrafeaccel_qw)
+ self.stat_sv_airstrafeaccel_qw = copysign(bound(0.001, 1-(1-fabs(sv_airstrafeaccel_qw))*autocvar_g_movement_highspeed, 1), sv_airstrafeaccel_qw);
+ else
+ self.stat_sv_airstrafeaccel_qw = 0;
+
if(self.PlayerPhysplug)
if(self.PlayerPhysplug())
return;
if(self.classname == "player")
{
- if(sv_doublejump && time - self.jumppadusetime > 2 * sys_frametime)
- {
- tracebox(self.origin + '0 0 0.01', self.mins, self.maxs, self.origin - '0 0 0.01', MOVE_NORMAL, self);
- self.flags &~= FL_ONGROUND;
- if(trace_fraction < 1 && trace_plane_normal_z > 0.7)
- self.flags |= FL_ONGROUND;
- }
-
if (self.BUTTON_JUMP)
PlayerJump ();
else
float accelerating;
float wishspeed2;
float airaccelqw;
+ float strafity;
- airaccelqw = sv_airaccel_qw;
+ airaccelqw = self.stat_sv_airaccel_qw;
accelerating = (self.velocity * wishdir > 0);
wishspeed2 = wishspeed;
if(sv_airstopaccelerate)
if(self.velocity * wishdir < 0)
airaccel = sv_airstopaccelerate*maxspd_mod;
- // this doesn't play well with analog input, but can't r
- // fixed like the AirControl can. So, don't set the maxa
- // cvars when you want to support analog input.
- if(self.movement_x == 0 && self.movement_y != 0)
- {
- if(sv_maxairstrafespeed)
- {
- wishspeed = min(wishspeed, sv_maxairstrafespeed*maxspd_mod);
- if(sv_maxairstrafespeed < sv_maxairspeed)
- airaccelqw = 1;
- }
- if(sv_airstrafeaccelerate)
- {
- airaccel = sv_airstrafeaccelerate*maxspd_mod;
- if(sv_airstrafeaccelerate > sv_airaccelerate)
- airaccelqw = 1;
- }
- }
+ // note that for straight forward jumping:
+ // step = accel * frametime * wishspeed0;
+ // accel = bound(0, wishspeed - vel_xy_current, step) * accelqw + step * (1 - accelqw);
+ // -->
+ // dv/dt = accel * maxspeed (when slow)
+ // dv/dt = accel * maxspeed * (1 - accelqw) (when fast)
+ // log dv/dt = logaccel + logmaxspeed (when slow)
+ // log dv/dt = logaccel + logmaxspeed + log(1 - accelqw) (when fast)
+ strafity = IsMoveInDirection(self.movement, -90) + IsMoveInDirection(self.movement, +90); // if one is nonzero, other is always zero
+ if(sv_maxairstrafespeed)
+ wishspeed = min(wishspeed, GeomLerp(sv_maxairspeed*maxspd_mod, strafity, sv_maxairstrafespeed*maxspd_mod));
+ if(sv_airstrafeaccelerate)
+ airaccel = GeomLerp(airaccel, strafity, sv_airstrafeaccelerate*maxspd_mod);
+ if(self.stat_sv_airstrafeaccel_qw)
+ airaccelqw = copysign(1-GeomLerp(1-fabs(self.stat_sv_airaccel_qw), strafity, 1-fabs(self.stat_sv_airstrafeaccel_qw)), ((strafity > 0.5) ? self.stat_sv_airstrafeaccel_qw : self.stat_sv_airaccel_qw));
// !CPM
if(sv_warsowbunny_turnaccel && accelerating && self.movement_y == 0 && self.movement_x != 0)
self.movetype = oldself.movetype;
self.nextthink = oldself.nextthink;
self.solid = oldself.solid;
+ self.ballistics_density = oldself.ballistics_density;
self.takedamage = oldself.takedamage;
self.think = oldself.think;
self.customizeentityforclient = oldself.customizeentityforclient;
self.movetype = MOVETYPE_TOSS;
// shootable corpse
self.solid = SOLID_CORPSE;
+ self.ballistics_density = cvar("g_ballistics_density_corpse");
// don't stick to the floor
self.flags &~= FL_ONGROUND;
// dying animation
return;
if(!W_IsWeaponThrowable(w))
return;
+ if(self.weaponentity.state != WS_READY)
+ return;
wb = W_WeaponBit(w);
if(self.weapons & wb != wb)
};
// perform weapon to attack (weaponstate and attack_finished check is here)
+void W_SwitchToOtherWeapon(entity pl)
+{
+ // hack to ensure it switches to an OTHER weapon (in case the other fire mode still has ammo, we want that anyway)
+ float w, ww;
+ w = W_WeaponBit(pl.weapon);
+ pl.weapons &~= w;
+ ww = w_getbestweapon(pl);
+ pl.weapons |= w;
+ if(ww)
+ W_SwitchWeapon_Force(pl, ww);
+}
+float weapon_prepareattack_checkammo(float secondary)
+{
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+ if (!weapon_action(self.weapon, WR_CHECKAMMO1 + secondary))
+ {
+ W_SwitchToOtherWeapon(self);
+ return FALSE;
+ }
+ return TRUE;
+}
.float race_penalty;
-float weapon_prepareattack(float secondary, float attacktime)
+float weapon_prepareattack_check(float secondary, float attacktime)
{
+ if(!weapon_prepareattack_checkammo(secondary))
+ return FALSE;
+
//if sv_ready_restart_after_countdown is set, don't allow the player to shoot
//if all players readied up and the countdown is running
if(time < game_starttime || time < self.race_penalty) {
return FALSE;
}
- if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- if (!weapon_action(self.weapon, WR_CHECKAMMO1 + secondary))
- {
- // hack to ensure it switches to an OTHER weapon (in case the other fire mode still has ammo, we want that anyway)
- float w, ww;
- w = W_WeaponBit(self.weapon);
- self.weapons &~= w;
- ww = w_getbestweapon(self);
- self.weapons |= w;
- if(ww)
- W_SwitchWeapon_Force(self, ww);
- return FALSE;
- }
-
if (timeoutStatus == 2) //don't allow the player to shoot while game is paused
return FALSE;
if (self.weaponentity.state != WS_READY)
return FALSE;
}
+
+ return TRUE;
+}
+float weapon_prepareattack_do(float secondary, float attacktime)
+{
self.weaponentity.state = WS_INUSE;
self.spawnshieldtime = min(self.spawnshieldtime, time); // kill spawn shield when you fire
self.bulletcounter += 1;
//dprint("attack finished ", ftos(ATTACK_FINISHED(self)), "\n");
return TRUE;
-};
+}
+float weapon_prepareattack(float secondary, float attacktime)
+{
+ if(weapon_prepareattack_check(secondary, attacktime))
+ {
+ weapon_prepareattack_do(secondary, attacktime);
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
void weapon_thinkf(float fr, float t, void() func)
{
float game_starttime; //point in time when the countdown is over
.float stat_game_starttime;
+.float stat_sv_airaccel_qw;
+.float stat_sv_airstrafeaccel_qw;
+
void W_Porto_Remove (entity p);
.float projectiledeathtype;
.float cvar_cl_weaponimpulsemode;
.float selectweapon; // last selected weapon of the player
+
+.float ballistics_density; // wall piercing factor, larger = bullet can pass through more
// string autocvar__cl_name;
//NOTE: copying a string-typed autocvar to another variable/field, and then
//changing the cvar or returning from progs is UNDEFINED. Writing to autocvar
-//globals is UNDEFINED. Accessing autocvar globals after cvar_set()ing that
+//globals is UNDEFINED. Accessing autocvar globals after cvar_set()ing that
//cvar is IMPLEMENTATION DEFINED (an implementation may either yield the
-//previous, or the current, value). Whether autocvar globals, after restoring
-//a savegame, have the cvar's current value, or the original value at time of
-//saving, is UNDEFINED. Restoring a savegame however must not restore the
-//cvar values themselves.
+//previous, or the current, value). Writing to an autocvar global is NOT
+//ALLOWED.
//In case the cvar does NOT exist, then it is automatically created with the
//value of the autocvar initializer, if given. This is possible with e.g.
//frikqcc and fteqcc the following way:
addstat(STAT_LEADLIMIT, AS_FLOAT, stat_leadlimit);
addstat(STAT_BULLETS_LOADED, AS_INT, campingrifle_bulletcounter);
+ // g_movementspeed hack
+ addstat(STAT_MOVEVARS_AIRACCEL_QW, AS_FLOAT, stat_sv_airaccel_qw);
+ addstat(STAT_MOVEVARS_AIRSTRAFEACCEL_QW, AS_FLOAT, stat_sv_airstrafeaccel_qw);
+
next_pingtime = time + 5;
InitializeEntity(self, cvar_changes_init, INITPRIO_CVARS);
if(argv(1) == "w")
setmodel(e, (nextent(world)).weaponentity.model);
else
+ {
+ precache_model(argv(1));
setmodel(e, argv(1));
+ }
e.frame = stof(argv(2));
- i = gettagindex(e, argv(3));
+ if(substring(argv(3), 0, 1) == "#")
+ i = stof(substring(argv(3), 1, -1));
+ else
+ i = gettagindex(e, argv(3));
if(i)
{
v = gettaginfo(e, i);
- print("model ", e.model, " frame ", ftos(e.frame), " tag ", argv(3));
- print(" index = ", ftos(i));
+ print("model ", e.model, " frame ", ftos(e.frame), " tag ", gettaginfo_name);
+ print(" index ", ftos(i), " parent ", ftos(gettaginfo_parent), "\n");
print(" vector = ", ftos(v_x), " ", ftos(v_y), " ", ftos(v_z), "\n");
+ print(" offset = ", ftos(gettaginfo_offset_x), " ", ftos(gettaginfo_offset_y), " ", ftos(gettaginfo_offset_z), "\n");
+ print(" forward = ", ftos(gettaginfo_forward_x), " ", ftos(gettaginfo_forward_y), " ", ftos(gettaginfo_forward_z), "\n");
+ print(" right = ", ftos(gettaginfo_right_x), " ", ftos(gettaginfo_right_y), " ", ftos(gettaginfo_right_z), "\n");
+ print(" up = ", ftos(gettaginfo_up_x), " ", ftos(gettaginfo_up_y), " ", ftos(gettaginfo_up_z), "\n");
if(argc >= 6)
{
v_y = -v_y;
float g_pickup_fuel_max;
float g_pickup_armorsmall;
float g_pickup_armorsmall_max;
+float g_pickup_armorsmall_anyway;
float g_pickup_armormedium;
float g_pickup_armormedium_max;
+float g_pickup_armormedium_anyway;
float g_pickup_armorbig;
float g_pickup_armorbig_max;
+float g_pickup_armorbig_anyway;
float g_pickup_armorlarge;
float g_pickup_armorlarge_max;
+float g_pickup_armorlarge_anyway;
float g_pickup_healthsmall;
float g_pickup_healthsmall_max;
+float g_pickup_healthsmall_anyway;
float g_pickup_healthmedium;
float g_pickup_healthmedium_max;
+float g_pickup_healthmedium_anyway;
float g_pickup_healthlarge;
float g_pickup_healthlarge_max;
+float g_pickup_healthlarge_anyway;
float g_pickup_healthmega;
float g_pickup_healthmega_max;
+float g_pickup_healthmega_anyway;
+float g_pickup_ammo_anyway;
+float g_pickup_weapons_anyway;
float g_weaponarena;
float g_weaponarena_random;
string g_weaponarena_list;
sv_maxidle = cvar("sv_maxidle");
sv_maxidle_spectatorsareidle = cvar("sv_maxidle_spectatorsareidle");
sv_pogostick = cvar("sv_pogostick");
- sv_doublejump = cvar("sv_doublejump");
g_ctf_reverse = cvar("g_ctf_reverse");
sv_autotaunt = cvar("sv_autotaunt");
sv_taunt = cvar("sv_taunt");
g_pickup_fuel_max = cvar("g_pickup_fuel_max");
g_pickup_armorsmall = cvar("g_pickup_armorsmall");
g_pickup_armorsmall_max = cvar("g_pickup_armorsmall_max");
+ g_pickup_armorsmall_anyway = cvar("g_pickup_armorsmall_anyway");
g_pickup_armormedium = cvar("g_pickup_armormedium");
g_pickup_armormedium_max = cvar("g_pickup_armormedium_max");
+ g_pickup_armormedium_anyway = cvar("g_pickup_armormedium_anyway");
g_pickup_armorbig = cvar("g_pickup_armorbig");
g_pickup_armorbig_max = cvar("g_pickup_armorbig_max");
+ g_pickup_armorbig_anyway = cvar("g_pickup_armorbig_anyway");
g_pickup_armorlarge = cvar("g_pickup_armorlarge");
g_pickup_armorlarge_max = cvar("g_pickup_armorlarge_max");
+ g_pickup_armorlarge_anyway = cvar("g_pickup_armorlarge_anyway");
g_pickup_healthsmall = cvar("g_pickup_healthsmall");
g_pickup_healthsmall_max = cvar("g_pickup_healthsmall_max");
+ g_pickup_healthsmall_anyway = cvar("g_pickup_healthsmall_anyway");
g_pickup_healthmedium = cvar("g_pickup_healthmedium");
g_pickup_healthmedium_max = cvar("g_pickup_healthmedium_max");
+ g_pickup_healthmedium_anyway = cvar("g_pickup_healthmedium_anyway");
g_pickup_healthlarge = cvar("g_pickup_healthlarge");
g_pickup_healthlarge_max = cvar("g_pickup_healthlarge_max");
+ g_pickup_healthlarge_anyway = cvar("g_pickup_healthlarge_anyway");
g_pickup_healthmega = cvar("g_pickup_healthmega");
g_pickup_healthmega_max = cvar("g_pickup_healthmega_max");
+ g_pickup_healthmega_anyway = cvar("g_pickup_healthmega_anyway");
+
+ g_pickup_ammo_anyway = cvar("g_pickup_ammo_anyway");
+ g_pickup_weapons_anyway = cvar("g_pickup_weapons_anyway");
g_pinata = cvar("g_pinata");
activator = a;
}
+void adaptor_think2use_hittype_splash() // for timed projectile detonation
+{
+ if not(self.flags & FL_ONGROUND) // if onground, we ARE touching something, but HITTYPE_SPLASH is to be networked if the damage causing projectile is not touching ANYTHING
+ self.projectiledeathtype |= HITTYPE_SPLASH;
+ adaptor_think2use();
+}
+
// deferred dropping
void DropToFloor_Handler()
{
sv_airstopaccelerate = cvar("sv_airstopaccelerate");
sv_airstrafeaccelerate = cvar("sv_airstrafeaccelerate");
sv_maxairstrafespeed = cvar("sv_maxairstrafespeed");
+ sv_airstrafeaccel_qw = cvar("sv_airstrafeaccel_qw");
sv_aircontrol = cvar("sv_aircontrol");
sv_aircontrol_power = cvar("sv_aircontrol_power");
sv_warsowbunny_airforwardaccel = cvar("sv_warsowbunny_airforwardaccel");
sv_warsowbunny_backtosideratio = cvar("sv_warsowbunny_backtosideratio");
teamplay = cvar ("teamplay");
sys_frametime = cvar("sys_ticrate") * cvar("slowmo");
+ sv_doublejump = cvar("sv_doublejump");
if (timeoutStatus == 1) // just before the timeout (when timeoutStatus will be 2)
orig_slowmo = cvar("slowmo"); // slowmo will be restored after the timeout
}
.float max_armorvalue;
+.float pickup_anyway;
float Item_Customize()
{
}
if (item.ammo_fuel)
- if (player.ammo_fuel < g_pickup_fuel_max)
+ if (player.ammo_fuel < g_pickup_fuel_max)
{
pickedup = TRUE;
player.ammo_fuel = min(player.ammo_fuel + item.ammo_fuel, g_pickup_fuel_max);
if(item.spawnshieldtime)
{
if (item.ammo_shells)
- if (player.ammo_shells < g_pickup_shells_max)
+ if ((player.ammo_shells < g_pickup_shells_max) || item.pickup_anyway)
{
pickedup = TRUE;
player.ammo_shells = min (player.ammo_shells + item.ammo_shells, g_pickup_shells_max);
}
if (item.ammo_nails)
- if (player.ammo_nails < g_pickup_nails_max)
+ if ((player.ammo_nails < g_pickup_nails_max) || item.pickup_anyway)
{
pickedup = TRUE;
player.ammo_nails = min (player.ammo_nails + item.ammo_nails, g_pickup_nails_max);
}
if (item.ammo_rockets)
- if (player.ammo_rockets < g_pickup_rockets_max)
+ if ((player.ammo_rockets < g_pickup_rockets_max) || item.pickup_anyway)
{
pickedup = TRUE;
player.ammo_rockets = min (player.ammo_rockets + item.ammo_rockets, g_pickup_rockets_max);
}
if (item.ammo_cells)
- if (player.ammo_cells < g_pickup_cells_max)
+ if ((player.ammo_cells < g_pickup_cells_max) || item.pickup_anyway)
{
pickedup = TRUE;
player.ammo_cells = min (player.ammo_cells + item.ammo_cells, g_pickup_cells_max);
}
if (item.ammo_fuel)
- if (player.ammo_fuel < g_pickup_fuel_max)
+ if ((player.ammo_fuel < g_pickup_fuel_max) || item.pickup_anyway)
{
pickedup = TRUE;
player.ammo_fuel = min(player.ammo_fuel + item.ammo_fuel, g_pickup_fuel_max);
}
if (item.flags & FL_WEAPON)
- if ((it = item.weapons - (item.weapons & player.weapons)))
+ if ((it = item.weapons - (item.weapons & player.weapons)) || g_pickup_weapons_anyway)
{
pickedup = TRUE;
for(i = WEP_FIRST; i <= WEP_LAST; ++i)
}
if (item.health)
- if (player.health < item.max_health)
+ if ((player.health < item.max_health) || item.pickup_anyway)
{
pickedup = TRUE;
player.health = min(player.health + item.health, item.max_health);
player.pauserothealth_finished = max(player.pauserothealth_finished, time + cvar("g_balance_pause_health_rot"));
}
if (item.armorvalue)
- if (player.armorvalue < item.max_armorvalue)
+ if ((player.armorvalue < item.max_armorvalue) || item.pickup_anyway)
{
pickedup = TRUE;
player.armorvalue = min(player.armorvalue + item.armorvalue, item.max_armorvalue);
void spawnfunc_item_rockets (void) {
if(!self.ammo_rockets)
self.ammo_rockets = g_pickup_rockets;
+ if(!self.pickup_anyway)
+ self.pickup_anyway = g_pickup_ammo_anyway;
StartItem ("models/items/a_rockets.md3", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "rockets", IT_ROCKETS, 0, 0, commodity_pickupevalfunc, 3000);
}
if(!self.ammo_nails)
self.ammo_nails = g_pickup_nails;
+ if(!self.pickup_anyway)
+ self.pickup_anyway = g_pickup_ammo_anyway;
StartItem ("models/items/a_bullets.mdl", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "bullets", IT_NAILS, 0, 0, commodity_pickupevalfunc, 2000);
}
void spawnfunc_item_cells (void) {
if(!self.ammo_cells)
self.ammo_cells = g_pickup_cells;
+ if(!self.pickup_anyway)
+ self.pickup_anyway = g_pickup_ammo_anyway;
StartItem ("models/items/a_cells.md3", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "cells", IT_CELLS, 0, 0, commodity_pickupevalfunc, 2000);
}
if(!self.ammo_shells)
self.ammo_shells = g_pickup_shells;
+ if(!self.pickup_anyway)
+ self.pickup_anyway = g_pickup_ammo_anyway;
StartItem ("models/items/a_shells.md3", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "shells", IT_SHELLS, 0, 0, commodity_pickupevalfunc, 500);
}
self.armorvalue = g_pickup_armorsmall;
if(!self.max_armorvalue)
self.max_armorvalue = g_pickup_armorsmall_max;
+ if(!self.pickup_anyway)
+ self.pickup_anyway = g_pickup_armorsmall_anyway;
StartItem ("models/items/g_a1.md3", "misc/armor1.wav", g_pickup_respawntime_short, g_pickup_respawntimejitter_short, "5 Armor", IT_ARMOR_SHARD, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_LOW);
}
self.armorvalue = g_pickup_armormedium;
if(!self.max_armorvalue)
self.max_armorvalue = g_pickup_armormedium_max;
+ if(!self.pickup_anyway)
+ self.pickup_anyway = g_pickup_armormedium_anyway;
StartItem ("models/items/g_armormedium.md3", "misc/armor10.wav", g_pickup_respawntime_medium, g_pickup_respawntimejitter_medium, "25 Armor", IT_ARMOR, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_MID);
}
self.armorvalue = g_pickup_armorbig;
if(!self.max_armorvalue)
self.max_armorvalue = g_pickup_armorbig_max;
+ if(!self.pickup_anyway)
+ self.pickup_anyway = g_pickup_armorbig_anyway;
StartItem ("models/items/g_a50.md3", "misc/armor17_5.wav", g_pickup_respawntime_long, g_pickup_respawntimejitter_long, "50 Armor", IT_ARMOR, 0, 0, commodity_pickupevalfunc, 20000);
}
self.armorvalue = g_pickup_armorlarge;
if(!self.max_armorvalue)
self.max_armorvalue = g_pickup_armorlarge_max;
+ if(!self.pickup_anyway)
+ self.pickup_anyway = g_pickup_armorlarge_anyway;
StartItem ("models/items/g_a25.md3", "misc/armor25.wav", g_pickup_respawntime_long, g_pickup_respawntimejitter_long, "100 Armor", IT_ARMOR, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_HIGH);
}
self.max_health = g_pickup_healthsmall_max;
if(!self.health)
self.health = g_pickup_healthsmall;
+ if(!self.pickup_anyway)
+ self.pickup_anyway = g_pickup_healthsmall_anyway;
StartItem ("models/items/g_h1.md3", "misc/minihealth.wav", g_pickup_respawntime_short, g_pickup_respawntimejitter_short, "5 Health", IT_5HP, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_LOW);
}
self.max_health = g_pickup_healthmedium_max;
if(!self.health)
self.health = g_pickup_healthmedium;
+ if(!self.pickup_anyway)
+ self.pickup_anyway = g_pickup_healthmedium_anyway;
StartItem ("models/items/g_h25.md3", "misc/mediumhealth.wav", g_pickup_respawntime_short, g_pickup_respawntimejitter_short, "25 Health", IT_25HP, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_MID);
}
self.max_health = g_pickup_healthlarge_max;
if(!self.health)
self.health = g_pickup_healthlarge;
+ if(!self.pickup_anyway)
+ self.pickup_anyway = g_pickup_healthlarge_anyway;
StartItem ("models/items/g_h50.md3", "misc/mediumhealth.wav", g_pickup_respawntime_medium, g_pickup_respawntimejitter_medium, "50 Health", IT_25HP, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_MID);
}
self.max_health = g_pickup_healthmega_max;
if(!self.health)
self.health = g_pickup_healthmega;
+ if(!self.pickup_anyway)
+ self.pickup_anyway = g_pickup_healthmega_anyway;
StartItem ("models/items/g_h100.md3", "misc/megahealth.wav", g_pickup_respawntime_long, g_pickup_respawntimejitter_long, "100 Health", IT_HEALTH, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_HIGH);
}
}
{
if(!self.ammo_fuel)
self.ammo_fuel = g_pickup_fuel;
+ if(!self.pickup_anyway)
+ self.pickup_anyway = g_pickup_ammo_anyway;
StartItem ("models/items/g_fuel.md3", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "Fuel", IT_FUEL, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_LOW);
}
other.flags &~= FL_ONGROUND;
other.velocity = self.movedir;
- other.jumppadusetime = time;
if (other.classname == "player")
{
w_ready();
}
-void W_CampingRifle_Reload()
+float W_CampingRifle_Reload()
{
float t;
W_CampingRifle_CheckMaxBullets(TRUE);
- if (self.campingrifle_bulletcounter >= cvar("g_balance_campingrifle_magazinecapacity"))
- return;
- if(self.ammo_nails < min(cvar("g_balance_campingrifle_primary_ammo"), cvar("g_balance_campingrifle_secondary_ammo")))
+ if(self.ammo_nails < min(cvar("g_balance_campingrifle_primary_ammo"), cvar("g_balance_campingrifle_secondary_ammo"))) // when we get here, bulletcounter must be 0 or -1
{
+ print("cannot reload... not enough bullets\n");
self.campingrifle_bulletcounter = -1; // reload later
- return;
+ W_SwitchToOtherWeapon(self);
+ return 0;
}
+ if (self.campingrifle_bulletcounter >= cvar("g_balance_campingrifle_magazinecapacity"))
+ return 0;
+
if (self.weaponentity)
{
if (self.weaponentity.wframe == WFRAME_RELOAD)
- return;
+ return 0;
// allow to switch away while reloading, but this will cause a new reload!
self.weaponentity.state = WS_READY;
weapon_thinkf(WFRAME_RELOAD, cvar("g_balance_campingrifle_reloadtime"), W_CampingRifle_ReloadedAndReady);
self.campingrifle_bulletcounter = -1;
+
+ return 1;
}
void W_CampingRifle_CheckReloadAndReady()
{
w_ready();
- if (self.campingrifle_bulletcounter <= 0)
- W_CampingRifle_Reload();
- else
- w_ready();
+ if(self.campingrifle_bulletcounter <= 0)
+ if(W_CampingRifle_Reload())
+ return;
}
void W_CampingRifle_FireBullet(float pSpread, float pDamage, float pHeadshotAddedDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant)
weapon_defaultspawnfunc(WEP_CAMPINGRIFLE);
}
+.void(void) campingrifle_bullethail_attackfunc;
+.float campingrifle_bullethail_frame;
+.float campingrifle_bullethail_animtime;
+.float campingrifle_bullethail_refire;
+void W_CampingRifle_BulletHail_Continue()
+{
+ float r, sw, af;
+ W_CampingRifle_CheckReloadAndReady();
+ if(self.campingrifle_bulletcounter < 0)
+ return; // reloading, so we are done
+ sw = self.switchweapon; // make it not detect weapon changes as reason to abort firing
+ af = ATTACK_FINISHED(self);
+ self.switchweapon = self.weapon;
+ ATTACK_FINISHED(self) = time;
+ print(ftos(self.ammo_nails), "\n");
+ r = weapon_prepareattack(self.campingrifle_bullethail_frame == WFRAME_FIRE2, self.campingrifle_bullethail_refire);
+ if(self.switchweapon == self.weapon)
+ self.switchweapon = sw;
+ if(r)
+ {
+ self.campingrifle_bullethail_attackfunc();
+ weapon_thinkf(self.campingrifle_bullethail_frame, self.campingrifle_bullethail_animtime, W_CampingRifle_BulletHail_Continue);
+ print("thinkf set\n");
+ }
+ else
+ {
+ ATTACK_FINISHED(self) = af; // reset attack_finished if we didn't fire, so the last shot enforces the refire time
+ print("out of ammo... ", ftos(self.weaponentity.state), "\n");
+ }
+}
+
+void W_CampingRifle_BulletHail(float mode, void(void) AttackFunc, float fr, float animtime, float refire)
+{
+ // if we get here, we have at least one bullet to fire
+ AttackFunc();
+ if(mode)
+ {
+ // continue hail
+ self.campingrifle_bullethail_attackfunc = AttackFunc;
+ self.campingrifle_bullethail_frame = fr;
+ self.campingrifle_bullethail_animtime = animtime;
+ self.campingrifle_bullethail_refire = refire;
+ weapon_thinkf(fr, animtime, W_CampingRifle_BulletHail_Continue);
+ }
+ else
+ {
+ // just one shot
+ weapon_thinkf(fr, animtime, W_CampingRifle_CheckReloadAndReady);
+ }
+}
+
.float bot_secondary_campingriflemooth;
float w_campingrifle(float req)
{
{
self.campingrifle_accumulator = bound(time - cvar("g_balance_campingrifle_bursttime"), self.campingrifle_accumulator, time);
if (self.BUTTON_ATCK)
+ if (weapon_prepareattack_check(0, cvar("g_balance_campingrifle_primary_refire")))
if (time >= self.campingrifle_accumulator + cvar("g_balance_campingrifle_primary_burstcost"))
- if (weapon_prepareattack(0, cvar("g_balance_campingrifle_primary_refire")))
{
- W_CampingRifle_Attack();
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_campingrifle_primary_animtime"), W_CampingRifle_CheckReloadAndReady);
+ weapon_prepareattack_do(0, cvar("g_balance_campingrifle_primary_refire"));
+ W_CampingRifle_BulletHail(cvar("g_balance_campingrifle_primary_bullethail"), W_CampingRifle_Attack, WFRAME_FIRE1, cvar("g_balance_campingrifle_primary_animtime"), cvar("g_balance_campingrifle_primary_refire"));
self.campingrifle_accumulator += cvar("g_balance_campingrifle_primary_burstcost");
}
if (self.BUTTON_ATCK2)
+ if (weapon_prepareattack_check(1, cvar("g_balance_campingrifle_secondary_refire")))
if (time >= self.campingrifle_accumulator + cvar("g_balance_campingrifle_secondary_burstcost"))
- if (weapon_prepareattack(1, cvar("g_balance_campingrifle_secondary_refire")))
{
- W_CampingRifle_Attack2();
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_campingrifle_secondary_animtime"), W_CampingRifle_CheckReloadAndReady);
+ weapon_prepareattack_do(1, cvar("g_balance_campingrifle_secondary_refire"));
+ W_CampingRifle_BulletHail(cvar("g_balance_campingrifle_secondary_bullethail"), W_CampingRifle_Attack2, WFRAME_FIRE2, cvar("g_balance_campingrifle_secondary_animtime"), cvar("g_balance_campingrifle_primary_refire"));
self.campingrifle_accumulator += cvar("g_balance_campingrifle_secondary_burstcost");
}
}
+
void W_GiveWeapon (entity e, float wep, string name)
{
entity oldself;
void W_BallisticBullet_Touch (void)
{
+ float density;
+
if(self.think == W_BallisticBullet_LeaveSolid_think) // skip this!
return;
PROJECTILE_TOUCH;
W_BallisticBullet_Hit ();
+ density = other.ballistics_density;
+ if(density == 0)
+ density = 1;
+
// go through solid!
- if(!W_BallisticBullet_LeaveSolid(self, self.velocity, self.dmg_radius))
+ if(!W_BallisticBullet_LeaveSolid(self, self.velocity, self.dmg_radius * density))
{
remove(self);
return;
void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, float lifetime, float damage, float headshotbonus, float force, float dtype, float tracereffects, float gravityfactor, float bulletconstant)
{
- float lag, dt, savetime;
+ float lag, dt, savetime, density;
entity pl, oldself;
entity proj;
W_BallisticBullet_Hit();
}
+ density = other.ballistics_density;
+ if(density == 0)
+ density = 1;
+
// go through solid!
- if(!W_BallisticBullet_LeaveSolid(self, self.velocity, self.dmg_radius))
+ if(!W_BallisticBullet_LeaveSolid(self, self.velocity, self.dmg_radius * density))
break;
W_BallisticBullet_LeaveSolid_think();
void W_Plasma_Explode_Combo (void)
{
-
W_Plasma_TriggerCombo(self.origin, cvar("g_balance_electro_combo_comboradius"), self.owner);
self.event_damage = SUB_Null;
else
{
self.use = W_Plasma_Explode;
- self.think = adaptor_think2use;
+ self.think = adaptor_think2use; // not _hittype_splash, as this runs "immediately"
}
}
}
proj.bot_dodge = TRUE;
proj.bot_dodgerating = cvar("g_balance_electro_primary_damage");
proj.use = W_Plasma_Explode;
- proj.think = adaptor_think2use;
+ proj.think = adaptor_think2use_hittype_splash;
proj.nextthink = time + cvar("g_balance_electro_primary_lifetime");
PROJECTILE_MAKETRIGGER(proj);
proj.projectiledeathtype = WEP_ELECTRO;
proj.classname = "plasma";
proj.owner = self;
proj.use = W_Plasma_Explode;
- proj.think = adaptor_think2use;
+ proj.think = adaptor_think2use_hittype_splash;
proj.bot_dodge = TRUE;
proj.bot_dodgerating = cvar("g_balance_electro_secondary_damage");
proj.nextthink = time + cvar("g_balance_electro_secondary_lifetime");
if(time > self.pushltime)
{
self.cnt = 1;
+ self.projectiledeathtype |= HITTYPE_SPLASH;
W_Fireball_Explode();
return;
}
setsize(gren, '0 0 -3', '0 0 -3');
gren.nextthink = time + cvar("g_balance_grenadelauncher_primary_lifetime");
- gren.think = adaptor_think2use;
+ gren.think = adaptor_think2use_hittype_splash;
gren.use = W_Grenade_Explode;
gren.touch = W_Grenade_Touch1;
W_SETUPPROJECTILEVELOCITY_UP(gren, g_balance_grenadelauncher_primary);
setorigin(gren, w_shotorg);
gren.nextthink = time + cvar("g_balance_grenadelauncher_secondary_lifetime");
- gren.think = adaptor_think2use;
+ gren.think = adaptor_think2use_hittype_splash;
gren.use = W_Grenade_Explode2;
gren.touch = W_Grenade_Touch2;
gren.takedamage = DAMAGE_YES;
missile.bot_dodgerating = cvar("g_balance_hagar_primary_damage");
missile.touch = W_Hagar_Touch;
missile.use = W_Hagar_Explode;
- missile.think = adaptor_think2use;
+ missile.think = adaptor_think2use_hittype_splash;
missile.nextthink = time + cvar("g_balance_hagar_primary_lifetime");
PROJECTILE_MAKETRIGGER(missile);
missile.projectiledeathtype = WEP_HAGAR;
missile.touch = W_Hagar_Touch2;
missile.cnt = 0;
missile.use = W_Hagar_Explode2;
- missile.think = adaptor_think2use;
+ missile.think = adaptor_think2use_hittype_splash;
missile.nextthink = time + cvar("g_balance_hagar_secondary_lifetime_min") + random() * cvar("g_balance_hagar_secondary_lifetime_rand");
PROJECTILE_MAKETRIGGER(missile);
missile.projectiledeathtype = WEP_HAGAR | HITTYPE_SECONDARY;
setsize(gren, '0 0 0', '0 0 0');
gren.nextthink = time + cvar("g_balance_hook_secondary_lifetime");
- gren.think = adaptor_think2use;
+ gren.think = adaptor_think2use_hittype_splash;
gren.use = W_Hook_Explode2;
gren.touch = W_Hook_Touch2;
float dist;
if (time > self.cnt)
+ {
+ self.projectiledeathtype |= HITTYPE_SPLASH;
Seeker_Missile_Explode();
+ }
if (!self.switchweapon)
self.switchweapon = cvar("g_balance_seeker_missile_speed");
missile.bot_dodgerating = cvar("g_balance_seeker_flac_damage");
missile.touch = Seeker_Flac_Explode;
missile.use = Seeker_Flac_Explode;
- missile.think = Seeker_Flac_Explode;
+ missile.think = adaptor_think2use_hittype_splash;
missile.nextthink = time + cvar("g_balance_seeker_flac_lifetime") + cvar("g_balance_seeker_flac_lifetime_rand");
missile.solid = SOLID_BBOX;
missile.scale = 0.4; // BUG: the model is too big