]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote branch 'origin/fruitiex/bots'
authorRudolf Polzer <divverent@alientrap.org>
Tue, 28 Dec 2010 13:07:07 +0000 (14:07 +0100)
committerRudolf Polzer <divverent@alientrap.org>
Tue, 28 Dec 2010 13:07:07 +0000 (14:07 +0100)
1  2 
defaultXonotic.cfg
qcsrc/server/bot/aim.qc
qcsrc/server/bot/havocbot/havocbot.qc

diff --combined defaultXonotic.cfg
index 686d898ec96340ccd09e97824f842921d67cf973,1463eda485fd08440446aac7d0c154fd88053158..8e27bff243a33caa562fed70eee21909a508eca2
@@@ -25,9 -25,6 +25,9 @@@ gameversion_max 65535 // git builds se
  // server about changes)
  alias setreport "set \"$1\" \"$2\" ; sendcvar \"$1\""
  
 +seta cl_firststart "" "how many times the client has been run"
 +seta cl_startcount 0 "how many times the client has been run"
 +
  // detect dedicated server or client
  alias "_detect_dedicated_$qport" "${* asis}"
  alias "_detect_dedicated_0" ""
@@@ -88,22 -85,22 +88,22 @@@ alias movetoteam_auto "sv_cmd movetotea
  mod_q3bsp_lightmapmergepower 4
  
  // player defaults
 -_cl_color 102
 +_cl_color 112
  _cl_name Player
 -_cl_playermodel models/player/umbra.iqm
 +_cl_playermodel models/player/erebus.iqm
  _cl_playerskin 0
 -seta crosshair 3
 +seta crosshair 16
  seta crosshair_color "0.6 0.8 1"
 -seta crosshair_alpha 1
 -seta crosshair_size 0.35
 +seta crosshair_alpha 0.300000
 +seta crosshair_size 0.500000
  seta crosshair_dot 1
  seta crosshair_dot_alpha 1
 -seta crosshair_dot_size 1
 +seta crosshair_dot_size 0.600000
 +seta crosshair_dot_color "1 0 0" "when != 0, use custom color for the crosshair dot"
  seta crosshair_pickup 0.25
  seta crosshair_pickup_speed 4
  seta crosshair_per_weapon 0   "when 1, each gun will display a different crosshair"
 -seta crosshair_color_override 0       "when 1, crosshair_color_* overrides the per-weapon color"
 -seta crosshair_color_per_weapon 1 "when 1, each gun will display a different colored crosshair"
 +seta crosshair_color_per_weapon 1 "when 1, each gun will display the crosshair with a different color"
  seta crosshair_effect_speed -1 "how fast (in seconds) some crosshair effects should take place, 0 = instant, -1 = 2x weapon switch time"
  seta crosshair_effect_scalefade 1 "use scaling and fading for crosshair effects"
  seta crosshair_hittest 1 "do a crosshair hit evaluation; also, the crosshair is scaled by the given number when aiming at an enemy, and blurred when aiming at a team mate"
@@@ -169,10 -166,10 +169,10 @@@ seta crosshair_seeker ""        "crosshair to 
  seta crosshair_seeker_color "1 0.35 0.35"     "crosshair color to display when wielding the TAG seeker"
  seta crosshair_seeker_alpha 0.9       "crosshair alpha value to display when wielding the TAG seeker"
  seta crosshair_seeker_size 0.8        "crosshair size when wielding the TAG seeker"
 -seta crosshair_campingrifle ""        "crosshair to display when wielding the campingrifle"
 -seta crosshair_campingrifle_color "0.85 0.5 0.25"     "crosshair color to display when wielding the campingrifle"
 -seta crosshair_campingrifle_alpha 1   "crosshair alpha value to display when wielding the campingrifle"
 -seta crosshair_campingrifle_size 0.65 "crosshair size when wielding the campingrifle"
 +seta crosshair_sniperrifle "" "crosshair to display when wielding the sniperrifle"
 +seta crosshair_sniperrifle_color "0.85 0.5 0.25"      "crosshair color to display when wielding the sniperrifle"
 +seta crosshair_sniperrifle_alpha 1    "crosshair alpha value to display when wielding the sniperrifle"
 +seta crosshair_sniperrifle_size 0.65  "crosshair size when wielding the sniperrifle"
  seta crosshair_tuba ""        "crosshair to display when wielding the tuba"
  seta crosshair_tuba_color "0.85 0.5 0.25"     "crosshair color to display when wielding the tuba"
  seta crosshair_tuba_alpha 1   "crosshair alpha value to display when wielding the tuba"
@@@ -184,9 -181,8 +184,9 @@@ seta crosshair_fireball_size 1     "crossha
  
  // ring around crosshair, used for various purposes (such as indicating bullets left in clip, nex charge)
  seta crosshair_ring_size 2    "bullet counter ring size for Rifle, velocity ring for Nex"
 +seta crosshair_ring_alpha 0.2 "ring alpha"
  
 -seta crosshair_ring_campingrifle_alpha 0.15
 +seta crosshair_ring_sniperrifle_alpha 0.15
  
  seta crosshair_ring_nex_outer_alpha 0.15
  seta crosshair_ring_nex_inner_alpha 0.15
@@@ -266,14 -262,6 +266,14 @@@ gl_polyblend 0 // whether to use scree
  r_motionblur 0 // motion blur value, default is 0
  r_damageblur 0 // motion blur when damaged, default is 0
  
 +r_bloom_blur 8
 +r_bloom_brighten 3
 +r_bloom_colorexponent 1
 +r_bloom_colorscale 1
 +r_bloom_colorsubtract 0.25
 +r_bloom_resolution 320
 +r_hdr_range 4
 +
  seta vid_x11_display ""       "xonotic-linux-*.sh will use this to start xonotic on an other/new X display"
  // This can have three possible settings:
  //    ""              run as usual
@@@ -386,8 -374,26 +386,8 @@@ sv_jumpstep 1 // step up stairs while j
  set ekg 0     "Throw huge amounts of gibs"
  
  cl_movement 1
 +cl_movement_track_canjump 0
  cl_stairsmoothspeed 200
 -cl_forwardspeed $sv_maxspeed
 -cl_backspeed $sv_maxspeed
 -cl_sidespeed $sv_maxspeed
 -cl_upspeed $sv_maxspeed
 -cl_movement_accelerate $sv_accelerate
 -cl_movement_airaccel_qw $sv_airaccel_qw
 -cl_movement_airaccel_sideways_friction $sv_airaccel_sideways_friction
 -cl_movement_airaccelerate $sv_airaccelerate
 -cl_movement_edgefriction $edgefriction
 -cl_movement_friction $sv_friction
 -cl_movement_jumpvelocity $sv_jumpvelocity
 -cl_movement_maxairspeed $sv_maxairspeed
 -cl_movement_maxspeed $sv_maxspeed
 -cl_movement_stepheight $sv_stepheight
 -cl_movement_stopspeed $sv_stopspeed
 -cl_movement_track_canjump 0 // till DP bug gets fixed
 -cl_movement_wallfriction $sv_wallfriction
 -cl_movement_wateraccelerate $sv_wateraccelerate
 -cl_movement_waterfriction $sv_waterfriction
  
  seta cl_autoswitch 1 "automatically switch to newly picked up weapons if they are better than what you are carrying"
  alias autoswitch "set cl_autoswitch $1 ; cmd autoswitch $1"
@@@ -401,16 -407,16 +401,16 @@@ seta bot_suffix ""      "Suffix behind the b
  seta skill_auto 0     "when 1, \"skill\" gets adjusted to match the best player on the map"
  // general bot AI cvars
  set bot_ai_thinkinterval 0.05
- set bot_ai_strategyinterval 3 "How often a new objective is chosen"
- set bot_ai_enemydetectioninterval 0.5 "How often bots pick a new target"
+ set bot_ai_strategyinterval 5 "How often a new objective is chosen"
+ set bot_ai_enemydetectioninterval 3 "How often bots pick a new target"
  set bot_ai_enemydetectionradius 10000 "How far bots can see enemies"
- set bot_ai_dodgeupdateinterval 0.1 "How often scan for items to dodge. Currently not in use."
- set bot_ai_chooseweaponinterval 0.3 "How often the best weapon according to the situation will be chosen"
- set bot_ai_dangerdetectioninterval 0.1 "How often scan for waypoints with dangers near"
+ set bot_ai_dodgeupdateinterval 0.2 "How often scan for items to dodge. Currently not in use."
+ set bot_ai_chooseweaponinterval 0.5 "How often the best weapon according to the situation will be chosen"
+ set bot_ai_dangerdetectioninterval 0.25 "How often scan for waypoints with dangers near"
  set bot_ai_dangerdetectionupdates 64 "How many waypoints will be considered for danger detection"
  set bot_ai_aimskill_blendrate 2       "How much correction will be applied to the aiming angle"
  set bot_ai_aimskill_fixedrate 15
- set bot_ai_aimskill_firetolerance_distdegrees 180
+ set bot_ai_aimskill_firetolerance_distdegrees 100
  set bot_ai_aimskill_firetolerance_mindegrees 2 "Minimum angle tolerance. Used on large distances"
  set bot_ai_aimskill_firetolerance_maxdegrees 60 "Maximum firing angle. Used on close range"
  set bot_ai_aimskill_mouse 1 "How much of the aiming filters are applied"
@@@ -419,17 -425,17 +419,17 @@@ set bot_ai_keyboard_treshold 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 campingrifle rocketlauncher minelayer grenadelauncher electro hagar hlac crylink laser uzi fireball seeker shotgun tuba"       "Desired weapons for far distances ordered by priority"
 -set bot_ai_custom_weapon_priority_mid   "minstanex rocketlauncher nex fireball seeker minelayer grenadelauncher electro uzi campingrifle crylink hlac hagar shotgun laser tuba"       "Desired weapons for middle distances ordered by priority"
 -set bot_ai_custom_weapon_priority_close "minstanex nex uzi hlac tuba seeker hagar crylink minelayer grenadelauncher shotgun electro campingrifle rocketlauncher laser fireball"       "Desired weapons for close distances ordered by priority"
 +set bot_ai_custom_weapon_priority_far   "minstanex nex sniperrifle 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 sniperrifle crylink hlac hagar shotgun laser 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 sniperrifle rocketlauncher laser fireball minelayer"        "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.3 "Try to make a combo N seconds after the last attack"
+ 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"
  set bot_ai_ignoregoal_timeout 3       "Ignore goals making bots to get stuck in front of a wall for N seconds"
  set bot_ai_bunnyhop_skilloffset 7     "Bots with skill equal or greater than this value will perform the  \"bunnyhop\" technique"
- set bot_ai_bunnyhop_startdistance 250 "Run to goals located further than this distance"
- set bot_ai_bunnyhop_stopdistance 220 "Stop jumping after reaching this distance to the goal"
- set bot_ai_bunnyhop_firstjumpdelay 0.5 "Start running to the goal only if it was seen for more than N seconds"
+ set bot_ai_bunnyhop_startdistance 100 "Run to goals located further than this distance"
+ set bot_ai_bunnyhop_stopdistance 125 "Stop jumping after reaching this distance to the goal"
+ set bot_ai_bunnyhop_firstjumpdelay 0.2 "Start running to the goal only if it was seen for more than N seconds"
  set bot_god 0 "god mode for bots"
  set bot_ai_navigation_jetpack 0 "Enable bots to navigat maps using the jetpack"
  set bot_ai_navigation_jetpack_mindistance 3500 "Bots will try fly to objects located farther than this distance"
@@@ -459,7 -465,7 +459,7 @@@ alias g_waypointeditor_unreachable "imp
  
  locs_enable 0
  pausable 0
 -seta g_spawnshieldtime 0.300000 "number of seconds you are invincible after you spawned, this shield is lost after you fire"
 +seta g_spawnshieldtime 1.000000 "number of seconds you are invincible after you spawned, this shield is lost after you fire"
  seta g_antilag 2      "AntiLag (0 = no AntiLag, 1 = verified client side hit scan, 2 = server side hit scan in the past, 3 = unverified client side hit scan)"
  set g_antilag_nudge 0 "don't touch"
  set g_antilag_bullets 1 "Bullets AntiLag (0 = no AntiLag, 1 = server side hit scan in the past) - DO NOT TOUCH (severely changes weapon balance)"
@@@ -561,14 -567,6 +561,14 @@@ seta g_nexball_goalleadlimit -1 "Nexbal
  seta g_ctf_win_mode 0 "0: captures only, 1: captures, then points, 2: points only"
  seta g_ctf_ignore_frags 0     "1: regular frags give no points"
  
 +set g_freezetag 0 "Freeze Tag: Freeze the opposing team(s) to win, unfreeze teammates by standing next to them"
 +seta g_freezetag_warmup 5 "Time players get to run around before the round starts"
 +seta g_freezetag_point_limit -1       "Freeze Tag point limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
 +seta g_freezetag_point_leadlimit -1   "Freeze Tag point lead limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
 +seta g_freezetag_revive_time 2.5 "Time it takes to revive a frozen teammate"
 +seta g_freezetag_revive_extra_size 100 "Distance in qu that you can stand from a frozen teammate to keep reviving him"
 +seta g_freezetag_frozen_force 0.6 "How much to multiply the force on a frozen player with"
 +
  // 50% of the spawns shall be far away from any players
  set g_spawn_furthest 0.5
  // respawn delay
@@@ -578,56 -576,36 +578,56 @@@ set g_respawn_waves 0 "respawn in wave
  // to force disable delay or waves, set them to 0.125
  set g_ctf_respawn_delay 0
  set g_ctf_respawn_waves 0
 +set g_ctf_weapon_stay 0
  set g_dm_respawn_delay 0
  set g_dm_respawn_waves 0
 +set g_dm_weapon_stay 0
  set g_dom_respawn_delay 0
  set g_dom_respawn_waves 0
 +set g_dom_weapon_stay 0
  set g_lms_respawn_delay 0
  set g_lms_respawn_waves 0
 +set g_lms_weapon_stay 0
  set g_rune_respawn_delay 0
  set g_rune_respawn_waves 0
 +set g_rune_weapon_stay 0
  set g_tdm_respawn_delay 0
  set g_tdm_respawn_waves 0
 +set g_tdm_weapon_stay 0
  set g_kh_respawn_delay 0
  set g_kh_respawn_waves 0
 +set g_kh_weapon_stay 0
  set g_arena_respawn_delay 0
  set g_arena_respawn_waves 0
 +set g_arena_weapon_stay 0
  set g_ca_respawn_delay 0
  set g_ca_respawn_waves 0
 +set g_ca_weapon_stay 0
  set g_ca_damage2score_multiplier 0.01
  set g_ca_round_timelimit 180
  set g_nexball_respawn_delay 0
  set g_nexball_respawn_waves 0
 +set g_nexball_weapon_stay 0
  set g_as_respawn_delay 0
  set g_as_respawn_waves 0
 +set g_as_weapon_stay 0
  set g_ons_respawn_delay 0
  set g_ons_respawn_waves 0
 +set g_ons_weapon_stay 0
  set g_rc_respawn_waves 0
  set g_rc_respawn_delay 0
 +set g_rc_weapon_stay 0
  set g_cts_respawn_waves 0
 -set g_cts_respawn_delay 0.25
 +set g_cts_respawn_delay 0
  set g_cts_selfdamage 1 "0 = disable all selfdamage and falldamage in cts"
  set g_cts_finish_kill_delay 10 "prevent cheating by running back to the start line, and starting out with more speed than otherwise possible"
 +set g_cts_weapon_stay 1
 +set g_freezetag_respawn_waves 0
 +set g_freezetag_respawn_delay 0
 +set g_freezetag_weapon_stay 0
 +set g_ka_respawn_delay 0
 +set g_ka_respawn_waves 0
 +set g_ka_weapon_stay 0
  
  // overtime
  seta timelimit_overtime 2 "duration in minutes of one added overtime, added to the timelimit"
@@@ -637,13 -615,11 +637,13 @@@ seta timelimit_suddendeath 5 "number o
  // common team values
  set g_tdm 0 "Team Deathmatch: the team who kills their opponents most often wins"
  
 -seta teamplay_default 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 g_mirrordamage 0.300000  "for teamplay 4: mirror damage factor"
 -seta g_friendlyfire 0.100000  "for teamplay 4: fiendly fire factor"
 -seta g_teamdamage_threshold 50        "for teamplay 4: threshold over which to apply mirror damage"
 -seta g_teamdamage_resetspeed 30       "for teamplay 4: how fast player's teamdamage count decreases"
 +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 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"
 +seta g_friendlyfire_virtual 1 "for teamplay 4: do not actually apply friendly fire, just show graphics effect for it"
 +seta g_teamdamage_threshold 40        "for teamplay 4: threshold over which to apply mirror damage"
 +seta g_teamdamage_resetspeed 20       "for teamplay 4: how fast player's teamdamage count decreases"
  
  set deathmatch_force_teamplay 0       "Always play TDM instead of DM"
  seta g_balance_teams 0        "automatically balance out players entering instead of asking them for their preferred team"
@@@ -870,7 -846,7 +870,7 @@@ r_picmipsprites 0 // Xonotic uses sprit
  r_picmipworld 1
  gl_picmip_world 0
  gl_picmip_sprites 0
 -gl_picmip_other 2 // so, picmip -2 is best possible quality
 +gl_picmip_other 1 // so, picmip -1 is best possible quality
  r_mipsprites 1
  r_mipskins 1
  r_shadow_realtime_world_lightmaps 1
@@@ -938,6 -914,8 +938,6 @@@ alias +fire2 +button
  alias -fire2 -button3
  alias +attack2 +button3 // old alias from Nexuiz
  alias -attack2 -button3 // old alias name from Nexuiz
 -alias +zoom +button4
 -alias -zoom -button4
  alias +crouch +button5
  alias -crouch -button5
  alias weapnext "_weapnext_${cl_weaponpriority_useforcycling}"
@@@ -951,12 -929,6 +951,12 @@@ alias _weapprev_1 "impulse 16
  alias _weapprev_2 "impulse 12"
  alias weapbest "impulse 13"
  
 +// experimental zoom toggle (can be in wrong state at start of a game, though)
 +set _togglezoom +
 +alias +zoom "set _togglezoom -; +button4"
 +alias -zoom "set _togglezoom +; -button4"
 +alias togglezoom "${_togglezoom}zoom"
 +
  alias reload "impulse 20"
  
  // movement
@@@ -1085,8 -1057,8 +1085,8 @@@ alias vstop "cmd vote stop
  alias vmaster "cmd vote master"
  alias vlogin "cmd vote login $*"
  alias vdo "cmd vote do $*"
 -alias vyes "cmd vote yes"
 -alias vno "cmd vote no"
 +alias vyes "cl_cmd vyes"
 +alias vno "cl_cmd vno"
  alias vdontcare "cmd vote dontcare"
  alias vabstain "cmd vote abstain"
  
@@@ -1139,7 -1111,7 +1139,7 @@@ set quit_and_redirect ""        "set to an IP 
  // singleplayer campaign
  set g_campaign 0
  set g_campaign_forceteam 0 "Forces the player to a given team in campaign mode, 1 = red, 2 = blue, 3 = yellow, 4 = pink"
 -seta g_campaign_name "xonotic25"
 +seta g_campaign_name "xonoticbeta"
  set g_campaign_skill 0
  set g_campaignxonotic20_index 0
  set g_campaignxonotic25_index 1
@@@ -1271,28 -1243,6 +1271,28 @@@ set g_balance_keyhunt_damageforcescale 
  seta g_keyhunt_teams_override 0
  set g_keyhunt_teams 0
  
 +// keepaway
 +set g_keepaway 0 "game mode which focuses around a ball, look at g_keepaway_win_mode for further details"
 +set g_keepaway_bckillscore 1 "enable scoring points (y/n) for ball carrier kills"
 +set g_keepaway_pointlimit     -1      "total amount of points you can get, -1 for unlimited"
 +set g_keepaway_pointleadlimit -1      "mercy rule, -1 for unlimited"
 +set g_keepaway_ballcarrier_alpha 0.6 "alpha when the player is the ballcarrier"
 +set g_keepaway_ballcarrier_highspeed 1.5 "speed multiplier done to the person holding the ball"
 +set g_keepaway_ballcarrier_damage     1.5     "damage multiplier while having powerup"
 +set g_keepaway_ballcarrier_force      1.5     "force multiplier while having powerup"
 +set g_keepaway_ballcarrier_selfdamage 1       "self damage multiplier while having powerup"
 +set g_keepaway_ballcarrier_selfforce  1.5     "self force multiplier while having powerup"
 +set g_keepaway_noncarrier_warn        0       "warn players when they kill without holding the ball"
 +set g_keepaway_noncarrier_damage      0.5     "damage done to other players if both you and they don't have the ball"
 +set g_keepaway_noncarrier_force       0.5     "force done to other players if both you and they don't have the ball"
 +set g_keepaway_noncarrier_selfdamage  1       "self damage if you don't have the ball"
 +set g_keepaway_noncarrier_selfforce   1       "self force if you don't have the ball"
 +set g_keepawayball_trail_color        254     "particle trail color from player/ball"
 +set g_keepawayball_damageforcescale   2 "Scale of force which is applied to the ball by weapons/explosions/etc"
 +set g_keepawayball_respawntime        15      "if no one picks up the ball, how long to wait until the ball respawns"
 +seta g_keepaway_teams_override 0
 +set g_keepaway_teams 0
 +
  // so it can be stuffcmd-ed still
  set cl_gravity 800    "but ignored anyway"
  
@@@ -1395,11 -1345,8 +1395,11 @@@ seta hud_panel_weapons_ammo_full_nails 
  seta hud_panel_weapons_ammo_full_cells 80 "show 100% of the status bar at this ammo count"
  seta hud_panel_weapons_ammo_full_rockets 80 "show 100% of the status bar at this ammo count"
  seta hud_panel_weapons_ammo_full_fuel 100 "show 100% of the status bar at this ammo count"
 -seta hud_panel_weapons_timeout "3" "panel disappears if you don't switch weapon for this amount of seconds"
 -seta hud_panel_weapons_timeout_effect "1" "disappearance effect: 0) no effect; 1) panel moves out of screen; 2) panel fades out"
 +
 +seta hud_panel_ammo_maxammo "40" "when you have this much ammo, the ammo status bar is full"
 +
 +seta hud_panel_healtharmor_maxhealth "250" "when you have this much health, the health status bar is full"
 +seta hud_panel_healtharmor_maxarmor "150" "when you have this much armor, the armor status bar is full"
  
  seta hud_panel_notify_time 10 "time that a new entry stays until it fades out"
  seta hud_panel_notify_fadetime 3 "fade out time"
@@@ -1420,20 -1367,16 +1420,20 @@@ seta hud_panel_engineinfo_framecounter_
  seta hud_showbinds 1  "the way to show the keys to press in HUD messages: 0 displays commands, 1 bound keys, 2 both"
  seta hud_showbinds_limit 2    "maximum number of bound keys to show for a command. 0 for unlimited"
  
 -seta hud_damage 1 "an improved version of gl_polyblend, draw an image instead when hurt"
 +seta hud_colorflash_alpha 0.5 "starting alpha of the color flash"
 +
 +seta hud_damage 0.55 "an improved version of gl_polyblend, draw an image instead when hurt"
 +seta hud_damage_gentle_alpha_multiplier 0.10 "how much to multiply alpha of flash when using the cl_gentle version, it's much more opaque than the non-gentle version"
 +seta hud_damage_gentle_color "1 0.7 1" "color of flash for cl_gentle version"
  seta hud_damage_color "1 0 0" "color of flash"
 -seta hud_damage_factor 0.05 "(damage * factor) = how much to add to the alpha value"
 -seta hud_damage_fade_rate 1 "how much to subtract from the alpha value each second"
 -seta hud_damage_maxalpha 2 "how much to limit the alpha value to"
 -seta hud_damage_pain_treshold 0.1 "how much alpha to ignore (must be bigger than the hud_damage_factor so that e.g. rot is ignored)"
 -seta hud_damage_pain_treshold_lower 1 "how much we lower pain_treshold with when nearing 0 health (if pain_treshold gets negative then we always draw a flash at alpha = fabs(pain_treshold)"
 -seta hud_damage_pain_treshold_lower_health 50 "at which health we start lowering pain_treshold"
 -seta hud_damage_pain_treshold_pulsating_min 0.6 "minimum value when calculating the pulse: max(pulsating_min, fabs(sin(PI * time / period))"
 -seta hud_damage_pain_treshold_pulsating_period 0.8 "one pulse every X seconds"
 +seta hud_damage_factor 0.025 "(damage * factor) = how much to add to the alpha value"
 +seta hud_damage_fade_rate 0.75 "how much to subtract from the alpha value each second"
 +seta hud_damage_maxalpha 1.5 "how much to limit the alpha value to"
 +seta hud_damage_pain_threshold 0.1 "how much alpha to ignore (must be bigger than the hud_damage_factor so that e.g. rot is ignored)"
 +seta hud_damage_pain_threshold_lower 1.25 "how much we lower pain_threshold with when nearing 0 health (if pain_threshold gets negative then we always draw a flash at alpha = fabs(pain_threshold)"
 +seta hud_damage_pain_threshold_lower_health 50 "at which health we start lowering pain_threshold"
 +seta hud_damage_pain_threshold_pulsating_min 0.6 "minimum value when calculating the pulse: max(pulsating_min, fabs(sin(PI * time / period))"
 +seta hud_damage_pain_threshold_pulsating_period 0.8 "one pulse every X seconds"
  
  // scoreboard
  seta scoreboard_columns default
@@@ -1540,8 -1483,7 +1540,8 @@@ sv_gameplayfix_q2airaccelerate 
  sv_gameplayfix_stepmultipletimes 1
  
  // delay for "kill" to prevent abuse
 -set g_balance_kill_delay 5
 +set g_balance_kill_delay 2
 +set g_balance_kill_antispam 5
  
  // this feature is currently buggy in the engine (it appears to PREVENT any dropping in lots of maps, leading to weirdly aligned entities, and in some cases even CAUSES them to drop through solid, like in facing worlds nex)
  sv_gameplayfix_droptofloorstartsolid 0
@@@ -1605,12 -1547,12 +1605,12 @@@ set g_jump_grunt 0   "Do you make a grunt
  
  alias allready "sv_cmd allready"
  
 -seta cl_weaponpriority "minstanex rocketlauncher nex minelayer grenadelauncher fireball hlac hagar seeker crylink campingrifle uzi electro tuba shotgun laser hook porto" "weapon priority list"
 +seta cl_weaponpriority "minstanex rocketlauncher nex minelayer grenadelauncher fireball hlac hagar seeker crylink sniperrifle uzi electro tuba shotgun laser hook porto" "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 campingrifle"                           "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 campingrifle 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_weaponpriority2 "minstanex nex sniperrifle"                           "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 sniperrifle 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 "minelayer grenadelauncher 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_weaponpriority6 "" "use impulse 206 for prev gun from this list, 216 for best gun, 226 for next gun"
@@@ -1629,7 -1571,7 +1629,7 @@@ if_dedicated set g_start_delay 15       "dela
  
  alias ons_map           "cl_cmd radar" // legacy alias
  alias radar             "cl_cmd radar"
 -alias scoreboard_columns_set  "cl_cmd scoreboard_columns_set $*"
 +alias scoreboard_columns_set  "" // aliased later
  alias scoreboard_columns_help "cl_cmd scoreboard_columns_help $*"
  
  alias _gl_flashblend_update_00 "gl_flashblend 1"
@@@ -1647,6 -1589,7 +1647,6 @@@ set cl_handicap 1       "the higher, the mor
  alias menu_showteamselect "menu_cmd directmenu TeamSelect"
  alias menu_showhudexit "menu_cmd directmenu HUDExit"
  alias menu_showhudoptions "menu_cmd directpanelhudmenu $*"
 -alias menu_sync "menu_cmd sync"
  bind f5 menu_showteamselect
  
  set g_bugrigs 0
@@@ -1739,7 -1682,6 +1739,7 @@@ seta sv_gentle 0                "force gentle mode fo
  seta cl_gentle 0              "client side gentle mode, master switch for removing both gibs and messages"
  seta cl_gentle_gibs 0         "client side gentle mode (only replaces gibs); when set to 1, white smoke replaces gibs, when set to 2, colorful clouds replace gibs"
  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"
  
  seta cl_racetimer_position 0.25 "Y-axis positioning of the race timer (from 0 to 1)"
  seta cl_showpressedkeys       0       "Show which movement keys someone is pressing: 1 for spectating, 2 for always"
@@@ -1754,7 -1696,7 +1754,7 @@@ seta cl_showspeed_position 0.7 "Y-axis 
  seta cl_showacceleration 0 "show the XY acceleration of the player"
  seta cl_showacceleration_z 0 "include the speed on the Z-axis"
  seta cl_showacceleration_size 40 "height of the bar"
 -seta cl_showacceleration_scale 5 "X-axis scale of the bar"
 +seta cl_showacceleration_scale 1 "X-axis scale of the bar"
  seta cl_showacceleration_alpha 0.5 "alpha of the bar"
  seta cl_showacceleration_color_custom 0 "0 = dynamic color depending on acceleration, 1 = use custom color"
  seta cl_showacceleration_color "1 0 0" "color of the bar, needs cl_showacceleration_color_custom to be 1"
@@@ -1816,7 -1758,6 +1816,7 @@@ alias cl_hook_gamestart_a
  alias cl_hook_gamestart_rc
  alias cl_hook_gamestart_nexball
  alias cl_hook_gamestart_cts
 +alias cl_hook_gamestart_ka
  alias cl_hook_gameend
  alias cl_hook_activeweapon
  
@@@ -1837,7 -1778,6 +1837,7 @@@ alias sv_hook_gamestart_a
  alias sv_hook_gamestart_rc
  alias sv_hook_gamestart_nexball
  alias sv_hook_gamestart_cts
 +alias sv_hook_gamestart_ka
  alias sv_hook_gamerestart
  alias sv_hook_gameend
  
@@@ -1916,6 -1856,9 +1916,6 @@@ collision_endposnudge 
  set cl_lerpanim_maxdelta_framegroups 0.05 // must be faster than fastest weapon refire
  set cl_lerpanim_maxdelta_server 0.1 // must be slower than slowest server controlled anim (e.g. animinfo stuff)
  
 -// player ID
 -seta _cl_userid "" "player ID (e.g. for tournaments)"
 -
  // FIXME workaround for engine bug
  sv_gameplayfix_nudgeoutofsolid 0
  // to div0: remove this once 5b7ac1706712977bbc0297d2d53294e73574c7cd (svn r9537) is in the stable branch of the engine again
@@@ -1960,7 -1903,7 +1960,7 @@@ set g_weaponreplace_porto "
  set g_weaponreplace_minstanex ""
  set g_weaponreplace_hook ""
  set g_weaponreplace_hlac ""
 -set g_weaponreplace_campingrifle ""
 +set g_weaponreplace_sniperrifle ""
  set g_weaponreplace_tuba ""
  set g_weaponreplace_fireball ""
  set g_weaponreplace_seeker ""
@@@ -1987,11 -1930,9 +1987,11 @@@ scr_loadingscreen_background 
  scr_loadingscreen_barcolor "0 0.5 1"
  scr_loadingscreen_barheight 20
  scr_loadingscreen_count 1
 +scr_conforcewhiledisconnected 0
  
  // DP cannot properly detect this, so rather turn off the detection
  r_texture_dds_load_dxt1_noalpha 1
 +r_texture_dds_load_swdecode 1 // SW decode to quarter res if we want to load DDS but don't support the extension for it
  
  // particles optimization
  r_drawparticles_nearclip_min 8
@@@ -2023,7 -1964,7 +2023,7 @@@ utf8_enable 
  // safe font defaults
  r_font_hinting 1
  r_font_disable_freetype 0
 -r_font_size_snapping 2
 +r_font_size_snapping 4
  
  // database management
  set sv_db_saveasdump 0 "write server.db in dump format (loads slower, easier to read/parse)"
@@@ -2053,40 -1994,15 +2053,40 @@@ set g_forced_team_yellow "" "list of pl
  set g_forced_team_pink "" "list of player IDs for pink team"
  set g_forced_team_otherwise "default" "action if a non listed player joins (can be default for default action, spectate for forcing to spectate, or red, blue, yellow, pink)"
  
 +// random charge stuff :P
 +set g_weapon_charge_colormod_hdrmultiplier 4 "how much to multiply the colors by in the colormod vector"
 +set g_weapon_charge_colormod_red_half 0
 +set g_weapon_charge_colormod_green_half 0.5
 +set g_weapon_charge_colormod_blue_half 1
 +set g_weapon_charge_colormod_red_full 1
 +set g_weapon_charge_colormod_green_full -0.5
 +set g_weapon_charge_colormod_blue_full -1
 +
 +// player statistics server URI
 +set g_playerstats_uri ""
 +
 +// create this cvar in case the engine did not
 +set snd_soundradius 1200
 +
 +// loading screen
 +scr_loadingscreen_scale 1
 +scr_loadingscreen_scale_base 1
 +scr_loadingscreen_scale_limit 1
 +
  // other config files
  exec balanceXonotic.cfg
  exec ctfscoring-ai.cfg
  exec effects-normal.cfg
 -exec physicsNoQWBunny-xpmbased.cfg
 +exec physicsX0.cfg
  exec turrets.cfg
 +exec font-nimbussansl.cfg
  
  // hud cvar descriptions
  exec _hud_descriptions.cfg
  // exec the default skin config
  // please add any new cvars into the hud_save script in qcsrc/client/hud.qc for consistency
  exec hud_luminos.cfg
 +
 +// enable menu syncing
 +alias menu_sync "menu_cmd sync"
 +alias scoreboard_columns_set  "cl_cmd scoreboard_columns_set $*"
diff --combined qcsrc/server/bot/aim.qc
index 1911daf9e6a3ad2f5504995fac11f68b3256f5f1,43398b3d901dc40aefd96d048fc4f33ced290584..9ef109e2b585e3c76053c7b183fbc49da22543ff
@@@ -109,10 -109,6 +109,10 @@@ float bot_shouldattack(entity e
                        return FALSE;
        }
  
 +      if(g_freezetag)
 +              if(e.freezetag_frozen)
 +                      return FALSE;
 +
        if(teams_matter)
        {
                if(e.team==0)
@@@ -176,7 -172,7 +176,7 @@@ float bot_aimdir(vector v, float maxfir
        if (time >= self.bot_badaimtime)
        {
                self.bot_badaimtime = max(self.bot_badaimtime + 0.3, time);
 -              self.bot_badaimoffset = randomvec() * bound(0, 5 - 0.5 * (skill+self.bot_offsetskill), 5) * cvar("bot_ai_aimskill_offset");
 +              self.bot_badaimoffset = randomvec() * bound(0, 5 - 0.5 * (skill+self.bot_offsetskill), 5) * autocvar_bot_ai_aimskill_offset;
        }
        desiredang = vectoangles(v) + self.bot_badaimoffset;
        //dprint(" desired:", vtos(desiredang));
        self.bot_prevaimtime = time;
        // Here we will try to anticipate the comming aiming direction
        self.bot_1st_order_aimfilter= self.bot_1st_order_aimfilter
 -              + (diffang * (1 / delta_t)    - self.bot_1st_order_aimfilter) * bound(0, cvar("bot_ai_aimskill_order_filter_1st"),1);
 +              + (diffang * (1 / delta_t)    - self.bot_1st_order_aimfilter) * bound(0, autocvar_bot_ai_aimskill_order_filter_1st,1);
        self.bot_2nd_order_aimfilter= self.bot_2nd_order_aimfilter
 -              + (self.bot_1st_order_aimfilter - self.bot_2nd_order_aimfilter) * bound(0, cvar("bot_ai_aimskill_order_filter_2nd"),1);
 +              + (self.bot_1st_order_aimfilter - self.bot_2nd_order_aimfilter) * bound(0, autocvar_bot_ai_aimskill_order_filter_2nd,1);
        self.bot_3th_order_aimfilter= self.bot_3th_order_aimfilter
 -              + (self.bot_2nd_order_aimfilter - self.bot_3th_order_aimfilter) * bound(0, cvar("bot_ai_aimskill_order_filter_3th"),1);
 +              + (self.bot_2nd_order_aimfilter - self.bot_3th_order_aimfilter) * bound(0, autocvar_bot_ai_aimskill_order_filter_3th,1);
        self.bot_4th_order_aimfilter= self.bot_4th_order_aimfilter
 -              + (self.bot_3th_order_aimfilter - self.bot_4th_order_aimfilter) * bound(0, cvar("bot_ai_aimskill_order_filter_4th"),1);
 +              + (self.bot_3th_order_aimfilter - self.bot_4th_order_aimfilter) * bound(0, autocvar_bot_ai_aimskill_order_filter_4th,1);
        self.bot_5th_order_aimfilter= self.bot_5th_order_aimfilter
 -              + (self.bot_4th_order_aimfilter - self.bot_5th_order_aimfilter) * bound(0, cvar("bot_ai_aimskill_order_filter_5th"),1);
 +              + (self.bot_4th_order_aimfilter - self.bot_5th_order_aimfilter) * bound(0, autocvar_bot_ai_aimskill_order_filter_5th,1);
  
        //blend = (bound(0,skill,10)*0.1)*pow(1-bound(0,skill,10)*0.05,2.5)*5.656854249; //Plot formule before changing !
        blend = bound(0,skill+self.bot_aimskill,10)*0.1;
        desiredang = desiredang + blend *
        (
 -                self.bot_1st_order_aimfilter * cvar("bot_ai_aimskill_order_mix_1st")
 -              + self.bot_2nd_order_aimfilter * cvar("bot_ai_aimskill_order_mix_2nd")
 -              + self.bot_3th_order_aimfilter * cvar("bot_ai_aimskill_order_mix_3th")
 -              + self.bot_4th_order_aimfilter * cvar("bot_ai_aimskill_order_mix_4th")
 -              + self.bot_5th_order_aimfilter * cvar("bot_ai_aimskill_order_mix_5th")
 +                self.bot_1st_order_aimfilter * autocvar_bot_ai_aimskill_order_mix_1st
 +              + self.bot_2nd_order_aimfilter * autocvar_bot_ai_aimskill_order_mix_2nd
 +              + self.bot_3th_order_aimfilter * autocvar_bot_ai_aimskill_order_mix_3th
 +              + self.bot_4th_order_aimfilter * autocvar_bot_ai_aimskill_order_mix_4th
 +              + self.bot_5th_order_aimfilter * autocvar_bot_ai_aimskill_order_mix_5th
        );
  
        // calculate turn angles
        diffang_y = diffang_y - floor(diffang_y / 360) * 360;
        if (diffang_y >= 180)
                diffang_y = diffang_y - 360;
 -      desiredang = desiredang + diffang * bound(0,cvar("bot_ai_aimskill_think"),1);
 +      desiredang = desiredang + diffang * bound(0,autocvar_bot_ai_aimskill_think,1);
  
        // calculate turn angles
        diffang = desiredang - self.v_angle;
  
        // turn
        local float r, fixedrate, blendrate;
 -      fixedrate = cvar("bot_ai_aimskill_fixedrate") / bound(1,dist,1000);
 -      blendrate = cvar("bot_ai_aimskill_blendrate");
 +      fixedrate = autocvar_bot_ai_aimskill_fixedrate / bound(1,dist,1000);
 +      blendrate = autocvar_bot_ai_aimskill_blendrate;
        r = max(fixedrate, blendrate);
        //self.v_angle = self.v_angle + diffang * bound(frametime, r * frametime * (2+skill*skill*0.05-random()*0.05*(10-skill)), 1);
        self.v_angle = self.v_angle + diffang * bound(delta_t, r * delta_t * (2+pow(skill+self.bot_mouseskill,3)*0.005-random()), 1);
 -      self.v_angle = self.v_angle * bound(0,cvar("bot_ai_aimskill_mouse"),1) + desiredang * bound(0,(1-cvar("bot_ai_aimskill_mouse")),1);
 +      self.v_angle = self.v_angle * bound(0,autocvar_bot_ai_aimskill_mouse,1) + desiredang * bound(0,(1-autocvar_bot_ai_aimskill_mouse),1);
        //self.v_angle = self.v_angle + diffang * bound(0, r * frametime * (skill * 0.5 + 2), 1);
        //self.v_angle = self.v_angle + diffang * (1/ blendrate);
        self.v_angle_z = 0;
@@@ -339,10 -335,10 +339,10 @@@ float bot_aim(float shotspeed, float sh
        shotdir = v_forward;
        v = bot_shotlead(self.bot_aimtargorigin, self.bot_aimtargvelocity, shotspeed, self.bot_aimlatency);
        local float distanceratio;
 -      distanceratio =sqrt(bound(0,skill,10000))*0.3*(vlen(v-shotorg)-100)/cvar("bot_ai_aimskill_firetolerance_distdegrees");
 +      distanceratio =sqrt(bound(0,skill,10000))*0.3*(vlen(v-shotorg)-100)/autocvar_bot_ai_aimskill_firetolerance_distdegrees;
        distanceratio = bound(0,distanceratio,1);
 -      r =  (cvar("bot_ai_aimskill_firetolerance_maxdegrees")-cvar("bot_ai_aimskill_firetolerance_mindegrees"))
 -              * (1-distanceratio) + cvar("bot_ai_aimskill_firetolerance_mindegrees");
 +      r =  (autocvar_bot_ai_aimskill_firetolerance_maxdegrees-autocvar_bot_ai_aimskill_firetolerance_mindegrees)
 +              * (1-distanceratio) + autocvar_bot_ai_aimskill_firetolerance_mindegrees;
        if (applygravity && self.bot_aimtarg)
        {
                if (!findtrajectorywithleading(shotorg, '0 0 0', '0 0 0', self.bot_aimtarg, shotspeed, shotspeedupward, maxshottime, 0, self))
        {
                f = bot_aimdir(v - shotorg, r);
                //dprint("AIM: ");dprint(vtos(self.bot_aimtargorigin));dprint(" + ");dprint(vtos(self.bot_aimtargvelocity));dprint(" * ");dprint(ftos(self.bot_aimlatency + vlen(self.bot_aimtargorigin - shotorg) / shotspeed));dprint(" = ");dprint(vtos(v));dprint(" : aimdir = ");dprint(vtos(normalize(v - shotorg)));dprint(" : ");dprint(vtos(shotdir));dprint("\n");
-               traceline(shotorg, shotorg + shotdir * 10000, FALSE, self);
-               if (trace_ent.takedamage)
-               if (trace_fraction < 1)
-               if (!bot_shouldattack(trace_ent))
-                       return FALSE;
+               //traceline(shotorg, shotorg + shotdir * 10000, FALSE, self);
+               //if (trace_ent.takedamage)
+               //if (trace_fraction < 1)
+               //if (!bot_shouldattack(trace_ent))
+               //      return FALSE;
                traceline(shotorg, self.bot_aimtargorigin, FALSE, self);
                if (trace_fraction < 1)
                if (trace_ent != self.enemy)
                if (!bot_shouldattack(trace_ent))
                        return FALSE;
        }
-       if (r > maxshottime * shotspeed)
-               return FALSE;
-       return f;
+       //if (r > maxshottime * shotspeed)
+       //      return FALSE;
+       return TRUE;
  };
index c685735ac84b25e298a2a81a4a0dfb0b3ed6bbc0,442711514573e697ac99baa98c25b3ff4403ffc3..f71df778dad283a245f63a2ade567cad9e9f9d72
@@@ -21,8 -21,7 +21,8 @@@ void havocbot_ai(
                }
                else
                {
 -                      self.havocbot_role();
 +                      if not(self.jumppadcount)
 +                              self.havocbot_role();
                }
  
                // TODO: tracewalk() should take care of this job (better path finding under water)
@@@ -81,7 -80,7 +81,7 @@@
        havocbot_chooseenemy();
        if (self.bot_chooseweapontime < time )
        {
 -              self.bot_chooseweapontime = time + cvar("bot_ai_chooseweaponinterval");
 +              self.bot_chooseweapontime = time + autocvar_bot_ai_chooseweaponinterval;
                havocbot_chooseweapon();
        }
        havocbot_aim();
@@@ -94,7 -93,7 +94,7 @@@
                if(self.weapons)
                {
                        weapon_action(self.weapon, WR_AIM);
 -                      if (cvar("bot_nofire") || IS_INDEPENDENT_PLAYER(self))
 +                      if (autocvar_bot_nofire || IS_INDEPENDENT_PLAYER(self))
                        {
                                self.BUTTON_ATCK = FALSE;
                                self.BUTTON_ATCK2 = FALSE;
                        next = self.goalstack01.origin - (self.origin + self.view_ofs);
  
                skillblend=bound(0,(skill+self.bot_moveskill-2.5)*0.5,1); //lower skill player can't preturn
 -              distanceblend=bound(0,aimdistance/cvar("bot_ai_keyboard_distance"),1);
 +              distanceblend=bound(0,aimdistance/autocvar_bot_ai_keyboard_distance,1);
                blend = skillblend * (1-distanceblend);
                //v = (now * (distanceblend) + next * (1-distanceblend)) * (skillblend) + now * (1-skillblend);
                //v = now * (distanceblend) * (skillblend) + next * (1-distanceblend) * (skillblend) + now * (1-skillblend);
@@@ -155,7 -154,7 +155,7 @@@ void havocbot_keyboard_movement(vector 
  
        sk = skill + self.bot_moveskill;
  
 -      maxspeed = cvar("sv_maxspeed");
 +      maxspeed = autocvar_sv_maxspeed;
  
        if (time < self.havocbot_keyboardtime)
                return;
  
        local float trigger, trigger1;
        blend = bound(0,sk*0.1,1);
 -      trigger = cvar("bot_ai_keyboard_treshold");
 +      trigger = autocvar_bot_ai_keyboard_treshold;
        trigger1 = 0 - trigger;
  
        // categorize forward movement
        if (self.havocbot_ducktime>time) self.BUTTON_CROUCH=TRUE;
  
        keyboard = self.havocbot_keyboard;
 -      blend = bound(0,vlen(destorg-self.origin)/cvar("bot_ai_keyboard_distance"),1); // When getting close move with 360 degree
 +      blend = bound(0,vlen(destorg-self.origin)/autocvar_bot_ai_keyboard_distance,1); // When getting close move with 360 degree
        //dprint("movement ", vtos(self.movement), " keyboard ", vtos(keyboard), " blend ", ftos(blend), "\n");
        self.movement = self.movement + (keyboard - self.movement) * blend;
  };
@@@ -228,18 -227,20 +228,20 @@@ void havocbot_bunnyhop(vector dir
        local vector deviation;
        local float maxspeed;
  
 -      if(cvar("g_midair"))
 +      if(autocvar_g_midair)
                return;
  
        // Don't jump when using some weapons
+       /*
        if(self.aistatus & AI_STATUS_ATTACKING)
 -      if(self.weapon & WEP_CAMPINGRIFLE)
 +      if(self.weapon == WEP_SNIPERRIFLE)
                return;
  
        if(self.goalcurrent.classname == "player")
                return;
+       */
  
 -      maxspeed = cvar("sv_maxspeed");
 +      maxspeed = autocvar_sv_maxspeed;
  
        if(self.aistatus & AI_STATUS_DANGER_AHEAD)
        {
                        if(self.bot_timelastseengoal)
                        {
                                // for a period of time
 -                              if(time - self.bot_timelastseengoal > cvar("bot_ai_bunnyhop_firstjumpdelay"))
 +                              if(time - self.bot_timelastseengoal > autocvar_bot_ai_bunnyhop_firstjumpdelay)
                                {
                                        local float checkdistance;
                                        checkdistance = TRUE;
                                        // don't run if it is too close
                                        if(self.bot_canruntogoal==0)
                                        {
 -                                              if(bunnyhopdistance > cvar("bot_ai_bunnyhop_startdistance"))
 +                                              if(bunnyhopdistance > autocvar_bot_ai_bunnyhop_startdistance)
                                                        self.bot_canruntogoal = 1;
                                                else
                                                        self.bot_canruntogoal = -1;
                                                if(bunnyhopdistance < vlen(self.origin - self.goalstack01.origin))
                                                if(fabs(self.goalstack01.origin_z - self.goalcurrent.origin_z) < self.maxs_z - self.mins_z)
                                                {
 -                                                      if(vlen(self.goalcurrent.origin - self.goalstack01.origin) > cvar("bot_ai_bunnyhop_startdistance"))
 +                                                      if(vlen(self.goalcurrent.origin - self.goalstack01.origin) > autocvar_bot_ai_bunnyhop_startdistance)
                                                        if(checkpvs(self.origin + self.view_ofs, self.goalstack01))
                                                        {
                                                                checkdistance = FALSE;
                                        if(checkdistance)
                                        {
                                                self.aistatus &~= AI_STATUS_RUNNING;
 -                                              if(bunnyhopdistance > cvar("bot_ai_bunnyhop_stopdistance"))
 +                                              if(bunnyhopdistance > autocvar_bot_ai_bunnyhop_stopdistance)
                                                        self.BUTTON_JUMP = TRUE;
                                        }
                                        else
        }
  
        // Release jump button
+       if(!cvar("sv_pogostick"))
        if(self.flags & FL_ONGROUND == 0)
        {
                if(self.velocity_z < 0 || vlen(self.velocity)<maxspeed)
@@@ -380,7 -382,7 +383,7 @@@ void havocbot_movetogoal(
        //if (self.goalentity)
        //      te_lightning2(self, self.origin, (self.goalentity.absmin + self.goalentity.absmax) * 0.5);
        self.movement = '0 0 0';
 -      maxspeed = cvar("sv_maxspeed");
 +      maxspeed = autocvar_sv_maxspeed;
  
        // Jetpack navigation
        if(self.goalcurrent)
                        dxy = self.origin - self.goalcurrent.origin; dxy_z = 0;
                        d = vlen(dxy);
                        v = vlen(self.velocity -  self.velocity_z * '0 0 1');
 -                      db = (pow(v,2) / (cvar("g_jetpack_acceleration_side") * 2)) + 100;
 +                      db = (pow(v,2) / (autocvar_g_jetpack_acceleration_side * 2)) + 100;
                //      dprint("distance ", ftos(ceil(d)), " velocity ", ftos(ceil(v)), " brake at ", ftos(ceil(db)), "\n");
                        if(d < db || d < 500)
                        {
        // Handling of jump pads
        if(self.jumppadcount)
        {
 -              if(self.flags & FL_ONGROUND)
 -              {
 -                      self.jumppadcount = FALSE;
 -                      if(self.aistatus & AI_STATUS_OUT_JUMPPAD)
 -                              self.aistatus &~= AI_STATUS_OUT_JUMPPAD;
 -              }
 -
 -              // If got stuck on the jump pad try to reach the farther visible item
 +              // If got stuck on the jump pad try to reach the farthest visible item
                if(self.aistatus & AI_STATUS_OUT_JUMPPAD)
                {
                        if(fabs(self.velocity_z)<50)
                                if(newgoal)
                                {
                                        self.ignoregoal = self.goalcurrent;
 -                                      self.ignoregoaltime = time + cvar("bot_ai_ignoregoal_timeout");
 +                                      self.ignoregoaltime = time + autocvar_bot_ai_ignoregoal_timeout;
                                        navigation_clearroute();
                                        navigation_routetogoal(newgoal, self.origin);
                                        self.aistatus &~= AI_STATUS_OUT_JUMPPAD;
                                local float threshold;
                                threshold = maxspeed * 0.2;
                                if(fabs(self.velocity_x) < threshold  &&  fabs(self.velocity_y) < threshold)
 +                              {
 +                                      dprint("Warning: ", self.netname, " got stuck on a jumppad, trying to get out of it now\n");
                                        self.aistatus |= AI_STATUS_OUT_JUMPPAD;
 +                              }
                                return;
                        }
 +
 +                      // Don't chase players while using a jump pad
 +                      if(self.goalcurrent.classname=="player" || self.goalstack01.classname=="player")
 +                              return;
                }
        }
 +      else if(self.aistatus & AI_STATUS_OUT_JUMPPAD)
 +              self.aistatus &~= AI_STATUS_OUT_JUMPPAD;
  
        // If there is a trigger_hurt right below try to use the jetpack or make a rocketjump
        if(skill>6)
  
                        return;
                }
 -              else if(self.health>cvar("g_balance_rocketlauncher_damage")*0.5)
 +              else if(self.health>autocvar_g_balance_rocketlauncher_damage*0.5)
                {
                        if(self.velocity_z < 0)
                        if(client_hasweapon(self, WEP_ROCKET_LAUNCHER, TRUE, FALSE))
                                self.switchweapon = WEP_ROCKET_LAUNCHER;
                                self.v_angle_x = 90;
                                self.BUTTON_ATCK = TRUE;
 -                              self.rocketjumptime = time + cvar("g_balance_rocketlauncher_detonatedelay");
 +                              self.rocketjumptime = time + autocvar_g_balance_rocketlauncher_detonatedelay;
                                return;
                        }
                }
                                if(self.facingwalltime && time > self.facingwalltime)
                                {
                                        self.ignoregoal = self.goalcurrent;
 -                                      self.ignoregoaltime = time + cvar("bot_ai_ignoregoal_timeout");
 +                                      self.ignoregoaltime = time + autocvar_bot_ai_ignoregoal_timeout;
                                        self.bot_strategytime = 0;
                                        return;
                                }
                        // (only when the bot is on the ground or jumping intentionally)
                        self.aistatus &~= AI_STATUS_DANGER_AHEAD;
  
 -                      if(trace_fraction == 1)
 +                      if(trace_fraction == 1 && self.jumppadcount == 0)
                        if(self.flags & FL_ONGROUND || self.aistatus & AI_STATUS_RUNNING || self.BUTTON_JUMP == TRUE)
                        {
                                // Look downwards
        // Bunnyhop!
  //    if(self.aistatus & AI_STATUS_ROAMING)
        if(self.goalcurrent)
 -      if(skill+self.bot_moveskill >= cvar("bot_ai_bunnyhop_skilloffset"))
 +      if(skill+self.bot_moveskill >= autocvar_bot_ai_bunnyhop_skilloffset)
                havocbot_bunnyhop(dir);
  
 -      if ((dir * v_up) >= cvar("sv_jumpvelocity")*0.5 && (self.flags & FL_ONGROUND)) self.BUTTON_JUMP=1;
 +      if ((dir * v_up) >= autocvar_sv_jumpvelocity*0.5 && (self.flags & FL_ONGROUND)) self.BUTTON_JUMP=1;
        if (((dodge * v_up) > 0) && random()*frametime >= 0.2*bound(0,(10-skill-self.bot_dodgeskill)*0.1,1)) self.BUTTON_JUMP=TRUE;
        if (((dodge * v_up) < 0) && random()*frametime >= 0.5*bound(0,(10-skill-self.bot_dodgeskill)*0.1,1)) self.havocbot_ducktime=time+0.3/bound(0.1,skill+self.bot_dodgeskill,10);
  };
@@@ -824,7 -824,7 +827,7 @@@ void havocbot_chooseenemy(
        local entity head, best, head2;
        local float rating, bestrating, i, f;
        local vector eye, v;
 -      if (cvar("bot_nofire") || IS_INDEPENDENT_PLAYER(self))
 +      if (autocvar_bot_nofire || IS_INDEPENDENT_PLAYER(self))
        {
                self.enemy = world;
                return;
                        if (self.health > 30)
                        {
                                // remain tracking him for a shot while (case he went after a small corner or pilar
 -                              self.havocbot_chooseenemy_finished = time + cvar("bot_ai_enemydetectioninterval");
 +                              self.havocbot_chooseenemy_finished = time + autocvar_bot_ai_enemydetectioninterval;
                                return;
                        }
                        // enemy isn't visible, or is far away, or we're injured severely
        }
        if (time < self.havocbot_chooseenemy_finished)
                return;
 -      self.havocbot_chooseenemy_finished = time + cvar("bot_ai_enemydetectioninterval");
 +      self.havocbot_chooseenemy_finished = time + autocvar_bot_ai_enemydetectioninterval;
        eye = self.origin + self.view_ofs;
        best = world;
        bestrating = 100000000;
                {
                        v = (head.absmin + head.absmax) * 0.5;
                        rating = vlen(v - eye);
 -                      if (rating<cvar("bot_ai_enemydetectionradius"))
 +                      if (rating<autocvar_bot_ai_enemydetectionradius)
                        if (bestrating > rating)
                        if (bot_shouldattack(head))
                        {
  
                // I want to do a second scan if no enemy was found or I don't have weapons
                // TODO: Perform the scan when using the rifle (requires changes on the rifle code)
 -              if(best || self.weapons) // || self.weapon == WEP_CAMPINGRIFLE
 +              if(best || self.weapons) // || self.weapon == WEP_SNIPERRIFLE
                        break;
                if(i)
                        break;
@@@ -944,18 -944,34 +947,18 @@@ void havocbot_chooseweapon(
                return;
  
        // Workaround for rifle reloading (..)
 -      if(self.weapon == WEP_CAMPINGRIFLE)
 -      if(i < cvar("g_balance_campingrifle_reloadtime") + 1)
 +      if(self.weapon == WEP_SNIPERRIFLE)
 +      if(i < autocvar_g_balance_sniperrifle_reloadtime + 1)
                return;
  
        local float w;
 -      local float rocket  ; rocket   =-1000;
 -      local float nex     ; nex      =-1000;
 -      local float hagar   ; hagar    =-1000;
 -      local float grenade ; grenade  =-1000;
 -      local float mine    ; mine     =-1000;
 -      local float electro ; electro  =-1000;
 -      local float crylink ; crylink  =-1000;
 -      local float uzi     ; uzi      =-1000;
 -      local float shotgun ; shotgun  =-1000;
 -      local float campingrifle ; campingrifle  =-1000;
 -      local float laser   ; laser    =-1000;
 -      local float minstanex ; minstanex =-1000;
 -      local float bestscore; bestscore = 0;
 -      local float bestweapon; bestweapon=self.switchweapon;
        local float distance; distance=bound(10,vlen(self.origin-self.enemy.origin)-200,10000);
 -      local float maxdelaytime=0.5;
 -      local float spreadpenalty=10;
  
        // Should it do a weapon combo?
        local float af, ct, combo_time, combo;
  
        af = ATTACK_FINISHED(self);
 -      ct = cvar("bot_ai_weapon_combo_threshold");
 +      ct = autocvar_bot_ai_weapon_combo_threshold;
  
        // Bots with no skill will be 4 times more slower than "godlike" bots when doing weapon combos
        // Ideally this 4 should be calculated as longest_weapon_refire / bot_ai_weapon_combo_threshold
  
        combo = FALSE;
  
 -      if(cvar("bot_ai_weapon_combo"))
 +      if(autocvar_bot_ai_weapon_combo)
        if(self.weapon == self.lastfiredweapon)
        if(af > combo_time)
        {
                        }
                }
        }
 -
 -#ifdef 0
 -      // TODO: This disabled code is not working well and got replaced by custom weapon priorities.
 -      // However, this logic should be refactored and moved to weapons code so each new weapon can be
 -      // evaluated dynamically by bots without updating the "ai" or config files.     --mand1nga
 -      float s, distancefromfloor, currentscore;
 -
 -
 -      // Formula:
 -      //      (Damage/Sec * Weapon spefic change to get that damage)
 -      //      *(Time to get to target * weapon specfic hitchange bonus) / (in a time of maxdelaytime)
 -      //      *(Spread change of hit) // if it applies
 -      //      *(Penality for target beeing in air)
 -      // %weaponaddpoint
 -
 -      traceline(self.enemy.origin,self.enemy.origin-'0 0 1000',TRUE,world);
 -      distancefromfloor = self.enemy.origin_z - trace_endpos_z;
 -
 -      if (client_hasweapon(self, WEP_MINSTANEX, TRUE, FALSE))
 -              minstanex = (1000/cvar("g_balance_minstanex_refire")*1.0)
 -                      * (0.5);
 -
 -      if (client_hasweapon(self, WEP_ROCKET_LAUNCHER, TRUE, FALSE)  &&
 -              !(      cvar("bot_ai_weapon_combo") && self.weapon == WEP_ROCKET_LAUNCHER &&
 -                      af > combo_time
 -              )
 -      )
 -              rocket = (cvar("g_balance_rocketlauncher_damage")/cvar("g_balance_rocketlauncher_refire")*0.75)
 -                      * bound(0,(cvar("g_balance_rocketlauncher_speed")/distance*maxdelaytime),1)*1.5;
 -
 -      if (client_hasweapon(self, WEP_NEX, TRUE, FALSE)  &&
 -              !(      cvar("bot_ai_weapon_combo") && self.weapon == WEP_NEX &&
 -                      af > combo_time
 -              )
 -      )
 -              nex = (cvar("g_balance_nex_damage")/cvar("g_balance_nex_refire")*1.0)
 -                      * (0.5);
 -
 -      if (client_hasweapon(self, WEP_HAGAR, TRUE, FALSE) ) // &&
 -      //      !( cvar("bot_ai_weapon_combo") && self.weapon == WEP_HAGAR &&  time < self.bot_lastshot + cvar("g_balance_hagar_primary_refire") ))
 -              hagar = (cvar("g_balance_hagar_primary_damage")/cvar("g_balance_hagar_primary_refire")*1.0)
 -                      * bound(0,(cvar("g_balance_hagar_primary_speed")/distance*maxdelaytime),1)*0.2;
 -
 -      if (client_hasweapon(self, WEP_GRENADE_LAUNCHER, TRUE, FALSE) &&
 -              !(
 -                      cvar("bot_ai_weapon_combo") && self.weapon == WEP_GRENADE_LAUNCHER &&
 -                      af > combo_time
 -              )
 -      )
 -              grenade = (cvar("g_balance_grenadelauncher_primary_damage")/cvar("g_balance_grenadelauncher_primary_refire")*1.0)
 -                      * bound(0,(cvar("g_balance_grenadelauncher_primary_speed")/distance*maxdelaytime),1)*1.1;
 -
 -      if (client_hasweapon(self, WEP_MINE_LAYER, TRUE, FALSE) &&
 -              !(
 -                      cvar("bot_ai_weapon_combo") && self.weapon == WEP_MINE_LAYER &&
 -                      af > combo_time
 -              )
 -      )
 -              mine = (cvar("g_balance_minelayer_damage")/cvar("g_balance_minelayer_refire")*1.0)
 -                      * bound(0,(cvar("g_balance_minelayer_speed")/distance*maxdelaytime),1)*1.1;
 -
 -      if (client_hasweapon(self, WEP_ELECTRO, TRUE, FALSE) &&
 -              !(      cvar("bot_ai_weapon_combo") && self.weapon == WEP_ELECTRO &&
 -                      af > combo_time
 -              )
 -      )
 -              electro = (cvar("g_balance_electro_primary_damage")/cvar("g_balance_electro_primary_refire")*0.75)
 -                      * bound(0,(cvar("g_balance_electro_primary_speed")/distance*maxdelaytime),1)*1.0;
 -
 -      if (client_hasweapon(self, WEP_CRYLINK, TRUE, FALSE) ) // &&
 -      //      !( self.weapon == WEP_CRYLINK &&  time < self.bot_lastshot + cvar("g_balance_crylink_primary_refire") ))
 -              crylink = (cvar("g_balance_crylink_primary_damage")/cvar("g_balance_crylink_primary_refire")*1.0)
 -                      * bound(0,(cvar("g_balance_crylink_primary_speed")/distance*maxdelaytime),1)*(64/(32+cvar("g_balance_crylink_primary_spread")*distance))*1.0;
 -
 -      if (client_hasweapon(self, WEP_UZI, TRUE, FALSE) ) // &&
 -      //      !( self.weapon == WEP_UZI &&  time < self.bot_lastshot + cvar("g_balance_uzi_sustained_refire") ))
 -              uzi = (cvar("g_balance_uzi_sustained_damage")/cvar("g_balance_uzi_sustained_refire")*1.0)
 -                      * bound(0,32/(32+cvar("g_balance_uzi_sustained_spread")*distance),1);
 -
 -      if (client_hasweapon(self, WEP_SHOTGUN, TRUE, FALSE) &&
 -              !(      cvar("bot_ai_weapon_combo") && self.weapon == WEP_SHOTGUN &&
 -                      af > combo_time
 -              )
 -      )
 -              shotgun = (cvar("g_balance_shotgun_primary_damage")*cvar("g_balance_shotgun_primary_bullets")/cvar("g_balance_shotgun_primary_refire")*1.0)
 -                      * bound(0,32/(32+cvar("g_balance_shotgun_primary_spread")*distance),1);
 -
 -      if (client_hasweapon(self, WEP_LASER, FALSE, FALSE) &&
 -              !(      cvar("bot_ai_weapon_combo") && self.weapon == WEP_LASER &&
 -                      af > combo_time
 -              )
 -      )
 -              laser = (cvar("g_balance_laser_primary_damage")/cvar("g_balance_laser_primary_refire")*1.0)
 -                      * bound(0,cvar("g_balance_laser_primary_speed")/distance*maxdelaytime,1);
 -
 -      if((self.enemy.flags & FL_ONGROUND)==FALSE){
 -              rocket = rocket   * (1.5-bound(0, distancefromfloor/cvar("g_balance_rocketlauncher_radius"         ),0.9)); //slight bigger change
 -              grenade = grenade * (1.5-bound(0,distancefromfloor/cvar("g_balance_grenadelauncher_primary_radius"),0.95));
 -              electro = electro * (1.5-bound(0,distancefromfloor/cvar("g_balance_electro_primary_radius"        ),0.95));
 -              laser = laser     * (1.5-bound(0,distancefromfloor/cvar("g_balance_laser_primary_radius"                  ),0.95));
 -      }
 -      /*
 -      dprint("Floor distance: ",ftos(distancefromfloor),"\n");
 -      dprint("Rocket: " , ftos(rocket  ), "\n");
 -      dprint("Nex: "    , ftos(nex     ), "\n");
 -      dprint("Hagar: "  , ftos(hagar   ), "\n");
 -      dprint("Grenade: ", ftos(grenade ), "\n");
 -      dprint("Mine: "   , ftos(mine    ), "\n");
 -      dprint("Electro: ", ftos(electro ), "\n");
 -      dprint("Crylink: ", ftos(crylink ), "\n");
 -      dprint("Uzi: "    , ftos(uzi     ), "\n");
 -      dprint("Shotgun :", ftos(shotgun ), "\n");
 -      dprint("Laser   :", ftos(laser   ), "\n\n");
 -      */
 -      currentscore = -1;
 -      w = WEP_MINSTANEX        ;s = minstanex;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
 -      w = WEP_ROCKET_LAUNCHER  ;s = rocket   ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
 -      w = WEP_NEX              ;s = nex      ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
 -      w = WEP_HAGAR            ;s = hagar    ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
 -      w = WEP_GRENADE_LAUNCHER ;s = grenade  ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
 -      w = WEP_MINE_LAYER       ;s = mine     ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
 -      w = WEP_ELECTRO          ;s = electro  ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
 -      w = WEP_CRYLINK          ;s = crylink  ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
 -      w = WEP_UZI              ;s = uzi      ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
 -      w = WEP_SHOTGUN          ;s = shotgun  ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
 -      w = WEP_LASER            ;s = laser    ;if (s > bestscore){bestscore = s;bestweapon = w;} if (self.switchweapon == w) currentscore = s;
 -
 -      // switch if the best weapon would provide a significant damage increase
 -      if (bestscore > currentscore*1.5){
 -              self.switchweapon = bestweapon;
 -
 -              // buys time for detonating the rocket. not tested yet
 -              if ( cvar("bot_ai_weapon_combo") && bestweapon == WEP_ROCKET_LAUNCHER )
 -                      self.bot_chooseweapontime += (distance  / cvar("g_balance_rocketlauncher_speed"));
 -      }
 -#endif
  };
  
  void havocbot_aim()
@@@ -1184,7 -1336,6 +1187,6 @@@ vector havocbot_dodge(
  {
        // LordHavoc: disabled because this is too expensive
        return '0 0 0';
-       /*
        local entity head;
        local vector dodge, v, n;
        local float danger, bestdanger, vl, d;
                if (head.owner != self)
                {
                        vl = vlen(head.velocity);
 -                      if (vl > sv_maxspeed * 0.3)
 +                      if (vl > autocvar_sv_maxspeed * 0.3)
                        {
                                n = normalize(head.velocity);
                                v = self.origin - head.origin;
                head = head.chain;
        }
        return dodge;
-       */
  };