]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into Mario/buff_updates
authorMario <zacjardine@y7mail.com>
Tue, 4 Aug 2015 02:30:37 +0000 (12:30 +1000)
committerMario <zacjardine@y7mail.com>
Tue, 4 Aug 2015 02:30:37 +0000 (12:30 +1000)
# Conflicts:
# effectinfo.txt
# qcsrc/common/notifications.qh
# qcsrc/common/stats.qh

14 files changed:
1  2 
_hud_descriptions.cfg
effectinfo.txt
hud_luma.cfg
hud_luminos.cfg
hud_luminos_minimal.cfg
hud_luminos_minimal_xhair.cfg
hud_luminos_old.cfg
hud_nexuiz.cfg
qcsrc/client/autocvars.qh
qcsrc/client/hud.qc
qcsrc/client/hud_config.qc
qcsrc/common/notifications.qh
qcsrc/common/stats.qh
qcsrc/server/autocvars.qh

diff --combined _hud_descriptions.cfg
index 5cabda2f6b118ad5208bb1529bb0a24a62e27b25,0a1c1d4bc3fe093be7b37a31f0b478d32a8b589a..c37b4fb645abe1f9839c2698ba711ca3529df767
@@@ -25,6 -25,8 +25,8 @@@ seta hud_progressbar_nexball_color "" "
  seta hud_progressbar_speed_color "" "R G B vector of the progress bar background color"
  seta hud_progressbar_acceleration_color "" "R G B vector of the progress bar background color"
  seta hud_progressbar_acceleration_neg_color "" "R G B vector of the progress bar background color"
+ seta hud_progressbar_vehicles_ammo1_color "" "R G B vector of the progress bar background color"
+ seta hud_progressbar_vehicles_ammo2_color "" "R G B vector of the progress bar background color"
  
  seta _hud_panelorder "" "contains order in which panels are to be drawn"
  
@@@ -62,6 -64,8 +64,8 @@@ seta hud_panel_weapons_label_scale "" "
  seta hud_panel_weapons_accuracy "" "show accuracy color as the weapon icon background; colors can be configured with accuracy_color* cvars"
  seta hud_panel_weapons_ammo "" "show ammo as a status bar"
  seta hud_panel_weapons_onlyowned "" "show only owned weapons"
+ seta hud_panel_weapons_noncurrent_alpha "" "alpha of noncurrent weapons"
+ seta hud_panel_weapons_noncurrent_scale "" "scale of noncurrent weapons, relative to the current weapon"
  
  seta hud_panel_ammo "" "enable/disable this panel"
  seta hud_panel_ammo_pos "" "position of this panel"
@@@ -310,5 -314,3 +314,5 @@@ seta hud_panel_buffs_bg_color_team "" "
  seta hud_panel_buffs_bg_alpha "" "if set to something else than \"\" = override default panel background alpha"
  seta hud_panel_buffs_bg_border "" "if set to something else than \"\" = override default size of border around the background"
  seta hud_panel_buffs_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
 +seta hud_panel_buffs_progressbar "" "use progressbar behind buff names"
 +seta hud_panel_buffs_progressbar_name "" "name of progressbar to use behind buff names"
diff --combined effectinfo.txt
index 49ae480df70446fc0cb98c73737b180621089922,f7bdc1d23fd06b486cbc5d0e764206313f19cf63..7990d74d761d283c49fd4ec4eed414a9610c4164
@@@ -9177,241 -9177,187 +9177,425 @@@ effect arc_overheat_fire // arc overhea
        liquidfriction 5
        velocitymultiplier 80
  
+ // yellowflag_touch -- effects for touching the yellow flag
+ // used nowhere in code
+ effect yellowflag_touch
+ count 35
+ type spark
+ tex 40 40
+ color 0xFFFF0F 0xFFFF0F
+ size 1 3
+ alpha 0 256 556
+ gravity 1
+ bounce 1.5
+ originjitter 1 1 1
+ velocityjitter 300 300 300
+ velocitymultiplier 0.5
+ airfriction 3
+ // pinkflag_touch -- effects for touching the pink flag
+ // used nowhere in code
+ effect pinkflag_touch
+ count 35
+ type spark
+ tex 40 40
+ color 0xFF0FFF 0xFF0FFF
+ size 1 3
+ alpha 0 256 556
+ gravity 1
+ bounce 1.5
+ originjitter 1 1 1
+ velocityjitter 300 300 300
+ velocitymultiplier 0.5
+ airfriction 3
+ // neutralflag_touch -- effects for touching the neutral flag
+ // used nowhere in code
+ effect neutralflag_touch
+ count 35
+ type spark
+ tex 40 40
+ color 0xFFFFFF 0xFFFFFF
+ size 1 3
+ alpha 0 256 556
+ gravity 1
+ bounce 1.5
+ originjitter 1 1 1
+ velocityjitter 300 300 300
+ velocitymultiplier 0.5
+ airfriction 3
+ // yellow_pass
+ // used nowhere in code
+ effect yellow_pass
+ trailspacing 64
+ color 0xFFFF0F 0xFFFF0F
+ size 2 2
+ tex 32 32
+ alpha 64 128 64
+ airfriction 5
+ sizeincrease 2
+ type static
+ effect yellow_pass
+ trailspacing 12
+ color 0xFFFF0F 0xFFFF0F
+ size 1 1
+ tex 0 8
+ alpha 32 64 32
+ airfriction 9
+ sizeincrease 8
+ velocityjitter 64 64 64
+ type static
+ effect yellow_pass
+ trailspacing 12
+ color 0xFFFF0F 0xFFFF0F
+ size 4 4
+ //tex 48 55
+ alpha 256 256 1280
+ type static
+ // pink_pass
+ // used nowhere in code
+ effect pink_pass
+ trailspacing 64
+ color 0xFFFFFF 0xFFFFFF
+ size 2 2
+ tex 32 32
+ alpha 64 128 64
+ airfriction 5
+ sizeincrease 2
+ type static
+ effect pink_pass
+ trailspacing 12
+ color 0xFFFFFF 0xFFFFFF
+ size 1 1
+ tex 0 8
+ alpha 32 64 32
+ airfriction 9
+ sizeincrease 8
+ velocityjitter 64 64 64
+ type static
+ effect pink_pass
+ trailspacing 12
+ color 0xFFFFFF 0xFFFFFF
+ size 4 4
+ //tex 48 55
+ alpha 256 256 1280
+ type static
+ // neutral_pass
+ // used nowhere in code
+ effect neutral_pass
+ trailspacing 64
+ color 0xFFFFFF 0xFFFFFF
+ size 2 2
+ tex 32 32
+ alpha 64 128 64
+ airfriction 5
+ sizeincrease 2
+ type static
+ effect neutral_pass
+ trailspacing 12
+ color 0xFFFFFF 0xFFFFFF
+ size 1 1
+ tex 0 8
+ alpha 32 64 32
+ airfriction 9
+ sizeincrease 8
+ velocityjitter 64 64 64
+ type static
+ effect neutral_pass
+ trailspacing 12
+ color 0xFFFFFF 0xFFFFFF
+ size 4 4
+ //tex 48 55
+ alpha 256 256 1280
+ type static
+ // yellow_cap -- yellow team capture effect
+ effect yellow_cap
+ count 500
+ type spark
+ tex 64 64
+ color 0xFFFF0F 0xFFFF0F
+ size 1 1
+ alpha 0 256 100
+ stretchfactor 2
+ //gravity 1
+ bounce 1.5
+ originjitter 1 1 1
+ velocityjitter 1000 1000 1500
+ velocitymultiplier 0.5
+ airfriction 2
+ stretchfactor 0.6
+ effect yellow_cap
+ countabsolute 1
+ type smoke
+ tex 65 65
+ size 150 150
+ alpha 190 190 180
+ sizeincrease -80
+ color 0xFFFF0F 0xFFFF0F
+ // pink_cap -- pink team capture effect
+ effect pink_cap
+ count 500
+ type spark
+ tex 64 64
+ color 0xFF0FFF 0xFF0FFF
+ size 1 1
+ alpha 0 256 100
+ stretchfactor 2
+ //gravity 1
+ bounce 1.5
+ originjitter 1 1 1
+ velocityjitter 1000 1000 1500
+ velocitymultiplier 0.5
+ airfriction 2
+ stretchfactor 0.6
+ effect pink_cap
+ countabsolute 1
+ type smoke
+ tex 65 65
+ size 150 150
+ alpha 190 190 180
+ sizeincrease -80
+ color 0xFF0FFF 0xFF0FFF
 +
 +// relic_resistance effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_resistance
 +count 20
 +type static
 +color 0x00ff80 0x00ff80
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
 +
 +// relic_regeneration effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_regeneration
 +count 1
 +type static
 +color 0x00ffff 0x00ffff
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
 +
 +// relic_vempire effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_vampire
 +count 20
 +type static
 +color 0xff00ff 0xff00ff
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
 +
 +// relic_ammo effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_ammo
 +count 1
 +type static
 +color 0x80ff00 0x80ff00
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
 +
 +// relic_damage effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_damage
 +count 20
 +type static
 +color 0xff0000 0xff0000
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
 +
 +// relic_splashdamage effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_ssplashdamage
 +count 20
 +type static
 +color 0xff8000 0xff8000
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
 +
 +// relic_firingspeed effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_firingspeed
 +count 20
 +type static
 +color 0xffff00 0xffff00
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
 +
 +// relic_disability effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_disability
 +count 20
 +type static
 +color 0x0000ff 0x0000ff
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
 +
 +// relic_disability_curse effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_disability_curse
 +count 1
 +type static
 +color 0x000080 0x000080
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
 +
 +// relic_teamboost effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_teamboost
 +count 20
 +type static
 +color 0xffffff 0xffffff
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
 +
 +// relic_teamboost_boost effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_teamboost_boost
 +count 1
 +type static
 +color 0x808080 0x808080
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
 +
 +// relic_speed effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_speed
 +count 1
 +type static
 +color 0x80ffff 0x80ffff
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
 +
 +// relic_jump effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_jump
 +count 20
 +type static
 +color 0xffff80 0xffff80
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
 +
 +// relic_flight effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_flight
 +count 1
 +type static
 +color 0x8080ff 0x8080ff
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
 +
 +// relic_radioactive effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_radioactive
 +count 20
 +type static
 +color 0x00ff00 0x00ff00
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
 +
 +// relic_resurrection effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_resurrection
 +count 20
 +type static
 +color 0xff0080 0xff0080
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
 +
 +// relic_vengeance effect, used by the relics mutator
 +// used in qcsrc/server/mutators/relics.qc: pointparticles(particleeffectnum(mdl), e.origin, '0 0 0', 1);
 +effect relic_vengeance
 +count 20
 +type static
 +color 0xff8080 0xff8080
 +size 1.5 1.5
 +alpha 128 256 256
 +gravity -0.1
 +airfriction 0.2
 +liquidfriction 0.8
 +originjitter 8 8 32
 +velocityjitter 64 64 32
diff --combined hud_luma.cfg
index ae0b5f0d972d70883f3da799fcee296a00014958,81528404a0b95f729bebf4c61166a11be54ab94c..0edab56dba6a8cc9413dedc8040f4db82e721c85
@@@ -23,6 -23,8 +23,8 @@@ seta hud_progressbar_nexball_color "0.
  seta hud_progressbar_speed_color "0.77 0.67 0"
  seta hud_progressbar_acceleration_color "0.2 0.65 0.93"
  seta hud_progressbar_acceleration_neg_color "0.86 0.35 0"
+ seta hud_progressbar_vehicles_ammo1_color "0.77 0.67 0"
+ seta hud_progressbar_vehicles_ammo2_color "0.86 0.35 0"
  
  seta _hud_panelorder "15 12 9 5 10 6 14 0 7 4 11 2 1 3 8 13 16 "
  
@@@ -31,7 -33,7 +33,7 @@@ seta hud_configure_grid_xsize "0.005000
  seta hud_configure_grid_ysize "0.005000"
  
  seta hud_panel_weapons 1
- seta hud_panel_weapons_pos "0.965000 0.120000"
+ seta hud_panel_weapons_pos "0.965000 0.125000"
  seta hud_panel_weapons_size "0.035000 0.770000"
  seta hud_panel_weapons_bg "border_default_east"
  seta hud_panel_weapons_bg_color ""
@@@ -60,10 -62,12 +62,12 @@@ seta hud_panel_weapons_timeout_fadefgmi
  seta hud_panel_weapons_timeout_speed_in "0.25"
  seta hud_panel_weapons_timeout_speed_out "0.75"
  seta hud_panel_weapons_onlyowned "1"
+ seta hud_panel_weapons_noncurrent_alpha "0.8"
+ seta hud_panel_weapons_noncurrent_scale "0.9"
  
  seta hud_panel_ammo 1
- seta hud_panel_ammo_pos "0.330000 0.865000"
- seta hud_panel_ammo_size "0.340000 0.060000"
+ seta hud_panel_ammo_pos "0.315000 0.865000"
+ seta hud_panel_ammo_size "0.370000 0.060000"
  seta hud_panel_ammo_bg "border_tab_south"
  seta hud_panel_ammo_bg_color ""
  seta hud_panel_ammo_bg_color_team ""
@@@ -80,17 -84,17 +84,17 @@@ seta hud_panel_ammo_progressbar_xoffse
  seta hud_panel_ammo_text "1"
  
  seta hud_panel_powerups 1
- seta hud_panel_powerups_pos "0 0.270000"
- seta hud_panel_powerups_size "0.040000 0.415000"
- seta hud_panel_powerups_bg "border_default_west"
+ seta hud_panel_powerups_pos "0.325000 0.820000"
+ seta hud_panel_powerups_size "0.350000 0.050000"
+ seta hud_panel_powerups_bg "border_shadow_south"
  seta hud_panel_powerups_bg_color ""
  seta hud_panel_powerups_bg_color_team ""
  seta hud_panel_powerups_bg_alpha ""
  seta hud_panel_powerups_bg_border ""
- seta hud_panel_powerups_bg_padding "2"
+ seta hud_panel_powerups_bg_padding ""
  seta hud_panel_powerups_flip "1"
- seta hud_panel_powerups_iconalign "1"
- seta hud_panel_powerups_baralign "1"
+ seta hud_panel_powerups_iconalign "2"
+ seta hud_panel_powerups_baralign "2"
  seta hud_panel_powerups_progressbar "1"
  seta hud_panel_powerups_progressbar_strength "progressbar"
  seta hud_panel_powerups_progressbar_shield "progressbar"
@@@ -206,7 -210,7 +210,7 @@@ seta hud_panel_modicons_dom_layout "1
  seta hud_panel_modicons_freezetag_layout "1"
  
  seta hud_panel_pressedkeys 1
- seta hud_panel_pressedkeys_pos "0.445000 0.730000"
+ seta hud_panel_pressedkeys_pos "0.445000 0.710000"
  seta hud_panel_pressedkeys_size "0.110000 0.090000"
  seta hud_panel_pressedkeys_bg " "
  seta hud_panel_pressedkeys_bg_color ""
@@@ -251,7 -255,7 +255,7 @@@ seta hud_panel_infomessages_bg_padding 
  seta hud_panel_infomessages_flip "1"
  
  seta hud_panel_physics 3
- seta hud_panel_physics_pos "0.410000 0.630000"
+ seta hud_panel_physics_pos "0.410000 0.625000"
  seta hud_panel_physics_size "0.180000 0.080000"
  seta hud_panel_physics_bg "0"
  seta hud_panel_physics_bg_color ""
@@@ -300,15 -304,13 +304,15 @@@ seta hud_panel_centerprint_fade_subsequ
  seta hud_panel_centerprint_fade_minfontsize "0"
  
  seta hud_panel_buffs 1
- seta hud_panel_buffs_pos "0.435000 0.840000"
- seta hud_panel_buffs_size "0.125000 0.035000"
+ seta hud_panel_buffs_pos "0.325000 0.820000"
+ seta hud_panel_buffs_size "0.350000 0.050000"
  seta hud_panel_buffs_bg "0"
  seta hud_panel_buffs_bg_color ""
  seta hud_panel_buffs_bg_color_team ""
  seta hud_panel_buffs_bg_alpha ""
  seta hud_panel_buffs_bg_border ""
  seta hud_panel_buffs_bg_padding ""
 +seta hud_panel_buffs_progressbar 1
 +seta hud_panel_buffs_progressbar_name "progressbar"
  
  menu_sync
diff --combined hud_luminos.cfg
index 4d95e94f7662d5c80acfaf3d7b08f0bb76b66256,efffd53e3b3e0105832bbaf14630b56eb71c584f..b15e82c52d6a83353229544620342cca0c0f48e9
@@@ -23,6 -23,8 +23,8 @@@ seta hud_progressbar_nexball_color "0.
  seta hud_progressbar_speed_color "1 0.75 0"
  seta hud_progressbar_acceleration_color "0.5 0.75 1"
  seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
+ seta hud_progressbar_vehicles_ammo1_color "0.8 0.7 0"
+ seta hud_progressbar_vehicles_ammo2_color "0.7 0.4 0"
  
  seta _hud_panelorder "15 12 9 10 5 6 14 0 7 4 11 2 1 3 8 13 16 "
  
@@@ -60,6 -62,8 +62,8 @@@ seta hud_panel_weapons_timeout_fadefgmi
  seta hud_panel_weapons_timeout_speed_in "0.25"
  seta hud_panel_weapons_timeout_speed_out "0.75"
  seta hud_panel_weapons_onlyowned "1"
+ seta hud_panel_weapons_noncurrent_alpha "1"
+ seta hud_panel_weapons_noncurrent_scale "1"
  
  seta hud_panel_ammo 1
  seta hud_panel_ammo_pos "0.330000 0.960000"
@@@ -308,7 -312,5 +312,7 @@@ seta hud_panel_buffs_bg_color_team "
  seta hud_panel_buffs_bg_alpha ""
  seta hud_panel_buffs_bg_border ""
  seta hud_panel_buffs_bg_padding ""
 +seta hud_panel_buffs_progressbar 1
 +seta hud_panel_buffs_progressbar_name "progressbar"
  
  menu_sync
diff --combined hud_luminos_minimal.cfg
index e0a381c6f4fe9c7acbbaac030a3212bbf3832cac,c0b2e3d90878e5c6dbf362fd00590f1aae4c1499..299417659345186c97b4e5731fe64979898ac92e
@@@ -23,6 -23,8 +23,8 @@@ seta hud_progressbar_nexball_color "0.
  seta hud_progressbar_speed_color "1 0.75 0"
  seta hud_progressbar_acceleration_color "0.5 0.75 1"
  seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
+ seta hud_progressbar_vehicles_ammo1_color "0.8 0.7 0"
+ seta hud_progressbar_vehicles_ammo2_color "0.7 0.4 0"
  
  seta _hud_panelorder "10 3 0 14 6 9 13 4 1 2 11 12 7 5 8 15 16 "
  
@@@ -60,6 -62,8 +62,8 @@@ seta hud_panel_weapons_timeout_fadefgmi
  seta hud_panel_weapons_timeout_speed_in "0.25"
  seta hud_panel_weapons_timeout_speed_out "0.75"
  seta hud_panel_weapons_onlyowned "1"
+ seta hud_panel_weapons_noncurrent_alpha "1"
+ seta hud_panel_weapons_noncurrent_scale "1"
  
  seta hud_panel_ammo 1
  seta hud_panel_ammo_pos "0.650000 0.890000"
@@@ -308,7 -312,5 +312,7 @@@ seta hud_panel_buffs_bg_color_team "
  seta hud_panel_buffs_bg_alpha ""
  seta hud_panel_buffs_bg_border ""
  seta hud_panel_buffs_bg_padding ""
 +seta hud_panel_buffs_progressbar 1
 +seta hud_panel_buffs_progressbar_name "progressbar"
  
  menu_sync
index 2d72b3cd41633ef007903a5abca354485892a373,6671c402181c76fbe1b9b34da0d3d6f0130e4354..a1f79cb58db7bd3dffbe4fbbd7f51a75009fdc9d
@@@ -23,6 -23,8 +23,8 @@@ seta hud_progressbar_nexball_color "0.
  seta hud_progressbar_speed_color "1 0.75 0"
  seta hud_progressbar_acceleration_color "0.5 0.75 1"
  seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
+ seta hud_progressbar_vehicles_ammo1_color "0.8 0.7 0"
+ seta hud_progressbar_vehicles_ammo2_color "0.7 0.4 0"
  
  seta _hud_panelorder "15 3 1 2 11 10 0 14 6 9 13 4 12 7 5 8 16 "
  
@@@ -60,6 -62,8 +62,8 @@@ seta hud_panel_weapons_timeout_fadefgmi
  seta hud_panel_weapons_timeout_speed_in "0.25"
  seta hud_panel_weapons_timeout_speed_out "0.75"
  seta hud_panel_weapons_onlyowned "1"
+ seta hud_panel_weapons_noncurrent_alpha "1"
+ seta hud_panel_weapons_noncurrent_scale "1"
  
  seta hud_panel_ammo 1
  seta hud_panel_ammo_pos "0.450000 0.630000"
@@@ -308,7 -312,5 +312,7 @@@ seta hud_panel_buffs_bg_color_team "
  seta hud_panel_buffs_bg_alpha ""
  seta hud_panel_buffs_bg_border ""
  seta hud_panel_buffs_bg_padding ""
 +seta hud_panel_buffs_progressbar 1
 +seta hud_panel_buffs_progressbar_name "progressbar"
  
  menu_sync
diff --combined hud_luminos_old.cfg
index 88c0d8f414c547d61a65ee5870a02c8d8549e7e4,615dfb296e4b12c35fc20956e2e9531f054ad546..b45c9f4bdd02086c7045f0fe5033649cf372e03f
@@@ -23,6 -23,8 +23,8 @@@ seta hud_progressbar_nexball_color "0.
  seta hud_progressbar_speed_color "1 0.75 0"
  seta hud_progressbar_acceleration_color "0.5 0.75 1"
  seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
+ seta hud_progressbar_vehicles_ammo1_color "0.8 0.7 0"
+ seta hud_progressbar_vehicles_ammo2_color "0.7 0.4 0"
  
  seta _hud_panelorder "15 10 9 6 8 14 5 0 4 13 2 7 1 3 11 12 16 "
  
@@@ -60,6 -62,8 +62,8 @@@ seta hud_panel_weapons_timeout_fadefgmi
  seta hud_panel_weapons_timeout_speed_in "0.25"
  seta hud_panel_weapons_timeout_speed_out "0.75"
  seta hud_panel_weapons_onlyowned "1"
+ seta hud_panel_weapons_noncurrent_alpha "1"
+ seta hud_panel_weapons_noncurrent_scale "1"
  
  seta hud_panel_ammo 1
  seta hud_panel_ammo_pos "0.190000 0.920000"
@@@ -308,7 -312,5 +312,7 @@@ seta hud_panel_buffs_bg_color_team "
  seta hud_panel_buffs_bg_alpha ""
  seta hud_panel_buffs_bg_border ""
  seta hud_panel_buffs_bg_padding ""
 +seta hud_panel_buffs_progressbar 1
 +seta hud_panel_buffs_progressbar_name "progressbar"
  
  menu_sync
diff --combined hud_nexuiz.cfg
index f3d9180be8358244232da09e0c6040f5e8b8a873,9dbd05f54a74029f4a1a980f6a206e1b163e2c05..9e4e174a2f0dd6fdce9f897800d80b4320ba4c4a
@@@ -23,6 -23,8 +23,8 @@@ seta hud_progressbar_nexball_color "0.
  seta hud_progressbar_speed_color "1 0.75 0"
  seta hud_progressbar_acceleration_color "0.5 0.75 1"
  seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
+ seta hud_progressbar_vehicles_ammo1_color "0.8 0.7 0"
+ seta hud_progressbar_vehicles_ammo2_color "0.7 0.4 0"
  
  seta _hud_panelorder "15 0 11 8 5 6 14 9 13 7 2 3 1 10 12 4 16 "
  
@@@ -60,6 -62,8 +62,8 @@@ seta hud_panel_weapons_timeout_fadefgmi
  seta hud_panel_weapons_timeout_speed_in "0.25"
  seta hud_panel_weapons_timeout_speed_out "0.75"
  seta hud_panel_weapons_onlyowned "0"
+ seta hud_panel_weapons_noncurrent_alpha "1"
+ seta hud_panel_weapons_noncurrent_scale "1"
  
  seta hud_panel_ammo 1
  seta hud_panel_ammo_pos "0.160000 0.910000"
@@@ -308,7 -312,5 +312,7 @@@ seta hud_panel_buffs_bg_color_team "
  seta hud_panel_buffs_bg_alpha ""
  seta hud_panel_buffs_bg_border ""
  seta hud_panel_buffs_bg_padding ""
 +seta hud_panel_buffs_progressbar 1
 +seta hud_panel_buffs_progressbar_name "progressbar"
  
  menu_sync
index b9a241da9feb143d86696d4f9bed8e7c22a5e758,6cf3227933dfd55ac4490b13c7d802e573dcb8ef..646415a8e1c5b90f22cb0b5d48380694cbf0d55e
@@@ -77,9 -77,9 +77,9 @@@ bool autocvar_cl_spawnzoom = 1
  float autocvar_cl_spawnzoom_speed = 1;
  float autocvar_cl_spawnzoom_factor = 2;
  bool autocvar_cl_stripcolorcodes;
- float autocvar_cl_vehicle_spiderbot_cross_alpha = 0.6;
- float autocvar_cl_vehicle_spiderbot_cross_size = 1;
  bool autocvar_cl_vehicles_hud_tactical = 1;
+ float autocvar_cl_vehicles_hudscale = 0.5;
+ float autocvar_cl_vehicles_crosshair_size = 0.5;
  bool autocvar_cl_velocityzoom_enabled;
  float autocvar_cl_velocityzoom_factor;
  int autocvar_cl_velocityzoom_type = 3;
@@@ -306,8 -306,6 +306,8 @@@ bool autocvar_hud_panel_powerups_flip
  int autocvar_hud_panel_powerups_iconalign;
  bool autocvar_hud_panel_powerups_progressbar;
  bool autocvar_hud_panel_buffs;
 +bool autocvar_hud_panel_buffs_progressbar;
 +string autocvar_hud_panel_buffs_progressbar_name = "progressbar";
  //float autocvar_hud_panel_buffs_iconalign;
  string autocvar_hud_panel_powerups_progressbar_shield;
  string autocvar_hud_panel_powerups_progressbar_strength;
@@@ -356,6 -354,8 +356,8 @@@ float autocvar_hud_panel_weapons_compla
  int autocvar_hud_panel_weapons_label;
  float autocvar_hud_panel_weapons_label_scale = 0.5;
  bool autocvar_hud_panel_weapons_onlyowned;
+ float autocvar_hud_panel_weapons_noncurrent_alpha = 1;
+ float autocvar_hud_panel_weapons_noncurrent_scale = 1;
  float autocvar_hud_panel_weapons_timeout;
  int autocvar_hud_panel_weapons_timeout_effect;
  float autocvar_hud_panel_weapons_timeout_fadebgmin;
@@@ -373,6 -373,8 +375,8 @@@ vector autocvar_hud_progressbar_shield_
  vector autocvar_hud_progressbar_speed_color;
  vector autocvar_hud_progressbar_strength_color;
  vector autocvar_hud_progressbar_superweapons_color;
+ vector autocvar_hud_progressbar_vehicles_ammo1_color;
+ vector autocvar_hud_progressbar_vehicles_ammo2_color;
  bool autocvar_hud_showbinds;
  bool autocvar_hud_showbinds_limit;
  bool autocvar__hud_showbinds_reload;
diff --combined qcsrc/client/hud.qc
index f30edcbdcbb8ecf877be46390c89e2320b8f7063,a0a5464a09f224546b2711cbc225f6a94f660457..9b0e5895c395ba9f0a5e5b37a41ddc4fe353b815
@@@ -13,6 -13,9 +13,9 @@@
  #include "../common/deathtypes.qh"
  #include "../common/mapinfo.qh"
  #include "../common/nades.qh"
+ #include "../server/mutators/gamemode_ctf.qh"
  #include "../common/stats.qh"
  
  #include "../csqcmodellib/cl_player.qh"
@@@ -789,11 -792,17 +792,17 @@@ void HUD_Weapons(void
        // draw items
        row = column = 0;
        vector label_size = '1 1 0' * min(weapon_size.x, weapon_size.y) * bound(0, autocvar_hud_panel_weapons_label_scale, 1);
+       vector noncurrent_pos = '0 0 0';
+       vector noncurrent_size = weapon_size * bound(0, autocvar_hud_panel_weapons_noncurrent_scale, 1);
+       float noncurrent_alpha = panel_fg_alpha * bound(0, autocvar_hud_panel_weapons_noncurrent_alpha, 1);
+       bool isCurrent;
        for(i = 0; i <= WEP_LAST-WEP_FIRST; ++i)
        {
                // retrieve information about the current weapon to be drawn
                self = weaponorder[i];
                weapon_id = self.impulse;
+               isCurrent = (self.weapon == switchweapon);
  
                // skip if this weapon doesn't exist
                if(!self || weapon_id < 0) { continue; }
                        continue;
  
                // figure out the drawing position of weapon
-               weapon_pos = (panel_pos
-                       + eX * column * weapon_size.x
-                       + eY * row * weapon_size.y);
+               weapon_pos = (panel_pos + eX * column * weapon_size.x + eY * row * weapon_size.y);
+               noncurrent_pos.x = weapon_pos.x + (weapon_size.x - noncurrent_size.x) / 2;
+               noncurrent_pos.y = weapon_pos.y + (weapon_size.y - noncurrent_size.y) / 2;
  
                // draw background behind currently selected weapon
-               if(self.weapon == switchweapon)
+               if(isCurrent)
                        drawpic_aspect_skin(weapon_pos, "weapon_current_bg", weapon_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
  
                // draw the weapon accuracy
                if(weapons_stat & WepSet_FromWeapon(self.weapon))
                {
                        // draw the weapon image
-                       drawpic_aspect_skin(weapon_pos, self.model2, weapon_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+                       if(isCurrent)
+                               drawpic_aspect_skin(weapon_pos, self.model2, weapon_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+                       else
+                               drawpic_aspect_skin(noncurrent_pos, self.model2, noncurrent_size, '1 1 1', noncurrent_alpha, DRAWFLAG_NORMAL);
  
                        // draw weapon label string
                        switch(autocvar_hud_panel_weapons_label)
                }
                else // draw a "ghost weapon icon" if you don't have the weapon
                {
-                       drawpic_aspect_skin(weapon_pos, self.model2, weapon_size, '0 0 0', panel_fg_alpha * 0.5, DRAWFLAG_NORMAL);
+                       drawpic_aspect_skin(noncurrent_pos, self.model2, noncurrent_size, '0.2 0.2 0.2', panel_fg_alpha * 0.5, DRAWFLAG_NORMAL);
                }
  
                // draw the complain message
  }
  
  // Ammo (#1)
- void DrawNadeScoreBar(vector myPos, vector mySize, vector color)
+ void DrawNadeProgressBar(vector myPos, vector mySize, float progress, vector color)
  {
        HUD_Panel_DrawProgressBar(
                myPos + eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize.x,
                mySize - eX * autocvar_hud_panel_ammo_progressbar_xoffset * mySize.x,
                autocvar_hud_panel_ammo_progressbar_name,
-               getstatf(STAT_NADE_BONUS_SCORE), 0, 0, color,
+               progress, 0, 0, color,
                autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
  }
  
  void DrawAmmoNades(vector myPos, vector mySize, bool draw_expanding, float expand_time)
  {
-       float theAlpha = 1, a, b;
-       vector nade_color, picpos, numpos;
+       float bonusNades    = getstatf(STAT_NADE_BONUS);
+       float bonusProgress = getstatf(STAT_NADE_BONUS_SCORE);
+       float bonusType     = getstati(STAT_NADE_BONUS_TYPE);
+       vector nadeColor    = Nade_Color(bonusType);
+       string nadeIcon     = Nade_Icon(bonusType);
  
-       nade_color = Nade_Color(getstati(STAT_NADE_BONUS_TYPE));
-       a = getstatf(STAT_NADE_BONUS);
-       b = getstatf(STAT_NADE_BONUS_SCORE);
+       vector iconPos, textPos;
  
        if(autocvar_hud_panel_ammo_iconalign)
        {
-               numpos = myPos;
-               picpos = myPos + eX * 2 * mySize.y;
+               iconPos = myPos + eX * 2 * mySize.y;
+               textPos = myPos;
        }
        else
        {
-               numpos = myPos + eX * mySize.y;
-               picpos = myPos;
+               iconPos = myPos;
+               textPos = myPos + eX * mySize.y;
        }
  
-       DrawNadeScoreBar(myPos, mySize, nade_color);
-       if(b > 0 || a > 0)
+       if(bonusNades > 0 || bonusProgress > 0)
        {
+               DrawNadeProgressBar(myPos, mySize, bonusProgress, nadeColor);
                if(autocvar_hud_panel_ammo_text)
-                       drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize.x + eY * mySize.y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL);
+                       drawstring_aspect(textPos, ftos(bonusNades), eX * (2/3) * mySize.x + eY * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
  
                if(draw_expanding)
-                       drawpic_aspect_skin_expanding(picpos, "nade_nbg", '1 1 0' * mySize.y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL, expand_time);
+                       drawpic_aspect_skin_expanding(iconPos, nadeIcon, '1 1 0' * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL, expand_time);
  
-               drawpic_aspect_skin(picpos, "nade_bg" , '1 1 0' * mySize.y, '1 1 1', panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL);
-               drawpic_aspect_skin(picpos, "nade_nbg" , '1 1 0' * mySize.y, nade_color, panel_fg_alpha * theAlpha, DRAWFLAG_NORMAL);
+               drawpic_aspect_skin(iconPos, nadeIcon, '1 1 0' * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
        }
  }
  
@@@ -2316,7 -2325,7 +2325,7 @@@ void HUD_Score(void
        vector distribution_color;
        entity tm, pl, me;
  
-       me = playerslots[player_localentnum - 1];
+       me = playerslots[current_player];
  
        if((scores_flags[ps_primary] & SFL_TIME) && !teamplay) { // race/cts record display on HUD
                string timer, distrtimer;
@@@ -2854,154 -2863,184 +2863,184 @@@ void HUD_Mod_CA(vector myPos, vector my
  }
  
  // CTF HUD modicon section
float redflag_prevframe, blueflag_prevframe; // status during previous frame
- int redflag_prevstatus, blueflag_prevstatus; // last remembered status
- float redflag_statuschange_time, blueflag_statuschange_time; // time when the status changed
int redflag_prevframe, blueflag_prevframe, yellowflag_prevframe, pinkflag_prevframe, neutralflag_prevframe; // status during previous frame
+ int redflag_prevstatus, blueflag_prevstatus, yellowflag_prevstatus, pinkflag_prevstatus, neutralflag_prevstatus; // last remembered status
+ float redflag_statuschange_time, blueflag_statuschange_time, yellowflag_statuschange_time, pinkflag_statuschange_time, neutralflag_statuschange_time; // time when the status changed
  
  void HUD_Mod_CTF_Reset(void)
  {
-       redflag_prevstatus = blueflag_prevstatus = redflag_prevframe = blueflag_prevframe = redflag_statuschange_time = blueflag_statuschange_time = 0;
+       redflag_prevstatus = blueflag_prevstatus = yellowflag_prevstatus = pinkflag_prevstatus = neutralflag_prevstatus = 0;
+       redflag_prevframe = blueflag_prevframe = yellowflag_prevframe = pinkflag_prevframe = neutralflag_prevframe = 0;
+       redflag_statuschange_time = blueflag_statuschange_time = yellowflag_statuschange_time = pinkflag_statuschange_time = neutralflag_statuschange_time = 0;
  }
  
  void HUD_Mod_CTF(vector pos, vector mySize)
  {
-       vector redflag_pos, blueflag_pos;
+       vector redflag_pos, blueflag_pos, yellowflag_pos, pinkflag_pos, neutralflag_pos;
        vector flag_size;
        float f; // every function should have that
  
-       int redflag, blueflag; // current status
-       float redflag_statuschange_elapsedtime, blueflag_statuschange_elapsedtime; // time since the status changed
-       int stat_items;
-       stat_items = getstati(STAT_ITEMS, 0, 24);
-       redflag = (stat_items/IT_RED_FLAG_TAKEN) & 3;
-       blueflag = (stat_items/IT_BLUE_FLAG_TAKEN) & 3;
+       int redflag, blueflag, yellowflag, pinkflag, neutralflag; // current status
+       float redflag_statuschange_elapsedtime, blueflag_statuschange_elapsedtime, yellowflag_statuschange_elapsedtime, pinkflag_statuschange_elapsedtime, neutralflag_statuschange_elapsedtime; // time since the status changed
+       bool ctf_oneflag; // one-flag CTF mode enabled/disabled
+       int stat_items = getstati(STAT_CTF_FLAGSTATUS, 0, 24);
+       float fs, fs2, fs3, size1, size2;
+       vector e1, e2;
+       redflag = (stat_items/CTF_RED_FLAG_TAKEN) & 3;
+       blueflag = (stat_items/CTF_BLUE_FLAG_TAKEN) & 3;
+       yellowflag = (stat_items/CTF_YELLOW_FLAG_TAKEN) & 3;
+       pinkflag = (stat_items/CTF_PINK_FLAG_TAKEN) & 3;
+       neutralflag = (stat_items/CTF_NEUTRAL_FLAG_TAKEN) & 3;
+       
+       ctf_oneflag = (stat_items & CTF_FLAG_NEUTRAL);
  
-       if(redflag || blueflag)
-               mod_active = 1;
-       else
-               mod_active = 0;
+       mod_active = (redflag || blueflag || yellowflag || pinkflag || neutralflag);
  
-       if(autocvar__hud_configure)
-       {
+       if (autocvar__hud_configure) {
                redflag = 1;
                blueflag = 2;
+               if (team_count >= 3)
+                       yellowflag = 2;
+               if (team_count >= 4)
+                       pinkflag = 3;
+               ctf_oneflag = neutralflag = 0; // disable neutral flag in hud editor?
        }
  
        // when status CHANGES, set old status into prevstatus and current status into status
-       if (redflag != redflag_prevframe)
-       {
-               redflag_statuschange_time = time;
-               redflag_prevstatus = redflag_prevframe;
-               redflag_prevframe = redflag;
-       }
-       if (blueflag != blueflag_prevframe)
-       {
-               blueflag_statuschange_time = time;
-               blueflag_prevstatus = blueflag_prevframe;
-               blueflag_prevframe = blueflag;
-       }
-       redflag_statuschange_elapsedtime = time - redflag_statuschange_time;
-       blueflag_statuschange_elapsedtime = time - blueflag_statuschange_time;
-       float BLINK_FACTOR = 0.15;
-       float BLINK_BASE = 0.85;
+       #define X(team) do {                                                                                                                    \
+               if (team##flag != team##flag_prevframe) {                                                                       \
+               team##flag_statuschange_time = time;                                                                    \
+               team##flag_prevstatus = team##flag_prevframe;                                                   \
+               team##flag_prevframe = team##flag;                                                                              \
+       }                                                                                                                                                       \
+       team##flag_statuschange_elapsedtime = time - team##flag_statuschange_time;      \
+     } while (0)
+       X(red);
+       X(blue);
+       X(yellow);
+       X(pink);
+       X(neutral);
+       #undef X
+       const float BLINK_FACTOR = 0.15;
+       const float BLINK_BASE = 0.85;
        // note:
        //   RMS = sqrt(BLINK_BASE^2 + 0.5 * BLINK_FACTOR^2)
        // thus
        //   BLINK_BASE = sqrt(RMS^2 - 0.5 * BLINK_FACTOR^2)
        // ensure RMS == 1
-       float BLINK_FREQ = 5; // circle frequency, = 2*pi*frequency in hertz
-       string red_icon, red_icon_prevstatus;
-       float red_alpha, red_alpha_prevstatus;
-       red_alpha = red_alpha_prevstatus = 1;
-       switch(redflag) {
-               case 1: red_icon = "flag_red_taken"; break;
-               case 2: red_icon = "flag_red_lost"; break;
-               case 3: red_icon = "flag_red_carrying"; red_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break;
-               default:
-                       if((stat_items & IT_CTF_SHIELDED) && (myteam == NUM_TEAM_2))
-                               red_icon = "flag_red_shielded";
-                       else
-                               red_icon = string_null;
-                       break;
-       }
-       switch(redflag_prevstatus) {
-               case 1: red_icon_prevstatus = "flag_red_taken"; break;
-               case 2: red_icon_prevstatus = "flag_red_lost"; break;
-               case 3: red_icon_prevstatus = "flag_red_carrying"; red_alpha_prevstatus = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break;
+       const float BLINK_FREQ = 5; // circle frequency, = 2*pi*frequency in hertz
+       #define X(team, cond) \
+       string team##_icon, team##_icon_prevstatus; \
+       int team##_alpha, team##_alpha_prevstatus; \
+       team##_alpha = team##_alpha_prevstatus = 1; \
+       do { \
+               switch (team##flag) { \
+                       case 1: team##_icon = "flag_" #team "_taken"; break; \
+                       case 2: team##_icon = "flag_" #team "_lost"; break; \
+                       case 3: team##_icon = "flag_" #team "_carrying"; team##_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; \
+                       default: \
+                               if ((stat_items & CTF_SHIELDED) && (cond)) { \
+                                       team##_icon = "flag_" #team "_shielded"; \
+                               } else { \
+                                       team##_icon = string_null; \
+                               } \
+                               break; \
+               } \
+               switch (team##flag_prevstatus) { \
+                       case 1: team##_icon_prevstatus = "flag_" #team "_taken"; break; \
+                       case 2: team##_icon_prevstatus = "flag_" #team "_lost"; break; \
+                       case 3: team##_icon_prevstatus = "flag_" #team "_carrying"; team##_alpha_prevstatus = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break; \
+                       default: \
+                               if (team##flag == 3) { \
+                                       team##_icon_prevstatus = "flag_" #team "_carrying"; /* make it more visible */\
+                               } else if((stat_items & CTF_SHIELDED) && (cond)) { \
+                                       team##_icon_prevstatus = "flag_" #team "_shielded"; \
+                               } else { \
+                                       team##_icon_prevstatus = string_null; \
+                               } \
+                               break; \
+               } \
+       } while (0)
+       X(red, myteam != NUM_TEAM_1);
+       X(blue, myteam != NUM_TEAM_2);
+       X(yellow, myteam != NUM_TEAM_3);
+       X(pink, myteam != NUM_TEAM_4);
+       X(neutral, true);
+       #undef X
+       if (ctf_oneflag) {
+               // hacky, but these aren't needed
+               red_icon = red_icon_prevstatus = blue_icon = blue_icon_prevstatus = yellow_icon = yellow_icon_prevstatus = pink_icon = pink_icon_prevstatus = string_null;
+               fs = fs2 = fs3 = 1;
+       } else switch (team_count) {
                default:
-                       if(redflag == 3)
-                               red_icon_prevstatus = "flag_red_carrying"; // make it more visible
-                       else if((stat_items & IT_CTF_SHIELDED) && (myteam == NUM_TEAM_2))
-                               red_icon_prevstatus = "flag_red_shielded";
-                       else
-                               red_icon_prevstatus = string_null;
-                       break;
+               case 2: fs = 0.5; fs2 = 0.5; fs3 = 0.5; break;
+               case 3: fs = 1; fs2 = 0.35; fs3 = 0.35; break;
+               case 4: fs = 0.75; fs2 = 0.25; fs3 = 0.5; break;
        }
  
-       string blue_icon, blue_icon_prevstatus;
-       float blue_alpha, blue_alpha_prevstatus;
-       blue_alpha = blue_alpha_prevstatus = 1;
-       switch(blueflag) {
-               case 1: blue_icon = "flag_blue_taken"; break;
-               case 2: blue_icon = "flag_blue_lost"; break;
-               case 3: blue_icon = "flag_blue_carrying"; blue_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break;
-               default:
-                       if((stat_items & IT_CTF_SHIELDED) && (myteam == NUM_TEAM_1))
-                               blue_icon = "flag_blue_shielded";
-                       else
-                               blue_icon = string_null;
-                       break;
-       }
-       switch(blueflag_prevstatus) {
-               case 1: blue_icon_prevstatus = "flag_blue_taken"; break;
-               case 2: blue_icon_prevstatus = "flag_blue_lost"; break;
-               case 3: blue_icon_prevstatus = "flag_blue_carrying"; blue_alpha_prevstatus = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break;
-               default:
-                       if(blueflag == 3)
-                               blue_icon_prevstatus = "flag_blue_carrying"; // make it more visible
-                       else if((stat_items & IT_CTF_SHIELDED) && (myteam == NUM_TEAM_1))
-                               blue_icon_prevstatus = "flag_blue_shielded";
-                       else
-                               blue_icon_prevstatus = string_null;
-                       break;
+       if (mySize_x > mySize_y) {
+               size1 = mySize_x;
+               size2 = mySize_y;
+               e1 = eX;
+               e2 = eY;
+       } else {
+               size1 = mySize_y;
+               size2 = mySize_x;
+               e1 = eY;
+               e2 = eX;
        }
  
-       if(mySize.x > mySize.y) {
-               if (myteam == NUM_TEAM_1) { // always draw own flag on left
+       switch (myteam) {
+               default:
+               case NUM_TEAM_1: {
                        redflag_pos = pos;
-                       blueflag_pos = pos + eX * 0.5 * mySize.x;
-               } else {
-                       blueflag_pos = pos;
-                       redflag_pos = pos + eX * 0.5 * mySize.x;
+                       blueflag_pos = pos + eX * fs2 * size1;
+                       yellowflag_pos = pos - eX * fs2 * size1;
+                       pinkflag_pos = pos + eX * fs3 * size1;
+                       break;
                }
-               flag_size = eX * 0.5 * mySize.x + eY * mySize.y;
-       } else {
-               if (myteam == NUM_TEAM_1) { // always draw own flag on left
-                       redflag_pos = pos;
-                       blueflag_pos = pos + eY * 0.5 * mySize.y;
-               } else {
+               case NUM_TEAM_2: {
+                       redflag_pos = pos + eX * fs2 * size1;
                        blueflag_pos = pos;
-                       redflag_pos = pos + eY * 0.5 * mySize.y;
+                       yellowflag_pos = pos - eX * fs2 * size1;
+                       pinkflag_pos = pos + eX * fs3 * size1;
+                       break;
+               }
+               case NUM_TEAM_3: {
+                       redflag_pos = pos + eX * fs3 * size1;
+                       blueflag_pos = pos - eX * fs2 * size1;
+                       yellowflag_pos = pos;
+                       pinkflag_pos = pos + eX * fs2 * size1;
+                       break;
+               }
+               case NUM_TEAM_4: {
+                       redflag_pos = pos - eX * fs2 * size1;
+                       blueflag_pos = pos + eX * fs3 * size1;
+                       yellowflag_pos = pos + eX * fs2 * size1;
+                       pinkflag_pos = pos;
+                       break;
                }
-               flag_size = eY * 0.5 * mySize.y + eX * mySize.x;
        }
-       f = bound(0, redflag_statuschange_elapsedtime*2, 1);
-       if(red_icon_prevstatus && f < 1)
-               drawpic_aspect_skin_expanding(redflag_pos, red_icon_prevstatus, flag_size, '1 1 1', panel_fg_alpha * red_alpha_prevstatus, DRAWFLAG_NORMAL, f);
-       if(red_icon)
-               drawpic_aspect_skin(redflag_pos, red_icon, flag_size, '1 1 1', panel_fg_alpha * red_alpha * f, DRAWFLAG_NORMAL);
-       f = bound(0, blueflag_statuschange_elapsedtime*2, 1);
-       if(blue_icon_prevstatus && f < 1)
-               drawpic_aspect_skin_expanding(blueflag_pos, blue_icon_prevstatus, flag_size, '1 1 1', panel_fg_alpha * blue_alpha_prevstatus, DRAWFLAG_NORMAL, f);
-       if(blue_icon)
-               drawpic_aspect_skin(blueflag_pos, blue_icon, flag_size, '1 1 1', panel_fg_alpha * blue_alpha * f, DRAWFLAG_NORMAL);
+       neutralflag_pos = pos;
+       flag_size = e1 * fs * size1 + e2 * size2;
+       #define X(team) do { \
+               f = bound(0, team##flag_statuschange_elapsedtime * 2, 1); \
+               if (team##_icon_prevstatus && f < 1) \
+                       drawpic_aspect_skin_expanding(team##flag_pos, team##_icon_prevstatus, flag_size, '1 1 1', panel_fg_alpha * team##_alpha_prevstatus, DRAWFLAG_NORMAL, f); \
+               if (team##_icon) \
+                       drawpic_aspect_skin(team##flag_pos, team##_icon, flag_size, '1 1 1', panel_fg_alpha * team##_alpha * f, DRAWFLAG_NORMAL); \
+       } while (0)
+       X(red);
+       X(blue);
+       X(yellow);
+       X(pink);
+       X(neutral);
+       #undef X
  }
  
  // Keyhunt HUD modicon section
@@@ -3782,7 -3821,7 +3821,7 @@@ void HUD_InfoMessages(void
                        if(spectatee_status == -1)
                                s = _("^1Observing");
                        else
-                               s = sprintf(_("^1Spectating: ^7%s"), GetPlayerName(player_localentnum - 1));
+                               s = sprintf(_("^1Spectating: ^7%s"), GetPlayerName(current_player));
                        drawInfoMessage(s);
  
                        if(spectatee_status == -1)
@@@ -4549,7 -4588,8 +4588,7 @@@ void HUD_Buffs(void
        }
  
        HUD_Panel_UpdateCvars();
 -
 -      draw_beginBoldFont();
 +      
  
        vector pos, mySize;
        pos = panel_pos;
        //float buff_iconalign = autocvar_hud_panel_buffs_iconalign;
        vector buff_offset = '0 0 0';
  
 +      draw_beginBoldFont();
 +      float buff_time, buff_maxtime;
 +      buff_time = bound(0, getstatf(STAT_BUFF_TIME) - time, 99);
 +      buff_maxtime = 60; // TODO: stat?
        for(e = Buff_Type_first; e; e = e.enemy) if(buffs & e.items)
        {
 +              if(buff_time && autocvar_hud_panel_buffs_progressbar)
 +                      HUD_Panel_DrawProgressBar(pos + buff_offset, mySize, autocvar_hud_panel_buffs_progressbar_name, buff_time/buff_maxtime, 0, 0, 
 +                                                                        Buff_Color(e.items) * -1 + '1 1 1', (autocvar_hud_progressbar_alpha * panel_fg_alpha) * 0.4, DRAWFLAG_NORMAL);
 +
                //DrawNumIcon(pos + buff_offset, mySize, shield, "shield", is_vertical, buff_iconalign, '1 1 1', 1);
                drawcolorcodedstring_aspect(pos + buff_offset, s, mySize, panel_fg_alpha * 0.5, DRAWFLAG_NORMAL);
        }
@@@ -4637,8 -4669,6 +4676,6 @@@ void HUD_Main (void
                hud_skin_prev = strzone(autocvar_hud_skin);
        }
  
-     current_player = player_localentnum;
        // draw the dock
        if(autocvar_hud_dock != "" && autocvar_hud_dock != "0")
        {
                {
                        string hud_dock_color = autocvar_hud_dock_color;
                        if(hud_dock_color == "shirt") {
-                               f = stof(getplayerkeyvalue(current_player - 1, "colors"));
+                               f = stof(getplayerkeyvalue(current_player, "colors"));
                                color = colormapPaletteColor(floor(f / 16), 0);
                        }
                        else if(hud_dock_color == "pants") {
-                               f = stof(getplayerkeyvalue(current_player - 1, "colors"));
+                               f = stof(getplayerkeyvalue(current_player, "colors"));
                                color = colormapPaletteColor(f % 16, 1);
                        }
                        else
index 696b1e7059e4efb8947517680e7f57e2df717ff8,2bce4439241156d6b38bf93c50de62d4febf40e5..72233a0ac0d382f5d027894cc192e4ac62d3a90a
@@@ -96,6 -96,8 +96,8 @@@ void HUD_Panel_ExportCfg(string cfgname
                                        HUD_Write_PanelCvar_q("_timeout_speed_in");
                                        HUD_Write_PanelCvar_q("_timeout_speed_out");
                                        HUD_Write_PanelCvar_q("_onlyowned");
+                                       HUD_Write_PanelCvar_q("_noncurrent_alpha");
+                                       HUD_Write_PanelCvar_q("_noncurrent_scale");
                                        break;
                                case HUD_PANEL_AMMO:
                                        HUD_Write_PanelCvar_q("_onlycurrent");
                                        HUD_Write_PanelCvar_q("_fade_subsequent_minfontsize");
                                        HUD_Write_PanelCvar_q("_fade_minfontsize");
                                        break;
 +                              case HUD_PANEL_BUFFS:
 +                                      HUD_Write_PanelCvar_q("_progressbar");
 +                                      HUD_Write_PanelCvar_q("_progressbar_name");
                        }
                        HUD_Write("\n");
                }
index 13487ad830001d6a4ca1e09c574a612c67f0e06a,1f1e9828c160c276b5976f92792335a79fec2b88..d26f47b795aea7728d693937de6aa2e18d3f322b
@@@ -347,37 -347,45 +347,46 @@@ void Send_Notification_WOCOVA
  
  #define MSG_INFO_NOTIFICATIONS \
      MSG_INFO_NOTIF(2, INFO_CHAT_NOSPECTATORS,              0, 0, "", "",                            "",                     _("^F4NOTE: ^BGSpectator chat is not sent to players during the match"), "") \
+     MULTITEAM_INFO(1, INFO_CTF_CAPTURE_, 4,                1, 0, "s1", "s1",                        "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag"), "") \
+     MULTITEAM_INFO(1, INFO_CTF_CAPTURE_BROKEN_, 4,         2, 2, "s1 f1p2dec s2 f2p2dec", "s1",     "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds, breaking ^BG%s^BG's previous record of ^F2%s^BG seconds"), "") \
+     MSG_INFO_NOTIF(1, INFO_CTF_CAPTURE_NEUTRAL,            1, 0, "s1", "s1",                        "notify_%s_captured",   _("^BG%s^BG captured the flag"), "") \
+     MULTITEAM_INFO(1, INFO_CTF_CAPTURE_TIME_, 4,           1, 1, "s1 f1p2dec", "s1",                "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds"), "") \
+     MULTITEAM_INFO(1, INFO_CTF_CAPTURE_UNBROKEN_, 4,       2, 2, "s1 f1p2dec s2 f2p2dec", "s1",     "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F2%s^BG seconds, failing to break ^BG%s^BG's previous record of ^F1%s^BG seconds"), "") \
+     MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_ABORTRUN_, 4,    0, 0, "", "",                            "",                     _("^BGThe ^TC^TT^BG flag was returned to base by its owner"), "") \
+     MSG_INFO_NOTIF(1, INFO_CTF_FLAGRETURN_ABORTRUN_NEUTRAL,0, 0, "", "",                            "",                     _("^BGThe flag was returned by its owner"), "") \
+     MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_DAMAGED_, 4,     0, 0, "", "",                            "",                     _("^BGThe ^TC^TT^BG flag was destroyed and returned to base"), "") \
+     MSG_INFO_NOTIF(1, INFO_CTF_FLAGRETURN_DAMAGED_NEUTRAL, 0, 0, "", "",                            "",                     _("^BGThe flag was destroyed and returned to base"), "") \
+     MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_DROPPED_, 4,     0, 0, "", "",                            "",                     _("^BGThe ^TC^TT^BG flag was dropped in the base and returned itself"), "") \
+     MSG_INFO_NOTIF(1, INFO_CTF_FLAGRETURN_DROPPED_NEUTRAL, 0, 0, "", "",                            "",                     _("^BGThe flag was dropped in the base and returned itself"), "") \
+     MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_NEEDKILL_, 4,    0, 0, "", "",                            "",                     _("^BGThe ^TC^TT^BG flag fell somewhere it couldn't be reached and returned to base"), "") \
+     MSG_INFO_NOTIF(1, INFO_CTF_FLAGRETURN_NEEDKILL_NEUTRAL,0, 0, "", "",                            "",                     _("^BGThe flag fell somewhere it couldn't be reached and returned to base"), "") \
+     MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_SPEEDRUN_, 4,    0, 1, "f1p2dec", "",                     "",                     _("^BGThe ^TC^TT^BG flag became impatient after ^F1%.2f^BG seconds and returned itself"), "") \
+     MSG_INFO_NOTIF(1, INFO_CTF_FLAGRETURN_SPEEDRUN_NEUTRAL,0, 1, "f1p2dec", "",                     "",                     _("^BGThe flag became impatient after ^F1%.2f^BG seconds and returned itself"), "") \
+     MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_TIMEOUT_, 4,     0, 0, "", "",                            "",                     _("^BGThe ^TC^TT^BG flag has returned to the base"), "") \
+     MSG_INFO_NOTIF(1, INFO_CTF_FLAGRETURN_TIMEOUT_NEUTRAL, 0, 0, "", "",                            "",                     _("^BGThe flag has returned to the base"), "") \
+     MULTITEAM_INFO(1, INFO_CTF_LOST_, 4,                   1, 0, "s1", "s1",                        "notify_%s_lost",       _("^BG%s^BG lost the ^TC^TT^BG flag"), "") \
+     MSG_INFO_NOTIF(1, INFO_CTF_LOST_NEUTRAL,               1, 0, "s1", "s1",                        "notify_%s_lost",       _("^BG%s^BG lost the flag"), "") \
+     MULTITEAM_INFO(1, INFO_CTF_PICKUP_, 4,                 1, 0, "s1", "s1",                        "notify_%s_taken",      _("^BG%s^BG got the ^TC^TT^BG flag"), "") \
+     MSG_INFO_NOTIF(1, INFO_CTF_PICKUP_NEUTRAL,             1, 0, "s1", "s1",                        "notify_%s_taken",      _("^BG%s^BG got the flag"), "") \
+     MULTITEAM_INFO(1, INFO_CTF_RETURN_, 4,                 1, 0, "s1", "s1",                        "notify_%s_returned",   _("^BG%s^BG returned the ^TC^TT^BG flag"), "") \
+     MULTITEAM_INFO(1, INFO_CTF_RETURN_MONSTER_, 4,         1, 0, "s1", "s1",                        "notify_%s_returned",   _("^BG%s^BG returned the ^TC^TT^BG flag"), "") \
      MSG_INFO_NOTIF(2, INFO_COINTOSS,                       1, 0, "s1", "",                          "",                     _("^F2Throwing coin... Result: %s^F2!"), "") \
      MSG_INFO_NOTIF(1, INFO_JETPACK_NOFUEL,                 0, 0, "", "",                            "",                     _("^BGYou don't have any fuel for the ^F1Jetpack"), "") \
      MSG_INFO_NOTIF(2, INFO_SUPERSPEC_MISSING_UID,          0, 0, "", "",                            "",                     _("^F2You lack a UID, superspec options will not be saved/restored"), "") \
      MSG_INFO_NOTIF(1, INFO_CA_JOIN_LATE,                   0, 0, "", "",                            "",                     _("^F1Round already started, you will join the game in the next round"), "") \
      MSG_INFO_NOTIF(1, INFO_CA_LEAVE,                       0, 0, "", "",                            "",                     _("^F2You will spectate in the next round"), "") \
-     MULTITEAM_INFO(1, INFO_CTF_CAPTURE_, 2,                1, 0, "s1", "s1",                        "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag"), "") \
-     MULTITEAM_INFO(1, INFO_CTF_CAPTURE_BROKEN_, 2,         2, 2, "s1 f1p2dec s2 f2p2dec", "s1",     "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds, breaking ^BG%s^BG's previous record of ^F2%s^BG seconds"), "") \
-     MULTITEAM_INFO(1, INFO_CTF_CAPTURE_TIME_, 2,           1, 1, "s1 f1p2dec", "s1",                "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds"), "") \
-     MULTITEAM_INFO(1, INFO_CTF_CAPTURE_UNBROKEN_, 2,       2, 2, "s1 f1p2dec s2 f2p2dec", "s1",     "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F2%s^BG seconds, failing to break ^BG%s^BG's previous record of ^F1%s^BG seconds"), "") \
-     MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_ABORTRUN_, 2,    0, 0, "", "",                            "",                     _("^BGThe ^TC^TT^BG flag was returned to base by its owner"), "") \
-     MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_DAMAGED_, 2,     0, 0, "", "",                            "",                     _("^BGThe ^TC^TT^BG flag was destroyed and returned to base"), "") \
-     MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_DROPPED_, 2,     0, 0, "", "",                            "",                     _("^BGThe ^TC^TT^BG flag was dropped in the base and returned itself"), "") \
-     MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_NEEDKILL_, 2,    0, 0, "", "",                            "",                     _("^BGThe ^TC^TT^BG flag fell somewhere it couldn't be reached and returned to base"), "") \
-     MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_SPEEDRUN_, 2,    0, 1, "f1p2dec", "",                     "",                     _("^BGThe ^TC^TT^BG flag became impatient after ^F1%.2f^BG seconds and returned itself"), "") \
-     MULTITEAM_INFO(1, INFO_CTF_FLAGRETURN_TIMEOUT_, 2,     0, 0, "", "",                            "",                     _("^BGThe ^TC^TT^BG flag has returned to the base"), "") \
-     MULTITEAM_INFO(1, INFO_CTF_LOST_, 2,                   1, 0, "s1", "s1",                        "notify_%s_lost",       _("^BG%s^BG lost the ^TC^TT^BG flag"), "") \
-     MULTITEAM_INFO(1, INFO_CTF_PICKUP_, 2,                 1, 0, "s1", "s1",                        "notify_%s_taken",      _("^BG%s^BG got the ^TC^TT^BG flag"), "") \
-     MULTITEAM_INFO(1, INFO_CTF_RETURN_, 2,                 1, 0, "s1", "s1",                        "notify_%s_returned",   _("^BG%s^BG returned the ^TC^TT^BG flag"), "") \
-     MULTITEAM_INFO(1, INFO_CTF_RETURN_MONSTER_, 2,         1, 0, "s1", "s1",                        "notify_%s_returned",   _("^BG%s^BG returned the ^TC^TT^BG flag"), "") \
 +    MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_BUFF,              3, 3, "spree_inf s1 s2 f3buffname s3loc spree_end", "s2 s1",  "notify_death", _("^BG%s%s^K1 was killed by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s"), _("^BG%s%s^K1 was scored against by ^BG%s^K1's ^BG%s^K1 buff ^K1%s%s")) \
      MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_CHEAT,             3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_death",         _("^BG%s%s^K1 was unfairly eliminated by ^BG%s^K1%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_DROWN,             3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_water",         _("^BG%s%s^K1 was drowned by ^BG%s^K1%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_FALL,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_fall",          _("^BG%s%s^K1 was grounded by ^BG%s^K1%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_FIRE,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_death",         _("^BG%s%s^K1 was burnt up into a crisp by ^BG%s^K1%s%s"), _("^BG%s%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s%s")) \
      MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_LAVA,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_lava",          _("^BG%s%s^K1 was cooked by ^BG%s^K1%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_MONSTER,           3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_death",         _("^BG%s%s^K1 was pushed infront of a monster by ^BG%s^K1%s%s"), "") \
-     MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_nade",          _("^BG%s%s^K1 was blown up by ^BG%s^K1's Nade%s%s"), "") \
-     MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_NAPALM,       3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_nade_napalm",   _("^BG%s%s^K1 was burned to death by ^BG%s^K1's Napalm Nade%s%s"), _("^BG%s%s^K1 got too close to a napalm explosion%s%s")) \
-     MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_ICE,          3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_nade_ice",      _("^BG%s%s^K1 was blown up by ^BG%s^K1's Ice Nade%s%s"), "") \
-     MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_ICE_FREEZE,   3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_nade_ice",      _("^BG%s%s^K1 was frozen to death by ^BG%s^K1's Ice Nade%s%s"), "") \
-     MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_HEAL,         3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_nade_heal",     _("^BG%s%s^K1 has not been healed by ^BG%s^K1's Healing Nade%s%s"), "") \
+     MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "nade_normal",          _("^BG%s%s^K1 was blown up by ^BG%s^K1's Nade%s%s"), "") \
+     MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_NAPALM,       3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "nade_napalm",          _("^BG%s%s^K1 was burned to death by ^BG%s^K1's Napalm Nade%s%s"), _("^BG%s%s^K1 got too close to a napalm explosion%s%s")) \
+     MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_ICE,          3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "nade_ice",             _("^BG%s%s^K1 was blown up by ^BG%s^K1's Ice Nade%s%s"), "") \
+     MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_ICE_FREEZE,   3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "nade_ice",             _("^BG%s%s^K1 was frozen to death by ^BG%s^K1's Ice Nade%s%s"), "") \
+     MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_HEAL,         3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "nade_heal",            _("^BG%s%s^K1 has not been healed by ^BG%s^K1's Healing Nade%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SHOOTING_STAR,     3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_shootingstar",  _("^BG%s%s^K1 was shot into space by ^BG%s^K1%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SLIME,             3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_slime",         _("^BG%s%s^K1 was slimed by ^BG%s^K1%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SWAMP,             3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_slime",         _("^BG%s%s^K1 was preserved by ^BG%s^K1%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_WAKI_DEATH,     3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_death",         _("^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Racer exploded%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_WAKI_GUN,       3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_death",         _("^BG%s%s^K1 was bolted down by ^BG%s^K1's Racer%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_WAKI_ROCKET,    3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_death",         _("^BG%s%s^K1 couldn't find shelter from ^BG%s^K1's Racer%s%s"), "") \
 -    MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VENGEANCE,         3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_death",         _("^BG%s%s^K1 was destroyed by the vengeful ^BG%s^K1%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VOID,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_void",          _("^BG%s%s^K1 was thrown into a world of hurt by ^BG%s^K1%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_AUTOTEAMCHANGE,      2, 1, "s1 s2loc death_team", "",         "",                     _("^BG%s^K1 was moved into the %s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_BETRAYAL,            2, 1, "s1 s2loc spree_lost", "s1",       "notify_teamkill_red",  _("^BG%s^K1 became enemies with the Lord of Teamplay%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_WYVERN,          2, 1, "s1 s2loc spree_lost", "s1",       "notify_death",         _("^BG%s^K1 was fireballed by a Wyvern%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ZOMBIE_JUMP,     2, 1, "s1 s2loc spree_lost", "s1",       "notify_death",         _("^BG%s^K1 joins the Zombies%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ZOMBIE_MELEE,    2, 1, "s1 s2loc spree_lost", "s1",       "notify_death",         _("^BG%s^K1 was given kung fu lessons by a Zombie%s%s"), "") \
-     MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE,                2, 1, "s1 s2loc spree_lost", "s1",       "notify_nade",          _("^BG%s^K1 mastered the art of self-nading%s%s"), "") \
-     MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_NAPALM,         2, 1, "s1 s2loc spree_lost", "s1",       "notify_nade_napalm",   _("^BG%s^K1 was burned to death by their own Napalm Nade%s%s"), _("^BG%s^K1 decided to take a look at the results of their napalm explosion%s%s")) \
-     MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_ICE,            2, 1, "s1 s2loc spree_lost", "s1",       "notify_nade_ice",      _("^BG%s^K1 mastered the art of self-nading%s%s"), "") \
-     MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_ICE_FREEZE,     2, 1, "s1 s2loc spree_lost", "s1",       "notify_nade_ice",      _("^BG%s^K1 was frozen to death by their own Ice Nade%s%s"), _("^BG%s^K1 felt a little chilly%s%s")) \
-     MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_HEAL,           2, 1, "s1 s2loc spree_lost", "s1",       "notify_nade_heal",     _("^BG%s^K1's Healing Nade didn't quite heal them%s%s"), "") \
+     MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE,                2, 1, "s1 s2loc spree_lost", "s1",       "nade_normal",          _("^BG%s^K1 mastered the art of self-nading%s%s"), "") \
+     MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_NAPALM,         2, 1, "s1 s2loc spree_lost", "s1",       "nade_napalm",          _("^BG%s^K1 was burned to death by their own Napalm Nade%s%s"), _("^BG%s^K1 decided to take a look at the results of their napalm explosion%s%s")) \
+     MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_ICE,            2, 1, "s1 s2loc spree_lost", "s1",       "nade_ice",             _("^BG%s^K1 mastered the art of self-nading%s%s"), "") \
+     MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_ICE_FREEZE,     2, 1, "s1 s2loc spree_lost", "s1",       "nade_ice",             _("^BG%s^K1 was frozen to death by their own Ice Nade%s%s"), _("^BG%s^K1 felt a little chilly%s%s")) \
+     MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_HEAL,           2, 1, "s1 s2loc spree_lost", "s1",       "nade_heal",            _("^BG%s^K1's Healing Nade didn't quite heal them%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NOAMMO,              2, 1, "s1 s2loc spree_lost", "s1",       "notify_outofammo",     _("^BG%s^K1 died%s%s. What's the point of living without ammo?"), _("^BG%s^K1 ran out of ammo%s%s")) \
      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_ROT,                 2, 1, "s1 s2loc spree_lost", "s1",       "notify_death",         _("^BG%s^K1 rotted away%s%s"), "") \
      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SHOOTING_STAR,       2, 1, "s1 s2loc spree_lost", "s1",       "notify_shootingstar",  _("^BG%s^K1 became a shooting star%s%s"), "") \
      MSG_CENTER_NOTIF(1, CENTER_CAMPCHECK,                   0, 0, "",             CPID_CAMPCHECK,      "0 0", _("^F2Don't camp!"), "") \
      MSG_CENTER_NOTIF(1, CENTER_COINTOSS,                    1, 0, "s1",           NO_CPID,             "0 0", _("^F2Throwing coin... Result: %s^F2!"), "") \
      MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_FREE,      0, 0, "",             CPID_CTF_CAPSHIELD,  "0 0", _("^BGYou are now free.\n^BGFeel free to ^F2try to capture^BG the flag again\n^BGif you think you will succeed."), "") \
-     MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_SHIELDED,  0, 0, "",             CPID_CTF_CAPSHIELD,  "0 0", _("^BGYou are now ^F1shielded^BG from the flag\n^BGfor ^F2too many unsuccessful attempts^BG to capture.\n^BGMake some defensive scores before trying again."), "") \
-     MULTITEAM_CENTER(1, CENTER_CTF_CAPTURE_, 2,             0, 0, "",             CPID_CTF_LOWPRIO,    "0 0", _("^BGYou captured the ^TC^TT^BG flag!"), "") \
+     MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_INACTIVE,  0, 0, "",             CPID_CTF_CAPSHIELD,  "0 0", _("^BGThis flag is currently inactive"), "") \
+     MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_SHIELDED,  0, 0, "",             CPID_CTF_CAPSHIELD,  "0 0", _("^BGYou are now ^F1shielded^BG from the flag(s)\n^BGfor ^F2too many unsuccessful attempts^BG to capture.\n^BGMake some defensive scores before trying again."), "") \
+     MULTITEAM_CENTER(1, CENTER_CTF_CAPTURE_, 4,             0, 0, "",             CPID_CTF_LOWPRIO,    "0 0", _("^BGYou captured the ^TC^TT^BG flag!"), "") \
+     MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURE_NEUTRAL,         0, 0, "",             CPID_CTF_LOWPRIO,    "0 0", _("^BGYou captured the flag!"), "") \
      MSG_CENTER_NOTIF(1, CENTER_CTF_FLAG_THROW_PUNISH,       0, 1, "f1secs",       CPID_CTF_LOWPRIO,    "0 0", _("^BGToo many flag throws! Throwing disabled for %s."), "") \
-     MULTITEAM_CENTER(1, CENTER_CTF_PASS_OTHER_, 2,          2, 0, "s1 s2",        CPID_CTF_PASS,       "0 0", _("^BG%s^BG passed the ^TC^TT^BG flag to %s"), "") \
-     MULTITEAM_CENTER(1, CENTER_CTF_PASS_RECEIVED_, 2,       1, 0, "s1",           CPID_CTF_PASS,       "0 0", _("^BGYou received the ^TC^TT^BG flag from %s"), "") \
+     MULTITEAM_CENTER(1, CENTER_CTF_PASS_OTHER_, 4,          2, 0, "s1 s2",        CPID_CTF_PASS,       "0 0", _("^BG%s^BG passed the ^TC^TT^BG flag to %s"), "") \
+     MSG_CENTER_NOTIF(1, CENTER_CTF_PASS_OTHER_NEUTRAL,      2, 0, "s1 s2",        CPID_CTF_PASS,       "0 0", _("^BG%s^BG passed the flag to %s"), "") \
+     MULTITEAM_CENTER(1, CENTER_CTF_PASS_RECEIVED_, 4,       1, 0, "s1",           CPID_CTF_PASS,       "0 0", _("^BGYou received the ^TC^TT^BG flag from %s"), "") \
+     MSG_CENTER_NOTIF(1, CENTER_CTF_PASS_RECEIVED_NEUTRAL,   1, 0, "s1",           CPID_CTF_PASS,       "0 0", _("^BGYou received the flag from %s"), "") \
      MSG_CENTER_NOTIF(1, CENTER_CTF_PASS_REQUESTED,          1, 0, "s1 pass_key",  CPID_CTF_PASS,       "0 0", _("^BG%s^BG requests you to pass the flag%s"), "") \
      MSG_CENTER_NOTIF(1, CENTER_CTF_PASS_REQUESTING,         1, 0, "s1",           CPID_CTF_PASS,       "0 0", _("^BGRequesting %s^BG to pass you the flag"), "") \
-     MULTITEAM_CENTER(1, CENTER_CTF_PASS_SENT_, 2,           1, 0, "s1",           CPID_CTF_PASS,       "0 0", _("^BGYou passed the ^TC^TT^BG flag to %s"), "") \
-     MULTITEAM_CENTER(1, CENTER_CTF_PICKUP_, 2,              0, 0, "",             CPID_CTF_LOWPRIO,    "0 0", _("^BGYou got the ^TC^TT^BG flag!"), "") \
+     MULTITEAM_CENTER(1, CENTER_CTF_PASS_SENT_, 4,           1, 0, "s1",           CPID_CTF_PASS,       "0 0", _("^BGYou passed the ^TC^TT^BG flag to %s"), "") \
+     MSG_CENTER_NOTIF(1, CENTER_CTF_PASS_SENT_NEUTRAL,       1, 0, "s1",           CPID_CTF_PASS,       "0 0", _("^BGYou passed the flag to %s"), "") \
+     MULTITEAM_CENTER(1, CENTER_CTF_PICKUP_, 4,              0, 0, "",             CPID_CTF_LOWPRIO,    "0 0", _("^BGYou got the ^TC^TT^BG flag!"), "") \
+     MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_NEUTRAL,          0, 0, "",             CPID_CTF_LOWPRIO,    "0 0", _("^BGYou got the flag!"), "") \
+     MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_TEAM,             1, 0, "s1",           CPID_CTF_LOWPRIO,    "0 0", _("^BGYou got your %steam^BG's flag, return it!"), "") \
+     MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_TEAM_ENEMY,       1, 0, "s1",           CPID_CTF_LOWPRIO,    "0 0", _("^BGYou got the %senemy^BG's flag, return it!"), "") \
      MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_ENEMY,            1, 0, "s1",           CPID_CTF_LOWPRIO,    "0 0", _("^BGThe %senemy^BG got your flag! Retrieve it!"), "") \
      MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_ENEMY_VERBOSE,    2, 0, "s1 s2 s1",     CPID_CTF_LOWPRIO,    "0 0", _("^BGThe %senemy (^BG%s%s)^BG got your flag! Retrieve it!"), "") \
-     MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_TEAM,             1, 0, "s1",           CPID_CTF_LOWPRIO,    "0 0", _("^BGYour %steam mate^BG got the flag! Protect them!"), "") \
-     MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_TEAM_VERBOSE,     2, 0, "s1 s2 s1",     CPID_CTF_LOWPRIO,    "0 0", _("^BGYour %steam mate (^BG%s%s)^BG got the flag! Protect them!"), "") \
-     MULTITEAM_CENTER(1, CENTER_CTF_RETURN_, 2,              0, 0, "",             CPID_CTF_LOWPRIO,    "0 0", _("^BGYou returned the ^TC^TT^BG flag!"), "") \
+     MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_ENEMY_NEUTRAL,    1, 0, "s1",           CPID_CTF_LOWPRIO,    "0 0", _("^BGThe %senemy^BG got the flag! Retrieve it!"), "") \
+     MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_ENEMY_NEUTRAL_VERBOSE, 2, 0, "s1 s2 s1",CPID_CTF_LOWPRIO,    "0 0", _("^BGThe %senemy (^BG%s%s)^BG got the flag! Retrieve it!"), "") \
+     MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_ENEMY_TEAM,        1, 0, "s1",          CPID_CTF_LOWPRIO,    "0 0", _("^BGThe %senemy^BG got their flag! Retrieve it!"), "") \
+     MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_ENEMY_TEAM_VERBOSE,2, 0, "s1 s2 s1",    CPID_CTF_LOWPRIO,    "0 0", _("^BGThe %senemy (^BG%s%s)^BG got their flag! Retrieve it!"), "") \
+     MULTITEAM_CENTER(1, CENTER_CTF_PICKUP_TEAM_, 4,         1, 0, "s1",           CPID_CTF_LOWPRIO,    "0 0", _("^BGYour %steam mate^BG got the ^TC^TT^BG flag! Protect them!"), "") \
+     MULTITEAM_CENTER(1, CENTER_CTF_PICKUP_TEAM_VERBOSE_,    4, 2, 0, "s1 s2 s1",  CPID_CTF_LOWPRIO,    "0 0", _("^BGYour %steam mate (^BG%s%s)^BG got the ^TC^TT^BG flag! Protect them!"), "") \
+     MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_TEAM_NEUTRAL,         1, 0, "s1",       CPID_CTF_LOWPRIO,    "0 0", _("^BGYour %steam mate^BG got the flag! Protect them!"), "") \
+     MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_TEAM_VERBOSE_NEUTRAL, 2, 0, "s1 s2 s1", CPID_CTF_LOWPRIO,    "0 0", _("^BGYour %steam mate (^BG%s%s)^BG got the flag! Protect them!"), "") \
+     MULTITEAM_CENTER(1, CENTER_CTF_RETURN_, 4,              0, 0, "",             CPID_CTF_LOWPRIO,    "0 0", _("^BGYou returned the ^TC^TT^BG flag!"), "") \
      MSG_CENTER_NOTIF(1, CENTER_CTF_STALEMATE_CARRIER,       0, 0, "",             CPID_STALEMATE,      "0 0", _("^BGStalemate! Enemies can now see you on radar!"), "") \
      MSG_CENTER_NOTIF(1, CENTER_CTF_STALEMATE_OTHER,         0, 0, "",             CPID_STALEMATE,      "0 0", _("^BGStalemate! Flag carriers can now be seen by enemies on radar!"), "") \
      MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAG,                 1, 1, "spree_cen s1",             NO_CPID, "0 0", _("^K3%sYou fragged ^BG%s"), _("^K3%sYou scored against ^BG%s")) \
      MULTITEAM_MULTI##teams(default,prefix,anncepre,infopre,centerpre)
  
  #define MSG_MULTI_NOTIFICATIONS \
 +    MSG_MULTI_NOTIF(1, DEATH_MURDER_BUFF,                    NO_MSG,        INFO_DEATH_MURDER_BUFF,                    NO_MSG) \
      MSG_MULTI_NOTIF(1, DEATH_MURDER_CHEAT,                   NO_MSG,        INFO_DEATH_MURDER_CHEAT,                   NO_MSG) \
      MSG_MULTI_NOTIF(1, DEATH_MURDER_DROWN,                   NO_MSG,        INFO_DEATH_MURDER_DROWN,                   NO_MSG) \
      MSG_MULTI_NOTIF(1, DEATH_MURDER_FALL,                    NO_MSG,        INFO_DEATH_MURDER_FALL,                    NO_MSG) \
      MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_WAKI_DEATH,           NO_MSG,        INFO_DEATH_MURDER_VH_WAKI_DEATH,           NO_MSG) \
      MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_WAKI_GUN,             NO_MSG,        INFO_DEATH_MURDER_VH_WAKI_GUN,             NO_MSG) \
      MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_WAKI_ROCKET,          NO_MSG,        INFO_DEATH_MURDER_VH_WAKI_ROCKET,          NO_MSG) \
 -    MSG_MULTI_NOTIF(1, DEATH_MURDER_VENGEANCE,               NO_MSG,        INFO_DEATH_MURDER_VENGEANCE,               NO_MSG) \
      MSG_MULTI_NOTIF(1, DEATH_MURDER_VOID,                    NO_MSG,        INFO_DEATH_MURDER_VOID,                    NO_MSG) \
      MSG_MULTI_NOTIF(1, DEATH_SELF_AUTOTEAMCHANGE,            NO_MSG,        INFO_DEATH_SELF_AUTOTEAMCHANGE,            CENTER_DEATH_SELF_AUTOTEAMCHANGE) \
      MSG_MULTI_NOTIF(1, DEATH_SELF_BETRAYAL,                  NO_MSG,        INFO_DEATH_SELF_BETRAYAL,                  CENTER_DEATH_SELF_BETRAYAL) \
      MULTITEAM_CHOICE##teams(default,challow,prefix,chtype,optiona,optionb)
  
  #define MSG_CHOICE_NOTIFICATIONS \
-     MULTITEAM_CHOICE(1, 2, CHOICE_CTF_CAPTURE_BROKEN_, 2,    MSG_INFO,    INFO_CTF_CAPTURE_,                INFO_CTF_CAPTURE_BROKEN_) \
-     MULTITEAM_CHOICE(1, 2, CHOICE_CTF_CAPTURE_TIME_, 2,      MSG_INFO,    INFO_CTF_CAPTURE_,                INFO_CTF_CAPTURE_TIME_) \
-     MULTITEAM_CHOICE(1, 2, CHOICE_CTF_CAPTURE_UNBROKEN_, 2,  MSG_INFO,    INFO_CTF_CAPTURE_,                INFO_CTF_CAPTURE_UNBROKEN_) \
-     MSG_CHOICE_NOTIF(1, 2, CHOICE_CTF_PICKUP_TEAM,           MSG_CENTER,  CENTER_CTF_PICKUP_TEAM,           CENTER_CTF_PICKUP_TEAM_VERBOSE) \
+     MULTITEAM_CHOICE(1, 2, CHOICE_CTF_CAPTURE_BROKEN_, 4,    MSG_INFO,    INFO_CTF_CAPTURE_,                INFO_CTF_CAPTURE_BROKEN_) \
+     MULTITEAM_CHOICE(1, 2, CHOICE_CTF_CAPTURE_TIME_, 4,      MSG_INFO,    INFO_CTF_CAPTURE_,                INFO_CTF_CAPTURE_TIME_) \
+     MULTITEAM_CHOICE(1, 2, CHOICE_CTF_CAPTURE_UNBROKEN_, 4,  MSG_INFO,    INFO_CTF_CAPTURE_,                INFO_CTF_CAPTURE_UNBROKEN_) \
+     MULTITEAM_CHOICE(1, 2, CHOICE_CTF_PICKUP_TEAM_, 4,       MSG_CENTER,  CENTER_CTF_PICKUP_TEAM_,          CENTER_CTF_PICKUP_TEAM_VERBOSE_) \
+     MSG_CHOICE_NOTIF(1, 2, CHOICE_CTF_PICKUP_TEAM_NEUTRAL,   MSG_CENTER,  CENTER_CTF_PICKUP_TEAM_NEUTRAL,   CENTER_CTF_PICKUP_TEAM_VERBOSE_NEUTRAL) \
      MSG_CHOICE_NOTIF(1, 2, CHOICE_CTF_PICKUP_ENEMY,          MSG_CENTER,  CENTER_CTF_PICKUP_ENEMY,          CENTER_CTF_PICKUP_ENEMY_VERBOSE) \
+     MSG_CHOICE_NOTIF(1, 2, CHOICE_CTF_PICKUP_ENEMY_NEUTRAL,  MSG_CENTER,  CENTER_CTF_PICKUP_ENEMY_NEUTRAL,  CENTER_CTF_PICKUP_ENEMY_NEUTRAL_VERBOSE) \
+     MSG_CHOICE_NOTIF(1, 2, CHOICE_CTF_PICKUP_ENEMY_TEAM,     MSG_CENTER,  CENTER_CTF_PICKUP_ENEMY_TEAM,     CENTER_CTF_PICKUP_ENEMY_TEAM_VERBOSE) \
      MSG_CHOICE_NOTIF(1, 1, CHOICE_FRAG,                      MSG_CENTER,  CENTER_DEATH_MURDER_FRAG,         CENTER_DEATH_MURDER_FRAG_VERBOSE) \
      MSG_CHOICE_NOTIF(1, 1, CHOICE_FRAGGED,                   MSG_CENTER,  CENTER_DEATH_MURDER_FRAGGED,      CENTER_DEATH_MURDER_FRAGGED_VERBOSE) \
      MSG_CHOICE_NOTIF(1, 1, CHOICE_TYPEFRAG,                  MSG_CENTER,  CENTER_DEATH_MURDER_TYPEFRAG,     CENTER_DEATH_MURDER_TYPEFRAG_VERBOSE) \
@@@ -1070,7 -1096,6 +1096,7 @@@ const float ARG_DC = 6; // unique resul
      ARG_CASE(ARG_CS_SV,     "spree_lost",    (autocvar_notification_show_sprees ? notif_arg_spree_inf(-2, "", "", f1) : "")) \
      ARG_CASE(ARG_CS_SV,     "item_wepname",  WEP_NAME(f1)) \
      ARG_CASE(ARG_CS_SV,     "item_buffname", sprintf("%s%s", rgb_to_hexcolor(Buff_Color(f1)), Buff_PrettyName(f1))) \
 +    ARG_CASE(ARG_CS_SV,     "f3buffname",    sprintf("%s%s", rgb_to_hexcolor(Buff_Color(f3)), Buff_PrettyName(f3))) \
      ARG_CASE(ARG_CS_SV,     "item_wepammo",  (s1 != "" ? sprintf(_(" with %s"), s1) : "")) \
      ARG_CASE(ARG_DC,        "item_centime",  ftos(autocvar_notification_item_centerprinttime)) \
      ARG_CASE(ARG_SV,        "death_team",    Team_ColoredFullName(f1)) \
@@@ -1322,9 -1347,9 +1348,9 @@@ float NOTIF_CHOICE_COUNT
  // notification limits -- INCREASE AS NECESSARY
  const float NOTIF_ANNCE_MAX   = 100;
  const float NOTIF_INFO_MAX    = 300;
- const float NOTIF_CENTER_MAX  = 200;
+ const float NOTIF_CENTER_MAX  = 250;
  const float NOTIF_MULTI_MAX   = 200;
- const float NOTIF_CHOICE_MAX  = 20;
+ const float NOTIF_CHOICE_MAX  = 30;
  
  // notification entities
  entity msg_annce_notifs[NOTIF_ANNCE_MAX];
diff --combined qcsrc/common/stats.qh
index e6e93a6608fbd9a89108c3557011f5be2cba8168,fdb9da2a9266482d7dc394fa62ed3dfabdc8f946..8778a77f0baeed420a7da73489ad541d924d4bc2
@@@ -109,12 -109,12 +109,11 @@@ const int STAT_OK_AMMO_CHARGE         
  const int STAT_OK_AMMO_CHARGEPOOL     = 86;
  const int STAT_FROZEN                 = 87;
  const int STAT_REVIVE_PROGRESS        = 88;
- const int STAT_BUFF_TIME              = 89;
- // 90 empty?
- // 91 empty?
- // 92 empty?
 -const int STAT_WEAPONSINMAP           = 89;
 -const int STAT_WEAPONSINMAP2          = 90;
 -const int STAT_WEAPONSINMAP3          = 91;
 -const int STAT_CTF_FLAGSTATUS         = 92;
--// 93 empty?
--// 94 empty?
++const int STAT_BUFF_TIME              = 90;
++const int STAT_WEAPONSINMAP           = 91;
++const int STAT_WEAPONSINMAP2          = 92;
++const int STAT_WEAPONSINMAP3          = 93;
++const int STAT_CTF_FLAGSTATUS         = 94;
  // 95 empty?
  // 96 empty?
  // 97 empty?
index fdb014710b16d6f513f2c09d57a39c899dfca735,d4f4786a938e0c56eedb22f7a04c0475291cfc4a..3b469b8153b82577f703f4f71e2c5e6b35bd6724
@@@ -238,6 -238,7 +238,7 @@@ float autocvar_g_ctf_throw_velocity_for
  float autocvar_g_ctf_throw_velocity_up;
  float autocvar_g_ctf_drop_velocity_up;
  float autocvar_g_ctf_drop_velocity_side;
+ bool autocvar_g_ctf_oneflag_reverse;
  bool autocvar_g_ctf_portalteleport;
  bool autocvar_g_ctf_pass;
  float autocvar_g_ctf_pass_arc;
@@@ -251,19 -252,18 +252,18 @@@ float autocvar_g_ctf_pass_turnrate
  float autocvar_g_ctf_pass_timelimit;
  float autocvar_g_ctf_pass_velocity;
  bool autocvar_g_ctf_dynamiclights;
- string autocvar_g_ctf_flag_blue_model;
- int autocvar_g_ctf_flag_blue_skin;
  float autocvar_g_ctf_flag_collect_delay;
  float autocvar_g_ctf_flag_damageforcescale;
int autocvar_g_ctf_flag_dropped_waypoint;
float autocvar_g_ctf_flag_dropped_floatinwater;
bool autocvar_g_ctf_flag_dropped_waypoint;
bool autocvar_g_ctf_flag_dropped_floatinwater;
  bool autocvar_g_ctf_flag_glowtrails;
float autocvar_g_ctf_flag_health;
string autocvar_g_ctf_flag_red_model;
int autocvar_g_ctf_flag_red_skin;
int autocvar_g_ctf_flag_health;
bool autocvar_g_ctf_flag_return;
float autocvar_g_ctf_flag_return_carried_radius;
  float autocvar_g_ctf_flag_return_time;
  bool autocvar_g_ctf_flag_return_when_unreachable;
  float autocvar_g_ctf_flag_return_damage;
+ float autocvar_g_ctf_flag_return_damage_delay;
  float autocvar_g_ctf_flag_return_dropped;
  float autocvar_g_ctf_flagcarrier_auto_helpme_damage;
  float autocvar_g_ctf_flagcarrier_auto_helpme_time;
@@@ -278,7 -278,6 +278,6 @@@ int autocvar_g_ctf_score_capture
  int autocvar_g_ctf_score_capture_assist;
  int autocvar_g_ctf_score_kill;
  int autocvar_g_ctf_score_penalty_drop;
- //int autocvar_g_ctf_score_penalty_suicidedrop;
  int autocvar_g_ctf_score_penalty_returned;
  int autocvar_g_ctf_score_pickup_base;
  int autocvar_g_ctf_score_pickup_dropped_early;
@@@ -839,7 -838,6 +838,7 @@@ bool autocvar_g_spawn_near_teammate_ign
  bool autocvar_g_physics_clientselect;
  string autocvar_g_physics_clientselect_options;
  string autocvar_g_physics_clientselect_default;
 +bool  autocvar_g_buffs_effects;
  float autocvar_g_buffs_waypoint_distance;
  bool autocvar_g_buffs_randomize;
  float autocvar_g_buffs_random_lifetime;
@@@ -858,25 -856,16 +857,25 @@@ float autocvar_g_buffs_medic_regen
  float autocvar_g_buffs_vengeance_damage_multiplier;
  float autocvar_g_buffs_bash_force;
  float autocvar_g_buffs_bash_force_self;
 -float autocvar_g_buffs_disability_time;
 +float autocvar_g_buffs_disability_slowtime;
  float autocvar_g_buffs_disability_speed;
  float autocvar_g_buffs_disability_rate;
 +float autocvar_g_buffs_disability_weaponspeed;
  float autocvar_g_buffs_speed_speed;
  float autocvar_g_buffs_speed_rate;
 +float autocvar_g_buffs_speed_weaponspeed;
  float autocvar_g_buffs_speed_damage_take;
  float autocvar_g_buffs_speed_regen;
  float autocvar_g_buffs_vampire_damage_steal;
  float autocvar_g_buffs_invisible_alpha;
  float autocvar_g_buffs_flight_gravity;
  float autocvar_g_buffs_jump_height;
 +float autocvar_g_buffs_inferno_burntime_factor;
 +float autocvar_g_buffs_inferno_burntime_min_time;
 +float autocvar_g_buffs_inferno_burntime_target_damage;
 +float autocvar_g_buffs_inferno_burntime_target_time;
 +float autocvar_g_buffs_inferno_damagemultiplier;
 +float autocvar_g_buffs_swapper_range;
 +float autocvar_g_buffs_magnet_range_item;
  float autocvar_sv_player_scale;
  #endif