Merge branch 'master' into terencehill/newpanelhud-dom_points
authorterencehill <piuntn@gmail.com>
Wed, 20 Oct 2010 22:09:40 +0000 (00:09 +0200)
committerterencehill <piuntn@gmail.com>
Wed, 20 Oct 2010 22:09:40 +0000 (00:09 +0200)
Conflicts:
qcsrc/server/cl_client.qc

1  2 
defaultXonotic.cfg
qcsrc/client/hud.qc
qcsrc/common/constants.qh
qcsrc/server/cl_client.qc
qcsrc/server/domination.qc

diff --combined defaultXonotic.cfg
index 6ab48a4f9aafe98060ab42b600a36bfbc9e7b996,050a2915df005d8183456c873e5d9adfb720ccc2..1746535c951c47d2416a98f9aeb51c3ba0e98649
@@@ -79,16 -79,23 +79,23 @@@ alias movetoteam_pink "sv_cmd movetotea
  alias movetoteam_yellow "sv_cmd movetoteam $1 yellow"
  alias movetoteam_auto "sv_cmd movetoteam $1 auto"
  
- // merge lightmaps up to 1024x1024 textures
- // the default of 2048x2048 is too heavy for my rig (SavageX)
- mod_q3bsp_lightmapmergepower 3
+ // merge lightmaps up to 2048x2048 textures
+ mod_q3bsp_lightmapmergepower 4
  
  // player defaults
  _cl_color 102
  _cl_name Player
  _cl_playermodel models/player/umbra.iqm
  _cl_playerskin 0
- crosshair 1
+ seta crosshair 3
+ seta crosshair_color_red 0.6
+ seta crosshair_color_green 0.8
+ seta crosshair_color_blue 1
+ seta crosshair_alpha 1
+ seta crosshair_size 0.35
+ seta crosshair_dot 1
+ seta crosshair_dot_alpha 1
+ seta crosshair_dot_size 1
  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_effect_speed -1 "how fast (in seconds) some crosshair effects should take place, 0 = instant, -1 = 2x weapon switch time"
@@@ -120,6 -127,12 +127,12 @@@ seta crosshair_grenadelauncher_color_gr
  seta crosshair_grenadelauncher_color_blue 0   "crosshair color blue component to display when wielding the mortar"
  seta crosshair_grenadelauncher_color_alpha 1.15       "crosshair alpha value to display when wielding the mortar"
  seta crosshair_grenadelauncher_size 0.7       "crosshair size when wielding the mortar"
+ seta crosshair_minelayer ""   "crosshair to display when wielding the mortar"
+ seta crosshair_minelayer_color_red 0.75       "crosshair color red component to display when wielding the mortar"
+ seta crosshair_minelayer_color_green 0.75     "crosshair color green component to display when wielding the mortar"
+ seta crosshair_minelayer_color_blue 0 "crosshair color blue component to display when wielding the mortar"
+ seta crosshair_minelayer_color_alpha 1.15     "crosshair alpha value to display when wielding the mortar"
+ seta crosshair_minelayer_size 0.9     "crosshair size when wielding the mortar"
  seta crosshair_electro ""     "crosshair to display when wielding the electro"
  seta crosshair_electro_color_red 0.35 "crosshair color red component to display when wielding the electro"
  seta crosshair_electro_color_green 0.5        "crosshair color green component to display when wielding the electro"
@@@ -186,7 -199,6 +199,6 @@@ seta crosshair_campingrifle_color_gree
  seta crosshair_campingrifle_color_blue 0.25   "crosshair color blue component to display when wielding the campingrifle"
  seta crosshair_campingrifle_color_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_campingrifle_ring_size 1.5     "bullet counter ring size around campingrifle crosshair, multiple of crosshair_campingrifle_size"
  seta crosshair_tuba ""        "crosshair to display when wielding the tuba"
  seta crosshair_tuba_color_red 0.85    "crosshair color red component to display when wielding the tuba"
  seta crosshair_tuba_color_green 0.5   "crosshair color green component to display when wielding the tuba"
@@@ -199,6 -211,9 +211,9 @@@ seta crosshair_fireball_color_green 1.
  seta crosshair_fireball_color_blue 0.2        "crosshair color blue component to display when wielding the fireball"
  seta crosshair_fireball_color_alpha 1 "crosshair alpha value to display when wielding the fireball"
  seta crosshair_fireball_size 1        "crosshair size when wielding the fireball"
+ seta crosshair_ring_size 3    "bullet counter ring size for Rifle, velocity ring for Nex"
+ seta crosshair_campingrifle_bulletcounter_alpha 0.15
+ seta crosshair_nexvelocity_alpha 0.15
  seta cl_reticle_stretch 0 "whether to stretch reticles so they fit the screen (brakes image proportions)"
  seta cl_reticle_item_nex 1 "draw aiming recticle for the nex weapon's zoom, 0 disables and values between 0 and 1 change alpha"
  seta cl_reticle_item_normal 1 "draw recticle when zooming with the zoom button, 0 disables and values between 0 and 1 change alpha"
@@@ -210,7 -225,7 +225,7 @@@ seta cl_zoomspeed 3.5      "how fast it wil
  seta cl_zoomsensitivity 0     "how zoom changes sensitivity (0 = weakest, 1 = strongest)"
  freelook 1
  sensitivity 6
- v_gamma 1.125000
+ v_gamma 1
  viewsize 100
  bgmvolume 1
  volume 0.5
@@@ -283,8 -298,6 +298,6 @@@ seta cl_voice_directional_taunt_attenua
  hostname "Xonotic $g_xonoticversion Server"
  set sv_mapchange_delay 5
  set minplayers 0 "number of players playing at the same time (if not enough real players are there the remaining slots are filled with bots)"
- sv_cullentities_trace 1
- r_cullentities_trace 1
  
  // restart server if all players hit "ready"-button
  set sv_ready_restart 0 "if set to 1 allow a map to be restarted once all players pressed the \"ready\" button'"
@@@ -322,11 -335,12 +335,12 @@@ set g_allow_oldnexbeam 0 "If enabled, c
  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 sv_qcweaponanimation 0
  
- set g_telefrags 1
- set g_telefrags_avoid 0
+ 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"
+ set g_telefrags_avoid 1 "when teleporters have a random destination, avoid teleporting to locations where a telefrag would happen"
  set g_teleport_maxspeed 0 "maximum speed that a player can keep when going through a teleporter (if a misc_teleporter_dest also has a cap the smallest one of these will be used), 0 = don't limit, -1 = keep no speed"
  
- set g_respawn_ghosts 0 "if 1 dead bodies become ghosts and float away when the player respawns"
+ set g_respawn_ghosts 1 "if 1 dead bodies become ghosts and float away when the player respawns"
  set g_respawn_ghosts_speed 5 "the speed with which respawn ghosts float and rotate"
  set g_respawn_ghosts_maxtime 6 "maximum amount of time a respawn ghost can last, minimum time is half this value. 0 disables and ghosts fade when the body would"
  
@@@ -338,12 -352,12 +352,12 @@@ set sv_fragmessage_information_typefra
  
  // use default physics
  set sv_friction_on_land 0
- exec physicsNoQWBunny-nexbased.cfg
+ exec physicsNoQWBunny-xpmbased.cfg
  
- set sv_player_viewoffset "0 0 35" "view offset of the player model"
+ set sv_player_viewoffset "0 0 42" "view offset of the player model"
  set sv_player_mins "-16 -16 -24" "playermodel mins"
  set sv_player_maxs "16 16 45" "playermodel maxs"
- set sv_player_crouch_viewoffset "0 0 15" "view offset of the player model when crouched"
+ set sv_player_crouch_viewoffset "0 0 20" "view offset of the player model when crouched"
  set sv_player_crouch_mins "-16 -16 -24" "mins of a crouched playermodel"
  set sv_player_crouch_maxs "16 16 25" "maxs of a crouched playermodel"
  
@@@ -428,9 -442,9 +442,9 @@@ 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 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 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 grenadelauncher shotgun electro campingrifle rocketlauncher laser fireball" "Desired weapons for close distances ordered by priority"
+ 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_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_friends_aware_pickup_radius "500"  "Bots will not pickup items if a team mate is this distance near the item"
@@@ -509,7 -523,7 +523,7 @@@ set g_casings 2 "specifies which casing
  set g_norecoil 0 "if set to 1 shooting weapons won't make you crosshair to move upwards (recoil)"
  set g_maplist_mostrecent "" "contains the name of the maps that were most recently played"
  seta g_maplist_mostrecent_count 3     "number of most recent maps that are blocked from being played again"
- seta g_maplist "accident aggressor aneurysm basement basementctf bleach bloodprison bloodprisonctf bluesky cyberparcour01 darkzone desertfactory dieselpower downer eggandbacon evilspace farewell final_rage nr_piece-o-cake ons-reborn racetrack reslimed ruiner runningman runningman_1on1remix runningmanctf silvercity skyway slimepit soylent starship stormkeep2 strength toxic warfare"
+ seta g_maplist "g-23" "the list of maps to be cycled among (is autogenerated if empty)"
  seta g_maplist_index 0        "this is used internally for saving position in maplist cycle"
  seta g_maplist_selectrandom 0 "if 1, a random map will be chosen as next map - DEPRECATED in favor of g_maplist_shuffle"
  seta g_maplist_shuffle 1      "new randomization method: like selectrandom, but avoid playing the same maps in short succession. This works by taking out the first element and inserting it into g_maplist with a bias to the end of the list"
@@@ -523,6 -537,7 +537,7 @@@ set g_player_brightness 0  "set to 2 fo
  seta g_balance_cloaked_alpha 0.25
  
  set g_playerclip_collisions 1 "0 = disable collision testing against playerclips, might be useful on some defrag maps"
+ set g_botclip_collisions 1 "0 = disable collision testing against botclips, might be useful on some defrag maps"
  
  set welcome_message_time 8
  
@@@ -846,6 -861,10 +861,10 @@@ set g_footsteps 1        "serverside footstep 
  
  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"
  // effects
  r_picmipsprites 0 // Xonotic uses sprites that should never be picmipped (team mate, typing, waypoints)
  r_picmipworld 1
@@@ -856,16 -875,16 +875,16 @@@ r_mipsprites 
  r_mipskins 1
  r_shadow_realtime_world_lightmaps 1
  seta r_ambient 4
- cl_decals_fadetime 1
+ cl_decals_fadetime 5
  cl_decals_time 2
  seta cl_gunalign 3 "Gun alignment; 1 = right, 2 = left, 3 = center or right, 4 = center or left"
  seta cl_nogibs 0 "reduce number of violence effects, or remove them totally"
  seta cl_particlegibs 0 "simpler gibs"
  seta cl_gibs_damageforcescale 3.5 "force to push around gibs"
- seta cl_gibs_lifetime 14 "average lifetime of gibs"
+ seta cl_gibs_lifetime 5 "average lifetime of gibs"
  seta cl_gibs_velocity_scale 1 "gib throw velocity force scale"
  seta cl_gibs_velocity_random 1 "gib throw velocity randomness scale"
- seta cl_gibs_velocity_up 0 "extra z velocity for gibs"
+ seta cl_gibs_velocity_up 1 "extra z velocity for gibs"
  seta cl_gibs_ticrate 0.1 "ticrate for gibs"
  seta cl_gibs_sloppy 1 "sloppy gibs, may temporarily penetrate walls"
  seta cl_casings 1 "enable or disable bullet casings"
@@@ -1047,13 -1066,13 +1066,13 @@@ set rcon_restricted_commands "restart f
  set sv_vote_call 1    "users can call a vote for the above commands"
  set sv_vote_master 1  "users can call a vote to become master"
  set sv_vote_master_password ""        "when set, users can use \"vlogin PASSWORD\" to log in as master"
- set sv_vote_change 0  "set to 1 to allow to change you vote/mind"
+ set sv_vote_change 1  "set to 1 to allow to change you vote/mind"
  set sv_vote_singlecount 0     "set to 1 to count votes once after timeout or to 0 to count with every vote"
- set sv_vote_timeout 60        "a vote will timeout after this many seconds"
+ set sv_vote_timeout 30        "a vote will timeout after this many seconds"
  set sv_vote_wait 120  "a player can not call a vote again for this many seconds when his vote was not accepted"
  set sv_vote_stop 15   "a player can not call a vote again for this many seconds when he stopped this vote (e.g. to correct it)"
  set sv_vote_majority_factor 0.5       "which quotient of the PLAYERS constitute a majority? (try: 0.667, 0.75 when using the above)"
- set sv_vote_simple_majority_factor 0  "which quotient of the VOTERS constitute a majority too? (0 = off, otherwise it must be higher than or equal to sv_vote_majority_factor)"
+ set sv_vote_simple_majority_factor 0.667      "which quotient of the VOTERS constitute a majority too? (0 = off, otherwise it must be higher than or equal to sv_vote_majority_factor)"
  // when disabled, don't allow game type changes "note: set these two equal to JUST support simple majorities"
  set sv_vote_override_mostrecent 0
  alias vhelp "cmd vote help"
@@@ -1116,6 -1135,7 +1135,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"
  set g_campaign_skill 0
  set g_campaignxonotic20_index 0
@@@ -1140,6 -1160,7 +1160,7 @@@ seta sv_servermodelsonly 
  cl_curl_enabled 1
  cl_curl_maxspeed 300
  sv_curl_defaulturl "http://www.xonotic.com/contentdownload/getmap.php?file="
+ set sv_curl_serverpackages_auto 0 "automatically add packs with *.serverpackage files to sv_curl_serverpackages"
  
  set sv_motd ""
  
@@@ -1251,8 -1272,9 +1272,9 @@@ set g_keyhunt_teams 
  set cl_gravity 800    "but ignored anyway"
  
  set g_ban_default_bantime 5400        "90 minutes"
- set g_ban_default_masksize 3  "whole 255.255.255.0 networks (set to 4 for single IPs); when UID support is compiled in, masksize 0 means banning by UID"
+ set g_ban_default_masksize 3  "masksize 0 means banning by UID only, 1 means banning by /8 (IPv6: /32) network, 2 means banning by /16 (IPv6: /48) network, 3 means banning by /24 (IPv6: /56) network, 4 means banning by single IP (IPv6: /64 network)"
  set g_banned_list ""  "format: IP remainingtime IP remainingtime ..."
+ set g_banned_list_idmode "1"  "when set, the IP banning system always uses the ID over the IP address (so a user in a banned IP range can connect if they have a valid signed ID)"
  alias bans "sv_cmd bans"
  alias ban "sv_cmd ban $*"         // usage: ban address(maybe incomplete, like 1.2.3) bantime(seconds)
  alias kickban "sv_cmd kickban $*" // usage: kickban # playerno bantime(seconds) masksize(bytes)
@@@ -1307,13 -1329,15 +1329,15 @@@ alias _userbind_call "${$1}
  alias +userbind "_userbind_call userbind${1}_press"
  alias -userbind "_userbind_call userbind${1}_release"
  
- seta menu_skin "default"
+ seta menu_skin "luminos"
  set menu_slowmo 1
  seta menu_sounds 0 "enables menu sound effects. 1 enables click sounds, 2 also enables hover sounds"
  
  r_textbrightness 0.2
  r_textcontrast 0.8
- r_textshadow 1
+ r_textshadow 0
+ r_font_postprocess_blur 1
+ r_font_postprocess_outline 1
  
  // good settings for these fonts
  con_chat 5
@@@ -1325,7 -1349,7 +1349,7 @@@ con_notifyalign 
  
  // hud variables
  set _hud_configure 0 "1 = configure the HUD"
- seta hud_configure_teamcolorforced 1 "1 = force display of team colors in configure mode"
+ seta hud_configure_teamcolorforced 0 "1 = force display of team colors in configure mode"
  seta hud_configure_checkcollisions 1 "check for collisions against other panels when in hud configure mode"
  seta hud_configure_bg_minalpha 0.25 "minimum panel background alpha when in hud configure mode"
  seta hud_configure_grid_alpha 0.15 "alpha for visible grid when in configure mode"
@@@ -1334,8 -1358,9 +1358,9 @@@ seta sbar_info_pos 0 "Y-axis distance f
  
  // hud cvar descriptions
  exec _hud_descriptions.cfg
- // exec the default skin config. remember, NO menu_restart in the deafault cfg (dp segfaults at startup otherwise)
- exec hud_default.cfg
+ // exec the default skin config
+ // please add any new cvars into the hud_save script in qcsrc/client/hud.qc for consistency
+ exec hud_luminos.cfg
  
  // user preference cvars (i.e. shouldn't be adjusted by a skin config) 
  seta hud_panel_weapons_label 1 "1 = show number of weapon, 2 = show bound key of weapon"
@@@ -1352,12 -1377,12 +1377,14 @@@ 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_notify_time 10 "time that a new entry stays until it fades out"
  seta hud_panel_notify_fadetime 3 "fade out time"
  
 +seta hud_panel_modicons_dom_layout 0 "3 possible layouts: 0) only icons; 1) icons and percentage of average pps (points per second); 2) icons and average pps"
 +
  seta hud_panel_timer_increment 0 "show elapsed time instead of remaining time"
  
  seta hud_panel_radar_scale 4096 "distance you can see on the team radar"
@@@ -1365,12 -1390,15 +1392,15 @@@ seta hud_panel_radar_rotation 0      "rotati
  seta hud_panel_radar_zoommode 0       "zoom mode: 0 = zoomed by default, 1 = zoomed when +zoom, 2 = always zoomed, 3 = always zoomed out"
  alias hud_panel_radar_rotate "toggle hud_panel_radar_rotation 0 1 2 3 4"
  
- seta hud_panel_engineinfo_framecounter_time 1 "time between framerate display updates, smaller values yield less accuracy"
+ seta hud_panel_engineinfo_framecounter_time 0.1 "time between framerate display updates"
  seta hud_panel_engineinfo_framecounter_decimals 0 "amount of decimals to show"
  seta hud_panel_engineinfo_framecounter_exponentialmovingaverage 1 "use an averaging method for calculating fps instead of counting frametime like engine does"
  seta hud_panel_engineinfo_framecounter_exponentialmovingaverage_new_weight 0.1 "weight of latest data point"
  seta hud_panel_engineinfo_framecounter_exponentialmovingaverage_instantupdate_change_threshold 0.5 "threshold for fps change when to update instantly, to make big fps changes update faster"
  
+ 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"
  // scoreboard
  seta scoreboard_columns default
  seta scoreboard_border_thickness 1 "scoreboard border thickness"
@@@ -1378,8 -1406,8 +1408,8 @@@ seta scoreboard_accuracy_border_thickne
  seta scoreboard_accuracy_doublerows 0 "use two rows instead of one"
  seta scoreboard_accuracy 1 "0 = no weapon accuracy stats panel on scoreboard"
  seta scoreboard_color_bg_r 0 "red color component of the HUD background"
- seta scoreboard_color_bg_g 0.25 "green color component of the HUD background"
- seta scoreboard_color_bg_b 0.17 "blue color component of the HUD background"
+ seta scoreboard_color_bg_g 0.4 "green color component of the HUD background"
+ seta scoreboard_color_bg_b 0.6 "blue color component of the HUD background"
  seta scoreboard_color_bg_team 0.5 "team color multiplier of the HUD background"
  seta scoreboard_alpha_bg 0.6 "scoreboard background alpha"
  seta scoreboard_alpha_fg 1 "scoreboard foreground alpha"
@@@ -1390,6 -1418,8 +1420,8 @@@ seta scoreboard_fadeoutspeed 5 "speed a
  seta scoreboard_highlight 1 "enable highlighting for rows and columns in the scoreboard"
  seta scoreboard_highlight_alpha 0.10 "highlight alpha value (depends on hud_scoreboard_highlight 1)"
  seta scoreboard_highlight_alpha_self 0.25 "self highlight alpha value"
+ seta scoreboard_offset_left 0.04 "how many pixels the scoreboard is offset from the left screen edge"
+ seta scoreboard_offset_right 0.148 "how many pixels the scoreboard is offset from the right screen edge"
  
  // for menu server list (eventually make them have engine support?)
  seta menu_slist_showfull 1 "show servers even if they are full and have no slots to join"
@@@ -1449,6 -1479,7 +1481,7 @@@ set con_completion_gotomap      ma
  set con_completion_vmap               map
  set con_completion_vnextmap   map
  set con_completion_vdomap     map
+ set con_completion_playermodel        models/player/*.iqm
  
  // these non-saved engine cvars shall be savedG
  seta cl_port $cl_port
@@@ -1464,6 -1495,7 +1497,7 @@@ sys_ticrate 0.016666
  cl_netfps 60 // should match
  sv_gameplayfix_delayprojectiles 0
  sv_gameplayfix_q2airaccelerate 1
+ sv_gameplayfix_stepmultipletimes 1
  
  // delay for "kill" to prevent abuse
  set g_balance_kill_delay 5
@@@ -1502,8 -1534,8 +1536,8 @@@ unalias _cdtrac
  cd remap $g_cdtracks_remaplist
  set sv_intermission_cdtrack ""
  
- set g_cdtracks_dontusebydefault ""
- set menu_cdtrack "ninesix"
+ set g_cdtracks_dontusebydefault "rising-of-the-phoenix"
+ set menu_cdtrack "rising-of-the-phoenix"
  
  // maxidle (in seconds): kick players idle for more than that amount of time
  set sv_maxidle 0
@@@ -1516,7 -1548,7 +1550,7 @@@ set capturelimit 
  // hud: font size
  seta hud_fontsize 11
  seta hud_fontsize_spec 16
- seta scr_centersize 11
+ seta scr_centersize 12
  seta hud_width 560
  // alias hud_font "loadfont user1 ${1},gfx/fallback ${2-}; loadfont user2 ${1}-big ${2-}; scoreboard_columns_set"
  alias sbar_font "set _requested_sbar_font \"${*}\""
@@@ -1532,13 -1564,13 +1566,13 @@@ set g_jump_grunt 0   "Do you make a grunt
  
  alias allready "sv_cmd allready"
  
- seta cl_weaponpriority "minstanex rocketlauncher nex 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 campingrifle 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_weaponpriority4 "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_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"
  seta cl_weaponpriority7 "" "use impulse 207 for prev gun from this list, 217 for best gun, 227 for next gun"
@@@ -1878,6 -1910,7 +1912,7 @@@ cl_decals_newsystem 
  set g_weaponreplace_laser ""
  set g_weaponreplace_shotgun ""
  set g_weaponreplace_uzi ""
+ set g_weaponreplace_minelayer ""
  set g_weaponreplace_grenadelauncher ""
  set g_weaponreplace_electro ""
  set g_weaponreplace_crylink ""
@@@ -1911,5 -1944,27 +1946,27 @@@ scr_conscroll3_y 
  scr_conscroll_x -0.1
  scr_conscroll_y -0.3
  
+ scr_loadingscreen_background 0
+ scr_loadingscreen_barcolor "0 0.5 1"
+ scr_loadingscreen_barheight 20
+ scr_loadingscreen_count 1
  // DP cannot properly detect this, so rather turn off the detection
  r_texture_dds_load_dxt1_noalpha 1
+ // particles optimization
+ r_drawparticles_nearclip_min 8
+ r_drawparticles_nearclip_max 16
+ // sv_cullentities_trace is 1, so the client doesn't have to
+ sv_cullentities_trace 1
+ r_cullentities_trace 0
+ // less "lagging" of other players, but also less PL tolerant... let's try this
+ sv_clmovement_inputtimeout 0.05
+ // exact gloss looks better, e.g. on g-23
+ r_shadow_glossexact 1
+ // use fake light if map has no lightmaps
+ r_fakelight 1
diff --combined qcsrc/client/hud.qc
index 439517f0ae0c4a7c3620a6fd122f0402e13a1d1a,69459256f0a22acd972fa7aea299402905a518e9..131d113c818d60081dd8ef9d6ded2a28cc7fa133
@@@ -131,7 -131,7 +131,7 @@@ float stringwidth_nocolors(string s, ve
  #define CENTERPRINT_MAX_LINES 30
  string centerprint_messages[CENTERPRINT_MAX_LINES];
  float centerprint_width[CENTERPRINT_MAX_LINES];
vector centerprint_start;
float centerprint_time;
  float centerprint_expire;
  float centerprint_num;
  float centerprint_offset_hint;
@@@ -182,6 -182,8 +182,8 @@@ void centerprint(string strMessage
                while(getWrappedLine_remaining)
                {
                        s = getWrappedLine(vid_conwidth * 0.75, centerprint_fontsize, stringwidth_colors);
+                       if(centerprint_messages[i] != s) // don't fade the same message in, looks stupid
+                               centerprint_time = time;
                        if(centerprint_messages[i])
                                strunzone(centerprint_messages[i]);
                        centerprint_messages[i] = strzone(s);
        if(havail > vid_conheight - 70)
                havail = vid_conheight - 70; // avoid overlapping HUD
  
-       centerprint_start_x = 0;
  #if 0
        float forbiddenmin, forbiddenmax, allowedmin, allowedmax, preferred;
  
                centerprint_start_y = bound(forbiddenmax, preferred, allowedmax);
        }
  #else
-       centerprint_start_y =
-               min(
-                       max(
-                               max(scoreboard_bottom, vid_conheight * 0.5 + 16),
-                               (havail - h)/2
-                       ),
-                       havail - h
-               );
  #endif
  
        centerprint_num = i;
        centerprint_expire = time + cvar("scr_centertime");
  }
  
@@@ -279,32 -272,39 +272,39 @@@ void HUD_DrawCenterPrint (void
        float i;
        vector pos;
        string ts;
-       float a;
-       //if(time > centerprint_expire)
-       //      return;
+       float a, sz;
  
-       //a = bound(0, 1 - 2 * (time - centerprint_expire), 1);
-       a = bound(0, 1 - 4 * (time - centerprint_expire), 1);
-       //sz = 1.2 / (a + 0.2);
+       if(time - centerprint_time < 0.25)
+               a = (time - centerprint_time) / 0.25;
+       else
+               a = bound(0, 1 - 4 * (time - centerprint_expire), 1);
  
        if(a <= 0)
                return;
  
+       sz = 0.8 + (a / 5);
+       if(centerprint_num * cvar("scr_centersize") > 24 && HUD_WouldDrawScoreboard()) // 24 = height of Scoreboard text
+       {
+               centerprint_start_y = scoreboard_bottom + centerprint_fontsize_y;
+       }
        pos = centerprint_start;
        for (i=0; i<centerprint_num; i = i + 1)
        {
-               pos_x = (vid_conwidth - centerprint_width[i]) * 0.5;
                ts = centerprint_messages[i];
+               drawfontscale = sz * '1 1 0';
+               drawfont = hud_bigfont;
+               pos_x = (vid_conwidth - stringwidth(ts, TRUE, centerprint_fontsize)) * 0.5;
                if (ts != "")
                {
-                       drawcolorcodedstring(pos, ts, centerprint_fontsize, a, DRAWFLAG_NORMAL);
-                       //  - '0 0.5 0' * (sz - 1) * centerprint_fontsize_x - '0.5 0 0' * (sz - 1) * centerprint_width[i] * centerprint_fontsize_y, centerprint_fontsize * sz
+                       drawcolorcodedstring(pos + '0 1 0' * (1 - sz) * 0.5 *centerprint_fontsize_y, ts, centerprint_fontsize, a, DRAWFLAG_NORMAL);
                        pos_y = pos_y + centerprint_fontsize_y;
                }
                else
                        // half height for empty lines looks better
-                       pos_y = pos_y + centerprint_fontsize_y * 0.5;
+                       pos_y = pos_y + sz * centerprint_fontsize_y * 0.5;
+               drawfontscale = '1 1 0';
+               drawfont = hud_font;
        }
  }
  
@@@ -453,6 -453,9 +453,9 @@@ void HUD_Panel_ExportCfg(string cfgname
                fputs(fh, strcat("seta hud_configure_grid_ysize \"", cvar_string("hud_configure_grid_ysize"), "\"", "\n"));
                fputs(fh, "\n");
  
+               fputs(fh, strcat("seta scr_centerpos \"", cvar_string("scr_centerpos"), "\"", "\n"));
+               fputs(fh, "\n");
                // common cvars for all panels
                float i;
                for (i = 0; i < HUD_PANEL_NUM; ++i)
                                case HUD_PANEL_PRESSEDKEYS:
                                        fputs(fh, strcat("seta hud_panel_", panel_name, "_aspect \"", cvar_string(strcat("hud_panel_", panel_name, "_aspect")), "\"", "\n"));
                                        break;
+                               case HUD_PANEL_INFOMESSAGES:
+                                       fputs(fh, strcat("seta hud_panel_", panel_name, "_flip \"", cvar_string(strcat("hud_panel_", panel_name, "_flip")), "\"", "\n"));
+                                       break;
                        }
                        fputs(fh, "\n");
                }
-               fputs(fh, strcat("menu_restart", "\n")); // force a menu update when execing config, so that the dialogs are updated
+               fputs(fh, strcat("menu_sync", "\n")); // force the menu to reread the cvars, so that the dialogs are updated
  
                print("^2Successfully exported to hud_", autocvar_hud_skin, "_", cfgname, ".cfg! (Note: It's saved in data/data/)\n");
        }
@@@ -940,6 -946,10 +946,10 @@@ void HUD_Panel_Arrow_Action(float nPrim
  
        HUD_Panel_UpdatePosSizeForId(highlightedPanel)
  
+       vector prev_pos, prev_size;
+       prev_pos = panel_pos;
+       prev_size = panel_size;
        if (hudShiftState & S_ALT) // resize
        {
                highlightedAction = 1;
  
                HUD_Panel_SetPos(pos);
        }
+       HUD_Panel_UpdatePosSizeForId(highlightedPanel)
+       if (prev_pos != panel_pos || prev_size != panel_size)
+       {
+               // backup!
+               panel_pos_backup = prev_pos;
+               panel_size_backup = prev_size;
+               highlightedPanel_backup = highlightedPanel;
+       }
  }
  
  float HUD_Panel_InputEvent(float bInputType, float nPrimary, float nSecondary)
                menu_enabled_time = time;
                localcmd("menu_showhudexit\n");
        }
+       else if(hudShiftState & S_CTRL)
+       {
+               if (mouseClicked)
+                       return true;
+               if(nPrimary == K_SPACE) // enable/disable highlighted panel or dock
+               {
+                       if (bInputType == 1)
+                               return true;
+                       if (highlightedPanel_prev != -1)
+                               cvar_set(strcat("hud_panel_", panel_name), ftos(!(panel_enabled)));
+                       else
+                               cvar_set(strcat("hud_dock"), (autocvar_hud_dock == "") ? "dock" : "");
+               }
+               if(nPrimary == 'c') // copy highlighted panel size
+               {
+                       if (bInputType == 1)
+                               return true;
+                       if (highlightedPanel_prev != -1)
+                       {
+                               panel_size_copied = panel_size;
+                               highlightedPanel_copied = highlightedPanel_prev;
+                       }
+               }
+               else if(nPrimary == 'v') // past copied size on the highlighted panel
+               {
+                       if (bInputType == 1)
+                               return true;
+                       if (highlightedPanel_copied == -1 || highlightedPanel_prev == -1)
+                               return true;
+                       HUD_Panel_UpdatePosSizeForId(highlightedPanel_prev)
+                       // reduce size if it'd go beyond screen boundaries
+                       vector tmp_size = panel_size_copied;
+                       if (panel_pos_x + panel_size_copied_x > vid_conwidth)
+                               tmp_size_x = vid_conwidth - panel_pos_x;
+                       if (panel_pos_y + panel_size_copied_y > vid_conheight)
+                               tmp_size_y = vid_conheight - panel_pos_y;
+                       if (panel_size == tmp_size)
+                               return true;
+                       // backup first!
+                       panel_pos_backup = panel_pos;
+                       panel_size_backup = panel_size;
+                       highlightedPanel_backup = highlightedPanel_prev;
+                       string s;
+                       s = strcat(ftos(tmp_size_x/vid_conwidth), " ", ftos(tmp_size_y/vid_conheight));
+                       cvar_set(strcat("hud_panel_", panel_name, "_size"), s);
+               }
+               else if(nPrimary == 'z') // undo last action
+               {
+                       if (bInputType == 1)
+                               return true;
+                       //restore previous values
+                       if (highlightedPanel_backup != -1)
+                       {
+                               HUD_Panel_GetName(highlightedPanel_backup)
+                               string s;
+                               s = strcat(ftos(panel_pos_backup_x/vid_conwidth), " ", ftos(panel_pos_backup_y/vid_conheight));
+                               cvar_set(strcat("hud_panel_", panel_name, "_pos"), s);
+                               s = strcat(ftos(panel_size_backup_x/vid_conwidth), " ", ftos(panel_size_backup_y/vid_conheight));
+                               cvar_set(strcat("hud_panel_", panel_name, "_size"), s);
+                               highlightedPanel_backup = -1;
+                       }
+               }
+       }
        else if(nPrimary == K_UPARROW || nPrimary == K_DOWNARROW || nPrimary == K_LEFTARROW || nPrimary == K_RIGHTARROW)
        {
                if (bInputType == 1)
@@@ -1226,6 -1318,7 +1318,7 @@@ void HUD_Panel_Highlight(
  }
  
  float highlightcheck;
+ vector prev_pos, prev_size;
  void HUD_Panel_Mouse()
  {
        // TODO: needs better check... is there any float that contains the current state of the menu? _menu_alpha isn't apparently updated the frame the menu gets enabled
        if(mouseClicked)
        {
                if(prevMouseClicked == 0)
+               {
                        HUD_Panel_Highlight(); // sets highlightedPanel, highlightedAction, panel_click_distance, panel_click_resizeorigin
+                                                                       // and calls HUD_Panel_UpdatePosSizeForId() for the highlighted panel
+                       prev_pos = panel_pos;
+                       prev_size = panel_size;
+               }
+               else
+                       HUD_Panel_UpdatePosSizeForId(highlightedPanel)
  
-               hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && autocvar_hud_configure_checkcollisions);
+               if (prev_pos != panel_pos || prev_size != panel_size)
+               {
+                       hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && autocvar_hud_configure_checkcollisions);
+                       // backup!
+                       panel_pos_backup = prev_pos;
+                       panel_size_backup = prev_size;
+                       highlightedPanel_backup = highlightedPanel;
+               }
+               else
+                       // in case the clicked panel is inside another panel and we aren't
+                       // moving it, avoid the immediate "fix" of its position/size
+                       // (often unwanted and hateful) by disabling collisions check
+                       hud_configure_checkcollisions = false;
  
                if(highlightedAction == 1)
                        HUD_Panel_SetPos(mousepos - panel_click_distance);
        cursorsize = '32 32 0';
  
        if(highlightcheck == 0)
-               drawpic(mousepos, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor.tga"), '32 32 0', '1 1 1', 1, DRAWFLAG_NORMAL);
+               drawpic(mousepos, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
        else if(highlightcheck == 1)
-               drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_move.tga"), '32 32 0', '1 1 1', 1, DRAWFLAG_NORMAL);
+               drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_move.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
        else if(highlightcheck == 2)
-               drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize.tga"), '32 32 0', '1 1 1', 1, DRAWFLAG_NORMAL);
+               drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
        else
-               drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize2.tga"), '32 32 0', '1 1 1', 1, DRAWFLAG_NORMAL);
+               drawpic(mousepos - cursorsize * 0.5, strcat("gfx/menu/", cvar_string("menu_skin"), "/cursor_resize2.tga"), '32 32 0', '1 1 1', hud_fade_alpha, DRAWFLAG_NORMAL);
  
        prevMouseClicked = mouseClicked;
  }
@@@ -1366,6 -1478,7 +1478,7 @@@ float GetAmmoTypeForWep(float i
                case WEP_UZI: return 1;
                case WEP_CAMPINGRIFLE: return 1;
                case WEP_GRENADE_LAUNCHER: return 2;
+               case WEP_MINE_LAYER: return 2;
                case WEP_ELECTRO: return 3;
                case WEP_CRYLINK: return 3;
                case WEP_HLAC: return 3;
@@@ -1385,14 -1498,94 +1498,94 @@@ void HUD_Weapons(void
        if(!autocvar_hud_panel_weapons && !autocvar__hud_configure)
                return;
  
+       float timeout = cvar("hud_panel_weapons_timeout");
+       float timeout_effect_length, timein_effect_length;
+       if (cvar("hud_panel_weapons_timeout_effect") == 0)
+       {
+               timeout_effect_length = 0;
+               timein_effect_length = 0;
+       }
+       else
+       {
+               timeout_effect_length = 0.75;
+               timein_effect_length = 0.375;
+       }
+       if (timeout && time >= weapontime + timeout + timeout_effect_length && !autocvar__hud_configure)
+       {
+               weaponprevtime = time;
+               return;
+       }
        active_panel = HUD_PANEL_WEAPONS;
        HUD_Panel_UpdateCvars(weapons);
-       vector pos, mySize;
-       float i, weapid, fade, weapon_stats, weapon_number, weapon_cnt;
  
-       pos = panel_pos;
-       mySize = panel_size;
+       if (timeout && time >= weapontime + timeout && !autocvar__hud_configure)
+       {
+               float f = (time - (weapontime + timeout)) / timeout_effect_length;
+               if (cvar("hud_panel_weapons_timeout_effect"))
+               {
+                       panel_bg_alpha *= (1 - f);
+                       panel_fg_alpha *= (1 - f);
+               }
+               if (cvar("hud_panel_weapons_timeout_effect") == 1)
+               {
+                       f *= f; // for a cooler movement
+                       vector center;
+                       center_x = panel_pos_x + panel_size_x/2;
+                       center_y = panel_pos_y + panel_size_y/2;
+                       float screen_ar = vid_conwidth/vid_conheight;
+                       if (center_x/center_y < screen_ar) //bottom left
+                       {
+                               if ((vid_conwidth - center_x)/center_y < screen_ar) //bottom
+                                       panel_pos_y += f * (vid_conheight - panel_pos_y);
+                               else //left
+                                       panel_pos_x -= f * (panel_pos_x + panel_size_x);
+                       }
+                       else //top right
+                       {
+                               if ((vid_conwidth - center_x)/center_y < screen_ar) //right
+                                       panel_pos_x += f * (vid_conwidth - panel_pos_x);
+                               else //top
+                                       panel_pos_y -= f * (panel_pos_y + panel_size_y);
+                       }
+               }
+               weaponprevtime = time - (1 - f) * timein_effect_length;
+       }
+       else if (timeout && time < weaponprevtime + timein_effect_length && !autocvar__hud_configure)
+       {
+               float f = (time - weaponprevtime) / timein_effect_length;
+               if (cvar("hud_panel_weapons_timeout_effect"))
+               {
+                       panel_bg_alpha *= (f);
+                       panel_fg_alpha *= (f);
+               }
+               if (cvar("hud_panel_weapons_timeout_effect") == 1)
+               {
+                       f *= f; // for a cooler movement
+                       f = 1 - f;
+                       vector center;
+                       center_x = panel_pos_x + panel_size_x/2;
+                       center_y = panel_pos_y + panel_size_y/2;
+                       float screen_ar = vid_conwidth/vid_conheight;
+                       if (center_x/center_y < screen_ar) //bottom left
+                       {
+                               if ((vid_conwidth - center_x)/center_y < screen_ar) //bottom
+                                       panel_pos_y += f * (vid_conheight - panel_pos_y);
+                               else //left
+                                       panel_pos_x -= f * (panel_pos_x + panel_size_x);
+                       }
+                       else //top right
+                       {
+                               if ((vid_conwidth - center_x)/center_y < screen_ar) //right
+                                       panel_pos_x += f * (vid_conwidth - panel_pos_x);
+                               else //top
+                                       panel_pos_y -= f * (panel_pos_y + panel_size_y);
+                       }
+               }
+       }
  
+       float i, weapid, fade, weapon_stats, weapon_number, weapon_cnt;
        weapon_cnt = 0;
        for(i = WEP_FIRST; i <= WEP_LAST; ++i)
        {
        HUD_Panel_DrawBg(1);
        if(panel_bg_padding)
        {
-               pos += '1 1 0' * panel_bg_padding;
-               mySize -= '2 2 0' * panel_bg_padding;
+               panel_pos += '1 1 0' * panel_bg_padding;
+               panel_size -= '2 2 0' * panel_bg_padding;
        }
  
        // hits
        HUD_Weapons_Clear();
  
        float rows, columns;
-       rows = mySize_y/mySize_x;
+       rows = panel_size_y/panel_size_x;
        rows = bound(1, floor((sqrt(4 * autocvar_hud_panel_weapons_aspect * rows * WEP_COUNT + rows * rows) + rows + 0.5) / 2), WEP_COUNT);
  
        columns = ceil(WEP_COUNT/rows);
  
        for(i = 0; i < weapon_cnt; ++i)
        {
-               wpnpos = pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows);
-               wpnsize = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows);
+               wpnpos = panel_pos + eX * column * panel_size_x*(1/columns) + eY * row * panel_size_y*(1/rows);
+               wpnsize = eX * panel_size_x*(1/columns) + eY * panel_size_y*(1/rows);
  
                self = weaponorder[i];
                weapid = self.impulse;
                        drawpic_aspect_skin(wpnpos, strcat("weapon", self.netname), wpnsize, '1 1 1', fade * panel_fg_alpha, DRAWFLAG_NORMAL);
  
                        if(autocvar_hud_panel_weapons_label == 1) // weapon number
-                               drawstring(wpnpos, ftos(weapid), '1 1 0' * 0.5 * mySize_y*(1/rows), '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+                               drawstring(wpnpos, ftos(weapid), '1 1 0' * 0.5 * panel_size_y*(1/rows), '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
                        else if(autocvar_hud_panel_weapons_label == 2) // bind
-                               drawstring(wpnpos, getcommandkey(ftos(weapid), strcat("impulse ", ftos(weapid))), '1 1 0' * 0.5 * mySize_y*(1/rows), '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+                               drawstring(wpnpos, getcommandkey(ftos(weapid), strcat("impulse ", ftos(weapid))), '1 1 0' * 0.5 * panel_size_y*(1/rows), '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
  
                        // draw ammo status bar
                        if(autocvar_hud_panel_weapons_ammo && weapid != WEP_TUBA && weapid != WEP_LASER && weapid != WEP_PORTO)
@@@ -1845,10 -2038,17 +2038,17 @@@ void HUD_Powerups(void) 
        pos = panel_pos;
        mySize = panel_size;
  
-       float strength_time, shield_time;
-       strength_time = bound(0, getstatf(STAT_STRENGTH_FINISHED) - time, 99);
-       shield_time = bound(0, getstatf(STAT_INVINCIBLE_FINISHED) - time, 99);
+       float strength_time, shield_time;
+       if(autocvar__hud_configure)
+       {
+               strength_time = 15;
+               shield_time = 27;
+       }
+       else
+       {
+               strength_time = bound(0, getstatf(STAT_STRENGTH_FINISHED) - time, 99);
+               shield_time = bound(0, getstatf(STAT_INVINCIBLE_FINISHED) - time, 99);
+       }
  
        HUD_Panel_DrawBg(bound(0, max(strength_time, shield_time), 1));
        if(panel_bg_padding)
                mySize -= '2 2 0' * panel_bg_padding;
        }
  
-       if(autocvar__hud_configure)
-       {
-               strength_time = 15;
-               shield_time = 27;
-       }
        vector barpos, barsize;
        vector picpos;
        vector numpos;
@@@ -2062,12 -2256,10 +2256,10 @@@ void HUD_HealthArmor(void
                mySize -= '2 2 0' * panel_bg_padding;
        }
  
-       float armor, health;
+       float armor, health, fuel;
        armor = getstati(STAT_ARMOR);
        health = getstati(STAT_HEALTH);
-       float fuel;
-       fuel = getstati(GetAmmoStat(4)); // how much fuel do we have?
+       fuel = getstati(STAT_FUEL);
  
        if(autocvar__hud_configure)
        {
@@@ -2391,7 -2583,7 +2583,7 @@@ void HUD_KillNotify_Push(string attacke
        killnotify_victims[0] = strzone(victim);
  }
  
- void HUD_KillNotify(string s1, string s2, string s3, float type, float msg)
+ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s1 = attacker, s2 = victim
  {
        float w;
        float alsoprint, gentle;
                }
                else if(type == KILL_FIRST_BLOOD)
                        print("^1",s1, "^1 drew first blood", "\n");
-               // TODO: icon!
-               else if (type == DEATH_TELEFRAG)
-                       print ("^1",s1, "^1 was telefragged by ", s2, "\n");
+               else if (type == DEATH_TELEFRAG) {
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_TELEFRAG);
+                       if(gentle)
+                               print ("^1",s2, "^1 tried to occupy ", s1, "^1's teleport destination space\n");
+                       else
+                               print ("^1",s2, "^1 was telefragged by ", s1, "\n");
+               }
                else if (type == DEATH_DROWN) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_DROWN);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_DROWN);
                        if(alsoprint)
-                               print ("^1",s1, "^1 was drowned by ", s2, "\n");
+                               print ("^1",s2, "^1 was drowned by ", s1, "\n");
                }
                else if (type == DEATH_SLIME) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_SLIME);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_SLIME);
                        if(alsoprint)
-                               print ("^1",s1, "^1 was slimed by ", s2, "\n");
+                               print ("^1",s2, "^1 was slimed by ", s1, "\n");
                }
                else if (type == DEATH_LAVA) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_LAVA);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_LAVA);
                        if(alsoprint)
-                               print ("^1",s1, "^1 was cooked by ", s2, "\n");
+                               print ("^1",s2, "^1 was cooked by ", s1, "\n");
                }
                else if (type == DEATH_FALL) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_FALL);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_FALL);
                        if(alsoprint)
-                               print ("^1",s1, "^1 was grounded by ", s2, "\n");
+                               print ("^1",s2, "^1 was grounded by ", s1, "\n");
                }
                else if (type == DEATH_SHOOTING_STAR) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_SHOOTING_STAR);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_SHOOTING_STAR);
                        if(alsoprint)
-                               print ("^1",s1, "^1 was shot into space by ", s2, "\n");
+                               print ("^1",s2, "^1 was shot into space by ", s1, "\n");
                }
                else if (type == DEATH_SWAMP) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
-                               print ("^1",s1, "^1 was conserved by ", s2, "\n");
+                               print ("^1",s2, "^1 was conserved by ", s1, "\n");
                }
                else if (type == DEATH_HURTTRIGGER)
                {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_HURTTRIGGER);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_HURTTRIGGER);
                        if(alsoprint)
-                               print("^1",s1, "^1 was thrown into a world of hurt by ", s2, "\n");
+                               print("^1",s2, "^1 was thrown into a world of hurt by ", s1, "\n");
                } else if(type == DEATH_SBCRUSH) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
-                               print ("^1",s1, "^1 was crushed by ^1", s2, "\n");
+                               print ("^1",s2, "^1 was crushed by ^1", s1, "\n");
                } else if(type == DEATH_SBMINIGUN) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
-                               print ("^1",s1, "^1 got shredded by ^1", s2, "\n");
+                               print ("^1",s2, "^1 got shredded by ^1", s1, "\n");
                } else if(type == DEATH_SBROCKET) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
-                               print ("^1",s1, "^1 was blased to bits by ^1", s2, "\n");
+                               print ("^1",s2, "^1 was blased to bits by ^1", s1, "\n");
                } else if(type == DEATH_SBBLOWUP) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
-                               print ("^1",s1, "^1 got caught in the destruction of ^1", s2, "'s vehicle\n");
+                               print ("^1",s2, "^1 got caught in the destruction of ^1", s1, "'s vehicle\n");
                } else if(type == DEATH_WAKIGUN) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
-                               print ("^1",s1, "^1 was bolted down by ^1", s2, "\n");
+                               print ("^1",s2, "^1 was bolted down by ^1", s1, "\n");
                } else if(type == DEATH_WAKIROCKET) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
-                               print ("^1",s1, "^1 could find no shelter from ^1", s2, "'s rockets\n");
+                               print ("^1",s2, "^1 could find no shelter from ^1", s1, "'s rockets\n");
                } else if(type == DEATH_WAKIBLOWUP) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
-                               print ("^1",s1, "^1 dies when ^1", s2, "'s wakizashi dies.\n");
+                               print ("^1",s2, "^1 dies when ^1", s1, "'s wakizashi dies.\n");
                } else if(type == DEATH_TURRET) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
-                               print ("^1",s1, "^1 was pushed into the line of fire by ^1", s2, "\n");
+                               print ("^1",s2, "^1 was pushed into the line of fire by ^1", s1, "\n");
                } else if(type == DEATH_TOUCHEXPLODE) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
-                               print ("^1",s1, "^1 was pushed into an accident by ^1", s2, "\n");
+                               print ("^1",s2, "^1 was pushed into an accident by ^1", s1, "\n");
                } else if(type == DEATH_CHEAT) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
-                               print ("^1",s1, "^1 was unfairly eliminated by ^1", s2, "\n");
+                               print ("^1",s2, "^1 was unfairly eliminated by ^1", s1, "\n");
                } else if (type == DEATH_FIRE) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
-                               print ("^1",s1, "^1 was burnt to death by ^1", s2, "\n");
+                               print ("^1",s2, "^1 was burnt to death by ^1", s1, "\n");
                } else if (type == DEATH_CUSTOM) {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_CUSTOM);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_CUSTOM);
                        if(alsoprint)
-                               print ("^1",s1, "^1 ", s2, "\n");
+                               print("^1", sprintf(s3, strcat(s2, "^1"), strcat(s1, "^1")), "\n");
+               } else if (type == DEATH_HURTTRIGGER) {
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_HURTTRIGGER);
+                       if(alsoprint)
+                               print("^1", sprintf(s3, strcat(s2, "^1"), strcat(s1, "^1")), "\n");
                } else {
-                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
-                               print ("^1",s1, "^1 was fragged by ", s2, "\n");
+                               print ("^1",s2, "^1 was fragged by ", s1, "\n");
                }
        } else if(msg == MSG_SPREE) {
                if(type == KILL_END_SPREE) {
                } else if (type == DEATH_CUSTOM) {
                        HUD_KillNotify_Push(s1, "", 0, DEATH_CUSTOM);
                        if(alsoprint)
-                               print ("^1",s1, "^1 ", s2, "\n");
+                               print("^1", sprintf(s2, strcat(s1, "^1")), "\n");
                } else if (type == DEATH_HURTTRIGGER) {
                        HUD_KillNotify_Push(s1, "", 0, DEATH_HURTTRIGGER);
                        if(alsoprint)
-                               print ("^1",s1, "^1 was in the wrong place\n");
+                               print("^1", sprintf(s2, strcat(s1, "^1")), "\n");
                } else if(type == DEATH_TOUCHEXPLODE) {
                        HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
                        if(alsoprint)
@@@ -2752,7 -2952,7 +2952,7 @@@ void HUD_Centerprint(string s1, string 
                                centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1Don't shoot your team mates!"));
                } else if (type == DEATH_QUIET) {
                        // do nothing
-               } else if (type == DEATH_KILL) {
+               } else { // generic message
                        if(gentle)
                                centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You need to be more careful!"));
                        else
                        } else {
                                centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^4You fragged ^7", s1, s2));
                        }
-               } else if (type == KILL_FRAGGED) {
+               } else { // generic message
                        if(gentle) {
                                centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You were scored against by ^7", s1, s2));
                        } else {
@@@ -2846,7 -3046,7 +3046,7 @@@ void HUD_Notify (void
        float width_attacker;
        string attacker, victim;
  
-       float i, j;
+       float i, j, w;
        for(j = 0; j < entries; ++j)
        {
                s = "";
                                a = 0;
                }
  
-               float w;
+               w = -1;
                w = DEATH_WEAPONOF(killnotify_deathtype[j]);
  
                // TODO: maybe print in team colors?
                        {
                                s = "notify_teamkill_red";
                        }
+                       else if(killnotify_deathtype[j] == DEATH_TELEFRAG)
+                       {
+                               s = "notify_telefrag";
+                       }
                        else if(killnotify_deathtype[j] == DEATH_DROWN)
                        {
                                s = "notify_water";
@@@ -3547,6 -3751,17 +3751,17 @@@ void HUD_VoteWindow(void
        pos = panel_pos;
        mySize = panel_size;
  
+       if(!autocvar__hud_configure)
+       {
+               panel_fg_alpha = autocvar_hud_panel_fg_alpha;
+               panel_bg_alpha_str = autocvar_hud_panel_vote_bg_alpha;
+               if(panel_bg_alpha_str == "") {
+                       panel_bg_alpha_str = ftos(autocvar_hud_panel_bg_alpha);
+               }
+               panel_bg_alpha = stof(panel_bg_alpha_str);
+       }
        string s;
        float a;
        if(vote_active != vote_prev) {
        if(!vote_alpha)
                return;
  
-       a = vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1);
+       a = panel_bg_alpha * vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1);
        HUD_Panel_DrawBg(a);
+       a = panel_fg_alpha * vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1);
        if(panel_bg_padding)
        {
                pos += '1 1 0' * panel_bg_padding;
        mySize = newSize;
  
        s = "A vote has been called for:";
-       drawstring_aspect(pos, s, eX * mySize_x + eY * (2/8) * mySize_y, '1 1 1', a * panel_fg_alpha, DRAWFLAG_NORMAL);
+       drawstring_aspect(pos, s, eX * mySize_x + eY * (2/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
        s = textShortenToWidth(vote_called_vote, mySize_x, '1 1 0' * mySize_y * (1.75/8), stringwidth_colors);
        if(autocvar__hud_configure)
                s = "^1Configure the HUD";
-       drawcolorcodedstring_aspect(pos + eY * (2/8) * mySize_y, s, eX * mySize_x + eY * (1.75/8) * mySize_y, a * panel_fg_alpha, DRAWFLAG_NORMAL);
+       drawcolorcodedstring_aspect(pos + eY * (2/8) * mySize_y, s, eX * mySize_x + eY * (1.75/8) * mySize_y, a, DRAWFLAG_NORMAL);
  
        // print the yes/no counts
-       s = strcat("Yes (", getcommandkey("not bound", "vyes"), "): ", ftos(vote_yescount));
-       drawstring_aspect(pos + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '0 1 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
-       s = strcat("No (", getcommandkey("not bound", "vno"), "): ", ftos(vote_nocount));
-       drawstring_aspect(pos + eX * 0.5 * mySize_x + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '1 0 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
+       s = strcat("Yes (", getcommandkey("vyes", "vyes"), "): ", ftos(vote_yescount));
+       drawstring_aspect(pos + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '0 1 0', a, DRAWFLAG_NORMAL);
+       s = strcat("No (", getcommandkey("vno", "vno"), "): ", ftos(vote_nocount));
+       drawstring_aspect(pos + eX * 0.5 * mySize_x + eY * (4/8) * mySize_y, s, eX * 0.5 * mySize_x + eY * (1.5/8) * mySize_y, '1 0 0', a, DRAWFLAG_NORMAL);
  
        // draw the progress bar backgrounds
-       drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_back", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a * panel_fg_alpha, DRAWFLAG_NORMAL);
+       drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_back", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
  
        // draw the highlights
        if(vote_highlighted == 1) {
                drawsetcliparea(pos_x, pos_y, mySize_x * 0.5, mySize_y);
-               drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '0 1 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
+               drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
        }
        else if(vote_highlighted == 2) {
                drawsetcliparea(pos_x + 0.5 * mySize_x, pos_y, mySize_x * 0.5, mySize_y);
-               drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '0 1 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
+               drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
        }
  
        // draw the progress bars
        drawsetcliparea(pos_x, pos_y, mySize_x * 0.5 * (vote_yescount/vote_needed), mySize_y);
-       drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '0 1 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
+       drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
  
        drawsetcliparea(pos_x + mySize_x - mySize_x * 0.5 * (vote_nocount/vote_needed), pos_y, mySize_x * 0.5, mySize_y);
-       drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '1 0 0', a * panel_fg_alpha, DRAWFLAG_NORMAL);
+       drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_prog", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
  
        drawresetcliparea();
  
@@@ -4114,105 -4329,6 +4329,105 @@@ void HUD_Mod_Race(vector pos, vector my
        drawfont = hud_font;
  }
  
 +void DrawDomItem(vector myPos, vector mySize, float aspect_ratio, float i)
 +{
 +      float stat, pps_ratio;
 +      string pic;
 +      vector color;
 +      switch(i)
 +      {
 +              case 0:
 +                      stat = getstatf(STAT_DOM_PPS_RED);
 +                      pic = "dom_icon_red";
 +                      color = '1 0 0';
 +                      break;
 +              case 1:
 +                      stat = getstatf(STAT_DOM_PPS_BLUE);
 +                      pic = "dom_icon_blue";
 +                      color = '0 0 1';
 +                      break;
 +              case 2:
 +                      stat = getstatf(STAT_DOM_PPS_YELLOW);
 +                      pic = "dom_icon_yellow";
 +                      color = '1 1 0';
 +                      break;
 +              case 3:
 +                      stat = getstatf(STAT_DOM_PPS_PINK);
 +                      pic = "dom_icon_pink";
 +                      color = '1 0 1';
 +      }
 +      pps_ratio = stat / getstatf(STAT_DOM_TOTAL_PPS);
 +
 +      if(mySize_x/mySize_y > aspect_ratio)
 +      {
 +              i = aspect_ratio * mySize_y;
 +              myPos_x = myPos_x + (mySize_x - i) / 2;
 +              mySize_x = i;
 +      }
 +      else
 +      {
 +              i = 1/aspect_ratio * mySize_x;
 +              myPos_y = myPos_y + (mySize_y - i) / 2;
 +              mySize_y = i;
 +      }
 +
 +      if (cvar("hud_panel_modicons_dom_layout")) // show text too
 +      {
 +              //draw the text
 +              drawfont = hud_bigfont;
 +              color *= 0.5 + pps_ratio * (1 - 0.5); // half saturated color at min, full saturated at max
 +              if (cvar("hud_panel_modicons_dom_layout") == 2) // average pps
 +                      drawstring_aspect(myPos + eX * mySize_y, ftos_decimals(stat, 2), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL);
 +              else // percentage of average pps
 +                      drawstring_aspect(myPos + eX * mySize_y, strcat( ftos(floor(pps_ratio*100 + 0.5)), "%" ), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL);
 +              drawfont = hud_font;
 +      }
 +
 +      //draw the icon
 +      drawpic_aspect_skin(myPos, pic, '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +      if (stat > 0)
 +      {
 +              drawsetcliparea(myPos_x, myPos_y + mySize_y * (1 - pps_ratio), mySize_y, mySize_y * pps_ratio);
 +              drawpic_aspect_skin(myPos, strcat(pic, "-highlighted"), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 +              drawresetcliparea();
 +      }
 +}
 +
 +void HUD_Mod_Dom(vector myPos, vector mySize)
 +{
 +      entity tm;
 +      float teams_count;
 +      for(tm = teams.sort_next; tm; tm = tm.sort_next)
 +              if(tm.team != COLOR_SPECTATOR)
 +                      ++teams_count;
 +
 +      float rows, columns, aspect_ratio;
 +      rows = mySize_y/mySize_x;
 +      aspect_ratio = (cvar("hud_panel_modicons_dom_layout")) ? 3 : 1;
 +      rows = bound(1, floor((sqrt((4 * aspect_ratio * teams_count + rows) * rows) + rows + 0.5) / 2), teams_count);
 +      columns = ceil(teams_count/rows);
 +
 +      drawfont = hud_bigfont;
 +      int i;
 +      float row, column;
 +      for(i=0; i<teams_count; ++i)
 +      {
 +              vector pos, size;
 +              pos = myPos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows);
 +              size = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows);
 +
 +              DrawDomItem(pos, size, aspect_ratio, i);
 +
 +              ++row;
 +              if(row >= rows)
 +              {
 +                      row = 0;
 +                      ++column;
 +              }
 +      }
 +      drawfont = hud_font;
 +}
 +
  float mod_prev; // previous state of mod_active to check for a change
  float mod_alpha;
  float mod_change; // "time" when mod_active changed
@@@ -4222,7 -4338,7 +4437,7 @@@ void HUD_ModIcons(void
        if(!autocvar_hud_panel_modicons && !autocvar__hud_configure)
                return;
  
 -      if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && !autocvar__hud_configure)
 +      if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && gametype != GAME_DOMINATION && !autocvar__hud_configure)
                return;
  
        active_panel = HUD_PANEL_MODICONS;
                HUD_Mod_NexBall(pos, mySize);
        else if(gametype == GAME_CTS || gametype == GAME_RACE)
                HUD_Mod_Race(pos, mySize);
 +      else if(gametype == GAME_DOMINATION)
 +              HUD_Mod_Dom(pos, mySize);
  }
  
  // Draw pressed keys (#11)
@@@ -4337,8 -4451,15 +4552,15 @@@ void HUD_Chat(void
        {
                panel_pos_y = panel_bg_border;
                panel_size_y = vid_conheight - panel_bg_border * 2;
-               if(panel_bg == "0")
-                       panel_bg = "border"; // force a border when maximized
+               if(panel_bg == "0") // force a border when maximized
+               {
+                       if(precache_pic(panel_bg) == "") {
+                               panel_bg = strcat(hud_skin_path, "/border_default");
+                               if(precache_pic(panel_bg) == "") {
+                                       panel_bg = "gfx/hud/default/border_default";
+                               }
+                       }
+               }
                panel_bg_alpha = max(0.75, panel_bg_alpha); // force an alpha of at least 0.75
        }
  
@@@ -4406,29 -4527,32 +4628,32 @@@ void HUD_EngineInfo(void
                mySize -= '2 2 0' * panel_bg_padding;
        }
  
+       float currentTime = gettime(GETTIME_REALTIME);
        if(cvar("hud_panel_engineinfo_framecounter_exponentialmovingaverage"))
        {
-               frametimeavg = (frametimeavg + frametimeavg1 + frametimeavg2 + frametime)/4; // average three frametimes into framecounter for slightly more stable fps readings :P
+               float currentframetime = currentTime - prevfps_time;
+               frametimeavg = (frametimeavg + frametimeavg1 + frametimeavg2 + currentframetime)/4; // average three frametimes into framecounter for slightly more stable fps readings :P
                frametimeavg2 = frametimeavg1;
                frametimeavg1 = frametimeavg;
                
                float weight;
                weight = cvar("hud_panel_engineinfo_framecounter_exponentialmovingaverage_new_weight");
-               if(frametime > 0.0001) // filter out insane values which sometimes seem to occur and throw off the average? If you are getting 10,000 fps or more, then you don't need a framerate counter.
+               if(currentframetime > 0.0001) // filter out insane values which sometimes seem to occur and throw off the average? If you are getting 10,000 fps or more, then you don't need a framerate counter.
                {
-                       if(fabs(prevfps - (1/frametimeavg)) > prevfps * cvar("hud_panel_engineinfo_framecounter_exponentialmovingaverage_instantupdate_change_threshold")) // if there was a big jump in fps, just force prevfps at current (1/frametime) to make big updates instant
-                               prevfps = (1/frametime);
+                       if(fabs(prevfps - (1/frametimeavg)) > prevfps * cvar("hud_panel_engineinfo_framecounter_exponentialmovingaverage_instantupdate_change_threshold")) // if there was a big jump in fps, just force prevfps at current (1/currentframetime) to make big updates instant
+                               prevfps = (1/currentframetime);
                        prevfps = (1 - weight) * prevfps + weight * (1/frametimeavg); // framecounter just used so there's no need for a new variable, think of it as "frametime average"
                }
+               prevfps_time = currentTime;
        }
        else
        {
                framecounter += 1;
-               if(time - prevfps_time > cvar("hud_panel_engineinfo_framecounter_time"))
+               if(currentTime - prevfps_time > cvar("hud_panel_engineinfo_framecounter_time"))
                {
-                       prevfps = framecounter/cvar("hud_panel_engineinfo_framecounter_time");
+                       prevfps = framecounter/(currentTime - prevfps_time);
                        framecounter = 0;
-                       prevfps_time = time;
+                       prevfps_time = currentTime;
                }
        }
  
  
  // Info messages panel (#14)
  //
+ #define drawInfoMessage(s)\
+       if(autocvar_hud_panel_infomessages_flip)\
+               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize);\
+       drawcolorcodedstring(o, s, fontsize, a, DRAWFLAG_NORMAL);\
+       o_y += fontsize_y;
  void HUD_InfoMessages(void)
  {
        if(!autocvar_hud_panel_infomessages && !autocvar__hud_configure)
        vector fontsize;
        fontsize = '0.20 0.20 0' * mySize_y;
        
+       float a;
+       if(spectatee_status != 0)
+               a = 1;
+       else
+               a = panel_fg_alpha;
        string s;
        if(!autocvar__hud_configure)
        {
                                s = "^1Observing";
                        else
                                s = strcat("^1Spectating: ^7", GetPlayerName(spectatee_status - 1));
-                       if(autocvar_hud_panel_infomessages_flip)
-                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-                       drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-                       o += eY * fontsize_y;
+                       drawInfoMessage(s)
  
                        if(spectatee_status == -1)
-                               s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 to spectate");
+                               s = strcat("^1Press ^3", getcommandkey("primary fire", "+fire"), "^1 to spectate");
                        else
-                               s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 for another player");
-                       if(autocvar_hud_panel_infomessages_flip)
-                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-                       drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-                       o += eY * fontsize_y;
+                               s = strcat("^1Press ^3", getcommandkey("primary fire", "+fire"), "^1 for another player");
+                       drawInfoMessage(s)
  
                        if(spectatee_status == -1)
                                s = strcat("^1Use ^3", getcommandkey("next weapon", "weapnext"), "^1 or ^3", getcommandkey("previous weapon", "weapprev"), "^1 to change the speed");
                        else
-                               s = strcat("^1Press ^3", getcommandkey("secondary fire", "+attack2"), "^1 to observe");
-                       if(autocvar_hud_panel_infomessages_flip)
-                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-                       drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-                       o += eY * fontsize_y;
+                               s = strcat("^1Press ^3", getcommandkey("secondary fire", "+fire2"), "^1 to observe");
+                       drawInfoMessage(s)
  
                        s = strcat("^1Press ^3", getcommandkey("server info", "+show_info"), "^1 for gamemode info");
-                       if(autocvar_hud_panel_infomessages_flip)
-                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-                       drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-                       o += eY * fontsize_y;
+                       drawInfoMessage(s)
  
                        if(gametype == GAME_ARENA)
                                s = "^1Wait for your turn to join";
                        }
                        else
                                s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join");
-                       if(autocvar_hud_panel_infomessages_flip)
-                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-                       drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-                       o += eY * fontsize_y;
+                       drawInfoMessage(s)
  
                        //show restart countdown:
                        if (time < getstatf(STAT_GAMESTARTTIME)) {
                                //we need to ceil, otherwise the countdown would be off by .5 when using round()
                                countdown = ceil(getstatf(STAT_GAMESTARTTIME) - time);
                                s = strcat("^1Game starts in ^3", ftos(countdown), "^1 seconds");
-                               drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-                               o += eY * fontsize_y;
+                               drawcolorcodedstring(o, s, fontsize, a, DRAWFLAG_NORMAL);
+                               o_y += fontsize_y;
                        }
                }
                if(warmup_stage && !intermission)
                {
                        s = "^2Currently in ^1warmup^2 stage!";
-                       if(autocvar_hud_panel_infomessages_flip)
-                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-                       drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-                       o += eY * fontsize_y;
+                       drawInfoMessage(s)
                }
  
                string blinkcolor;
                                else
                                        s = strcat("^2Waiting for others to ready up...");
                        }
-                       if(autocvar_hud_panel_infomessages_flip)
-                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-                       drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-                       o += eY * fontsize_y;
+                       drawInfoMessage(s)
                }
                else if(warmup_stage && !intermission && !spectatee_status)
                {
                        s = strcat("^2Press ^3", getcommandkey("ready", "ready"), "^2 to end warmup");
-                       if(autocvar_hud_panel_infomessages_flip)
-                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-                       drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-                       o += eY * fontsize_y;
+                       drawInfoMessage(s)
                }
  
                if(teamplay && !intermission && !spectatee_status && gametype != GAME_CA && teamnagger)
                                        if (tm.team != COLOR_SPECTATOR)
                                        if (tm.team_size == ts_max)
                                                s = strcat(s, " Press ^3", getcommandkey("team menu", "menu_showteamselect"), blinkcolor, " to adjust");
-                                       if(autocvar_hud_panel_infomessages_flip)
-                                               o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-                                       drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-                                       o += eY * fontsize_y;
+                                       drawInfoMessage(s)
                                }
                        }
                }
        else 
        {
                s = "^7Press ^3ESC ^7to show HUD options.";
-               if(autocvar_hud_panel_infomessages_flip)
-                       o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-               drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-               o += eY * fontsize_y;
+               drawInfoMessage(s)
                s = "^3Doubleclick ^7a panel for panel-specific options.";
-               if(autocvar_hud_panel_infomessages_flip)
-                       o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-               drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-               o += eY * fontsize_y;
+               drawInfoMessage(s)
                s = "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and";
-               if(autocvar_hud_panel_infomessages_flip)
-                       o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-               drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-               o += eY * fontsize_y;
+               drawInfoMessage(s)
                s = "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments.";
-               if(autocvar_hud_panel_infomessages_flip)
-                       o_x = pos_x + mySize_x - stringwidth(s, TRUE, fontsize); 
-               drawcolorcodedstring(o, s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
-               o += eY * fontsize_y;
+               drawInfoMessage(s)
        }
  }
  
@@@ -4804,10 -4898,19 +4999,19 @@@ void HUD_Main (void
  {
        hud_skin_path = strcat("gfx/hud/", autocvar_hud_skin);
  
+       // global hud alpha fade
        if(disable_menu_alphacheck == 1)
-               menu_fade_alpha = 1;
+               hud_fade_alpha = 1;
        else
-               menu_fade_alpha = (1 - autocvar__menu_alpha);
+               hud_fade_alpha = (1 - autocvar__menu_alpha);
+       if(scoreboard_fade_alpha)
+               hud_fade_alpha = (1 - scoreboard_fade_alpha);
+       if(intermission == 2) // no hud during mapvote
+               hud_fade_alpha = 0;
+       else if(autocvar__menu_alpha == 0 && scoreboard_fade_alpha == 0)
+               hud_fade_alpha = 1;
  
        hud_border_thickness = bound(0, cvar("hud_border_thickness"), 5);
        hud_accuracy_border_thickness = bound(0, cvar_or("hud_accuracy_border_thickness", 1), 5);
                string pic;
                pic = strcat(hud_skin_path, "/", autocvar_hud_dock);
                if(precache_pic(pic) == "") {
-                       pic = "gfx/hud/default/dock";
+                       pic = strcat(hud_skin_path, "/dock_medium");
+                       if(precache_pic(pic) == "") {
+                               pic = "gfx/hud/default/dock_medium";
+                       }
                }
-               drawpic('0 0 0', pic, eX * vid_conwidth + eY * vid_conheight, color, autocvar_hud_dock_alpha * menu_fade_alpha, DRAWFLAG_NORMAL); // no aspect ratio forcing on dock...
+               drawpic('0 0 0', pic, eX * vid_conwidth + eY * vid_conheight, color, autocvar_hud_dock_alpha * hud_fade_alpha, DRAWFLAG_NORMAL); // no aspect ratio forcing on dock...
        }
  
        // cache the panel order into the panel_order array
index b2c4c53d16fd8e0f6cdc530e093f16db9f00ec8f,6f0eccfafb8af72f94a556ad5709a0554c0ccfab..417526e78ea9d2b64d18522bc4a57162c9bbb5a1
@@@ -61,6 -61,7 +61,7 @@@ const float TE_CSQC_NOTIFY = 112
  const float TE_CSQC_WEAPONCOMPLAIN = 113;
  const float TE_CSQC_CAMPINGRIFLE_SCOPE = 115;
  const float TE_CSQC_NEX_SCOPE = 116;
+ const float TE_CSQC_CR_MAXBULLETS = 117;
  
  const float RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder
  const float RACE_NET_CHECKPOINT_CLEAR = 1;
@@@ -308,13 -309,8 +309,14 @@@ const float STAT_NB_METERSTART = 45
  const float STAT_SHOTORG = 46; // compressShotOrigin
  const float STAT_LEADLIMIT = 47;
  const float STAT_BULLETS_LOADED = 48;
+ const float STAT_NEX_CHARGE = 49;
  
 +const float STAT_DOM_TOTAL_PPS = 70;
 +const float STAT_DOM_PPS_RED = 71;
 +const float STAT_DOM_PPS_BLUE = 72;
 +const float STAT_DOM_PPS_PINK = 73;
 +const float STAT_DOM_PPS_YELLOW = 74;
 +
  // see DP source, quakedef.h
  const float STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW = 222;
  const float STAT_MOVEVARS_AIRSTRAFEACCEL_QW = 223;
@@@ -404,7 -400,7 +406,7 @@@ float      CHAN_AUTO                               = 0
        // on world: announcers, ...                     INFO
        // on players: item pickup                       ITEMS
        // on entities: UNUSED
-       // on csqc: UNUSED
+       // on csqc: announcers                           INFO
  float CHAN_WEAPON                             = 1; // Weapon fire
        // on world: UNUSED
        // on players: weapon firing                     WEAPONS
@@@ -419,7 -415,7 +421,7 @@@ float      CHAN_TRIGGER                    = 3; // Triggers/I
        // on world: UNUSED
        // on players: item pickup                       ITEMS
        // on entities: platforms moving etc.            ITEMS
-       // on csqc: UNUSED
+       // on csqc: platforms moving etc.                ITEMS
  float CHAN_PROJECTILE                 = 4; // Projectiles
        // on world: UNUSED
        // on players: projectiles hitting player        SHOTS
@@@ -460,20 -456,21 +462,21 @@@ float PROJECTILE_CRYLINK = 5
  float PROJECTILE_ELECTRO_BEAM = 6;
  float PROJECTILE_GRENADE = 7;
  float PROJECTILE_GRENADE_BOUNCING = 8;
- float PROJECTILE_LASER = 9;
- float PROJECTILE_HLAC = 10;
- float PROJECTILE_SEEKER = 11;
- float PROJECTILE_FLAC = 12;
- float PROJECTILE_PORTO_RED = 13;
- float PROJECTILE_PORTO_BLUE = 14;
- float PROJECTILE_HOOKBOMB = 15;
- float PROJECTILE_HAGAR = 16;
- float PROJECTILE_HAGAR_BOUNCING = 17;
- float PROJECTILE_BULLET_GLOWING = 18;
- float PROJECTILE_CRYLINK_BOUNCING = 19;
- float PROJECTILE_FIREBALL = 20;
- float PROJECTILE_FIREMINE = 21;
- float PROJECTILE_BULLET_GLOWING_TRACER = 22;
+ float PROJECTILE_MINE = 9;
+ float PROJECTILE_LASER = 10;
+ float PROJECTILE_HLAC = 11;
+ float PROJECTILE_SEEKER = 12;
+ float PROJECTILE_FLAC = 13;
+ float PROJECTILE_PORTO_RED = 14;
+ float PROJECTILE_PORTO_BLUE = 15;
+ float PROJECTILE_HOOKBOMB = 16;
+ float PROJECTILE_HAGAR = 17;
+ float PROJECTILE_HAGAR_BOUNCING = 18;
+ float PROJECTILE_BULLET_GLOWING = 19;
+ float PROJECTILE_CRYLINK_BOUNCING = 20;
+ float PROJECTILE_FIREBALL = 21;
+ float PROJECTILE_FIREMINE = 22;
+ float PROJECTILE_BULLET_GLOWING_TRACER = 23;
  
  float SPECIES_HUMAN        =  0;
  float SPECIES_ROBOT_SOLID  =  1;
index e935273c6dcc9417c40874b3d182e85bba37d1f3,df6c8d4b2a3f41e0793e271d8aae9a9b54512692..6cc10bcd6bb767d1307cb38a52d896f49e76d03e
@@@ -6,6 -6,13 +6,13 @@@ void send_CSQC_teamnagger() 
        WriteByte(0, TE_CSQC_TEAMNAGGER);
  }
  
+ void send_CSQC_cr_maxbullets(entity e) {
+       msg_entity = e;
+       WriteByte(MSG_ONE, SVC_TEMPENTITY);
+       WriteByte(MSG_ONE, TE_CSQC_CR_MAXBULLETS);
+       WriteByte(MSG_ONE, cvar("g_balance_campingrifle_magazinecapacity"));
+ }
  void Announce(string snd) {
        WriteByte(MSG_ALL, SVC_TEMPENTITY);
        WriteByte(MSG_ALL, TE_CSQC_ANNOUNCE);
@@@ -866,10 -873,11 +873,11 @@@ void PutClientInServer (void
                self.iscreature = TRUE;
                self.movetype = MOVETYPE_WALK;
                self.solid = SOLID_SLIDEBOX;
+               self.dphitcontentsmask = DPCONTENTS_BODY | DPCONTENTS_SOLID;
                if(cvar("g_playerclip_collisions"))
-                       self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
-               else
-                       self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY;
+                       self.dphitcontentsmask |= DPCONTENTS_PLAYERCLIP;
+               if(clienttype(self) == CLIENTTYPE_BOT && cvar("g_botclip_collisions"))
+                       self.dphitcontentsmask |= DPCONTENTS_BOTCLIP;
                self.frags = FRAGS_PLAYER;
                if(independent_players)
                        MAKE_INDEPENDENT_PLAYER(self);
                        self.effects = 0;
                self.air_finished = time + 12;
                self.dmg = 2;
+               if(cvar("g_balance_nex_charge"))
+                       self.nex_charge = cvar("g_balance_nex_charge_start");
  
                if(inWarmupStage)
                {
@@@ -1354,8 -1364,9 +1364,9 @@@ void FixClientCvars(entity e
        if(g_race || g_cts)
                stuffcmd(e, "cl_cmd settemp cl_movecliptokeyboard 2\n");
        if(cvar("g_antilag") == 3) // client side hitscan
-               //stuffcmd(e, "cl_cmd settemp cl_prydoncursor -1\ncl_cmd settemp cl_prydoncursor_notrace 0\n");
                stuffcmd(e, "cl_cmd settemp cl_prydoncursor_notrace 0\n");
+       if(sv_gentle)
+               stuffcmd(e, "cl_cmd settemp cl_gentle 1\n");
        /*
         * we no longer need to stuff this. Remove this comment block if you feel
         * 2.3 and higher (or was it 2.2.3?) don't need these any more
@@@ -1386,11 -1397,6 +1397,7 @@@ Called when a client connects to the se
  string ColoredTeamName(float t);
  void DecodeLevelParms (void);
  //void dom_player_join_team(entity pl);
- #ifdef UID
- .float uid_kicktime;
- .string uid;
- #endif
 +void set_dom_state(entity e, float connecting);
  void ClientConnect (void)
  {
        float t;
        else
                self.hitplotfh = -1;
  
- #ifdef UID
-       if(clienttype(self) == CLIENTTYPE_REAL)
-       if not(self.uid)
-               self.uid_kicktime = time + 60;
- #endif
        if(g_race || g_cts) {
                string rr;
                if(g_cts)
                        race_SendRankings(i, 0, 0, MSG_ONE);
                }
        }
-       else if(cvar("sv_teamnagger") && !g_ca) // teamnagger is currently bad for ca
+       else if(cvar("sv_teamnagger") && !(cvar("bot_vs_human") && (c3==-1 && c4==-1)) && !g_ca) // teamnagger is currently bad for ca
                send_CSQC_teamnagger();
  
 +      if (g_domination)
 +              set_dom_state(self, TRUE);
+       send_CSQC_cr_maxbullets(self);
  
        CheatInitClient();
  }
@@@ -2860,9 -2859,16 +2862,16 @@@ float isInvisibleString(string s
                switch(c)
                {
                        case 0:
-                       case 32:
-                       case 160:
+                       case 32: // space
                                break;
+                       case 192: // charmap space
+                               if (!cvar("utf8_enable"))
+                                       break;
+                               return FALSE;
+                       case 160: // space in unicode fonts
+                       case 0xE000 + 192: // utf8 charmap space
+                               if (cvar("utf8_enable"))
+                                       break;
                        default:
                                return FALSE;
                }
@@@ -2907,16 -2913,6 +2916,6 @@@ void PlayerPostThink (void
                self.stat_count -= 1;
        }
  
- #ifdef UID
-       if(self.uid_kicktime)
-       if(time > self.uid_kicktime)
-       {
-               bprint("^3", self.netname, "^3 was kicked for missing UID.\n");
-               dropclient(self);
-               return;
-       }
- #endif
        if(sv_maxidle && frametime)
        {
                // WORKAROUND: only use dropclient in server frames (frametime set). Never use it in cl_movement frames (frametime zero).
index ac8343c0699e1d8ae68be842ac09744e157d2966,3e5bed8b25f23c35247fa2cf1c50c14da053dc3c..17e2e5fe0bbaabfefd1f8dd4790129b5778a035e
@@@ -24,26 -24,6 +24,26 @@@ float g_domination_point_rate
  .entity sprite;
  .float captime;
  
 +// pps: points per second
 +.float dom_total_pps;
 +.float dom_pps_red;
 +.float dom_pps_blue;
 +.float dom_pps_yellow;
 +.float dom_pps_pink;
 +float total_pps;
 +float pps_red;
 +float pps_blue;
 +float pps_yellow;
 +float pps_pink;
 +void set_dom_state(entity e, float connecting)
 +{
 +      if(connecting)  e.dom_total_pps = total_pps;
 +                                      e.dom_pps_red = pps_red;
 +                                      e.dom_pps_blue = pps_blue;
 +      if(c3 >= 0)             e.dom_pps_yellow = pps_yellow;
 +      if(c4 >= 0)             e.dom_pps_pink = pps_pink;
 +}
 +
  void() dom_controlpoint_setup;
  
  void LogDom(string mode, float team_before, entity actor)
@@@ -97,7 -77,10 +97,10 @@@ void dompoint_captured (
                wait_time = self.wait;
  
        bprint("^3", head.netname, "^3", self.message);
-       bprint(" ^7(", ftos(points), " points every ", ftos(wait_time), " seconds)\n");
+       if (points != 1)
+               bprint(" ^7(", ftos(points), " points every ", ftos(wait_time), " seconds)\n");
+       else
+               bprint(" ^7(", ftos(points), " point every ", ftos(wait_time), " seconds)\n");
  
        if(self.enemy.playerid == self.enemy_playerid)
                PlayerScore_Add(self.enemy, SP_DOM_TAKES, 1);
        self.delay = old_delay;
        self.team = old_team;
  
 +      switch(self.team)
 +      {
 +              // "fix" pps when slightly under 0 because of approximation errors
 +              case COLOR_TEAM1:
 +                      pps_red -= (points/wait_time);
 +                      if (pps_red < 0) pps_red = 0;
 +                      break;
 +              case COLOR_TEAM2:
 +                      pps_blue -= (points/wait_time);
 +                      if (pps_blue < 0) pps_blue = 0;
 +                      break;
 +              case COLOR_TEAM3:
 +                      pps_yellow -= (points/wait_time);
 +                      if (pps_yellow < 0) pps_yellow = 0;
 +                      break;
 +              case COLOR_TEAM4:
 +                      pps_pink -= (points/wait_time);
 +                      if (pps_pink < 0) pps_pink = 0;
 +      }
 +
        switch(self.goalentity.team)
        {
 +              // "fix" pps when slightly over total_pps because of approximation errors
                case COLOR_TEAM1:
 +                      pps_red += (points/wait_time);
 +                      if (pps_red > total_pps) pps_red = total_pps;
                        WaypointSprite_UpdateSprites(self.sprite, "dom-red", "", "");
                        break;
                case COLOR_TEAM2:
 +                      pps_blue += (points/wait_time);
 +                      if (pps_blue > total_pps) pps_blue = total_pps;
                        WaypointSprite_UpdateSprites(self.sprite, "dom-blue", "", "");
                        break;
                case COLOR_TEAM3:
 +                      pps_yellow += (points/wait_time);
 +                      if (pps_yellow > total_pps) pps_yellow = total_pps;
                        WaypointSprite_UpdateSprites(self.sprite, "dom-yellow", "", "");
                        break;
                case COLOR_TEAM4:
 +                      pps_pink += (points/wait_time);
 +                      if (pps_pink > total_pps) pps_pink = total_pps;
                        WaypointSprite_UpdateSprites(self.sprite, "dom-pink", "", "");
 -                      break;
        }
 +
 +      FOR_EACH_CLIENT(head)
 +              set_dom_state(head, FALSE);
 +
        WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_DOMPOINT, colormapPaletteColor(self.goalentity.team - 1, 0));
        WaypointSprite_Ping(self.sprite);
  
@@@ -209,6 -160,9 +212,6 @@@ void dompointthink(
        if (gameover || self.delay > time || time < game_starttime)     // game has ended, don't keep giving points
                return;
  
 -      g_domination_point_rate = cvar("g_domination_point_rate");
 -      g_domination_point_amt = cvar("g_domination_point_amt");
 -
        if(g_domination_point_rate)
                self.delay = time + g_domination_point_rate;
        else
@@@ -595,17 -549,6 +598,17 @@@ void spawnfunc_dom_controlpoint(
        self.effects = self.effects | EF_LOWPRECISION;
        if (cvar("g_domination_point_fullbright"))
                self.effects |= EF_FULLBRIGHT;
 +      
 +      float points, waittime;
 +      if (g_domination_point_rate)
 +              points += g_domination_point_rate;
 +      else
 +              points += self.frags;
 +      if (g_domination_point_amt)
 +              waittime += g_domination_point_amt;
 +      else
 +              waittime += self.wait;
 +      total_pps += points/waittime;
  };
  
  // code from here on is just to support maps that don't have control point and team entities
@@@ -712,15 -655,6 +715,15 @@@ void dom_init(
        precache_sound("domination/claim.wav");
        InitializeEntity(world, dom_delayedinit, INITPRIO_GAMETYPE);
  
 +      addstat(STAT_DOM_TOTAL_PPS, AS_FLOAT, dom_total_pps);
 +      addstat(STAT_DOM_PPS_RED, AS_FLOAT, dom_pps_red);
 +      addstat(STAT_DOM_PPS_BLUE, AS_FLOAT, dom_pps_blue);
 +      if(c3 >= 0) addstat(STAT_DOM_PPS_YELLOW, AS_FLOAT, dom_pps_yellow);
 +      if(c4 >= 0) addstat(STAT_DOM_PPS_PINK, AS_FLOAT, dom_pps_pink);
 +
 +      g_domination_point_rate = cvar("g_domination_point_rate");
 +      g_domination_point_amt = cvar("g_domination_point_amt");
 +
        // teamplay is always on in domination, defaults to hurt self but not teammates
        //if(!teams_matter)
        //      cvar_set("teamplay", "3");