]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into Mario/physics
authorMario <zacjardine@y7mail.com>
Thu, 25 Dec 2014 10:22:26 +0000 (21:22 +1100)
committerMario <zacjardine@y7mail.com>
Thu, 25 Dec 2014 10:22:26 +0000 (21:22 +1100)
1  2 
defaultXonotic.cfg
qcsrc/server/autocvars.qh
qcsrc/server/cl_physics.qc
qcsrc/server/command/cmd.qc
qcsrc/server/defs.qh
qcsrc/server/g_world.qc
qcsrc/server/miscfunctions.qc

diff --combined defaultXonotic.cfg
index 71c8c9cc1d0badfc53f8271e1ed1550514b3778b,cbb8014bc0a0983e99e5fb943c746e09d73e76ee..250f0b70f964412151cf0083db185eca67890dfe
@@@ -34,6 -34,8 +34,8 @@@ seta g_configversion 0        "Configuration f
  // other aliases
  alias +hook +button6
  alias -hook -button6
+ alias +jetpack +button10
+ alias -jetpack -button10
  alias use "impulse 21"
  
  // for backwards compatibility
@@@ -44,8 -46,6 +46,6 @@@ alias dropweapon "impulse 17
  alias +show_info +button7
  alias -show_info -button7
  
- bind f6 team_auto
  // merge lightmaps up to 2048x2048 textures
  mod_q3bsp_lightmapmergepower 4
  
@@@ -57,10 -57,11 +57,11 @@@ _cl_playerskin 
  
  seta cl_reticle 1 "control for toggling whether ANY zoom reticles are shown"
  seta cl_reticle_stretch 0 "whether to stretch reticles so they fit the screen (breaks image proportions)"
- seta cl_reticle_item_nex 1 "draw aiming reticle for the nex weapon's zoom, 0 disables and values between 0 and 1 change alpha"
+ seta cl_reticle_item_vortex 1 "draw aiming reticle for the vortex weapon's zoom, 0 disables and values between 0 and 1 change alpha"
  seta cl_reticle_item_normal 1 "draw reticle when zooming with the zoom button, 0 disables and values between 0 and 1 change alpha"
  fov 100
- seta cl_velocityzoom 0        "velocity based zooming of fov, negative values zoom out"
+ seta cl_velocityzoom_enabled 0 "velocity based zooming of fov"
+ seta cl_velocityzoom_factor 0 "factor of fov zooming (negative values zoom out)"
  seta cl_velocityzoom_type 3 "how to factor in speed, 1 = all velocity in all directions, 2 = velocity only in forward direction (can be negative), 3 = velocity only in forward direction (limited to forward only)"
  seta cl_velocityzoom_speed 1000 "target speed for fov factoring"
  seta cl_velocityzoom_time 0.2 "time value for averaging speed values"
@@@ -226,7 -227,7 +227,7 @@@ seta cl_hitsound_min_pitch 0.75 "minimu
  seta cl_hitsound_max_pitch 1.5 "maximum pitch of hit sound"
  seta cl_hitsound_nom_damage 25 "damage amount at which hitsound bases pitch off"
  
- seta cl_eventchase_death 1 "camera goes into 3rd person mode when the player is dead"
+ seta cl_eventchase_death 1 "camera goes into 3rd person mode when the player is dead; set to 2 to active the effect only when the corpse doesn't move anymore"
  seta cl_eventchase_nexball 1 "camera goes into 3rd person mode when in nexball game-mode"
  seta cl_eventchase_distance 140 "final camera distance"
  seta cl_eventchase_speed 1.3 "how fast the camera slides back, 0 is instant"
@@@ -260,8 -261,8 +261,8 @@@ set sv_timeout_number 2    "how many timeo
  set sv_timeout_leadtime 4     "how long the players will be informed that a timeout was called before it starts, in seconds"
  set sv_timeout_resumetime 3   "how long the remaining timeout-time will be after a player called the timein command"
  
- set g_allow_oldnexbeam 0 "If enabled, clients are allowed to use old v2.3 Nexgun beam"
- seta cl_particles_oldnexbeam 0 "Uses the old v2.3 Nexgun beam instead of the new beam, only works if server allows it (g_allow_oldnexbeam 1)"
+ set g_allow_oldvortexbeam 0 "If enabled, clients are allowed to use old v2.3 Vortex beam"
+ seta cl_particles_oldvortexbeam 0 "Uses the old v2.3 Vortex beam instead of the new beam, only works if server allows it (g_allow_oldvortexbeam 1)"
  
  set g_telefrags 1 "telefragging, i.e. killing someone who stands in the way of someone who is teleporting"
  set g_telefrags_teamplay 1 "never telefrag team mates"
@@@ -363,9 -364,9 +364,9 @@@ set bot_ai_keyboard_threshold 0.5
  set bot_ai_aimskill_offset 0.3 "Amount of error induced to the bots aim"
  set bot_ai_aimskill_think 1 "Aiming velocity. Use values below 1 for slower aiming"
  set bot_ai_custom_weapon_priority_distances "300 850" "Define close and far distances in any order. Based on the distance to the enemy bots will choose different weapons"
- set bot_ai_custom_weapon_priority_far   "minstanex nex rifle electro rocketlauncher grenadelauncher hagar hlac crylink laser uzi fireball seeker shotgun tuba minelayer"      "Desired weapons for far distances ordered by priority"
- set bot_ai_custom_weapon_priority_mid   "minstanex rocketlauncher nex fireball seeker grenadelauncher electro uzi crylink hlac hagar shotgun laser rifle tuba minelayer"      "Desired weapons for middle distances ordered by priority"
- set bot_ai_custom_weapon_priority_close "minstanex shotgun nex uzi hlac tuba seeker hagar crylink grenadelauncher electro rocketlauncher laser fireball rifle minelayer"      "Desired weapons for close distances ordered by priority"
+ set bot_ai_custom_weapon_priority_far   "vaporizer vortex rifle electro devastator mortar hagar hlac crylink blaster machinegun fireball seeker shotgun tuba minelayer"       "Desired weapons for far distances ordered by priority"
+ set bot_ai_custom_weapon_priority_mid   "vaporizer devastator vortex fireball seeker mortar electro machinegun crylink hlac hagar shotgun blaster rifle tuba minelayer arc shockwave" "Desired weapons for middle distances ordered by priority"
+ set bot_ai_custom_weapon_priority_close "vaporizer shotgun vortex machinegun hlac tuba seeker hagar crylink mortar electro devastator blaster fireball rifle minelayer arc shockwave" "Desired weapons for close distances ordered by priority"
  set bot_ai_weapon_combo 1     "Enable bots to do weapon combos"
  set bot_ai_weapon_combo_threshold 0.4 "Try to make a combo N seconds after the last attack"
  set bot_ai_friends_aware_pickup_radius "500"  "Bots will not pickup items if a team mate is this distance near the item"
@@@ -419,9 -420,7 +420,7 @@@ set g_use_ammunition 1 "if set to 0 al
  set g_pickup_items -1 "if set to 0 all items (health, armor, ammo, weapons...) are removed from the map, if 1 they are forced to spawn"
  set g_weaponarena "0" "put in a list of weapons to enable a weapon arena mode, or try \"all\" or \"most\""
  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_laser "1"       "additionally, always provide the laser in random weapon arena games"
- set g_midair 0 "if set to 1 you can only apply damage to your opponent while he is airborne"
- set g_midair_shieldtime 0.3 "number of seconds you are still invincible since you lost contact to the ground"
+ 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"
  set g_forced_respawn 0 "if set to 1 and a player died, that player gets automatically respawned once <g_respawn_delay> seconds are over"
  set g_fullbrightplayers 0 "brightens up player models (note that the color, skin or model of the players does not change!)"
@@@ -459,8 -458,6 +458,6 @@@ seta menu_sandbox_edit_physics 
  seta menu_sandbox_edit_force 1
  seta menu_sandbox_edit_material ""
  
- bind f7 menu_showsandboxtools
  seta menu_monsters_edit_spawn ""
  seta menu_monsters_edit_skin 0
  seta menu_monsters_edit_movetarget 1
@@@ -490,7 -487,7 +487,7 @@@ seta timelimit_suddendeath 5 "number o
  set g_tdm 0 "Team Deathmatch: the team who kills their opponents most often wins"
  set g_tdm_on_dm_maps 0 "when this is set, all DM maps automatically support TDM"
  
- seta teamplay_mode 4 "default teamplay setting in team games. 1 = no friendly fire, self damage. 2 = friendly fire and self damage enabled. 3 = no friendly fire, but self damage enabled. 4 = obey the following four cvars"
+ seta teamplay_mode 4 "default teamplay setting in team games. 1 = no friendly fire, self damage. 2 = friendly fire and self damage enabled. 3 = no friendly fire, but self damage enabled. 4 = obey the cvars g_mirrordamage*, g_friendlyfire* and g_teamdamage_threshold*"
  seta g_mirrordamage 0.700000  "for teamplay 4: mirror damage factor"
  seta g_mirrordamage_virtual 1 "for teamplay 4: do not actually apply mirror damage, just show graphics effect for it"
  seta g_friendlyfire 0.500000  "for teamplay 4: fiendly fire factor"
@@@ -511,8 -508,6 +508,6 @@@ set g_bloodloss 0   "amount of health b
  
  set g_footsteps 1     "serverside footstep sounds"
  
- set g_deathglow 1.25 "when enabled, players stop glowing after they die (the value specifies glow fading speed)"
  set g_multijump 0     "Number of multiple jumps to allow (jumping again in the air), -1 allows for infinite jumps"
  set g_multijump_add 0 "0 = make the current z velocity equal to jumpvelocity, 1 = add jumpvelocity to the current z velocity"
  set g_multijump_speed -999999 "Minimum vertical speed a player must have in order to jump again"
@@@ -631,19 -626,6 +626,6 @@@ alias togglezoom "${_togglezoom}zoom
  
  alias reload "impulse 20"
  
- // movement
- bind w +forward
- bind a +moveleft
- bind s +back
- bind d +moveright
- bind UPARROW +forward
- bind LEFTARROW +moveleft
- bind DOWNARROW +back
- bind RIGHTARROW +moveright
- bind SHIFT +crouch
- bind ENTER +jump
- bind SPACE +jump
  // weapons
  alias weapon_group_1 "impulse 1"
  alias weapon_group_2 "impulse 2"
@@@ -656,102 -638,6 +638,6 @@@ alias weapon_group_8 "impulse 8
  alias weapon_group_9 "impulse 9"
  alias weapon_group_0 "impulse 14" // cycles the superweapons
  exec weapons.cfg
- bind 0 weapon_group_0
- bind 1 weapon_group_1
- bind 2 weapon_group_2
- bind 3 weapon_group_3
- bind 4 weapon_group_4
- bind 5 weapon_group_5
- bind 6 weapon_group_6
- bind 7 weapon_group_7
- bind 8 weapon_group_8
- bind 9 weapon_group_9
- bind q weaplast
- bind MOUSE1 +fire
- bind MOUSE2 +fire2
- bind MOUSE3 togglezoom
- bind MOUSE4 weaplast
- bind MOUSE5 +hook
- bind MWHEELUP weapnext
- bind MWHEELDOWN weapprev
- bind r reload
- bind BACKSPACE dropweapon
- bind g dropweapon
- bind f +use
- bind v +button8 // drag object
- // misc
- bind e +hook
- bind ` toggleconsole
- bind ~ toggleconsole
- bind TAB +showscores
- bind ESCAPE togglemenu
- bind t messagemode
- bind y messagemode2
- bind z messagemode2
- bind u "+con_chat_maximize"
- bind m +hud_panel_radar_maximized
- bind i +show_info
- bind PAUSE pause
- bind F10 menu_showquitdialog
- bind F11 disconnect
- bind F12 screenshot
- bind F4 ready
- bind ALT +showaccuracy
- // Gamepad defaults. Tested with Logitech Rumblepad 2, I hope similar ones works as well.
- bind JOY1 "+crouch"
- bind JOY2 "+jump"
- bind JOY3 "weapprev"
- bind JOY4 "weapnext"
- bind JOY5 "+fire2"
- bind JOY6 "+fire"
- bind JOY7 "+zoom"
- bind JOY8 "dropweapon"
- bind JOY9 "menu_showteamselect"
- bind JOY10 "+show_info"
- bind JOY11 "+showscores"
- bind JOY12 "+con_chat_maximize"
- seta joyadvanced "1"
- seta joyadvaxisr "2"
- seta joyadvaxisx "3"
- seta joyadvaxisy "1"
- seta joyadvaxisz "4"
- seta joysidesensitivity "1.0"
- seta joypitchsensitivity "0.9"
- seta joyyawsensitivity "-1.8"
- // SDL only
- seta joy_deadzoneforward "0.05"
- seta joy_deadzonepitch "0.05"
- seta joy_deadzoneside "0.05"
- seta joy_deadzoneup "0.05"
- seta joy_deadzoneyaw "0.05"
- seta joy_sensitivitypitch "0.9"
- seta joy_sensitivityyaw "-1.8"
- // team say
- bind kp_ins messagemode
- bind kp_del messagemode2
- bind kp_end "+userbind 1"
- bind kp_downarrow "+userbind 2"
- bind kp_pgdn "+userbind 3"
- bind kp_leftarrow "+userbind 4"
- bind kp_5 "+userbind 6"
- bind kp_rightarrow "+userbind 7"
- bind kp_home "+userbind 9"
- bind kp_uparrow "+userbind 10"
- bind kp_pgup "+userbind 11"
- bind kp_multiply "+userbind 12"
- bind kp_slash "+userbind 13"
- bind kp_enter "+userbind 16"
- bind kp_plus "+userbind 17"
- bind kp_minus "+userbind 18"
- bind F1 vyes
- bind F2 vno
- //used for spectate/observer mode
- bind F3 spec
  
  // score log
  set sv_logscores_console 0    "print scores to server console"
@@@ -897,43 -783,7 +783,7 @@@ set g_banned_list_idmode "1"      "when set
  
  r_labelsprites_scale 0.40625 // labels sprites get displayed at 0.5x from 640x480 to 1280x1024, and at 1x from 1600x1200 onwards
  
- // usercommands. These can be edited and bound by the menu.
- seta "userbind1_press" "say_team quad soon";  seta "userbind1_release" "";  seta "userbind1_description" "team: quad soon"
- seta "userbind2_press" "say_team free item %x^7 (l:%y^7); g_waypointsprite_team_here_p";  seta "userbind2_release" "";  seta "userbind2_description" "team: free item, icon"
- seta "userbind3_press" "say_team took item (l:%l^7); g_waypointsprite_team_here";  seta "userbind3_release" "";  seta "userbind3_description" "team: took item, icon"
- seta "userbind4_press" "say_team negative";  seta "userbind4_release" "";  seta "userbind4_description" "team: negative"
- seta "userbind5_press" "say_team positive";  seta "userbind5_release" "";  seta "userbind5_description" "team: positive"
- seta "userbind6_press" "say_team need help (l:%l^7) (h:%h^7 a:%a^7 w:%w^7); g_waypointsprite_team_helpme; cmd voice needhelp";  seta "userbind6_release" "";  seta "userbind6_description" "team: need help, icon"
- seta "userbind7_press" "say_team enemy seen (l:%y^7); g_waypointsprite_team_danger_p; cmd voice incoming";  seta "userbind7_release" "";  seta "userbind7_description" "team: enemy seen, icon"
- seta "userbind8_press" "say_team flag seen (l:%y^7); g_waypointsprite_team_here_p; cmd voice seenflag";  seta "userbind8_release" "";  seta "userbind8_description" "team: flag seen, icon"
- seta "userbind9_press" "say_team defending (l:%l^7) (h:%h^7 a:%a^7 w:%w^7); g_waypointsprite_team_here";  seta "userbind9_release" "";  seta "userbind9_description" "team: defending, icon"
- seta "userbind10_press" "say_team roaming (l:%l^7) (h:%h^7 a:%a^7 w:%w^7); g_waypointsprite_team_here";  seta "userbind10_release" "";  seta "userbind10_description" "team: roaming, icon"
- seta "userbind11_press" "say_team attacking (l:%l^7) (h:%h^7 a:%a^7 w:%w^7); g_waypointsprite_team_here";  seta "userbind11_release" "";  seta "userbind11_description" "team: attacking, icon"
- seta "userbind12_press" "say_team killed flagcarrier (l:%y^7); g_waypointsprite_team_here_p"; seta "userbind12_release" ""; seta "userbind12_description" "team: killed flag, icon"
- seta "userbind13_press" "say_team dropped flag (l:%d^7); g_waypointsprite_team_here_d"; seta "userbind13_release" ""; seta "userbind13_description" "team: dropped flag, icon"
- seta "userbind14_press" "say_team dropped gun %w^7 (l:%l^7); g_waypointsprite_team_here; wait; dropweapon"; seta "userbind14_release" ""; seta "userbind14_description" "team: drop gun, icon"
- // TODO change this to "use" once we can
- seta "userbind15_press" "say_team dropped flag/key %w^7 (l:%l^7); g_waypointsprite_team_here; wait; +use"; seta "userbind15_release" "-use"; seta "userbind15_description" "team: drop flag/key, icon"
- seta "userbind16_press" "say :-) / nice one"; seta "userbind16_release" ""; seta "userbind16_description" "chat: nice one"
- seta "userbind17_press" "say good game"; seta "userbind17_release" ""; seta "userbind17_description" "chat: good game"
- seta "userbind18_press" "say hi / good luck and have fun"; seta "userbind18_release" ""; seta "userbind18_description" "chat: hi / good luck"
- seta "userbind19_press" "+showscores; +con_chat_maximize"; seta "userbind19_release" "-showscores; -con_chat_maximize"; seta "userbind19_description" "scoreboard / chat history"
- seta "userbind20_press" "toggle cl_capturevideo"; seta "userbind20_release" ""; seta "userbind20_description" "toggle recording .avi"
- seta "userbind21_press" "toggle vid_fullscreen; vid_restart"; seta "userbind21_release" ""; seta "userbind21_description" "toggle fullscreen"
- seta "userbind22_press" ""; seta "userbind22_release" ""; seta "userbind22_description" ""
- seta "userbind23_press" ""; seta "userbind23_release" ""; seta "userbind23_description" ""
- seta "userbind24_press" ""; seta "userbind24_release" ""; seta "userbind24_description" ""
- seta "userbind25_press" ""; seta "userbind25_release" ""; seta "userbind25_description" ""
- seta "userbind26_press" ""; seta "userbind26_release" ""; seta "userbind26_description" ""
- seta "userbind27_press" ""; seta "userbind27_release" ""; seta "userbind27_description" ""
- seta "userbind28_press" ""; seta "userbind28_release" ""; seta "userbind28_description" ""
- seta "userbind29_press" ""; seta "userbind29_release" ""; seta "userbind29_description" ""
- seta "userbind30_press" ""; seta "userbind30_release" ""; seta "userbind30_description" ""
- seta "userbind31_press" ""; seta "userbind31_release" ""; seta "userbind31_description" ""
- seta "userbind32_press" ""; seta "userbind32_release" ""; seta "userbind32_description" ""
- alias _userbind_call "${$1}"
- alias +userbind "_userbind_call userbind${1}_press"
- alias -userbind "_userbind_call userbind${1}_release"
+ exec binds-default.cfg
  
  // we must change its default from 1.0 to 1 to be consistent with menuqc
  set slowmo 1
@@@ -1147,14 -997,14 +997,14 @@@ sv_allowdownloads 0 // download protoco
  
  set g_jump_grunt 0    "Do you make a grunting noise every time you jump? Is it the same grunting noise every time?"
  
- seta cl_weaponpriority "minstanex nex fireball grenadelauncher uzi hagar rifle electro rocketlauncher crylink minelayer shotgun hlac tuba laser porto seeker hook" "weapon priority list"
+ seta cl_weaponpriority "vaporizer vortex fireball mortar machinegun hagar rifle arc electro devastator crylink minelayer shotgun hlac tuba blaster porto seeker hook" "weapon priority list"
  seta cl_weaponpriority_useforcycling 0 "when set, weapon cycling by the mouse wheel makes use of the weapon priority list (the special value 2 uses the weapon ID list for cycling)"
- seta cl_weaponpriority0 "rocketlauncher grenadelauncher hagar seeker fireball" "use impulse 200 for prev gun from this list, 210 for best gun, 220 for next gun.  Default value: explosives"
- seta cl_weaponpriority1 "minstanex nex crylink hlac electro laser"             "use impulse 201 for prev gun from this list, 211 for best gun, 221 for next gun.  Default value: energy"
- seta cl_weaponpriority2 "minstanex nex rifle"                           "use impulse 202 for prev gun from this list, 212 for best gun, 222 for next gun.  Default value: hitscan exact"
- seta cl_weaponpriority3 "minstanex nex rifle uzi shotgun"               "use impulse 203 for prev gun from this list, 213 for best gun, 223 for next gun.  Default value: hitscan all"
- seta cl_weaponpriority4 "grenadelauncher minelayer hlac hagar crylink seeker shotgun"    "use impulse 204 for prev gun from this list, 214 for best gun, 224 for next gun.  Default value: spam weapons"
- seta cl_weaponpriority5 "laser hook porto"                                     "use impulse 205 for prev gun from this list, 215 for best gun, 225 for next gun.  Default value: weapons for moving"
+ seta cl_weaponpriority0 "devastator mortar hagar seeker fireball" "use impulse 200 for prev gun from this list, 210 for best gun, 220 for next gun.  Default value: explosives"
+ seta cl_weaponpriority1 "vaporizer vortex crylink hlac arc electro blaster shockwave"             "use impulse 201 for prev gun from this list, 211 for best gun, 221 for next gun.  Default value: energy"
+ seta cl_weaponpriority2 "vaporizer vortex rifle"                           "use impulse 202 for prev gun from this list, 212 for best gun, 222 for next gun.  Default value: hitscan exact"
+ seta cl_weaponpriority3 "vaporizer vortex rifle machinegun shotgun"               "use impulse 203 for prev gun from this list, 213 for best gun, 223 for next gun.  Default value: hitscan all"
+ seta cl_weaponpriority4 "mortar minelayer hlac hagar crylink seeker shotgun"    "use impulse 204 for prev gun from this list, 214 for best gun, 224 for next gun.  Default value: spam weapons"
+ seta cl_weaponpriority5 "blaster shockwave hook porto"                                     "use impulse 205 for prev gun from this list, 215 for best gun, 225 for next gun.  Default value: weapons for moving"
  seta cl_weaponpriority6 "" "use impulse 206 for prev gun from this list, 216 for best gun, 226 for next gun"
  seta cl_weaponpriority7 "" "use impulse 207 for prev gun from this list, 217 for best gun, 227 for next gun"
  seta cl_weaponpriority8 "" "use impulse 208 for prev gun from this list, 218 for best gun, 228 for next gun"
@@@ -1178,9 -1028,9 +1028,9 @@@ seta cl_clippedspectating 1 "movement c
  
  seta cl_autoscreenshot 1 "Take a screenshot upon the end of a match... 0 = Disable completely, 1 = Allow sv_autoscreenshot to take a screenshot when requested, 2 = Always take an autoscreenshot anyway."
  
+ seta cl_jetpack_jump 1 "Activate jetpack by pressing jump in the air. 0 = Disable, 1 = Stop when touching ground, 2 = Enable"
  // must be at the bottom of this file:
- // alias for switching the teamselect menu
- bind f5 menu_showteamselect
  
  set g_bugrigs 0
  set g_bugrigs_planar_movement 1       "BROTRR bug emulation"
@@@ -1241,7 -1091,7 +1091,7 @@@ seta cl_gentle_gibs 0           "client side gen
  seta cl_gentle_messages 0     "client side gentle mode (only replaces frag messages/centerprints)"
  seta cl_gentle_damage 0               "client side gentle mode (only replaces damage flash); when set to 1, a white flash replaces the blood image, when set to 2, a randomily colored flash is used instead"
  
- set g_jetpack 0 "Jetpack mutator (uses the hook's button, can't coexist with the offhand hook, but only with the onhand one)"
+ set g_jetpack 0 "Jetpack mutator"
  
  set g_running_guns 0 "... or wonder, till it drives you mad, what would have followed if you had."
  set g_bastet 0 "don't try"
@@@ -1315,8 -1165,6 +1165,6 @@@ set sv_accuracy_data_send 1 "1 send wea
  set cl_accuracy_data_share 0 "1 share my weapon accuracy data statistics with other players, 0 keep my weapon accuracy data statistics hidden"
  set cl_accuracy_data_receive 0 "1 receive weapon accuracy data statistics at the end of the match"
  
- set developer_fteqccbugs 0 "check fteqcc bugs on startup"
- set _allow_unacceptable_compiler_bugs 0 "don't bail out if certain bugs are detected (HANDLE WITH CARE)"
  set spawn_debug 0 "use all spawns one by one, then abort, to verify all spawnpoints"
  set loddebug 0 "force this LOD level"
  set spawn_debugview 0 "display spawnpoints and their rating on spawn to debug spawnpoint rating calculation"
@@@ -1380,25 -1228,7 +1228,7 @@@ volume 
  // 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_tuba ""
- set g_weaponreplace_fireball ""
- set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun (for Q3A map compatibility in mapinfo files)"
+ set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping machinegun and shotgun (for Q3A map compatibility in mapinfo files)"
  
  set g_movement_highspeed 1 "movement speed modification factor (only changes movement when above maxspeed)"
  
@@@ -1552,8 -1382,7 +1382,7 @@@ scr_loadingscreen_scale_base 
  scr_loadingscreen_scale_limit 2
  
  // other config files
- exec mutator_new_toys.cfg // run BEFORE balance to make sure balance wins
- exec balanceXonotic.cfg
+ exec balance-xonotic.cfg
  exec effects-normal.cfg
  exec physicsX.cfg
  exec turrets.cfg
@@@ -1563,7 -1392,6 +1392,7 @@@ exec gamemodes.cf
  exec mutators.cfg
  exec notifications.cfg
  exec monsters.cfg
 +exec physics.cfg
  
  // load console command aliases and settings
  exec commands.cfg
index 33660f1ba925ed83e4ec7c3561ba027f9ffe3897,d3003d7c4656b5fad4268b08b054a276327b5201..c672d76ec4567cae62404d6d0604b47869e3824f
@@@ -64,11 -64,10 +64,10 @@@ float autocvar_bot_wander_enable
  float autocvar_captureleadlimit_override;
  #define autocvar_capturelimit_override cvar("capturelimit_override")
  #define autocvar_developer cvar("developer")
- float autocvar_developer_fteqccbugs;
  float autocvar_ekg;
  #define autocvar_fraglimit cvar("fraglimit")
  #define autocvar_fraglimit_override cvar("fraglimit_override")
- float autocvar_g_allow_oldnexbeam;
+ float autocvar_g_allow_oldvortexbeam;
  float autocvar_g_antilag;
  float autocvar_g_antilag_nudge;
  float autocvar_g_balance_armor_blockpercent;
@@@ -80,33 -79,6 +79,6 @@@ float autocvar_g_balance_armor_rot
  float autocvar_g_balance_armor_rotlinear;
  float autocvar_g_balance_armor_rotstable;
  float autocvar_g_balance_armor_start;
- float autocvar_g_balance_rifle_bursttime;
- float autocvar_g_balance_rifle_primary_ammo;
- float autocvar_g_balance_rifle_primary_animtime;
- float autocvar_g_balance_rifle_primary_bullethail;
- float autocvar_g_balance_rifle_primary_burstcost;
- float autocvar_g_balance_rifle_primary_damage;
- float autocvar_g_balance_rifle_primary_force;
- float autocvar_g_balance_rifle_primary_refire;
- float autocvar_g_balance_rifle_primary_shots;
- float autocvar_g_balance_rifle_primary_solidpenetration;
- float autocvar_g_balance_rifle_primary_spread;
- float autocvar_g_balance_rifle_primary_tracer;
- float autocvar_g_balance_rifle_secondary;
- float autocvar_g_balance_rifle_secondary_ammo;
- float autocvar_g_balance_rifle_secondary_animtime;
- float autocvar_g_balance_rifle_secondary_bullethail;
- float autocvar_g_balance_rifle_secondary_burstcost;
- float autocvar_g_balance_rifle_secondary_damage;
- float autocvar_g_balance_rifle_secondary_force;
- float autocvar_g_balance_rifle_secondary_reload;
- float autocvar_g_balance_rifle_secondary_refire;
- float autocvar_g_balance_rifle_secondary_shots;
- float autocvar_g_balance_rifle_secondary_solidpenetration;
- float autocvar_g_balance_rifle_secondary_spread;
- float autocvar_g_balance_rifle_secondary_tracer;
- float autocvar_g_balance_rifle_reload_ammo;
- float autocvar_g_balance_rifle_reload_time;
  float autocvar_g_balance_cloaked_alpha;
  float autocvar_g_balance_contents_damagerate;
  float autocvar_g_balance_contents_drowndelay;
@@@ -114,134 -86,11 +86,11 @@@ float autocvar_g_balance_contents_playe
  float autocvar_g_balance_contents_playerdamage_lava;
  float autocvar_g_balance_contents_playerdamage_slime;
  float autocvar_g_balance_contents_projectiledamage;
- float autocvar_g_balance_crylink_primary_ammo;
- float autocvar_g_balance_crylink_primary_animtime;
- float autocvar_g_balance_crylink_primary_bouncedamagefactor;
- float autocvar_g_balance_crylink_primary_bounces;
- float autocvar_g_balance_crylink_primary_damage;
- float autocvar_g_balance_crylink_primary_edgedamage;
- float autocvar_g_balance_crylink_primary_force;
- float autocvar_g_balance_crylink_primary_joindelay;
- float autocvar_g_balance_crylink_primary_joinexplode;
- float autocvar_g_balance_crylink_primary_joinexplode_damage;
- float autocvar_g_balance_crylink_primary_joinexplode_edgedamage;
- float autocvar_g_balance_crylink_primary_joinexplode_force;
- float autocvar_g_balance_crylink_primary_joinexplode_radius;
- float autocvar_g_balance_crylink_primary_joinspread;
- float autocvar_g_balance_crylink_primary_linkexplode;
- float autocvar_g_balance_crylink_primary_middle_fadetime;
- float autocvar_g_balance_crylink_primary_middle_lifetime;
- float autocvar_g_balance_crylink_primary_other_fadetime;
- float autocvar_g_balance_crylink_primary_other_lifetime;
- float autocvar_g_balance_crylink_primary_radius;
- float autocvar_g_balance_crylink_primary_refire;
- float autocvar_g_balance_crylink_primary_shots;
- float autocvar_g_balance_crylink_primary_speed;
- float autocvar_g_balance_crylink_primary_spread;
- float autocvar_g_balance_crylink_secondary;
- float autocvar_g_balance_crylink_secondary_ammo;
- float autocvar_g_balance_crylink_secondary_animtime;
- float autocvar_g_balance_crylink_secondary_bouncedamagefactor;
- float autocvar_g_balance_crylink_secondary_bounces;
- float autocvar_g_balance_crylink_secondary_damage;
- float autocvar_g_balance_crylink_secondary_edgedamage;
- float autocvar_g_balance_crylink_secondary_force;
- float autocvar_g_balance_crylink_secondary_joindelay;
- float autocvar_g_balance_crylink_secondary_joinexplode;
- float autocvar_g_balance_crylink_secondary_joinexplode_damage;
- float autocvar_g_balance_crylink_secondary_joinexplode_edgedamage;
- float autocvar_g_balance_crylink_secondary_joinexplode_force;
- float autocvar_g_balance_crylink_secondary_joinexplode_radius;
- float autocvar_g_balance_crylink_secondary_joinspread;
- float autocvar_g_balance_crylink_secondary_line_fadetime;
- float autocvar_g_balance_crylink_secondary_line_lifetime;
- float autocvar_g_balance_crylink_secondary_linkexplode;
- float autocvar_g_balance_crylink_secondary_middle_fadetime;
- float autocvar_g_balance_crylink_secondary_middle_lifetime;
- float autocvar_g_balance_crylink_secondary_radius;
- float autocvar_g_balance_crylink_secondary_refire;
- float autocvar_g_balance_crylink_secondary_shots;
- float autocvar_g_balance_crylink_secondary_speed;
- float autocvar_g_balance_crylink_secondary_spread;
- float autocvar_g_balance_crylink_secondary_spreadtype;
- float autocvar_g_balance_crylink_reload_ammo;
- float autocvar_g_balance_crylink_reload_time;
  float autocvar_g_balance_damagepush_speedfactor;
- float autocvar_g_balance_electro_combo_comboradius;
- float autocvar_g_balance_electro_combo_damage;
- float autocvar_g_balance_electro_combo_edgedamage;
- float autocvar_g_balance_electro_combo_force;
- float autocvar_g_balance_electro_combo_radius;
- float autocvar_g_balance_electro_combo_speed;
- float autocvar_g_balance_electro_combo_safeammocheck;
- float autocvar_g_balance_electro_lightning;
- float autocvar_g_balance_electro_primary_ammo;
- float autocvar_g_balance_electro_primary_animtime;
- float autocvar_g_balance_electro_primary_comboradius;
- float autocvar_g_balance_electro_primary_damage;
- float autocvar_g_balance_electro_primary_edgedamage;
- float autocvar_g_balance_electro_primary_falloff_halflifedist;
- float autocvar_g_balance_electro_primary_falloff_maxdist;
- float autocvar_g_balance_electro_primary_falloff_mindist;
- float autocvar_g_balance_electro_primary_force;
- float autocvar_g_balance_electro_primary_force_up;
- float autocvar_g_balance_electro_primary_lifetime;
- float autocvar_g_balance_electro_primary_radius;
- float autocvar_g_balance_electro_primary_range;
- float autocvar_g_balance_electro_primary_refire;
- float autocvar_g_balance_electro_primary_speed;
- float autocvar_g_balance_electro_secondary_ammo;
- float autocvar_g_balance_electro_secondary_animtime;
- float autocvar_g_balance_electro_secondary_bouncefactor;
- float autocvar_g_balance_electro_secondary_bouncestop;
- float autocvar_g_balance_electro_secondary_count;
- float autocvar_g_balance_electro_secondary_damage;
- float autocvar_g_balance_electro_secondary_damageforcescale;
- float autocvar_g_balance_electro_secondary_damagedbycontents;
- float autocvar_g_balance_electro_secondary_edgedamage;
- float autocvar_g_balance_electro_secondary_force;
- float autocvar_g_balance_electro_secondary_health;
- float autocvar_g_balance_electro_secondary_lifetime;
- float autocvar_g_balance_electro_secondary_radius;
- float autocvar_g_balance_electro_secondary_refire;
- float autocvar_g_balance_electro_secondary_refire2;
- float autocvar_g_balance_electro_secondary_speed;
- float autocvar_g_balance_electro_reload_ammo;
- float autocvar_g_balance_electro_reload_time;
  float autocvar_g_balance_falldamage_deadminspeed;
  float autocvar_g_balance_falldamage_factor;
  float autocvar_g_balance_falldamage_maxdamage;
  float autocvar_g_balance_falldamage_minspeed;
- float autocvar_g_balance_fireball_primary_animtime;
- float autocvar_g_balance_fireball_primary_bfgdamage;
- float autocvar_g_balance_fireball_primary_bfgforce;
- float autocvar_g_balance_fireball_primary_bfgradius;
- float autocvar_g_balance_fireball_primary_damage;
- float autocvar_g_balance_fireball_primary_damageforcescale;
- float autocvar_g_balance_fireball_primary_edgedamage;
- float autocvar_g_balance_fireball_primary_force;
- float autocvar_g_balance_fireball_primary_health;
- float autocvar_g_balance_fireball_primary_laserburntime;
- float autocvar_g_balance_fireball_primary_laserdamage;
- float autocvar_g_balance_fireball_primary_laseredgedamage;
- float autocvar_g_balance_fireball_primary_laserradius;
- float autocvar_g_balance_fireball_primary_lifetime;
- float autocvar_g_balance_fireball_primary_radius;
- float autocvar_g_balance_fireball_primary_refire;
- float autocvar_g_balance_fireball_primary_refire2;
- float autocvar_g_balance_fireball_primary_speed;
- float autocvar_g_balance_fireball_secondary_animtime;
- float autocvar_g_balance_fireball_secondary_damage;
- float autocvar_g_balance_fireball_secondary_damageforcescale;
- float autocvar_g_balance_fireball_secondary_damagetime;
- float autocvar_g_balance_fireball_secondary_laserburntime;
- float autocvar_g_balance_fireball_secondary_laserdamage;
- float autocvar_g_balance_fireball_secondary_laseredgedamage;
- float autocvar_g_balance_fireball_secondary_laserradius;
- float autocvar_g_balance_fireball_secondary_lifetime;
- float autocvar_g_balance_fireball_secondary_refire;
- float autocvar_g_balance_fireball_secondary_speed;
- float autocvar_g_balance_fireball_secondary_speed_up;
  float autocvar_g_balance_firetransfer_damage;
  float autocvar_g_balance_firetransfer_time;
  float autocvar_g_balance_fuel_limit;
@@@ -261,75 -110,6 +110,6 @@@ float autocvar_g_balance_grapplehook_sp
  float autocvar_g_balance_grapplehook_stretch;
  float autocvar_g_balance_grapplehook_damagedbycontents;
  float autocvar_g_balance_grapplehook_refire;
- float autocvar_g_balance_grenadelauncher_bouncefactor;
- float autocvar_g_balance_grenadelauncher_bouncestop;
- float autocvar_g_balance_grenadelauncher_primary_ammo;
- float autocvar_g_balance_grenadelauncher_primary_animtime;
- float autocvar_g_balance_grenadelauncher_primary_damage;
- float autocvar_g_balance_grenadelauncher_primary_damageforcescale;
- float autocvar_g_balance_grenadelauncher_primary_edgedamage;
- float autocvar_g_balance_grenadelauncher_primary_force;
- float autocvar_g_balance_grenadelauncher_primary_health;
- float autocvar_g_balance_grenadelauncher_primary_lifetime;
- float autocvar_g_balance_grenadelauncher_primary_lifetime_stick;
- float autocvar_g_balance_grenadelauncher_primary_radius;
- float autocvar_g_balance_grenadelauncher_primary_refire;
- float autocvar_g_balance_grenadelauncher_primary_remote_minbouncecnt;
- float autocvar_g_balance_grenadelauncher_primary_speed;
- float autocvar_g_balance_grenadelauncher_primary_speed_up;
- float autocvar_g_balance_grenadelauncher_primary_type;
- float autocvar_g_balance_grenadelauncher_secondary_ammo;
- float autocvar_g_balance_grenadelauncher_secondary_animtime;
- float autocvar_g_balance_grenadelauncher_secondary_damage;
- float autocvar_g_balance_grenadelauncher_secondary_damageforcescale;
- float autocvar_g_balance_grenadelauncher_secondary_edgedamage;
- float autocvar_g_balance_grenadelauncher_secondary_force;
- float autocvar_g_balance_grenadelauncher_secondary_health;
- float autocvar_g_balance_grenadelauncher_secondary_lifetime;
- float autocvar_g_balance_grenadelauncher_secondary_lifetime_bounce;
- float autocvar_g_balance_grenadelauncher_secondary_lifetime_stick;
- float autocvar_g_balance_grenadelauncher_secondary_radius;
- float autocvar_g_balance_grenadelauncher_secondary_refire;
- float autocvar_g_balance_grenadelauncher_secondary_speed;
- float autocvar_g_balance_grenadelauncher_secondary_speed_up;
- float autocvar_g_balance_grenadelauncher_secondary_type;
- float autocvar_g_balance_grenadelauncher_reload_ammo;
- float autocvar_g_balance_grenadelauncher_reload_time;
- float autocvar_g_balance_hagar_primary_ammo;
- float autocvar_g_balance_hagar_primary_damage;
- float autocvar_g_balance_hagar_primary_edgedamage;
- float autocvar_g_balance_hagar_primary_force;
- float autocvar_g_balance_hagar_primary_health;
- float autocvar_g_balance_hagar_primary_damageforcescale;
- float autocvar_g_balance_hagar_primary_lifetime;
- float autocvar_g_balance_hagar_primary_radius;
- float autocvar_g_balance_hagar_primary_refire;
- float autocvar_g_balance_hagar_primary_speed;
- float autocvar_g_balance_hagar_secondary;
- float autocvar_g_balance_hagar_secondary_load;
- float autocvar_g_balance_hagar_secondary_load_speed;
- float autocvar_g_balance_hagar_secondary_load_spread;
- float autocvar_g_balance_hagar_secondary_load_spread_bias;
- float autocvar_g_balance_hagar_secondary_load_max;
- float autocvar_g_balance_hagar_secondary_load_hold;
- float autocvar_g_balance_hagar_secondary_load_releasedeath;
- float autocvar_g_balance_hagar_secondary_load_abort;
- float autocvar_g_balance_hagar_secondary_load_linkexplode;
- float autocvar_g_balance_hagar_secondary_load_animtime;
- float autocvar_g_balance_hagar_secondary_ammo;
- float autocvar_g_balance_hagar_secondary_damage;
- float autocvar_g_balance_hagar_secondary_edgedamage;
- float autocvar_g_balance_hagar_secondary_force;
- float autocvar_g_balance_hagar_secondary_health;
- float autocvar_g_balance_hagar_secondary_damageforcescale;
- float autocvar_g_balance_hagar_secondary_lifetime_min;
- float autocvar_g_balance_hagar_secondary_lifetime_rand;
- float autocvar_g_balance_hagar_secondary_radius;
- float autocvar_g_balance_hagar_secondary_refire;
- float autocvar_g_balance_hagar_secondary_speed;
- float autocvar_g_balance_hagar_secondary_spread;
- float autocvar_g_balance_hagar_reload_ammo;
- float autocvar_g_balance_hagar_reload_time;
  float autocvar_g_balance_health_limit;
  float autocvar_g_balance_health_regen;
  float autocvar_g_balance_health_regenlinear;
@@@ -337,54 -117,6 +117,6 @@@ float autocvar_g_balance_health_regenst
  float autocvar_g_balance_health_rot;
  float autocvar_g_balance_health_rotlinear;
  float autocvar_g_balance_health_rotstable;
- float autocvar_g_balance_hlac_primary_ammo;
- float autocvar_g_balance_hlac_primary_animtime;
- float autocvar_g_balance_hlac_primary_damage;
- float autocvar_g_balance_hlac_primary_edgedamage;
- float autocvar_g_balance_hlac_primary_force;
- float autocvar_g_balance_hlac_primary_lifetime;
- float autocvar_g_balance_hlac_primary_radius;
- float autocvar_g_balance_hlac_primary_refire;
- float autocvar_g_balance_hlac_primary_speed;
- float autocvar_g_balance_hlac_primary_spread_add;
- float autocvar_g_balance_hlac_primary_spread_crouchmod;
- float autocvar_g_balance_hlac_primary_spread_max;
- float autocvar_g_balance_hlac_primary_spread_min;
- float autocvar_g_balance_hlac_secondary;
- float autocvar_g_balance_hlac_secondary_ammo;
- float autocvar_g_balance_hlac_secondary_animtime;
- float autocvar_g_balance_hlac_secondary_damage;
- float autocvar_g_balance_hlac_secondary_edgedamage;
- float autocvar_g_balance_hlac_secondary_force;
- float autocvar_g_balance_hlac_secondary_lifetime;
- float autocvar_g_balance_hlac_secondary_radius;
- float autocvar_g_balance_hlac_secondary_refire;
- float autocvar_g_balance_hlac_secondary_shots;
- float autocvar_g_balance_hlac_secondary_speed;
- float autocvar_g_balance_hlac_secondary_spread;
- float autocvar_g_balance_hlac_secondary_spread_crouchmod;
- float autocvar_g_balance_hlac_reload_ammo;
- float autocvar_g_balance_hlac_reload_time;
- float autocvar_g_balance_hook_primary_animtime;
- float autocvar_g_balance_hook_primary_fuel;
- float autocvar_g_balance_hook_primary_hooked_fuel;
- float autocvar_g_balance_hook_primary_hooked_time_free;
- float autocvar_g_balance_hook_primary_hooked_time_max;
- float autocvar_g_balance_hook_primary_refire;
- float autocvar_g_balance_hook_secondary_ammo;
- float autocvar_g_balance_hook_secondary_animtime;
- float autocvar_g_balance_hook_secondary_damage;
- float autocvar_g_balance_hook_secondary_duration;
- float autocvar_g_balance_hook_secondary_edgedamage;
- float autocvar_g_balance_hook_secondary_force;
- float autocvar_g_balance_hook_secondary_gravity;
- float autocvar_g_balance_hook_secondary_lifetime;
- float autocvar_g_balance_hook_secondary_power;
- float autocvar_g_balance_hook_secondary_radius;
- float autocvar_g_balance_hook_secondary_refire;
- float autocvar_g_balance_hook_secondary_speed;
- float autocvar_g_balance_hook_secondary_health;
- float autocvar_g_balance_hook_secondary_damageforcescale;
  float autocvar_g_balance_keyhunt_damageforcescale;
  float autocvar_g_balance_keyhunt_delay_collect;
  float autocvar_g_balance_keyhunt_delay_return;
@@@ -402,102 -134,6 +134,6 @@@ float autocvar_g_balance_keyhunt_score_
  float autocvar_g_balance_keyhunt_throwvelocity;
  float autocvar_g_balance_kill_delay;
  float autocvar_g_balance_kill_antispam;
- float autocvar_g_balance_laser_primary_animtime;
- float autocvar_g_balance_laser_primary_damage;
- float autocvar_g_balance_laser_primary_delay;
- float autocvar_g_balance_laser_primary_edgedamage;
- float autocvar_g_balance_laser_primary_force;
- float autocvar_g_balance_laser_primary_force_other_scale;
- float autocvar_g_balance_laser_primary_force_velocitybias;
- float autocvar_g_balance_laser_primary_force_zscale;
- float autocvar_g_balance_laser_primary_lifetime;
- float autocvar_g_balance_laser_primary_radius;
- float autocvar_g_balance_laser_primary_refire;
- float autocvar_g_balance_laser_primary_shotangle;
- float autocvar_g_balance_laser_primary_speed;
- float autocvar_g_balance_laser_secondary;
- float autocvar_g_balance_laser_secondary_animtime;
- float autocvar_g_balance_laser_secondary_damage;
- float autocvar_g_balance_laser_secondary_edgedamage;
- float autocvar_g_balance_laser_secondary_force;
- float autocvar_g_balance_laser_secondary_force_other_scale;
- float autocvar_g_balance_laser_secondary_force_velocitybias;
- float autocvar_g_balance_laser_secondary_force_zscale;
- float autocvar_g_balance_laser_secondary_lifetime;
- float autocvar_g_balance_laser_secondary_radius;
- float autocvar_g_balance_laser_secondary_speed;
- float autocvar_g_balance_laser_reload_ammo;
- float autocvar_g_balance_laser_reload_time;
- float autocvar_g_balance_minelayer_ammo;
- float autocvar_g_balance_minelayer_animtime;
- float autocvar_g_balance_minelayer_damage;
- float autocvar_g_balance_minelayer_damageforcescale;
- float autocvar_g_balance_minelayer_detonatedelay;
- float autocvar_g_balance_minelayer_edgedamage;
- float autocvar_g_balance_minelayer_force;
- float autocvar_g_balance_minelayer_health;
- float autocvar_g_balance_minelayer_lifetime;
- float autocvar_g_balance_minelayer_lifetime_countdown;
- float autocvar_g_balance_minelayer_limit;
- float autocvar_g_balance_minelayer_protection;
- float autocvar_g_balance_minelayer_proximityradius;
- float autocvar_g_balance_minelayer_radius;
- float autocvar_g_balance_minelayer_refire;
- float autocvar_g_balance_minelayer_remote_damage;
- float autocvar_g_balance_minelayer_remote_edgedamage;
- float autocvar_g_balance_minelayer_remote_force;
- float autocvar_g_balance_minelayer_remote_radius;
- float autocvar_g_balance_minelayer_speed;
- float autocvar_g_balance_minelayer_time;
- float autocvar_g_balance_minelayer_reload_ammo;
- float autocvar_g_balance_minelayer_reload_time;
- float autocvar_g_balance_minstanex_ammo;
- float autocvar_g_balance_minstanex_laser_ammo;
- float autocvar_g_balance_minstanex_laser_animtime;
- float autocvar_g_balance_minstanex_laser_refire;
- float autocvar_g_balance_minstanex_animtime;
- float autocvar_g_balance_minstanex_refire;
- float autocvar_g_balance_minstanex_reload_ammo;
- float autocvar_g_balance_minstanex_reload_time;
- float autocvar_g_balance_nex_charge;
- float autocvar_g_balance_nex_charge_animlimit;
- float autocvar_g_balance_nex_charge_limit;
- float autocvar_g_balance_nex_charge_maxspeed;
- float autocvar_g_balance_nex_charge_mindmg;
- float autocvar_g_balance_nex_charge_minspeed;
- float autocvar_g_balance_nex_charge_rate;
- float autocvar_g_balance_nex_charge_rot_pause;
- float autocvar_g_balance_nex_charge_rot_rate;
- float autocvar_g_balance_nex_charge_shot_multiplier;
- float autocvar_g_balance_nex_charge_start;
- float autocvar_g_balance_nex_charge_velocity_rate;
- float autocvar_g_balance_nex_primary_ammo;
- float autocvar_g_balance_nex_primary_animtime;
- float autocvar_g_balance_nex_primary_damage;
- float autocvar_g_balance_nex_primary_damagefalloff_forcehalflife;
- float autocvar_g_balance_nex_primary_damagefalloff_halflife;
- float autocvar_g_balance_nex_primary_damagefalloff_maxdist;
- float autocvar_g_balance_nex_primary_damagefalloff_mindist;
- float autocvar_g_balance_nex_primary_force;
- float autocvar_g_balance_nex_primary_refire;
- float autocvar_g_balance_nex_secondary;
- float autocvar_g_balance_nex_secondary_ammo;
- float autocvar_g_balance_nex_secondary_animtime;
- float autocvar_g_balance_nex_secondary_charge;
- float autocvar_g_balance_nex_secondary_charge_rate;
- float autocvar_g_balance_nex_secondary_chargepool;
- float autocvar_g_balance_nex_secondary_chargepool_pause_health_regen;
- float autocvar_g_balance_nex_secondary_chargepool_pause_regen;
- float autocvar_g_balance_nex_secondary_chargepool_regen;
- float autocvar_g_balance_nex_secondary_damage;
- float autocvar_g_balance_nex_secondary_damagefalloff_forcehalflife;
- float autocvar_g_balance_nex_secondary_damagefalloff_halflife;
- float autocvar_g_balance_nex_secondary_damagefalloff_maxdist;
- float autocvar_g_balance_nex_secondary_damagefalloff_mindist;
- float autocvar_g_balance_nex_secondary_force;
- float autocvar_g_balance_nex_secondary_refire;
- float autocvar_g_balance_nex_reload_ammo;
- float autocvar_g_balance_nex_reload_time;
  float autocvar_g_balance_nexball_primary_animtime;
  float autocvar_g_balance_nexball_primary_refire;
  float autocvar_g_balance_nexball_primary_speed;
@@@ -507,11 -143,13 +143,13 @@@ float autocvar_g_balance_nexball_second
  float autocvar_g_balance_nexball_secondary_refire;
  float autocvar_g_balance_nexball_secondary_speed;
  float autocvar_g_balance_nix_ammo_cells;
+ float autocvar_g_balance_nix_ammo_plasma;
  float autocvar_g_balance_nix_ammo_fuel;
  float autocvar_g_balance_nix_ammo_nails;
  float autocvar_g_balance_nix_ammo_rockets;
  float autocvar_g_balance_nix_ammo_shells;
  float autocvar_g_balance_nix_ammoincr_cells;
+ float autocvar_g_balance_nix_ammoincr_plasma;
  float autocvar_g_balance_nix_ammoincr_fuel;
  float autocvar_g_balance_nix_ammoincr_nails;
  float autocvar_g_balance_nix_ammoincr_rockets;
@@@ -529,15 -167,6 +167,6 @@@ float autocvar_g_balance_pause_health_r
  float autocvar_g_balance_pause_health_rot_spawn;
  float autocvar_g_balance_portal_health;
  float autocvar_g_balance_portal_lifetime;
- float autocvar_g_balance_porto_primary_animtime;
- float autocvar_g_balance_porto_primary_lifetime;
- float autocvar_g_balance_porto_primary_refire;
- float autocvar_g_balance_porto_primary_speed;
- float autocvar_g_balance_porto_secondary;
- float autocvar_g_balance_porto_secondary_animtime;
- float autocvar_g_balance_porto_secondary_lifetime;
- float autocvar_g_balance_porto_secondary_refire;
- float autocvar_g_balance_porto_secondary_speed;
  float autocvar_g_balance_powerup_invincible_takedamage;
  float autocvar_g_balance_powerup_invincible_time;
  float autocvar_g_balance_powerup_strength_damage;
@@@ -546,133 -175,10 +175,10 @@@ float autocvar_g_balance_powerup_streng
  float autocvar_g_balance_powerup_strength_selfforce;
  float autocvar_g_balance_powerup_strength_time;
  float autocvar_g_balance_superweapons_time;
- float autocvar_g_balance_rocketlauncher_ammo;
- float autocvar_g_balance_rocketlauncher_animtime;
- float autocvar_g_balance_rocketlauncher_damage;
- float autocvar_g_balance_rocketlauncher_damageforcescale;
- float autocvar_g_balance_rocketlauncher_detonatedelay;
- float autocvar_g_balance_rocketlauncher_edgedamage;
- float autocvar_g_balance_rocketlauncher_force;
- float autocvar_g_balance_rocketlauncher_guidedelay;
- float autocvar_g_balance_rocketlauncher_guidegoal;
- float autocvar_g_balance_rocketlauncher_guiderate;
- float autocvar_g_balance_rocketlauncher_guideratedelay;
- float autocvar_g_balance_rocketlauncher_guidestop;
- float autocvar_g_balance_rocketlauncher_health;
- float autocvar_g_balance_rocketlauncher_lifetime;
- float autocvar_g_balance_rocketlauncher_radius;
- float autocvar_g_balance_rocketlauncher_refire;
- float autocvar_g_balance_rocketlauncher_remote_damage;
- float autocvar_g_balance_rocketlauncher_remote_edgedamage;
- float autocvar_g_balance_rocketlauncher_remote_force;
- float autocvar_g_balance_rocketlauncher_remote_radius;
- float autocvar_g_balance_rocketlauncher_speed;
- float autocvar_g_balance_rocketlauncher_speedaccel;
- float autocvar_g_balance_rocketlauncher_speedstart;
- float autocvar_g_balance_rocketlauncher_reload_ammo;
- float autocvar_g_balance_rocketlauncher_reload_time;
- float autocvar_g_balance_seeker_type;
- float autocvar_g_balance_seeker_flac_ammo;
- float autocvar_g_balance_seeker_flac_animtime;
- float autocvar_g_balance_seeker_flac_damage;
- float autocvar_g_balance_seeker_flac_edgedamage;
- float autocvar_g_balance_seeker_flac_force;
- float autocvar_g_balance_seeker_flac_lifetime;
- float autocvar_g_balance_seeker_flac_lifetime_rand;
- float autocvar_g_balance_seeker_flac_radius;
- float autocvar_g_balance_seeker_flac_refire;
- float autocvar_g_balance_seeker_missile_accel;
- float autocvar_g_balance_seeker_missile_ammo;
- float autocvar_g_balance_seeker_missile_animtime;
- float autocvar_g_balance_seeker_missile_count;
- float autocvar_g_balance_seeker_missile_damage;
- float autocvar_g_balance_seeker_missile_damageforcescale;
- float autocvar_g_balance_seeker_missile_decel;
- float autocvar_g_balance_seeker_missile_delay;
- float autocvar_g_balance_seeker_missile_edgedamage;
- float autocvar_g_balance_seeker_missile_force;
- float autocvar_g_balance_seeker_missile_health;
- float autocvar_g_balance_seeker_missile_lifetime;
- float autocvar_g_balance_seeker_missile_proxy;
- float autocvar_g_balance_seeker_missile_proxy_delay;
- float autocvar_g_balance_seeker_missile_proxy_maxrange;
- float autocvar_g_balance_seeker_missile_radius;
- float autocvar_g_balance_seeker_missile_refire;
- float autocvar_g_balance_seeker_missile_smart;
- float autocvar_g_balance_seeker_missile_smart_mindist;
- float autocvar_g_balance_seeker_missile_smart_trace_max;
- float autocvar_g_balance_seeker_missile_smart_trace_min;
- float autocvar_g_balance_seeker_missile_speed_max;
- float autocvar_g_balance_seeker_missile_turnrate;
- float autocvar_g_balance_seeker_tag_ammo;
- float autocvar_g_balance_seeker_tag_animtime;
- float autocvar_g_balance_seeker_tag_damageforcescale;
- float autocvar_g_balance_seeker_tag_health;
- float autocvar_g_balance_seeker_tag_lifetime;
- float autocvar_g_balance_seeker_tag_refire;
- float autocvar_g_balance_seeker_tag_speed;
- float autocvar_g_balance_seeker_tag_tracker_lifetime;
- float autocvar_g_balance_seeker_reload_ammo;
- float autocvar_g_balance_seeker_reload_time;
  float autocvar_g_balance_selfdamagepercent;
- float autocvar_g_balance_shotgun_primary_ammo;
- float autocvar_g_balance_shotgun_primary_animtime;
- float autocvar_g_balance_shotgun_primary_bullets;
- float autocvar_g_balance_shotgun_primary_damage;
- float autocvar_g_balance_shotgun_primary_force;
- float autocvar_g_balance_shotgun_primary_refire;
- float autocvar_g_balance_shotgun_primary_solidpenetration;
- float autocvar_g_balance_shotgun_primary_spread;
- float autocvar_g_balance_shotgun_secondary;
- float autocvar_g_balance_shotgun_secondary_animtime;
- float autocvar_g_balance_shotgun_secondary_damage;
- float autocvar_g_balance_shotgun_secondary_force;
- float autocvar_g_balance_shotgun_secondary_melee_delay;
- float autocvar_g_balance_shotgun_secondary_melee_range;
- float autocvar_g_balance_shotgun_secondary_melee_swing_side;
- float autocvar_g_balance_shotgun_secondary_melee_swing_up;
- float autocvar_g_balance_shotgun_secondary_melee_time;
- float autocvar_g_balance_shotgun_secondary_melee_traces;
- float autocvar_g_balance_shotgun_secondary_melee_no_doubleslap;
- float autocvar_g_balance_shotgun_secondary_melee_nonplayerdamage;
- float autocvar_g_balance_shotgun_secondary_melee_multihit;
- float autocvar_g_balance_shotgun_secondary_refire;
- float autocvar_g_balance_shotgun_reload_ammo;
- float autocvar_g_balance_shotgun_reload_time;
  float autocvar_g_balance_teams;
  float autocvar_g_balance_teams_prevent_imbalance;
  float autocvar_g_balance_teams_scorefactor;
- float autocvar_g_balance_tuba_animtime;
- float autocvar_g_balance_tuba_attenuation;
- float autocvar_g_balance_tuba_damage;
- float autocvar_g_balance_tuba_edgedamage;
- float autocvar_g_balance_tuba_force;
- float autocvar_g_balance_tuba_radius;
- float autocvar_g_balance_tuba_refire;
- float autocvar_g_balance_uzi_burst;
- float autocvar_g_balance_uzi_burst_ammo;
- float autocvar_g_balance_uzi_burst_animtime;
- float autocvar_g_balance_uzi_burst_refire;
- float autocvar_g_balance_uzi_burst_refire2;
- float autocvar_g_balance_uzi_burst_spread;
- float autocvar_g_balance_uzi_first;
- float autocvar_g_balance_uzi_first_ammo;
- float autocvar_g_balance_uzi_first_damage;
- float autocvar_g_balance_uzi_first_force;
- float autocvar_g_balance_uzi_first_refire;
- float autocvar_g_balance_uzi_first_spread;
- float autocvar_g_balance_uzi_mode;
- float autocvar_g_balance_uzi_solidpenetration;
- float autocvar_g_balance_uzi_spread_add;
- float autocvar_g_balance_uzi_spread_max;
- float autocvar_g_balance_uzi_spread_min;
- float autocvar_g_balance_uzi_sustained_ammo;
- float autocvar_g_balance_uzi_sustained_damage;
- float autocvar_g_balance_uzi_sustained_force;
- float autocvar_g_balance_uzi_sustained_refire;
- float autocvar_g_balance_uzi_sustained_spread;
- float autocvar_g_balance_uzi_reload_ammo;
- float autocvar_g_balance_uzi_reload_time;
  float autocvar_g_ballistics_density_corpse;
  float autocvar_g_ballistics_density_player;
  float autocvar_g_ballistics_mindistance;
@@@ -931,6 -437,7 +437,7 @@@ float autocvar_g_onslaught_cp_health
  float autocvar_g_onslaught_cp_regen;
  float autocvar_g_onslaught_gen_health;
  float autocvar_g_pickup_cells_max;
+ float autocvar_g_pickup_plasma_max;
  float autocvar_g_pickup_fuel_max;
  float autocvar_g_pickup_items;
  float autocvar_g_pickup_nails_max;
@@@ -939,7 -446,6 +446,6 @@@ float autocvar_g_pickup_shells_max
  float autocvar_g_player_alpha;
  float autocvar_g_player_brightness;
  float autocvar_g_playerclip_collisions;
- string autocvar_g_playerstats_uri;
  float autocvar_g_powerups;
  float autocvar_g_projectiles_damage;
  float autocvar_g_projectiles_keep_owner;
@@@ -971,7 -477,6 +477,6 @@@ float autocvar_g_spawn_furthest
  float autocvar_g_spawn_useallspawns;
  float autocvar_g_spawnpoints_auto_move_out_of_solid;
  #define autocvar_g_spawnshieldtime cvar("g_spawnshieldtime")
- #define autocvar_g_start_weapon_laser cvar("g_start_weapon_laser")
  float autocvar_g_tdm_team_spawns;
  float autocvar_g_tdm_point_limit;
  float autocvar_g_tdm_point_leadlimit;
@@@ -1077,8 -582,20 +582,8 @@@ float autocvar_skill_auto
  float autocvar_snd_soundradius;
  float autocvar_spawn_debug;
  float autocvar_speedmeter;
 -float autocvar_sv_accelerate;
  var float autocvar_sv_accuracy_data_share = 1;
  string autocvar_sv_adminnick;
 -float autocvar_sv_airaccel_qw;
 -float autocvar_sv_airaccel_qw_stretchfactor;
 -float autocvar_sv_airaccel_sideways_friction;
 -float autocvar_sv_airaccelerate;
 -float autocvar_sv_aircontrol;
 -float autocvar_sv_aircontrol_penalty;
 -float autocvar_sv_aircontrol_power;
 -float autocvar_sv_airspeedlimit_nonqw;
 -float autocvar_sv_airstopaccelerate;
 -float autocvar_sv_airstrafeaccel_qw;
 -float autocvar_sv_airstrafeaccelerate;
  float autocvar_sv_autoscreenshot;
  float autocvar_sv_cheats;
  float autocvar_sv_clientcommand_antispam_time;
@@@ -1112,6 -629,7 +617,6 @@@ float autocvar_sv_eventlog_files_counte
  string autocvar_sv_eventlog_files_nameprefix;
  string autocvar_sv_eventlog_files_namesuffix;
  float autocvar_sv_eventlog_files_timestamps;
 -float autocvar_sv_friction;
  float autocvar_sv_friction_on_land;
  float autocvar_sv_gameplayfix_q2airaccelerate;
  float autocvar_sv_gentle;
@@@ -1127,10 -645,11 +632,10 @@@ float autocvar_sv_logscores_file
  string autocvar_sv_logscores_filename;
  float autocvar_sv_mapchange_delay;
  float autocvar_sv_maxairspeed;
 -float autocvar_sv_maxairstrafespeed;
  float autocvar_sv_maxspeed;
  string autocvar_sv_motd;
  float autocvar_sv_precacheplayermodels;
- float autocvar_sv_precacheweapons;
+ //float autocvar_sv_precacheweapons; // WEAPONTODO?
  float autocvar_sv_q3acompat_machineshotgunswap;
  float autocvar_sv_ready_restart;
  float autocvar_sv_ready_restart_after_countdown;
@@@ -1140,6 -659,7 +645,6 @@@ float autocvar_sv_spectate
  float autocvar_sv_spectator_speed_multiplier;
  float autocvar_sv_status_privacy;
  float autocvar_sv_stepheight;
 -float autocvar_sv_stopspeed;
  float autocvar_sv_strengthsound_antispam_refire_threshold;
  float autocvar_sv_strengthsound_antispam_time;
  float autocvar_sv_teamnagger;
@@@ -1173,6 -693,11 +678,6 @@@ float autocvar_sv_vote_stop
  float autocvar_sv_vote_timeout;
  float autocvar_sv_vote_wait;
  float autocvar_sv_vote_gamestart;
 -float autocvar_sv_warsowbunny_accel;
 -float autocvar_sv_warsowbunny_airforwardaccel;
 -float autocvar_sv_warsowbunny_backtosideratio;
 -float autocvar_sv_warsowbunny_topspeed;
 -float autocvar_sv_warsowbunny_turnaccel;
  float autocvar_sv_waypointsprite_deadlifetime;
  float autocvar_sv_waypointsprite_deployed_lifetime;
  float autocvar_sv_waypointsprite_limitedrange;
@@@ -1312,14 -837,19 +817,21 @@@ float autocvar_g_campcheck_damage
  float autocvar_g_campcheck_distance;
  float autocvar_g_campcheck_interval;
  float autocvar_g_jump_grunt;
+ float autocvar_g_overkill_powerups_replace;
+ float autocvar_g_overkill_superguns_respawn_time;
+ float autocvar_g_overkill_100h_anyway;
+ float autocvar_g_overkill_100a_anyway;
+ float autocvar_g_overkill_ammo_charge;
+ float autocvar_g_overkill_ammo_charge_notice;
+ float autocvar_g_overkill_ammo_charge_limit;
  float autocvar_g_spawn_near_teammate_distance;
  float autocvar_g_spawn_near_teammate_ignore_spawnpoint;
  float autocvar_g_spawn_near_teammate_ignore_spawnpoint_delay;
  float autocvar_g_spawn_near_teammate_ignore_spawnpoint_delay_death;
  float autocvar_g_spawn_near_teammate_ignore_spawnpoint_check_health;
  float autocvar_g_spawn_near_teammate_ignore_spawnpoint_closetodeath;
 +float autocvar_g_physics_clientselect;
 +string autocvar_g_physics_clientselect_options;
  float autocvar_g_buffs_waypoint_distance;
  float autocvar_g_buffs_randomize;
  float autocvar_g_buffs_random_lifetime;
@@@ -1349,3 -879,4 +861,3 @@@ float autocvar_g_buffs_vampire_damage_s
  float autocvar_g_buffs_invisible_alpha;
  float autocvar_g_buffs_flight_gravity;
  float autocvar_g_buffs_jump_height;
 -
index 797226717cfe3129677584c626a83cabc5bd6c44,900f65bc8ab3dcbbe698f23ab906e7b5320f7601..dc7c62aed537d96b79ef4a9d8665ac1988a6e88b
  .float wasFlying;
  .float spectatorspeed;
  
 +// client side physics
 +float Physics_Valid(string thecvar)
 +{
 +      if(!autocvar_g_physics_clientselect) { return FALSE; }
 +
 +      string l = strcat(" ", autocvar_g_physics_clientselect_options, " ");
 +
 +      if(strstrofs(l, strcat(" ", thecvar, " "), 0) >= 0)
 +              return TRUE;
 +
 +      return FALSE;
 +}
 +
 +float Physics_ClientOption(entity pl, string option)
 +{
 +      if(Physics_Valid(pl.cvar_cl_physics) && (cvar_type(sprintf("g_physics_%s_%s", pl.cvar_cl_physics, option)) & 1))
 +              return cvar(sprintf("g_physics_%s_%s", pl.cvar_cl_physics, option));
 +      else
 +              return cvar(strcat("sv_", option));
 +}
 +
  /*
  =============
  PlayerJump
  
  When you press the jump key
+ returns TRUE if handled
  =============
  */
void PlayerJump (void)
float PlayerJump (void)
  {
        if(self.frozen)
-               return; // no jumping in freezetag when frozen
+               return TRUE; // no jumping in freezetag when frozen
  
        if(self.player_blocked)
-               return; // no jumping while blocked
+               return TRUE; // no jumping while blocked
  
        float doublejump = FALSE;
 -      float mjumpheight = autocvar_sv_jumpvelocity;
 +      float mjumpheight = self.stat_sv_jumpvelocity;
  
        player_multijump = doublejump;
        player_jumpheight = mjumpheight;
        if(MUTATOR_CALLHOOK(PlayerJump))
-               return;
+               return TRUE;
  
        doublejump = player_multijump;
        mjumpheight = player_jumpheight;
        if (self.waterlevel >= WATERLEVEL_SWIMMING)
        {
                self.velocity_z = self.stat_sv_maxspeed * 0.7;
-               return;
+               return TRUE;
        }
  
        if (!doublejump)
                if (!(self.flags & FL_ONGROUND))
-                       return;
+                       return !(self.flags & FL_JUMPRELEASED);
  
        if(self.cvar_cl_movement_track_canjump)
                if (!(self.flags & FL_JUMPRELEASED))
-                       return;
+                       return TRUE;
  
        // sv_jumpspeedcap_min/sv_jumpspeedcap_max act as baseline
        // velocity bounds.  Final velocity is bound between (jumpheight *
  
        self.restart_jump = -1; // restart jump anim next time
        // value -1 is used to not use the teleport bit (workaround for tiny hitch when re-jumping)
+       return TRUE;
  }
  void CheckWaterJump()
  {
                }
        }
  }
+ .float jetpack_stopped;
+ // Hack: shouldn't need to know about this
+ .float multijump_count;
  void CheckPlayerJump()
  {
-       if (self.BUTTON_JUMP)
-               PlayerJump ();
+       float was_flying = self.items & IT_USING_JETPACK;
+       if (self.cvar_cl_jetpack_jump < 2)
+               self.items &= ~IT_USING_JETPACK;
+       if (self.BUTTON_JUMP || self.BUTTON_JETPACK)
+       {
+               float air_jump = !PlayerJump() || self.multijump_count > 0; // PlayerJump() has important side effects
+               float activate = self.cvar_cl_jetpack_jump && air_jump && self.BUTTON_JUMP || self.BUTTON_JETPACK;
+               float has_fuel = !autocvar_g_jetpack_fuel || self.ammo_fuel || self.items & IT_UNLIMITED_WEAPON_AMMO;
+               if (self.jetpack_stopped) { }
+               else if (!has_fuel)
+               {
+                       if (was_flying) // TODO: ran out of fuel message
+                               Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_JETPACK_NOFUEL);
+                       else
+                               Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_JETPACK_NOFUEL);
+                       self.jetpack_stopped = TRUE;
+                       self.items &= ~IT_USING_JETPACK;
+               }
+               else if (activate && !self.frozen)
+                       self.items |= IT_USING_JETPACK;
+       }
        else
+       {
+               self.jetpack_stopped = FALSE;
+               self.items &= ~IT_USING_JETPACK;
+       }
+       if (!self.BUTTON_JUMP)
                self.flags |= FL_JUMPRELEASED;
  
        if (self.waterlevel == WATERLEVEL_SWIMMING)
@@@ -455,7 -466,7 +487,7 @@@ void CPM_PM_Aircontrol(vector wishdir, 
                return;
  #endif
  
 -      k *= bound(0, wishspeed / autocvar_sv_maxairspeed, 1);
 +      k *= bound(0, wishspeed / self.stat_sv_maxairspeed, 1);
  
        zspeed = self.velocity_z;
        self.velocity_z = 0;
  
        if(dot > 0) // we can't change direction while slowing down
        {
 -              k *= pow(dot, autocvar_sv_aircontrol_power)*frametime;
 -              xyspeed = max(0, xyspeed - autocvar_sv_aircontrol_penalty * sqrt(max(0, 1 - dot*dot)) * k/32);
 -              k *= autocvar_sv_aircontrol;
 +              k *= pow(dot, self.stat_sv_aircontrol_power)*frametime;
 +              xyspeed = max(0, xyspeed - self.stat_sv_aircontrol_penalty * sqrt(max(0, 1 - dot*dot)) * k/32);
 +              k *= self.stat_sv_aircontrol;
                self.velocity = normalize(self.velocity * xyspeed + wishdir * k);
        }
  
@@@ -577,26 -588,26 +609,26 @@@ void PM_AirAccelerate(vector wishdir, f
  
        if(wishspeed > curspeed * 1.01)
        {
 -              wishspeed = min(wishspeed, curspeed + autocvar_sv_warsowbunny_airforwardaccel * self.stat_sv_maxspeed * frametime);
 +              wishspeed = min(wishspeed, curspeed + self.stat_sv_warsowbunny_airforwardaccel * self.stat_sv_maxspeed * frametime);
        }
        else
        {
 -              f = max(0, (autocvar_sv_warsowbunny_topspeed - curspeed) / (autocvar_sv_warsowbunny_topspeed - self.stat_sv_maxspeed));
 -              wishspeed = max(curspeed, self.stat_sv_maxspeed) + autocvar_sv_warsowbunny_accel * f * self.stat_sv_maxspeed * frametime;
 +              f = max(0, (self.stat_sv_warsowbunny_topspeed - curspeed) / (self.stat_sv_warsowbunny_topspeed - self.stat_sv_maxspeed));
 +              wishspeed = max(curspeed, self.stat_sv_maxspeed) + self.stat_sv_warsowbunny_accel * f * self.stat_sv_maxspeed * frametime;
        }
        wishvel = wishdir * wishspeed;
        acceldir = wishvel - curvel;
        addspeed = vlen(acceldir);
        acceldir = normalize(acceldir);
  
 -      accelspeed = min(addspeed, autocvar_sv_warsowbunny_turnaccel * self.stat_sv_maxspeed * frametime);
 +      accelspeed = min(addspeed, self.stat_sv_warsowbunny_turnaccel * self.stat_sv_maxspeed * frametime);
  
 -      if(autocvar_sv_warsowbunny_backtosideratio < 1)
 +      if(self.stat_sv_warsowbunny_backtosideratio < 1)
        {
                curdir = normalize(curvel);
                dot = acceldir * curdir;
                if(dot < 0)
 -                      acceldir = acceldir - (1 - autocvar_sv_warsowbunny_backtosideratio) * dot * curdir;
 +                      acceldir = acceldir - (1 - self.stat_sv_warsowbunny_backtosideratio) * dot * curdir;
        }
  
        self.velocity += accelspeed * acceldir;
@@@ -670,34 -681,13 +702,34 @@@ void SV_PlayerPhysics(
  
        // fix physics stats for g_movement_highspeed
        // TODO maybe rather use maxairspeed? needs testing
 -      self.stat_sv_airaccel_qw = AdjustAirAccelQW(autocvar_sv_airaccel_qw, maxspd_mod);
 -      if(autocvar_sv_airstrafeaccel_qw)
 -              self.stat_sv_airstrafeaccel_qw = AdjustAirAccelQW(autocvar_sv_airstrafeaccel_qw, maxspd_mod);
 +      self.stat_sv_airaccel_qw = AdjustAirAccelQW(Physics_ClientOption(self, "airaccel_qw"), maxspd_mod);
 +      if(Physics_ClientOption(self, "airstrafeaccel_qw"))
 +              self.stat_sv_airstrafeaccel_qw = AdjustAirAccelQW(Physics_ClientOption(self, "airstrafeaccel_qw"), maxspd_mod);
        else
                self.stat_sv_airstrafeaccel_qw = 0;
 -      self.stat_sv_airspeedlimit_nonqw = autocvar_sv_airspeedlimit_nonqw * maxspd_mod;
 -      self.stat_sv_maxspeed = autocvar_sv_maxspeed * maxspd_mod; // also slow walking
 +      self.stat_sv_airspeedlimit_nonqw = Physics_ClientOption(self, "airspeedlimit_nonqw") * maxspd_mod;
 +      self.stat_sv_maxspeed = Physics_ClientOption(self, "maxspeed") * maxspd_mod; // also slow walking
 +      
 +      // fix some new settings
 +      self.stat_sv_airaccel_qw_stretchfactor = Physics_ClientOption(self, "airaccel_qw_stretchfactor");
 +      self.stat_sv_maxairstrafespeed = Physics_ClientOption(self, "maxairstrafespeed");
 +      self.stat_sv_maxairspeed = Physics_ClientOption(self, "maxairspeed");
 +      self.stat_sv_airstrafeaccelerate = Physics_ClientOption(self, "airstrafeaccelerate");
 +      self.stat_sv_warsowbunny_turnaccel = Physics_ClientOption(self, "warsowbunny_turnaccel");
 +      self.stat_sv_airaccel_sideways_friction = Physics_ClientOption(self, "airaccel_sideways_friction");
 +      self.stat_sv_aircontrol = Physics_ClientOption(self, "aircontrol");
 +      self.stat_sv_aircontrol_power = Physics_ClientOption(self, "aircontrol_power");
 +      self.stat_sv_aircontrol_penalty = Physics_ClientOption(self, "aircontrol_penalty");
 +      self.stat_sv_warsowbunny_airforwardaccel = Physics_ClientOption(self, "warsowbunny_airforwardaccel");
 +      self.stat_sv_warsowbunny_topspeed = Physics_ClientOption(self, "warsowbunny_topspeed");
 +      self.stat_sv_warsowbunny_accel = Physics_ClientOption(self, "warsowbunny_accel");
 +      self.stat_sv_warsowbunny_backtosideratio = Physics_ClientOption(self, "warsowbunny_backtosideratio");
 +      self.stat_sv_friction = Physics_ClientOption(self, "friction");
 +      self.stat_sv_accelerate = Physics_ClientOption(self, "accelerate");
 +      self.stat_sv_stopspeed = Physics_ClientOption(self, "stopspeed");
 +      self.stat_sv_airaccelerate = Physics_ClientOption(self, "airaccelerate");
 +      self.stat_sv_airstopaccelerate = Physics_ClientOption(self, "airstopaccelerate");
 +      self.stat_sv_jumpvelocity = Physics_ClientOption(self, "jumpvelocity");
  
      if(self.PlayerPhysplug)
          if(self.PlayerPhysplug())
                bot_think();
        }
  
-       self.items &= ~IT_USING_JETPACK;
        if(IS_PLAYER(self))
        {
                if(self.race_penalty)
                maxspd_mod = self.spectatorspeed;
        }
  
 -      spd = max(self.stat_sv_maxspeed, autocvar_sv_maxairspeed) * maxspd_mod * swampspd_mod;
 +      spd = max(self.stat_sv_maxspeed, self.stat_sv_maxairspeed) * maxspd_mod * swampspd_mod;
        if(self.speed != spd)
        {
                self.speed = spd;
                // noclipping or flying
                self.flags &= ~FL_ONGROUND;
  
 -              self.velocity = self.velocity * (1 - frametime * autocvar_sv_friction);
 +              self.velocity = self.velocity * (1 - frametime * self.stat_sv_friction);
                makevectors(self.v_angle);
                //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
                wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
                if (wishspeed > self.stat_sv_maxspeed*maxspd_mod)
                        wishspeed = self.stat_sv_maxspeed*maxspd_mod;
                if (time >= self.teleport_time)
 -                      PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0, 0);
 +                      PM_Accelerate(wishdir, wishspeed, wishspeed, self.stat_sv_accelerate*maxspd_mod, 1, 0, 0, 0);
        }
        else if (self.waterlevel >= WATERLEVEL_SWIMMING)
        {
                wishspeed = wishspeed * 0.7;
  
                // water friction
 -              self.velocity = self.velocity * (1 - frametime * autocvar_sv_friction);
 +              self.velocity = self.velocity * (1 - frametime * self.stat_sv_friction);
  
                // water acceleration
 -              PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0, 0);
 +              PM_Accelerate(wishdir, wishspeed, wishspeed, self.stat_sv_accelerate*maxspd_mod, 1, 0, 0, 0);
        }
        else if (time < self.ladder_time)
        {
                        self.velocity_z += g;
                }
  
 -              self.velocity = self.velocity * (1 - frametime * autocvar_sv_friction);
 +              self.velocity = self.velocity * (1 - frametime * self.stat_sv_friction);
                makevectors(self.v_angle);
                //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
                wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
                if (time >= self.teleport_time)
                {
                        // water acceleration
 -                      PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0, 0);
 +                      PM_Accelerate(wishdir, wishspeed, wishspeed, self.stat_sv_accelerate*maxspd_mod, 1, 0, 0, 0);
                }
        }
-       else if ((self.items & IT_JETPACK) && self.BUTTON_HOOK && (!autocvar_g_jetpack_fuel || self.ammo_fuel >= 0.01 || self.items & IT_UNLIMITED_WEAPON_AMMO) && !self.frozen)
+       else if (self.items & IT_USING_JETPACK)
        {
                //makevectors(self.v_angle_y * '0 1 0');
                makevectors(self.v_angle);
                wishvel = v_forward * self.movement_x + v_right * self.movement_y;
                // add remaining speed as Z component
 -              maxairspd = autocvar_sv_maxairspeed*max(1, maxspd_mod);
 +              maxairspd = self.stat_sv_maxairspeed*max(1, maxspd_mod);
                // fix speedhacks :P
                wishvel = normalize(wishvel) * min(vlen(wishvel) / maxairspd, 1);
                // add the unused velocity as up component
                else
                        fz = bound(0, 1 + self.velocity_z / autocvar_g_jetpack_maxspeed_up, 1);
  
-               float fvel;
-               fvel = vlen(wishvel);
                wishvel_x *= fxy;
                wishvel_y *= fxy;
                wishvel_z = (wishvel_z - autocvar_sv_gravity) * fz + autocvar_sv_gravity;
  
+               float fvel;
                fvel = min(1, vlen(wishvel) / best);
                if(autocvar_g_jetpack_fuel && !(self.items & IT_UNLIMITED_WEAPON_AMMO))
                        f = min(1, self.ammo_fuel / (autocvar_g_jetpack_fuel * frametime * fvel));
        {
                // we get here if we ran out of ammo
                if((self.items & IT_JETPACK) && self.BUTTON_HOOK && !(buttons_prev & 32) && self.ammo_fuel < 0.01)
-                       sprint(self, "You don't have any fuel for the ^2Jetpack\n");
+                       Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_JETPACK_NOFUEL);
  
                // walking
                makevectors(self.v_angle_y * '0 1 0');
                        self.jumppadcount = 0;
                }
  
- #ifdef LETS_TEST_FTEQCC
-               if(self.velocity_x || self.velocity_y)
-               {
-                       // good
-               }
-               else
-               {
-                       if(self.velocity_x)
-                               checkclient();
-                       if(self.velocity_y)
-                               checkclient();
-               }
- #endif
                v = self.velocity;
                v_z = 0;
                f = vlen(v);
                if(f > 0)
                {
 -                      if (f < autocvar_sv_stopspeed)
 -                              f = 1 - frametime * (autocvar_sv_stopspeed / f) * autocvar_sv_friction;
 +                      if (f < self.stat_sv_stopspeed)
 +                              f = 1 - frametime * (self.stat_sv_stopspeed / f) * self.stat_sv_friction;
                        else
 -                              f = 1 - frametime * autocvar_sv_friction;
 +                              f = 1 - frametime * self.stat_sv_friction;
                        if (f > 0)
                                self.velocity = self.velocity * f;
                        else
                if (self.crouch)
                        wishspeed = wishspeed * 0.5;
                if (time >= self.teleport_time)
 -                      PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0, 0);
 +                      PM_Accelerate(wishdir, wishspeed, wishspeed, self.stat_sv_accelerate*maxspd_mod, 1, 0, 0, 0);
        }
        else
        {
                float wishspeed0;
                // we get here if we ran out of ammo
                if((self.items & IT_JETPACK) && self.BUTTON_HOOK && !(buttons_prev & 32) && self.ammo_fuel < 0.01)
-                       sprint(self, "You don't have any fuel for the ^2Jetpack\n");
+                       Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_JETPACK_NOFUEL);
  
                if(maxspd_mod < 1)
                {
 -                      maxairspd = autocvar_sv_maxairspeed*maxspd_mod;
 -                      airaccel = autocvar_sv_airaccelerate*maxspd_mod;
 +                      maxairspd = self.stat_sv_maxairspeed*maxspd_mod;
 +                      airaccel = self.stat_sv_airaccelerate*maxspd_mod;
                }
                else
                {
 -                      maxairspd = autocvar_sv_maxairspeed;
 -                      airaccel = autocvar_sv_airaccelerate;
 +                      maxairspd = self.stat_sv_maxairspeed;
 +                      airaccel = self.stat_sv_airaccelerate;
                }
                // airborn
                makevectors(self.v_angle_y * '0 1 0');
                        wishspeed2 = wishspeed;
  
                        // CPM
 -                      if(autocvar_sv_airstopaccelerate)
 +                      if(self.stat_sv_airstopaccelerate)
                        {
                                vector curdir;
                                curdir = self.velocity;
                                curdir_z = 0;
                                curdir = normalize(curdir);
 -                              airaccel = airaccel + (autocvar_sv_airstopaccelerate*maxspd_mod - airaccel) * max(0, -(curdir * wishdir));
 +                              airaccel = airaccel + (self.stat_sv_airstopaccelerate*maxspd_mod - airaccel) * max(0, -(curdir * wishdir));
                        }
                        // note that for straight forward jumping:
                        // step = accel * frametime * wishspeed0;
                        // 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(autocvar_sv_maxairstrafespeed)
 -                              wishspeed = min(wishspeed, GeomLerp(autocvar_sv_maxairspeed*maxspd_mod, strafity, autocvar_sv_maxairstrafespeed*maxspd_mod));
 -                      if(autocvar_sv_airstrafeaccelerate)
 -                              airaccel = GeomLerp(airaccel, strafity, autocvar_sv_airstrafeaccelerate*maxspd_mod);
 +                      if(self.stat_sv_maxairstrafespeed)
 +                              wishspeed = min(wishspeed, GeomLerp(self.stat_sv_maxairspeed*maxspd_mod, strafity, self.stat_sv_maxairstrafespeed*maxspd_mod));
 +                      if(self.stat_sv_airstrafeaccelerate)
 +                              airaccel = GeomLerp(airaccel, strafity, self.stat_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(autocvar_sv_warsowbunny_turnaccel && accelerating && self.movement_y == 0 && self.movement_x != 0)
 +                      if(self.stat_sv_warsowbunny_turnaccel && accelerating && self.movement_y == 0 && self.movement_x != 0)
                                PM_AirAccelerate(wishdir, wishspeed);
                        else
 -                              PM_Accelerate(wishdir, wishspeed, wishspeed0, airaccel, airaccelqw, autocvar_sv_airaccel_qw_stretchfactor, autocvar_sv_airaccel_sideways_friction / maxairspd, self.stat_sv_airspeedlimit_nonqw);
 +                              PM_Accelerate(wishdir, wishspeed, wishspeed0, airaccel, airaccelqw, self.stat_sv_airaccel_qw_stretchfactor, self.stat_sv_airaccel_sideways_friction / maxairspd, self.stat_sv_airspeedlimit_nonqw);
  
 -                      if(autocvar_sv_aircontrol)
 +                      if(self.stat_sv_aircontrol)
                                CPM_PM_Aircontrol(wishdir, wishspeed2);
                }
        }
                }
        }
  
+       // WEAPONTODO
        float xyspeed;
        xyspeed = vlen('1 0 0' * self.velocity_x + '0 1 0' * self.velocity_y);
-       if(self.weapon == WEP_NEX && autocvar_g_balance_nex_charge && autocvar_g_balance_nex_charge_velocity_rate && xyspeed > autocvar_g_balance_nex_charge_minspeed)
+       if(self.weapon == WEP_VORTEX && WEP_CVAR(vortex, charge) && WEP_CVAR(vortex, charge_velocity_rate) && xyspeed > WEP_CVAR(vortex, charge_minspeed))
        {
                // add a maximum of charge_velocity_rate when going fast (f = 1), gradually increasing from minspeed (f = 0) to maxspeed
-               xyspeed = min(xyspeed, autocvar_g_balance_nex_charge_maxspeed);
-               f = (xyspeed - autocvar_g_balance_nex_charge_minspeed) / (autocvar_g_balance_nex_charge_maxspeed - autocvar_g_balance_nex_charge_minspeed);
+               xyspeed = min(xyspeed, WEP_CVAR(vortex, charge_maxspeed));
+               f = (xyspeed - WEP_CVAR(vortex, charge_minspeed)) / (WEP_CVAR(vortex, charge_maxspeed) - WEP_CVAR(vortex, charge_minspeed));
                // add the extra charge
-               self.nex_charge = min(1, self.nex_charge + autocvar_g_balance_nex_charge_velocity_rate * f * frametime);
+               self.vortex_charge = min(1, self.vortex_charge + WEP_CVAR(vortex, charge_velocity_rate) * f * frametime);
        }
  :end
        if(self.flags & FL_ONGROUND)
index 14ffd3468aca61adf180bb6277df95c43510c2dc,898e7db18faf59a78afe5988320a8a21baa02ccb..edc2420f6acf2cbecf4423dcaca6b966185eb918
@@@ -150,7 -150,7 +150,7 @@@ void ClientCommand_join(float request
                {
                        if(IS_CLIENT(self))
                        {
-                               if(!IS_PLAYER(self) && !lockteams)
+                               if(!IS_PLAYER(self) && !lockteams && !gameover)
                                {
                                        if(self.caplayer)
                                                return;
@@@ -341,46 -341,6 +341,46 @@@ void ClientCommand_mobspawn(float reque
        }
  }
  
 +void ClientCommand_physics(float request, float argc)
 +{
 +      switch(request)
 +      {
 +              case CMD_REQUEST_COMMAND:
 +              {
 +                      string command = strtolower(argv(1));
 +                      
 +                      if(!autocvar_g_physics_clientselect)
 +                      {
 +                              sprint(self, "Client physics selection is currently disabled.\n");
 +                              return;
 +                      }
 +
 +                      if(command == "list" || command == "help")
 +                      {
 +                              sprint(self, strcat("Available physics sets: \n\n", autocvar_g_physics_clientselect_options, " default\n"));
 +                              return;
 +                      }
 +                      
 +                      if(Physics_Valid(command) || command == "default")
 +                      {
 +                              stuffcmd(self, strcat("\nseta cl_physics ", command, "\nsendcvar cl_physics\n"));
 +                              sprint(self, strcat("^2Physics set successfully changed to ^3", command, "\n"));
 +                              return;
 +                      }
 +              }
 +      
 +              default:
 +                      sprint(self, strcat("Current physics set: ^3", self.cvar_cl_physics, "\n"));
 +              case CMD_REQUEST_USAGE:
 +              {
 +                      sprint(self, "\nUsage:^3 cmd physics <physics>\n");
 +                      sprint(self, "  See 'cmd physics list' for available physics sets.\n");
 +                      sprint(self, "  Argument 'default' resets to standard physics.\n");
 +                      return;
 +              }
 +      }
 +}
 +
  void ClientCommand_ready(float request) // todo: anti-spam for toggling readyness
  {
        switch(request)
@@@ -508,7 -468,7 +508,7 @@@ void ClientCommand_selectteam(float req
                                                                                        GetTeamCounts(self);
                                                                                        if(!TeamSmallerEqThanTeam(Team_TeamToNumber(selection), Team_TeamToNumber(self.team), self))
                                                                                        {
-                                                                                               sprint(self, "Cannot change to a larger/better/shinier team\n");
+                                                                                               Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_TEAMCHANGE_LARGERTEAM);
                                                                                                return;
                                                                                        }
                                                                                }
@@@ -773,7 -733,6 +773,7 @@@ void ClientCommand_(float request
        CLIENT_COMMAND("mobedit", ClientCommand_mobedit(request, arguments), "Edit your monster's properties") \
        CLIENT_COMMAND("mobkill", ClientCommand_mobkill(request), "Kills your monster") \
        CLIENT_COMMAND("mobspawn", ClientCommand_mobspawn(request, arguments), "Spawn monsters infront of yourself") \
 +      CLIENT_COMMAND("physics", ClientCommand_physics(request, arguments), "Change physics set") \
        CLIENT_COMMAND("ready", ClientCommand_ready(request), "Qualify as ready to end warmup stage (or restart server if allowed)") \
        CLIENT_COMMAND("say", ClientCommand_say(request, arguments, command), "Print a message to chat to all players") \
        CLIENT_COMMAND("say_team", ClientCommand_say_team(request, arguments, command), "Print a message to chat to all team mates") \
diff --combined qcsrc/server/defs.qh
index 388a1279d783066362013b06e0b23c6b8aeef1ef,757ee65e2799449c1afd71e68aaf2339596faada..e175e94180e562f12bea62a50b5d334fd7138ba7
@@@ -13,6 -13,7 +13,7 @@@ noref float require_spawnfunc_prefix; /
  #define BUTTON_USE        buttonuse
  #define BUTTON_DRAG       button8
  #define BUTTON_ZOOMSCRIPT button9
+ #define BUTTON_JETPACK    button10
  
  // Globals
  
@@@ -82,7 -83,6 +83,6 @@@ float server_is_dedicated
  
  .float        pain_finished;                  //Added by Supajoe
  .float        pain_frame;                     //"
- .float        statdraintime;                  // record the one-second intervals between draining health and armour when they're over 100
  .float  crouch;       // Crouching or not?
  
  .float        strength_finished;
@@@ -172,7 -172,7 +172,7 @@@ void setanim(entity e, vector anim, flo
  .string item_pickupsound;
  
  // definitions for weaponsystem
+ // more WEAPONTODO: move these to their proper files
  .entity weaponentity;
  .entity exteriorweaponentity;
  .vector weaponentity_glowmod;
  .float switchingweapon; // weapon currently being switched to (is copied from switchweapon once switch is possible)
  .string weaponname; // name of .weapon
  
+ // WEAPONTODO
  .float autoswitch;
float weapon_action(float wpn, float wrequest);
//float WEP_ACTION(float wpn, float wrequest);
  float client_hasweapon(entity cl, float wpn, float andammo, float complain);
  void w_clear();
  void w_ready();
  .float weapon_nextthink;
  .void() weapon_think;
  
- //float       PLAYER_WEAPONSELECTION_DELAY = );
- const float   PLAYER_WEAPONSELECTION_SPEED = 18;
- const vector  PLAYER_WEAPONSELECTION_RANGE = '0 20 -40';
  
  // weapon states (self.weaponentity.state)
  const float WS_CLEAR                  = 0; // no weapon selected
@@@ -263,6 -261,7 +261,7 @@@ float default_weapon_alpha
  .float cvar_cl_handicap;
  .float cvar_cl_clippedspectating;
  .float cvar_cl_autoscreenshot;
+ .float cvar_cl_jetpack_jump;
  .float cvar_cl_movement_track_canjump;
  .float cvar_cl_newusekeysupported;
  
@@@ -288,16 -287,12 +287,12 @@@ string gamemode_name
  
  float startitem_failed;
  
- typedef .float floatfield;
- floatfield Item_CounterField(float it);
- float W_AmmoItemCode(float wpn);
- string W_Name(float weaponid);
  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
@@@ -355,7 -350,6 +350,6 @@@ float next_pingtime
                _VOICEMSG(death) \
                _VOICEMSG(drown) \
                _VOICEMSG(fall) \
-               _VOICEMSG(fall) \
                _VOICEMSG(falling) \
                _VOICEMSG(gasp) \
                _VOICEMSG(jump) \
@@@ -453,36 -447,13 +447,36 @@@ float round_starttime; //point in time 
  .float stat_sv_airspeedlimit_nonqw;
  .float stat_sv_maxspeed;
  
 +// new properties
 +.float stat_sv_jumpvelocity;
 +.float stat_sv_airaccel_qw_stretchfactor;
 +.float stat_sv_maxairstrafespeed;
 +.float stat_sv_maxairspeed;
 +.float stat_sv_airstrafeaccelerate;
 +.float stat_sv_warsowbunny_turnaccel;
 +.float stat_sv_airaccel_sideways_friction;
 +.float stat_sv_aircontrol;
 +.float stat_sv_aircontrol_power;
 +.float stat_sv_aircontrol_penalty;
 +.float stat_sv_warsowbunny_airforwardaccel;
 +.float stat_sv_warsowbunny_topspeed;
 +.float stat_sv_warsowbunny_accel;
 +.float stat_sv_warsowbunny_backtosideratio;
 +.float stat_sv_friction;
 +.float stat_sv_accelerate;
 +.float stat_sv_stopspeed;
 +.float stat_sv_airaccelerate;
 +.float stat_sv_airstopaccelerate;
 +
 +.string cvar_cl_physics;
 +
  void W_Porto_Remove (entity p);
  
  .float projectiledeathtype;
  
  .string message2;
  
- .float stat_allow_oldnexbeam;
+ .float stat_allow_oldvortexbeam;
  
  // reset to 0 on weapon switch
  // may be useful to all weapons
@@@ -517,8 -488,6 +511,6 @@@ void ClientData_Touch(entity e)
  
  float servertime, serverprevtime, serverframetime;
  
- .entity soundentity;
  .float ammo_fuel;
  
  .vector prevorigin;
  .float stat_shotorg; // networked stat for trueaim HUD
  
  string matchid;
- .float hitplotfh;
  
  .float last_pickup;
  
@@@ -553,8 -521,6 +544,6 @@@ float client_cefc_accumulator
  float client_cefc_accumulatortime;
  #endif
  
- ..float current_ammo;
  .float weapon_load[WEP_MAXCOUNT];
  .float ammo_none; // used by the reloading system, must always be 0
  .float clip_load;
  
  .entity lastrocket;
  .float minelayer_mines;
- .float nex_charge;
- .float nex_charge_rottime;
- .float nex_chargepool_ammo;
+ .float vortex_charge;
+ .float vortex_charge_rottime;
+ .float vortex_chargepool_ammo;
  .float hagar_load;
  
  .float grab; // 0 = can't grab, 1 = owner can grab, 2 = owner and team mates can grab, 3 = anyone can grab
@@@ -585,9 -551,6 +574,6 @@@ string deathmessage
  
  .float just_joined;
  
- .float cvar_cl_accuracy_data_share;
- .float cvar_cl_accuracy_data_receive;
  .float cvar_cl_weaponimpulsemode;
  .float selectweapon; // last selected weapon of the player
  
@@@ -607,6 -570,7 +593,7 @@@ float serverflags
  .float team_forced; // can be a team number to force a team, or 0 for default action, or -1 for forced spectator
  
  .float player_blocked;
+ .float weapon_blocked; // weapon use disabled
  
  .float frozen; // for freeze attacks
  .float revive_progress;
@@@ -645,3 -609,12 +632,12 @@@ string modname
  #define MISSILE_IS_CONFUSABLE(m) ((m.missile_flags & MIF_GUIDED_CONFUSABLE) ? TRUE : FALSE)
  #define MISSILE_IS_GUIDED(m) ((m.missile_flags & MIF_GUIDED_ALL) ? TRUE : FALSE)
  #define MISSILE_IS_TRACKING(m) ((m.missile_flags & MIF_GUIDED_TRACKING) ? TRUE : FALSE)
+ ////
+ .entity player_stats;
+ //.float playerid;
+ .string playernick;
+ .float elos;
+ .float ranks;
diff --combined qcsrc/server/g_world.qc
index 63ff16434d1861b3b33b2782fe12cd3ed3c670af,f97a4254dff37f194d242f65119cfe6f55e624b8..49d453e6ef3050bc94425c8f720056aec0cf74ee
@@@ -81,32 -81,6 +81,6 @@@ void SetDefaultAlpha(
        }
  }
  
- void fteqcc_testbugs()
- {
-       float a, b;
-       if(!autocvar_developer_fteqccbugs)
-               return;
-       dprint("*** fteqcc test: checking for bugs...\n");
-       a = 1;
-       b = 5;
-       if(sqrt(a) - sqrt(b - a) == 0)
-               dprint("*** fteqcc test: found same-function-twice bug\n");
-       else
-               dprint("*** fteqcc test: same-function-twice bug got FINALLY FIXED! HOORAY!\n");
-       world.cnt = -10;
-       world.enemy = world;
-       world.enemy.cnt += 10;
-       if(world.cnt > 0.2 || world.cnt < -0.2) // don't error out if it's just roundoff errors
-               dprint("*** fteqcc test: found += bug\n");
-       else
-               dprint("*** fteqcc test: += bug got FINALLY FIXED! HOORAY!\n");
-       world.cnt = 0;
- }
  void GotoFirstMap()
  {
        float n;
@@@ -572,8 -546,6 +546,6 @@@ void spawnfunc_worldspawn (void
  
        remove = remove_safely; // during spawning, watch what you remove!
  
-       check_unacceptable_compiler_bugs();
        cvar_changes_init(); // do this very early now so it REALLY matches the server config
  
        compressShortVector_init();
  
        Map_MarkAsRecent(mapname);
  
-       PlayerStats_Init(); // we need this to be initiated before InitGameplayMode
+       PlayerStats_GameReport_Init(); // we need this to be initiated before InitGameplayMode
  
        precache_model ("null"); // we need this one before InitGameplayMode
        InitGameplayMode();
        readlevelcvars();
        GrappleHookInit();
-       ElectroInit();
-       LaserInit();
  
        player_count = 0;
        bot_waypoints_for_items = autocvar_g_waypoints_for_items;
        if(autocvar_g_campaign)
                CampaignPostInit();
  
-       fteqcc_testbugs();
        Ban_LoadBans();
  
        MapInfo_Enumerate();
        addstat(STAT_SWITCHINGWEAPON, AS_INT, switchingweapon);
        addstat(STAT_GAMESTARTTIME, AS_FLOAT, stat_game_starttime);
        addstat(STAT_ROUNDSTARTTIME, AS_FLOAT, stat_round_starttime);
-       addstat(STAT_ALLOW_OLDNEXBEAM, AS_INT, stat_allow_oldnexbeam);
+       addstat(STAT_ALLOW_OLDVORTEXBEAM, AS_INT, stat_allow_oldvortexbeam);
        Nagger_Init();
  
        addstat(STAT_STRENGTH_FINISHED, AS_FLOAT, strength_finished);
        addstat(STAT_SUPERWEAPONS_FINISHED, AS_FLOAT, superweapons_finished);
        addstat(STAT_PRESSED_KEYS, AS_FLOAT, pressedkeys);
        addstat(STAT_FUEL, AS_INT, ammo_fuel);
+       addstat(STAT_PLASMA, AS_INT, ammo_plasma);
        addstat(STAT_SHOTORG, AS_INT, stat_shotorg);
        addstat(STAT_LEADLIMIT, AS_FLOAT, stat_leadlimit);
        addstat(STAT_WEAPON_CLIPLOAD, AS_INT, clip_load);
        addstat(STAT_TYPEHIT_TIME, AS_FLOAT, typehit_time);
        addstat(STAT_LAYED_MINES, AS_INT, minelayer_mines);
  
-       addstat(STAT_NEX_CHARGE, AS_FLOAT, nex_charge);
-       addstat(STAT_NEX_CHARGEPOOL, AS_FLOAT, nex_chargepool_ammo);
+       addstat(STAT_VORTEX_CHARGE, AS_FLOAT, vortex_charge);
+       addstat(STAT_VORTEX_CHARGEPOOL, AS_FLOAT, vortex_chargepool_ammo);
  
        addstat(STAT_HAGAR_LOAD, AS_INT, hagar_load);
+       
+       addstat(STAT_ARC_HEAT, AS_FLOAT, arc_heat_percent);
  
        // freeze attacks
        addstat(STAT_FROZEN, AS_INT, frozen);
        addstat(STAT_MOVEVARS_AIRACCEL_QW, AS_FLOAT, stat_sv_airaccel_qw);
        addstat(STAT_MOVEVARS_AIRSTRAFEACCEL_QW, AS_FLOAT, stat_sv_airstrafeaccel_qw);
  
 +      // new properties
 +      addstat(STAT_MOVEVARS_JUMPVELOCITY, AS_FLOAT, stat_sv_jumpvelocity);
 +      addstat(STAT_MOVEVARS_AIRACCEL_QW_STRETCHFACTOR, AS_FLOAT, stat_sv_airaccel_qw_stretchfactor);
 +      addstat(STAT_MOVEVARS_MAXAIRSTRAFESPEED, AS_FLOAT, stat_sv_maxairstrafespeed);
 +      addstat(STAT_MOVEVARS_MAXAIRSPEED, AS_FLOAT, stat_sv_maxairspeed);
 +      addstat(STAT_MOVEVARS_AIRSTRAFEACCELERATE, AS_FLOAT, stat_sv_airstrafeaccelerate);
 +      addstat(STAT_MOVEVARS_WARSOWBUNNY_TURNACCEL, AS_FLOAT, stat_sv_warsowbunny_turnaccel);
 +      addstat(STAT_MOVEVARS_AIRACCEL_SIDEWAYS_FRICTION, AS_FLOAT, stat_sv_airaccel_sideways_friction);
 +      addstat(STAT_MOVEVARS_AIRCONTROL, AS_FLOAT, stat_sv_aircontrol);
 +      addstat(STAT_MOVEVARS_AIRCONTROL_POWER, AS_FLOAT, stat_sv_aircontrol_power);
 +      addstat(STAT_MOVEVARS_AIRCONTROL_PENALTY, AS_FLOAT, stat_sv_aircontrol_penalty);
 +      addstat(STAT_MOVEVARS_WARSOWBUNNY_AIRFORWARDACCEL, AS_FLOAT, stat_sv_warsowbunny_airforwardaccel);
 +      addstat(STAT_MOVEVARS_WARSOWBUNNY_TOPSPEED, AS_FLOAT, stat_sv_warsowbunny_topspeed);
 +      addstat(STAT_MOVEVARS_WARSOWBUNNY_ACCEL, AS_FLOAT, stat_sv_warsowbunny_accel);
 +      addstat(STAT_MOVEVARS_WARSOWBUNNY_BACKTOSIDERATIO, AS_FLOAT, stat_sv_warsowbunny_backtosideratio);
 +      addstat(STAT_MOVEVARS_FRICTION, AS_FLOAT, stat_sv_friction);
 +      addstat(STAT_MOVEVARS_ACCELERATE, AS_FLOAT, stat_sv_accelerate);
 +      addstat(STAT_MOVEVARS_STOPSPEED, AS_FLOAT, stat_sv_stopspeed);
 +      addstat(STAT_MOVEVARS_AIRACCELERATE, AS_FLOAT, stat_sv_airaccelerate);
 +      addstat(STAT_MOVEVARS_AIRSTOPACCELERATE, AS_FLOAT, stat_sv_airstopaccelerate);
 +
        // secrets
        addstat(STAT_SECRETS_TOTAL, AS_FLOAT, stat_secrets_total);
        addstat(STAT_SECRETS_FOUND, AS_FLOAT, stat_secrets_found);
@@@ -1549,11 -1499,7 +1520,7 @@@ void NextLevel(
        DumpStats(TRUE);
  
        // send statistics
-       entity e;
-       PlayerStats_EndMatch(1);
-       FOR_EACH_CLIENT(e)
-               PlayerStats_AddGlobalInfo(e);
-       PlayerStats_Shutdown();
+       PlayerStats_GameReport(TRUE);
        WeaponStats_Shutdown();
  
        Kill_Notification(NOTIF_ALL, world, MSG_CENTER, 0); // kill all centerprints now
@@@ -2359,8 -2305,6 +2326,6 @@@ void RestoreGame(
  
  void Shutdown()
  {
-       entity e;
        gameover = 2;
  
        if(world_initialized > 0)
                print("Saving persistent data...\n");
                Ban_SaveBans();
  
-               PlayerStats_EndMatch(0);
-               FOR_EACH_CLIENT(e)
-                       PlayerStats_AddGlobalInfo(e);
-               PlayerStats_Shutdown();
+               // playerstats with unfinished match
+               PlayerStats_GameReport(FALSE);
  
                if(!cheatcount_total)
                {
index d76ffdee4b413e1169ecc0d5df0f4b36305ec816,e6fda399e27eb0427e90a241964f623843a54feb..e0be5df290456af8becac200be15f6772f564ced
@@@ -355,12 -355,13 +355,13 @@@ string formatmessage(string msg
                                wep = self.switchweapon;
                        if (!wep)
                                wep = self.cnt;
-                       replacement = W_Name(wep);
+                       replacement = WEP_NAME(wep);
                } else if (escape == "W") {
                        if (self.items & IT_SHELLS) replacement = "shells";
                        else if (self.items & IT_NAILS) replacement = "bullets";
                        else if (self.items & IT_ROCKETS) replacement = "rockets";
                        else if (self.items & IT_CELLS) replacement = "cells";
+                       else if (self.items & IT_PLASMA) replacement = "plasma";
                        else replacement = "batteries"; // ;)
                } else if (escape == "x") {
                        replacement = cursor_ent.netname;
@@@ -460,7 -461,6 +461,6 @@@ void GetCvars_handleFloatOnce(string th
                        stuffcmd(self, strcat("cl_cmd sendcvar ", name, "\n"));
        }
  }
- float w_getbestweapon(entity e);
  string W_FixWeaponOrder_ForceComplete_AndBuildImpulseList(string wo)
  {
        string o;
@@@ -489,8 -489,8 +489,9 @@@ void GetCvars(float f
  
        GetCvars_handleFloat(s, f, autoswitch, "cl_autoswitch");
        GetCvars_handleFloat(s, f, cvar_cl_autoscreenshot, "cl_autoscreenshot");
+       GetCvars_handleFloat(s, f, cvar_cl_jetpack_jump, "cl_jetpack_jump");
        GetCvars_handleString(s, f, cvar_g_xonoticversion, "g_xonoticversion");
 +      GetCvars_handleString(s, f, cvar_cl_physics, "cl_physics");
        GetCvars_handleFloat(s, f, cvar_cl_handicap, "cl_handicap");
        GetCvars_handleFloat(s, f, cvar_cl_clippedspectating, "cl_clippedspectating");
        GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriority, "cl_weaponpriority", W_FixWeaponOrder_ForceComplete_AndBuildImpulseList);
                if (s == "cl_weaponpriority")
                        self.switchweapon = w_getbestweapon(self);
                if (s == "cl_allow_uidtracking")
-                       PlayerStats_AddPlayer(self);
+                       PlayerStats_GameReport_AddPlayer(self);
        }
  }
  
@@@ -564,6 -564,8 +565,8 @@@ float g_pickup_rockets
  float g_pickup_rockets_max;
  float g_pickup_cells;
  float g_pickup_cells_max;
+ float g_pickup_plasma;
+ float g_pickup_plasma_max;
  float g_pickup_fuel;
  float g_pickup_fuel_jetpack;
  float g_pickup_fuel_max;
@@@ -596,7 -598,7 +599,7 @@@ float g_pickup_weapons_anyway
  float g_weaponarena;
  WepSet g_weaponarena_weapons;
  float g_weaponarena_random;
- float g_weaponarena_random_with_laser;
+ float g_weaponarena_random_with_blaster;
  string g_weaponarena_list;
  float g_weaponspeedfactor;
  float g_weaponratefactor;
@@@ -612,6 -614,7 +615,7 @@@ float start_ammo_shells
  float start_ammo_nails;
  float start_ammo_rockets;
  float start_ammo_cells;
+ float start_ammo_plasma;
  float start_ammo_fuel;
  float start_health;
  float start_armorvalue;
@@@ -623,14 -626,13 +627,13 @@@ float warmup_start_ammo_shells
  float warmup_start_ammo_nails;
  float warmup_start_ammo_rockets;
  float warmup_start_ammo_cells;
+ float warmup_start_ammo_plasma;
  float warmup_start_ammo_fuel;
  float warmup_start_health;
  float warmup_start_armorvalue;
  float g_weapon_stay;
  
- entity get_weaponinfo(float w);
- float want_weapon(string cvarprefix, entity weaponinfo, float allguns)
+ float want_weapon(entity weaponinfo, float allguns) // WEAPONTODO: what still needs done? 
  {
        var float i = weaponinfo.weapon;
        var float d = 0;
        else if (g_nexball)
                d = 0; // weapon is set a few lines later
        else
-               d = (i == WEP_LASER || i == WEP_SHOTGUN);
+               d = !(!weaponinfo.weaponstart);
  
        if(g_grappling_hook) // if possible, redirect off-hand hook to on-hand hook
                d |= (i == WEP_HOOK);
-       if(weaponinfo.spawnflags & WEP_FLAG_MUTATORBLOCKED) // never default mutator blocked guns
+       if(!g_cts && (weaponinfo.spawnflags & WEP_FLAG_MUTATORBLOCKED)) // never default mutator blocked guns
                d = 0;
  
-       var float t = cvar(strcat(cvarprefix, weaponinfo.netname));
+       var float t = weaponinfo.weaponstartoverride;
  
        //print(strcat("want_weapon: ", weaponinfo.netname, " - d: ", ftos(d), ", t: ", ftos(t), ". \n"));
  
@@@ -688,6 -690,7 +691,7 @@@ void readplayerstartcvars(
        start_ammo_nails = 0;
        start_ammo_rockets = 0;
        start_ammo_cells = 0;
+       start_ammo_plasma = 0;
        start_health = cvar("g_balance_health_start");
        start_armorvalue = cvar("g_balance_armor_start");
  
                g_weaponarena_random = cvar("g_weaponarena_random");
        else
                g_weaponarena_random = 0;
-       g_weaponarena_random_with_laser = cvar("g_weaponarena_random_with_laser");
+       g_weaponarena_random_with_blaster = cvar("g_weaponarena_random_with_blaster");
  
        if (g_weaponarena)
        {
                for (i = WEP_FIRST; i <= WEP_LAST; ++i)
                {
                        e = get_weaponinfo(i);
-                       float w = want_weapon("g_start_weapon_", e, FALSE);
+                       float w = want_weapon(e, FALSE);
                        if(w & 1)
                                start_weapons |= WepSet_FromWeapon(i);
                        if(w & 2)
  
        if(start_items & IT_UNLIMITED_WEAPON_AMMO)
        {
-               start_ammo_rockets = 999;
                start_ammo_shells = 999;
-               start_ammo_cells = 999;
                start_ammo_nails = 999;
+               start_ammo_rockets = 999;
+               start_ammo_cells = 999;
+               start_ammo_plasma = 999;
                start_ammo_fuel = 999;
        }
        else
                start_ammo_nails = cvar("g_start_ammo_nails");
                start_ammo_rockets = cvar("g_start_ammo_rockets");
                start_ammo_cells = cvar("g_start_ammo_cells");
+               start_ammo_plasma = cvar("g_start_ammo_plasma");
                start_ammo_fuel = cvar("g_start_ammo_fuel");
        }
  
                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;
                if (!g_weaponarena && !g_ca)
                {
                        warmup_start_ammo_shells = cvar("g_warmup_start_ammo_shells");
-                       warmup_start_ammo_cells = cvar("g_warmup_start_ammo_cells");
                        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");
                        for (i = WEP_FIRST; i <= WEP_LAST; ++i)
                        {
                                e = get_weaponinfo(i);
-                               float w = want_weapon("g_start_weapon_", e, g_warmup_allguns);
+                               float w = want_weapon(e, g_warmup_allguns);
                                if(w & 1)
                                        warmup_start_weapons |= WepSet_FromWeapon(i);
                                if(w & 2)
  
        if ((start_items & IT_JETPACK) || (g_grappling_hook && (start_weapons & WEPSET_HOOK)))
        {
-               g_grappling_hook = 0; // these two can't coexist, as they use the same button
                start_items |= IT_FUEL_REGEN;
                start_ammo_fuel = max(start_ammo_fuel, cvar("g_balance_fuel_rotstable"));
                warmup_start_ammo_fuel = max(warmup_start_ammo_fuel, cvar("g_balance_fuel_rotstable"));
        {
                e = get_weaponinfo(i);
                if(precache_weapons & WepSet_FromWeapon(i))
-                       weapon_action(i, WR_PRECACHE);
+                       WEP_ACTION(i, WR_INIT);
        }
  
        start_ammo_shells = max(0, start_ammo_shells);
        start_ammo_nails = max(0, start_ammo_nails);
-       start_ammo_cells = max(0, start_ammo_cells);
        start_ammo_rockets = max(0, start_ammo_rockets);
+       start_ammo_cells = max(0, start_ammo_cells);
+       start_ammo_plasma = max(0, start_ammo_plasma);
        start_ammo_fuel = max(0, start_ammo_fuel);
  
        warmup_start_ammo_shells = max(0, warmup_start_ammo_shells);
        warmup_start_ammo_nails = max(0, warmup_start_ammo_nails);
-       warmup_start_ammo_cells = max(0, warmup_start_ammo_cells);
        warmup_start_ammo_rockets = max(0, warmup_start_ammo_rockets);
+       warmup_start_ammo_cells = max(0, warmup_start_ammo_cells);
+       warmup_start_ammo_plasma = max(0, warmup_start_ammo_plasma);
        warmup_start_ammo_fuel = max(0, warmup_start_ammo_fuel);
  }
  
@@@ -980,6 -988,8 +989,8 @@@ void readlevelcvars(void
        g_pickup_rockets_max = cvar("g_pickup_rockets_max");
        g_pickup_cells = cvar("g_pickup_cells");
        g_pickup_cells_max = cvar("g_pickup_cells_max");
+       g_pickup_plasma = cvar("g_pickup_plasma");
+       g_pickup_plasma_max = cvar("g_pickup_plasma_max");
        g_pickup_fuel = cvar("g_pickup_fuel");
        g_pickup_fuel_jetpack = cvar("g_pickup_fuel_jetpack");
        g_pickup_fuel_max = cvar("g_pickup_fuel_max");
@@@ -1358,18 -1368,6 +1369,6 @@@ void precache(
          precache_sound ("weapons/hook_impact.wav"); // hook
      }
  
-     if(autocvar_sv_precacheweapons)
-     {
-         //precache weapon models/sounds
-         float wep;
-         wep = WEP_FIRST;
-         while (wep <= WEP_LAST)
-         {
-             weapon_action(wep, WR_PRECACHE);
-             wep = wep + 1;
-         }
-     }
      precache_model("models/elaser.mdl");
      precache_model("models/laser.mdl");
      precache_model("models/ebomb.mdl");
@@@ -1764,7 -1762,9 +1763,9 @@@ float WarpZone_Projectile_Touch_ImpactF
                return TRUE;
        if(SUB_NoImpactCheck())
        {
-               if(self.classname == "grapplinghook")
+               if(self.classname == "nade")
+                       return FALSE; // no checks here
+               else if(self.classname == "grapplinghook")
                        RemoveGrapplingHook(self.realowner);
                else if(self.classname == "spike")
                {