]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into Mario/rifle_arena
authorMario <mario.mario@y7mail.com>
Sun, 26 May 2013 10:47:29 +0000 (20:47 +1000)
committerMario <mario.mario@y7mail.com>
Sun, 26 May 2013 10:47:29 +0000 (20:47 +1000)
1  2 
defaultXonotic.cfg
effectinfo.txt
qcsrc/common/constants.qh
qcsrc/common/deathtypes.qh
qcsrc/common/notifications.qh
qcsrc/server/autocvars.qh
qcsrc/server/miscfunctions.qc
qcsrc/server/mutators/mutator_riflearena.qc
qcsrc/server/mutators/mutators.qh
qcsrc/server/progs.src

diff --combined defaultXonotic.cfg
index 4b942b16e2b8a0799ae210a7cc9dcfd559f39d10,9af7a1f86bbe0934ff38718ae4c1323dbbe62758..533e2546cc538ec103f85150de150f41458f7101
@@@ -74,6 -74,11 +74,11 @@@ seta cl_unpress_zoom_on_death 1 "automa
  seta cl_unpress_zoom_on_weapon_switch 1 "automatically unpress zoom when you switch a weapon"
  seta cl_unpress_attack_on_weapon_switch 1 "automatically unpress fire and fire1 attack buttons when you switch a weapon"
  
+ seta cl_spawn_event_particles 1 "pointparticles effect whenever a player spawns"
+ seta cl_spawn_event_sound 1 "sound effect whenever a player spawns"
+ //seta cl_spawn_point_model 0 "place a model at all spawn points" // still needs a model
+ seta cl_spawn_point_particles 1 "pointparticles effect at all spawn points"
  freelook 1
  sensitivity 6
  v_gamma 1
@@@ -374,7 -379,7 +379,7 @@@ set g_powerups -1 "if set to 0 the stre
  set g_use_ammunition 1 "if set to 0 all weapons have unlimited ammunition"
  set g_pickup_items -1 "if set to 0 all items (health, armor, ammo, weapons...) are removed from the map, if 1 they are forced to spawn"
  set g_minstagib 0     "enable minstagib"
- set g_minstagib_extralives 2  "how many extra lives you will get per powerup"
+ set g_minstagib_extralives 1  "how many extra lives you will get per powerup"
  set g_minstagib_ammo_start 10 "starting ammo"
  set g_minstagib_ammo_drop 5   "how much ammo you'll get for weapons or cells"
  set g_minstagib_invis_alpha 0.15
@@@ -385,7 -390,6 +390,6 @@@ set g_weaponarena_random "0"       "if set t
  set g_weaponarena_random_with_laser "1"       "additionally, always provide the laser in random weapon arena games"
  set g_midair 0 "if set to 1 you can only apply damage to your opponent while he is airborne"
  set g_midair_shieldtime 0.3 "number of seconds you are still invincible since you lost contact to the ground"
- set g_spawnsound 1 "set to 0 if you don't want to hear the spawn sound when a player spawns"
  set g_spawnpoints_auto_move_out_of_solid 0 "if set to 1 you will see a warning if a spawn point was placed inside a solid"
  set g_forced_respawn 0 "if set to 1 and a player died, that player gets automatically respawned once <g_respawn_delay> seconds are over"
  set g_fullbrightplayers 0 "brightens up player models (note that the color, skin or model of the players does not change!)"
@@@ -464,7 -468,8 +468,8 @@@ set sv_dodging_height_threshold 10 "th
  set sv_dodging_wall_distance_threshold 10 "the maximum distance from a wall that still allows dodging"
  set sv_dodging_sound 1 "if 1 dodging makes a sound. if 0 dodging is silent"
  
- set g_spawn_furthest 0.5 "this amount of the spawns shall be far away from any players"
+ set g_spawn_alloweffects 1 "allow clients to enable spawn point and event effects such as particles and sounds, see cl_spawn_ cvars for more info"
+ set g_spawn_furthest 1 "this amount of the spawns shall be far away from any players"
  set g_spawn_useallspawns 0 "use all spawns, e.g. also team spawns in non-teamplay, and all spawns, even enemy spawns, in teamplay"
  set g_spawn_near_teammate 0 "if set, players prefer spawns near a team mate"
  set g_spawn_near_teammate_distance 640 "max distance to consider a spawn to be near a team mate"
@@@ -959,7 -964,7 +964,7 @@@ seta scoreboard_border_thickness 1 "sco
  seta scoreboard_accuracy_border_thickness 1 "accuracy stats border thickness"
  seta scoreboard_accuracy_doublerows 0 "use two rows instead of one"
  seta scoreboard_accuracy_nocolors 0 "don't use colors displaying accuracy stats"
- seta scoreboard_accuracy 1 "show weapon accuracy stats panel on scoreboard; colors can be configured with accuracy_color* cvars"
+ seta scoreboard_accuracy 0 "show weapon accuracy stats panel on scoreboard; colors can be configured with accuracy_color* cvars"
  seta scoreboard_color_bg_r 0 "red color component of the scoreboard background"
  seta scoreboard_color_bg_g 0.4 "green color component of the scoreboard background"
  seta scoreboard_color_bg_b 0.6 "blue color component of the scoreboard background"
@@@ -1102,10 -1107,8 +1107,8 @@@ set sv_intermission_cdtrack "
  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
- // when sv_maxidle is not 0, assume spectators are idle too
- set sv_maxidle_spectatorsareidle 0
+ set sv_maxidle 0 "kick players idle for more than this amount of time in seconds"
+ set sv_maxidle_spectatorsareidle 0 "when sv_maxidle is not 0, assume spectators are idle too"
  
  // these entities are not referenced by anything directly, they just represent
  // teams and are found by find() when needed
@@@ -1597,16 -1600,3 +1600,16 @@@ set cl_weapon_stay_color "2 0.5 0.5" "C
  set cl_weapon_stay_alpha 0.75 "Alpha of picked up weapons when g_weapon_stay > 0"
  
  seta g_superspectate 0 "server side, allows extended spectator functions through the cmd interface. followpowerup, followstrength, followstshield or followfc [red|blue] will transfer spectation to the relevent player, if any"
 +
 +set g_riflearena 0
 +set g_riflearena_nades 1
 +set g_riflearena_nade_lifetime 3.5
 +set g_riflearena_nade_damage 225
 +set g_riflearena_nade_edgedamage 90
 +set g_riflearena_nade_radius 300
 +set g_riflearena_nade_force 650
 +set g_riflearena_nade_health 25
 +set g_riflearena_nade_newton_style 0
 +set g_riflearena_nade_minforce 400
 +set g_riflearena_nade_maxforce 2000
 +set g_riflearena_nade_refire 6
diff --combined effectinfo.txt
index 475be8b986cc295d077784e26279bb50c9e2472a,c2f702fa5ab243ac7d032a8583bb07e0c8d82570..52b67739a0ae03a68e7e276757fd38f033fe8651
@@@ -7778,395 -7778,202 +7778,594 @@@ alpha 190 190 18
  sizeincrease -80
  color 0x0000FF 0x000097
  
 +// nades
 +effect nade_blue
 +trailspacing 1
 +type smoke
 +color 0x006cff 0x0600ff
 +tex 65 65
 +size 3 3
 +sizeincrease -1
 +alpha 100 100 250
 +//gravity -0.11
 +// fire
 +effect nade_blue
 +notunderwater
 +trailspacing 8
 +type smoke
 +color 0x0600ff 0x9794ff
 +tex 65 65
 +size 15 25
 +sizeincrease -10
 +alpha 30 30 150
 +// bubbles
 +effect nade_blue
 +underwater
 +trailspacing 16
 +type bubble
 +tex 62 62
 +color 0x006cff 0x0600ff
 +size 1 1
 +alpha 256 256 256
 +gravity -0.125
 +bounce 1.5
 +liquidfriction 4
 +velocityjitter 16 16 16
 +
 +effect nade_red
 +trailspacing 1
 +type smoke
 +color 0xff0000 0xff3c00
 +tex 65 65
 +size 3 3
 +sizeincrease -1
 +alpha 100 100 250
 +//gravity -0.11
 +// fire
 +effect nade_red
 +notunderwater
 +trailspacing 8
 +type smoke
 +color 0xff0000 0xffa2a2
 +tex 65 65
 +size 15 25
 +sizeincrease -10
 +alpha 30 30 150
 +// bubbles
 +effect nade_red
 +underwater
 +trailspacing 16
 +type bubble
 +tex 62 62
 +color 0xff0000 0xff3c00
 +size 1 1
 +alpha 256 256 256
 +gravity -0.125
 +bounce 1.5
 +liquidfriction 4
 +velocityjitter 16 16 16
 +
 +effect nade_red_burn
 +trailspacing 1
 +type smoke
 +color 0xff0000 0xff3c00
 +tex 65 65
 +size 5 5
 +sizeincrease -1
 +alpha 100 100 250
 +//gravity -0.11
 +// fire
 +effect nade_red_burn
 +notunderwater
 +trailspacing 64
 +type smoke
 +color 0xff0000 0xffa2a2
 +tex 65 65
 +size 45 25
 +sizeincrease -30
 +alpha 200 200 1000
 +// bubbles
 +effect nade_red_burn
 +underwater
 +trailspacing 16
 +type bubble
 +tex 62 62
 +color 0xff0000 0xff3c00
 +size 1 1
 +alpha 256 256 256
 +gravity -0.125
 +bounce 1.5
 +liquidfriction 4
 +velocityjitter 16 16 16
 +effect nade_red_burn
 +trailspacing 16
 +type smoke
 +color 0xff0000 0xff3c00
 +tex 71 73
 +size 15 25
 +sizeincrease -40
 +rotate -180 180 20 -20
 +originjitter 2 2 2
 +velocityjitter 10 10 10
 +alpha 300 900 1500
 +
 +effect nade_blue_burn
 +trailspacing 1
 +type smoke
 +color 0x006cff 0x0600ff
 +tex 65 65
 +size 5 5
 +sizeincrease -1
 +alpha 100 100 250
 +//gravity -0.11
 +// fire
 +effect nade_blue_burn
 +notunderwater
 +trailspacing 64
 +type smoke
 +color 0x0600ff 0x9794ff
 +tex 65 65
 +size 45 25
 +sizeincrease -30
 +alpha 200 200 1000
 +// bubbles
 +effect nade_blue_burn
 +underwater
 +trailspacing 16
 +type bubble
 +tex 62 62
 +color 0x006cff 0x0600ff
 +size 1 1
 +alpha 256 256 256
 +gravity -0.125
 +bounce 1.5
 +liquidfriction 4
 +velocityjitter 16 16 16
 +effect nade_blue_burn
 +trailspacing 16
 +type smoke
 +color 0x006cff 0x0600ff
 +tex 33 33
 +size 25 25
 +sizeincrease -30
 +
 +effect nade_blue_explode
 +countabsolute 1
 +type decal
 +tex 8 16
 +size 88 88
 +alpha 256 256 0
 +originjitter 26 26 26
 +lightradius 300
 +lightradiusfade 1500
 +lightcolor 20 20 100
 +// shockwave
 +effect nade_blue_explode
 +type smoke
 +countabsolute 1
 +tex 33 33
 +size 32 32
 +sizeincrease 1800
 +color 0x80C0FF 0x80C0FF
 +alpha 80 80 650
 +velocitymultiplier 44
 +// fire
 +effect nade_blue_explode
 +notunderwater
 +count 16
 +type smoke
 +color 0x629dff 0x0018ff
 +tex 48 55
 +size 20 24
 +sizeincrease 555
 +alpha 400 656 2000
 +airfriction 30
 +originjitter 50 50 50
 +velocityjitter 320 320 320
 +rotate -180 180 -9 9
 +// fire streched
 +effect nade_blue_explode
 +count 8
 +type spark
 +tex 48 55
 +color 0x629dff 0x0018ff
 +size 60 90
 +alpha 1500 3000 13000
 +stretchfactor 80
 +sizeincrease 40
 +velocityjitter 30 30 30
 +airfriction -9
 +//smoke
 +effect nade_blue_explode
 +type smoke
 +count 32
 +blend alpha
 +tex 0 7
 +size 60 30
 +color 0x222222 0x000000
 +alpha 128 328 390
 +rotate -180 180 2 -2
 +velocityjitter 200 200 200
 +velocityoffset 0 0 180
 +originjitter 50 50 10
 +sizeincrease 50
 +airfriction 0.04
 +gravity 0.4
 +// underwater bubbles
 +effect nade_blue_explode
 +underwater
 +count 32
 +type bubble
 +tex 62 62
 +color 0x404040 0x808080
 +size 3 6
 +alpha 128 256 64
 +gravity -0.125
 +bounce 1.5
 +liquidfriction 0.25
 +originjitter 16 16 16
 +velocityjitter 196 196 196
 +rotate 0 0 0 0
 +// bouncing sparks
 +effect nade_blue_explode
 +notunderwater
 +count 8
 +type spark
 +tex 40 40
 +color 0x006cff 0x0600ff
 +size 1 2
 +alpha 644 956 484
 +gravity 1
 +airfriction 1
 +bounce 1.6
 +liquidfriction 0.8
 +velocityoffset 0 0 80
 +originjitter 16 16 16
 +velocityjitter 424 424 624
 +// notbouncing sparks
 +effect nade_blue_explode
 +count 16
 +type spark
 +tex 40 40
 +color 0x006cff 0x0600ff
 +size 1 2
 +alpha 644 956 684
 +gravity 0.5
 +airfriction 0.7
 +liquidfriction 0.8
 +velocityoffset 0 0 80
 +originjitter 16 16 16
 +velocityjitter 424 424 624
 +// derbis
 +effect nade_blue_explode
 +notunderwater
 +count 12
 +type alphastatic
 +tex 66 68
 +color 0x6a3d25 0xcac5b4
 +size 2 6
 +alpha 644 956 684
 +gravity 1.3
 +airfriction 0.5
 +bounce 1.6
 +velocityjitter 324 324 524
 +rotate -180 180 -1000 1000
 +
 +effect nade_red_explode
 +countabsolute 1
 +type decal
 +tex 8 16
 +size 88 88
 +alpha 256 256 0
 +originjitter 26 26 26
 +lightradius 300
 +lightradiusfade 1500
 +lightcolor 100 20 20
 +// shockwave
 +effect nade_red_explode
 +type smoke
 +countabsolute 1
 +tex 33 33
 +size 32 32
 +sizeincrease 2200
 +color 0xff0000 0xffa2a2
 +alpha 80 80 650
 +velocitymultiplier 44
 +// fire
 +effect nade_red_explode
 +notunderwater
 +count 16
 +type smoke
 +color 0xff0000 0xff4200
 +tex 48 55
 +size 20 24
 +sizeincrease 555
 +alpha 400 656 2000
 +airfriction 30
 +originjitter 50 50 50
 +velocityjitter 320 320 320
 +rotate -180 180 -9 9
 +// fire streched
 +effect nade_red_explode
 +count 8
 +type spark
 +tex 48 55
 +color 0xff0000 0xff4200
 +size 60 90
 +alpha 1500 3000 13000
 +stretchfactor 80
 +sizeincrease 40
 +velocityjitter 30 30 30
 +airfriction -9
 +//smoke
 +effect nade_red_explode
 +type smoke
 +count 32
 +blend alpha
 +tex 0 7
 +size 60 30
 +color 0x222222 0x000000
 +alpha 128 328 390
 +rotate -180 180 2 -2
 +velocityjitter 200 200 200
 +velocityoffset 0 0 180
 +originjitter 50 50 10
 +sizeincrease 50
 +airfriction 0.04
 +gravity 0.4
 +// underwater bubbles
 +effect nade_red_explode
 +underwater
 +count 32
 +type bubble
 +tex 62 62
 +color 0x404040 0x808080
 +size 3 6
 +alpha 128 256 64
 +gravity -0.125
 +bounce 1.5
 +liquidfriction 0.25
 +originjitter 16 16 16
 +velocityjitter 196 196 196
 +rotate 0 0 0 0
 +// bouncing sparks
 +effect nade_red_explode
 +notunderwater
 +count 8
 +type spark
 +tex 40 40
 +color 0xff0000 0xffa2a2
 +size 1 2
 +alpha 644 956 484
 +gravity 1
 +airfriction 1
 +bounce 1.6
 +liquidfriction 0.8
 +velocityoffset 0 0 80
 +originjitter 16 16 16
 +velocityjitter 424 424 624
 +// notbouncing sparks
 +effect nade_red_explode
 +count 16
 +type spark
 +tex 40 40
 +color 0xff0000 0xffa2a2
 +size 1 2
 +alpha 644 956 684
 +gravity 0.5
 +airfriction 0.7
 +liquidfriction 0.8
 +velocityoffset 0 0 80
 +originjitter 16 16 16
 +velocityjitter 424 424 624
 +// derbis
 +effect nade_red_explode
 +notunderwater
 +count 8
 +type smoke
 +tex 71 73
 +color 0xff0000 0xffa2a2
 +size 20 40
 +alpha 644 956 2500
 +originjitter 64 64 64
 +velocityjitter 324 324 324
 +rotate -180 180 -100 100
+ // spawn_point_red -- red team idle spawn point effect
+ effect spawn_point_red
+ count 37.5
+ type static
+ color 0xFF0F0F 0xFF0F0F
+ size 1.0 2.0
+ alpha 64 128 128
+ gravity -0.1
+ airfriction 0.2
+ liquidfriction 0.8
+ originjitter 16 16 64
+ velocityjitter 32 32 0
+ //lightradius 200
+ //lighttime 0
+ //lightcolor 0.4 0.9 0.9
+ // spawn_point_blue -- blue team idle spawn point effect
+ effect spawn_point_blue
+ count 37.5
+ type static
+ color 0x0F0FFF 0x0F0FFF
+ size 1.0 2.0
+ alpha 64 128 128
+ gravity -0.1
+ airfriction 0.2
+ liquidfriction 0.8
+ originjitter 16 16 64
+ velocityjitter 32 32 0
+ //lightradius 200
+ //lighttime 0
+ //lightcolor 0.4 0.9 0.9
+ // spawn_point_yellow -- yellow team idle spawn point effect
+ effect spawn_point_yellow
+ count 37.5
+ type static
+ color 0xFFFF0F 0xFFFF0F
+ size 1.0 2.0
+ alpha 64 128 128
+ gravity -0.1
+ airfriction 0.2
+ liquidfriction 0.8
+ originjitter 16 16 64
+ velocityjitter 32 32 0
+ //lightradius 200
+ //lighttime 0
+ //lightcolor 0.4 0.9 0.9
+ // spawn_point_pink -- pink team idle spawn point effect
+ effect spawn_point_pink
+ count 37.5
+ type static
+ color 0xFF0FFF 0xFF0FFF
+ size 1.0 2.0
+ alpha 64 128 128
+ gravity -0.1
+ airfriction 0.2
+ liquidfriction 0.8
+ originjitter 16 16 64
+ velocityjitter 32 32 0
+ //lightradius 200
+ //lighttime 0
+ //lightcolor 0.4 0.9 0.9
+ // spawn_point_neutral -- neutral idle spawn point effect
+ effect spawn_point_neutral
+ count 37.5
+ type static
+ color 0xFFFFFF 0xFFFFFF
+ size 1.0 2.0
+ alpha 64 128 128
+ gravity -0.1
+ airfriction 0.2
+ liquidfriction 0.8
+ originjitter 16 16 64
+ velocityjitter 32 32 0
+ //lightradius 200
+ //lighttime 0
+ //lightcolor 0.4 0.9 0.9
+ // spawn_event_red -- red team spawning effect
+ effect spawn_event_red
+ count 100
+ type spark
+ tex 64 64
+ color 0xFF0F0F 0xFF0F0F
+ size 1 1
+ alpha 0 256 256
+ stretchfactor 0.6
+ //gravity 1
+ bounce 1
+ originjitter 1 1 1
+ velocityjitter 500 500 500
+ velocitymultiplier 0.1
+ airfriction 2
+ effect spawn_event_red
+ countabsolute 1
+ type smoke
+ tex 65 65
+ size 100 100
+ alpha 190 190 180
+ sizeincrease -80
+ color 0xFF0F0F 0xFF0F0F
+ // spawn_event_blue -- blue team spawning effect
+ effect spawn_event_blue
+ count 100
+ type spark
+ tex 64 64
+ color 0x0F0FFF 0x0F0FFF
+ size 1 1
+ alpha 0 256 256
+ stretchfactor 0.6
+ //gravity 1
+ bounce 1
+ originjitter 1 1 1
+ velocityjitter 500 500 500
+ velocitymultiplier 0.1
+ airfriction 2
+ effect spawn_event_blue
+ countabsolute 1
+ type smoke
+ tex 65 65
+ size 100 100
+ alpha 190 190 180
+ sizeincrease -80
+ color 0x0F0FFF 0x0F0FFF
+ // spawn_event_yellow -- yellow team spawning effect
+ effect spawn_event_yellow
+ count 100
+ type spark
+ tex 64 64
+ color 0xFFFF0F 0xFFFF0F
+ size 1 1
+ alpha 0 256 256
+ stretchfactor 0.6
+ //gravity 1
+ bounce 1
+ originjitter 1 1 1
+ velocityjitter 500 500 500
+ velocitymultiplier 0.1
+ airfriction 2
+ effect spawn_event_yellow
+ countabsolute 1
+ type smoke
+ tex 65 65
+ size 100 100
+ alpha 190 190 180
+ sizeincrease -80
+ color 0xFFFF0F 0xFFFF0F
+ // spawn_event_pink -- pink team spawning effect
+ effect spawn_event_pink
+ count 100
+ type spark
+ tex 64 64
+ color 0xFF0FFF 0xFF0FFF
+ size 1 1
+ alpha 0 256 256
+ stretchfactor 0.6
+ //gravity 1
+ bounce 1
+ originjitter 1 1 1
+ velocityjitter 500 500 500
+ velocitymultiplier 0.1
+ airfriction 2
+ effect spawn_event_pink
+ countabsolute 1
+ type smoke
+ tex 65 65
+ size 100 100
+ alpha 190 190 180
+ sizeincrease -80
+ color 0xFF0FFF 0xFF0FFF
+ // spawn_event_neutral -- neutral spawning effect
+ effect spawn_event_neutral
+ count 100
+ type spark
+ tex 64 64
+ color 0xFFFFFF 0xFFFFFF
+ size 1 1
+ alpha 0 256 256
+ stretchfactor 0.6
+ //gravity 1
+ bounce 1
+ originjitter 1 1 1
+ velocityjitter 500 500 500
+ velocitymultiplier 0.1
+ airfriction 2
+ effect spawn_event_neutral
+ countabsolute 1
+ type smoke
+ tex 65 65
+ size 100 100
+ alpha 190 190 180
+ sizeincrease -80
+ color 0xFFFFFF 0xFFFFFF
index 13d204a06a120f013201d290d7e6a868c0b34f88,b399f3857c3454e3c16572d0aed19a7aea627801..411bfa6489e55b69b998fb259cfd34d412113408
@@@ -30,19 -30,18 +30,18 @@@ const float AS_FLOAT               = 8
  
  const float TE_CSQC_PICTURE = 100;
  const float TE_CSQC_RACE = 101;
- const float TE_CSQC_SPAWN = 102;
- const float TE_CSQC_ZCURVEPARTICLES = 103;
- const float TE_CSQC_NEXGUNBEAMPARTICLE = 104;
- const float TE_CSQC_LIGHTNINGARC = 105;
- const float TE_CSQC_TEAMNAGGER = 106;
- const float TE_CSQC_PINGPLREPORT = 107;
- const float TE_CSQC_TARGET_MUSIC = 108;
- const float TE_CSQC_WEAPONCOMPLAIN = 109;
- const float TE_CSQC_NEX_SCOPE = 110;
- const float TE_CSQC_MINELAYER_MAXMINES = 111;
- const float TE_CSQC_HAGAR_MAXROCKETS = 112;
- const float TE_CSQC_VEHICLESETUP = 113;
- const float TE_CSQC_SVNOTICE = 114;
+ const float TE_CSQC_ZCURVEPARTICLES = 102;
+ const float TE_CSQC_NEXGUNBEAMPARTICLE = 103;
+ const float TE_CSQC_LIGHTNINGARC = 104;
+ const float TE_CSQC_TEAMNAGGER = 105;
+ const float TE_CSQC_PINGPLREPORT = 106;
+ const float TE_CSQC_TARGET_MUSIC = 107;
+ const float TE_CSQC_WEAPONCOMPLAIN = 108;
+ const float TE_CSQC_NEX_SCOPE = 109;
+ const float TE_CSQC_MINELAYER_MAXMINES = 110;
+ const float TE_CSQC_HAGAR_MAXROCKETS = 111;
+ const float TE_CSQC_VEHICLESETUP = 112;
+ const float TE_CSQC_SVNOTICE = 113;
  
  const float RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder
  const float RACE_NET_CHECKPOINT_CLEAR = 1;
@@@ -95,7 -94,9 +94,9 @@@ const float ENT_CLIENT_WARPZONE_TELEPOR
  const float ENT_CLIENT_MODEL = 33;
  const float ENT_CLIENT_ITEM = 34;
  const float ENT_CLIENT_BUMBLE_RAYGUN = 35;
- const float ENT_CLIENT_NOTIFICATION = 36;
+ const float ENT_CLIENT_SPAWNPOINT = 36;
+ const float ENT_CLIENT_SPAWNEVENT = 37;
+ const float ENT_CLIENT_NOTIFICATION = 38;
  
  const float ENT_CLIENT_TURRET = 40;
  const float ENT_CLIENT_AUXILIARYXHAIR = 50;
@@@ -177,6 -178,7 +178,7 @@@ const float STAT_SECRETS_TOTAL = 70
  const float STAT_SECRETS_FOUND = 71;
  
  const float STAT_RESPAWN_TIME = 72;
+ const float STAT_ROUNDSTARTTIME = 73;
  
  // mod stats (1xx)
  const float STAT_REDALIVE = 100;
@@@ -353,11 -355,6 +355,11 @@@ float PROJECTILE_WAKICANNON     = 29
  float PROJECTILE_BUMBLE_GUN     = 30;
  float PROJECTILE_BUMBLE_BEAM    = 31;
  
 +float PROJECTILE_NADE_RED       = 50;
 +float PROJECTILE_NADE_RED_BURN  = 51;
 +float PROJECTILE_NADE_BLUE      = 52;
 +float PROJECTILE_NADE_BLUE_BURN = 53;
 +
  float SPECIES_HUMAN        =  0;
  float SPECIES_ROBOT_SOLID  =  1;
  float SPECIES_ALIEN        =  2;
@@@ -396,43 -393,6 +398,6 @@@ float WR_SWITCHABLE       = 12; // (CSQC) imp
  float WR_PLAYERDEATH    = 13; // (SVQC) does not need to do anything
  float WR_GONETHINK    = 14; // (SVQC) logic to run every frame, also if no longer having the weapon as long as the switch away has not been performed
  
- float HUD_PANEL_WEAPONS               = 0;
- float HUD_PANEL_AMMO          = 1;
- float HUD_PANEL_POWERUPS      = 2;
- float HUD_PANEL_HEALTHARMOR   = 3;
- float HUD_PANEL_NOTIFY                = 4;
- float HUD_PANEL_TIMER         = 5;
- float HUD_PANEL_RADAR         = 6;
- float HUD_PANEL_SCORE         = 7;
- float HUD_PANEL_RACETIMER     = 8;
- float HUD_PANEL_VOTE          = 9;
- float HUD_PANEL_MODICONS      = 10;
- float HUD_PANEL_PRESSEDKEYS   = 11;
- float HUD_PANEL_CHAT          = 12;
- float HUD_PANEL_ENGINEINFO    = 13;
- float HUD_PANEL_INFOMESSAGES  = 14;
- float HUD_PANEL_PHYSICS       = 15;
- float HUD_PANEL_CENTERPRINT   = 16;
- float HUD_PANEL_NUM           = 17; // always last panel id + 1, please increment when adding a new panel
- string HUD_PANELNAME_WEAPONS          = "weapons";
- string HUD_PANELNAME_AMMO             = "ammo";
- string HUD_PANELNAME_POWERUPS         = "powerups";
- string HUD_PANELNAME_HEALTHARMOR      = "healtharmor";
- string HUD_PANELNAME_NOTIFY           = "notify";
- string HUD_PANELNAME_TIMER            = "timer";
- string HUD_PANELNAME_RADAR            = "radar";
- string HUD_PANELNAME_SCORE            = "score";
- string HUD_PANELNAME_RACETIMER                = "racetimer";
- string HUD_PANELNAME_VOTE             = "vote";
- string HUD_PANELNAME_MODICONS         = "modicons";
- string HUD_PANELNAME_PRESSEDKEYS      = "pressedkeys";
- string HUD_PANELNAME_CHAT             = "chat";
- string HUD_PANELNAME_ENGINEINFO               = "engineinfo";
- string HUD_PANELNAME_INFOMESSAGES     = "infomessages";
- string HUD_PANELNAME_PHYSICS  = "physics";
- string HUD_PANELNAME_CENTERPRINT      = "centerprint";
  #define SERVERFLAG_ALLOW_FULLBRIGHT 1
  #define SERVERFLAG_TEAMPLAY 2
  #define SERVERFLAG_PLAYERSTATS 4
index f5fe4287c7a480be5faf018a8993003e9eb01b8f,f9a9ceba25b1e0df2da7e77db433f5982e644b99..ee3f8bdd12d178cf6494c0cf0db613712f86f07f
@@@ -15,7 -15,6 +15,7 @@@
        DEATHTYPE(DEATH_KILL,                   DEATH_SELF_SUICIDE,                 NO_MSG,                        NORMAL_POS) \
        DEATHTYPE(DEATH_LAVA,                   DEATH_SELF_LAVA,                    DEATH_MURDER_LAVA,             NORMAL_POS) \
        DEATHTYPE(DEATH_MIRRORDAMAGE,           DEATH_SELF_BETRAYAL,                NO_MSG,                        NORMAL_POS) \
 +      DEATHTYPE(DEATH_NADE_NORMAL,                    DEATH_SELF_NADE_NORMAL,                         DEATH_MURDER_NADE_NORMAL,          NORMAL_POS) \
        DEATHTYPE(DEATH_NOAMMO,                 DEATH_SELF_NOAMMO,                  NO_MSG,                        NORMAL_POS) \
        DEATHTYPE(DEATH_ROT,                    DEATH_SELF_ROT,                     NO_MSG,                        NORMAL_POS) \
        DEATHTYPE(DEATH_SHOOTING_STAR,          DEATH_SELF_SHOOTING_STAR,           DEATH_MURDER_SHOOTING_STAR,    NORMAL_POS) \
@@@ -70,7 -69,7 +70,7 @@@ entity deathtypes[DT_MAX]
                CHECK_MAX_COUNT(name, DT_MAX, DT_COUNT, "deathtypes") \
                \
                entity deathent = spawn(); \
-               deathtypes[(name - DT_FIRST) - 1] = deathent; \
+               deathtypes[(name - DT_FIRST)] = deathent; \
                deathent.classname = "deathtype"; \
                deathent.nent_name = #name; \
                #if (msg_death != NO_MSG) \
@@@ -97,7 -96,7 +97,7 @@@ string Deathtype_Name(float deathtype
  {
        if(DEATH_ISSPECIAL(deathtype))
        {
-               entity deathent = deathtypes[(deathtype - DT_FIRST) - 1];
+               entity deathent = deathtypes[(deathtype - DT_FIRST)];
                if not(deathent) { backtrace("Deathtype_Name: Could not find deathtype entity!\n"); return ""; }
                return deathent.nent_name;
        }
index a1c0dbfd8c3f3d2d0f8b528b784062c6436ccb57,42f1b9b162fb2bc665ad6775ecbdbe767158573a..6b4c339740f8b5e9b4da8f5de15ffcaeaf996dd0
@@@ -263,7 -263,6 +263,7 @@@ void Send_Notification_WOVA
        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\n"), "") \
        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\n"), _("^BG%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s%s\n")) \
        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\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_NORMAL,       3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_death",         _("^BG%s%s^K1 was blown up by ^BG%s^K1's nade%s%s\n"), "") \
        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\n"), "") \
        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\n"), "") \
        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\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_FIRE,                2, 1, "s1 s2loc spree_lost", "s1",       "notify_death",         _("^BG%s^K1 became a bit too crispy%s%s\n"), _("^BG%s^K1 felt a little hot%s%s\n")) \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_GENERIC,             2, 1, "s1 s2loc spree_lost", "s1",       "notify_selfkill",      _("^BG%s^K1 died%s%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_LAVA,                2, 1, "s1 s2loc spree_lost", "s1",       "notify_lava",          _("^BG%s^K1 turned into hot slag%s%s\n"), _("^BG%s^K1 found a hot place%s%s\n")) \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_NORMAL,             2, 1, "s1 s2loc spree_lost", "",                     "",                                             _("^BG%s^K1 ate their own nade%s%s\n"), "") \
        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?\n"), _("^BG%s^K1 ran out of ammo%s%s\n")) \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_ROT,                 2, 1, "s1 s2loc spree_lost", "s1",       "notify_death",         _("^BG%s^K1 rotted away%s%s\n"), "") \
        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\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VOID,                2, 1, "s1 s2loc spree_lost", "s1",       "notify_void",          _("^BG%s^K1 was in the wrong place%s%s\n"), "") \
        MULTITEAM_INFO(1, INFO_DEATH_TEAMKILL_, 4,             3, 1, "s1 s2 s3loc spree_end", "s2 s1",  "notify_teamkill_%s",   _("^BG%s^K1 was betrayed by ^BG%s^K1%s%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_FREEZETAG_FREEZE,               2, 0, "s1 s2", "",                       "",                     _("^BG%s^K1 was frozen by ^BG%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_FREEZETAG_REVIVE,               2, 0, "s1 s2", "",                       "",                     _("^BG%s^K3 was revived by ^BG%s\n"), "") \
-       MULTITEAM_INFO(1, INFO_FREEZETAG_ROUND_WIN_, 4,        0, 0, "", "",                            "",                     _("^TC^TT^BG team wins the round, all other teams were frozen\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_FREEZETAG_REVIVED,              2, 0, "s1 s2", "",                       "",                     _("^BG%s^K3 was revived by ^BG%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_FREEZETAG_AUTO_REVIVED,         1, 1, "s1 f1", "",                       "",                     _("^BG%s^K3 was automatically revived after %s second(s)\n"), "") \
+       MULTITEAM_INFO(1, INFO_ROUND_TEAM_WIN_, 4,             0, 0, "", "",                            "",                     _("^TC^TT^BG team wins the round\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_ROUND_PLAYER_WIN,               1, 0, "s1", "",                          "",                     _("^BG%s^BG wins the round\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_ROUND_TIED,                     0, 0, "", "",                            "",                     _("^BGRound tied\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_ROUND_OVER,                     0, 0, "", "",                            "",                     _("^BGRound over, there's no winner\n"), "") \
        MSG_INFO_NOTIF(1, INFO_FREEZETAG_SELF,                 1, 0, "s1", "",                          "",                     _("^BG%s^K1 froze themself\n"), "") \
        MSG_INFO_NOTIF(1, INFO_GODMODE_OFF,                    0, 1, "f1", "",                          "",                     _("^BGGodmode saved you %s units of damage, cheater!\n"), "") \
        MSG_INFO_NOTIF(0, INFO_ITEM_WEAPON_DONTHAVE,           0, 1, "item_wepname", "",                      "",               _("^BGYou do not have the ^F1%s\n"), "") \
                MSG_CENTER_NOTIF(default, prefix##PINK, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_4, strtoupper(STATIC_NAME_TEAM_4)), TCR(gentle, COL_TEAM_4, strtoupper(STATIC_NAME_TEAM_4))) \
        #endif
  #define MSG_CENTER_NOTIFICATIONS \
-       MSG_CENTER_NOTIF(1, CENTER_ARENA_BEGIN,                 0, 0, "",             CPID_ARENA,          "2 0", _("^F4Begin!"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_ARENA_NEEDPLAYER,            0, 0, "",             CPID_ARENA,          "2 0", _("^BGNeed at least 1 player in each team to play Clan Arena!"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_ARENA_ROUNDSTART,            0, 1, "",             CPID_ARENA,          "1 f1", _("^F4Round will start in ^COUNT"), "") \
        MSG_CENTER_NOTIF(1, CENTER_ASSAULT_ATTACKING,           0, 0, "",             CPID_ASSAULT_ROLE,   "0 0", _("^BGYou are attacking!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_ASSAULT_DEFENDING,           0, 0, "",             CPID_ASSAULT_ROLE,   "0 0", _("^BGYou are defending!"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_COUNTDOWN_BEGIN,             0, 0, "",             CPID_GAMESTART,      "2 0", _("^F4Begin!"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_COUNTDOWN_GAMESTART,         0, 1, "",             CPID_GAMESTART,      "1 f1", _("^F4Game starts in ^COUNT"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_COUNTDOWN_BEGIN,             0, 0, "",             CPID_ROUND,          "2 0", _("^F4Begin!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_COUNTDOWN_GAMESTART,         0, 1, "",             CPID_ROUND,          "1 f1", _("^F4Game starts in ^COUNT"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_COUNTDOWN_ROUNDSTART,        0, 1, "",             CPID_ROUND,          "1 f1", _("^F4Round starts in ^COUNT"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_COUNTDOWN_ROUNDSTOP,         0, 0, "",             CPID_ROUND,          "2 0", _("^F4Round cannot start"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_ROUND_TIED,                  0, 0, "",             CPID_ROUND,          "0 0", _("^BGRound tied"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_ROUND_OVER,                  0, 0, "",             CPID_ROUND,          "0 0", _("^BGRound over, there's no winner"), "") \
        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_DEATH_SELF_FIRE,             0, 0, "",             NO_CPID,             "0 0", _("^K1You got a little bit too crispy!"), _("^K1You felt a little too hot!")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_GENERIC,          0, 0, "",             NO_CPID,             "0 0", _("^K1You killed your own dumb self!"), _("^K1You need to be more careful!")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_LAVA,             0, 0, "",             NO_CPID,             "0 0", _("^K1You couldn't stand the heat!"), "") \
 +      MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_NADE,                             0, 0, "",                         NO_CPID,                         "0 0", _("^K1You ate your own grenade!"), _("^K1Tastes like chicken!")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_NOAMMO,           0, 0, "",             NO_CPID,             "0 0", _("^K1You were killed for running out of ammo..."), _("^K1You are respawning for running out of ammo...")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_ROT,              0, 0, "",             NO_CPID,             "0 0", _("^K1You grew too old without taking your medicine"), _("^K1You need to preserve your health")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_SHOOTING_STAR,    0, 0, "",             NO_CPID,             "0 0", _("^K1You became a shooting star!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_TEAMKILL_FRAG,         1, 0, "s1",           NO_CPID,             "0 0", _("^K1Moron! You fragged ^BG%s^K1, a team mate!"), _("^K1Moron! You went against ^BG%s^K1, a team mate!")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_TEAMKILL_FRAGGED,      1, 0, "s1",           NO_CPID,             "0 0", _("^K1You were fragged by ^BG%s^K1, a team mate"), _("^K1You were scored against by ^BG%s^K1, a team mate")) \
        MSG_CENTER_NOTIF(1, CENTER_DISCONNECT_IDLING,           0, 1, "",             CPID_IDLING,         "1 f1", _("^K1Stop idling!\n^BGDisconnecting in ^COUNT..."), "") \
+       MSG_CENTER_NOTIF(1, CENTER_EXTRALIVES,                          0, 0, "",             NO_CPID,             "0 0", _("^F2You picked up some extra lives"), "") \
        MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_FREEZE,            1, 0, "s1",           NO_CPID,             "0 0", _("^K3You froze ^BG%s"), "") \
        MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_FROZEN,            1, 0, "s1",           NO_CPID,             "0 0", _("^K1You were frozen by ^BG%s"), "") \
        MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVE,            1, 0, "s1",           NO_CPID,             "0 0", _("^K3You revived ^BG%s"), "") \
        MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVED,           1, 0, "s1",           NO_CPID,             "0 0", _("^K3You were revived by ^BG%s"), "") \
-       MULTITEAM_CENTER(1, CENTER_FREEZETAG_ROUND_WIN_, 4,     0, 0, "",             NO_CPID,             "0 0", _("^TC^TT^BG team wins the round, all other teams were frozen"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_AUTO_REVIVED,      0, 1, "f1",           NO_CPID,             "0 0", _("^K3You were automatically revived after %s second(s)"), "") \
+       MULTITEAM_CENTER(1, CENTER_ROUND_TEAM_WIN_, 4,          0, 0, "",             CPID_ROUND,          "0 0", _("^TC^TT^BG team wins the round"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_ROUND_PLAYER_WIN,            1, 0, "s1",           CPID_ROUND,          "0 0", _("^BG%s^BG wins the round"), "") \
        MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_SELF,              0, 0, "",             NO_CPID,             "0 0", _("^K1You froze yourself"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_SPAWN_LATE,        0, 0, "",             NO_CPID,             "0 0", _("^K1You spawned after the round started, you'll spawn as frozen"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_SPAWN_LATE,        0, 0, "",             NO_CPID,             "0 0", _("^K1Round already started, you spawn as frozen"), "") \
        MSG_CENTER_NOTIF(1, CENTER_ITEM_WEAPON_DONTHAVE,        0, 1, "item_wepname",                      CPID_ITEM, "item_centime 0", _("^BGYou do not have the ^F1%s"), "") \
        MSG_CENTER_NOTIF(1, CENTER_ITEM_WEAPON_DROP,            1, 1, "item_wepname item_wepammo",         CPID_ITEM, "item_centime 0", _("^BGYou dropped the ^F1%s^BG%s"), "") \
        MSG_CENTER_NOTIF(1, CENTER_ITEM_WEAPON_GOT,             0, 1, "item_wepname",                      CPID_ITEM, "item_centime 0", _("^BGYou got the ^F1%s"), "") \
        MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_HELP,                0, 0, "",              CPID_KEYHUNT,          "0 0", _("^BGAll keys are in your team's hands!\nHelp the key carriers to meet!"), "") \
        MULTITEAM_CENTER(1, CENTER_KEYHUNT_INTERFERE_, 4,       0, 0, "",              CPID_KEYHUNT,          "0 0", _("^BGAll keys are in ^TC^TT team^BG's hands!\nInterfere ^F4NOW^BG!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_MEET,                0, 0, "",              CPID_KEYHUNT,          "0 0", _("^BGAll keys are in your team's hands!\nMeet the other key carriers ^F4NOW^BG!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_ROUNDSTART,          0, 1, "",              CPID_KEYHUNT_OTHER,    "1 f1", _("^F4Round will start in ^COUNT"), "") \
        MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_SCAN,                0, 1, "",              CPID_KEYHUNT_OTHER,    "f1 0", _("^BGScanning frequency range..."), "") \
        MULTITEAM_CENTER(1, CENTER_KEYHUNT_START_, 4,           0, 0, "",              CPID_KEYHUNT,          "0 0", _("^BGYou are starting with the ^TC^TT Key"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_WAIT,                0, 4, "kh_teams",      CPID_KEYHUNT_OTHER,    "0 0", _("^BGWaiting for players to join...\nNeed active players for: %s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_WAIT,                0, 4, "missing_teams", CPID_KEYHUNT_OTHER,    "0 0", _("^BGWaiting for players to join...\nNeed active players for: %s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_MISSING_TEAMS,               0, 4, "missing_teams", CPID_MISSING_TEAMS,    "-1 0", _("^BGWaiting for players to join...\nNeed active players for: %s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_MISSING_PLAYERS,             0, 1, "f1",            CPID_MISSING_PLAYERS,  "-1 0", _("^BGWaiting for %s player(s) to join..."), "") \
        MSG_CENTER_NOTIF(1, CENTER_LMS_CAMPCHECK,               0, 0, "",              CPID_LMS_CAMP,         "0 0", _("^F2Don't camp!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_MINSTA_FINDAMMO,             0, 0, "",              CPID_MINSTA_FINDAMMO,  "1 9", _("^F4^COUNT^BG left to find some ammo!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_MINSTA_FINDAMMO_FIRST,       0, 0, "",              CPID_MINSTA_FINDAMMO,  "1 10", _("^BGGet some ammo or you'll be dead in ^F4^COUNT^BG!"), _("^BGGet some ammo! ^F4^COUNT^BG left!")) \
+       MSG_CENTER_NOTIF(1, CENTER_MINSTA_LIVES_REMAINING,      0, 1, "f1",            NO_CPID,                           "0 0", _("^F2Extra lives remaining: ^K1%s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_MINSTA_SECONDARY,            0, 0, "",              NO_CPID,                           "0 0", _("^BGSecondary fire inflicts no damage!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_MOTD,                        1, 0, "s1",            CPID_MOTD,             "-1 0", _("^BG%s"), "") \
        MSG_CENTER_NOTIF(1, CENTER_NIX_COUNTDOWN,               0, 2, "item_wepname",  CPID_NIX,              "1 f2", _("^F2^COUNT^BG until weapon change...\nNext weapon: ^F1%s"), "") \
        MSG_CENTER_NOTIF(1, CENTER_NIX_NEWWEAPON,               0, 1, "item_wepname",  CPID_NIX,              "0 0", _("^F2Active weapon: ^F1%s"), "") \
 +      MSG_CENTER_NOTIF(1, CENTER_NADE,                                0, 0, "",              NO_CPID,                   "0 0", _("^BGPress ^F2DROPWEAPON^BG again to toss the grenade!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_OVERTIME_FRAG,               0, 0, "",              CPID_OVERTIME,         "0 0", _("^F2Now playing ^F4OVERTIME^F2!\nKeep fragging until we have a winner!"), _("^F2Now playing ^F4OVERTIME^F2!\nKeep scoring until we have a winner!")) \
        MSG_CENTER_NOTIF(1, CENTER_OVERTIME_TIME,               0, 1, "f1time",        CPID_OVERTIME,         "0 0", _("^F2Now playing ^F4OVERTIME^F2!\n^BGAdded ^F4%s^BG to the game!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_INVISIBILITY,      0, 0, "",              CPID_POWERUP,          "0 0", _("^F2Invisibility has worn off"), "") \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_FALL,                    NO_MSG,        INFO_DEATH_MURDER_FALL,                    NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_FIRE,                    NO_MSG,        INFO_DEATH_MURDER_FIRE,                    NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_LAVA,                    NO_MSG,        INFO_DEATH_MURDER_LAVA,                    NO_MSG) \
 +      MSG_MULTI_NOTIF(1, DEATH_MURDER_NADE_NORMAL,                     NO_MSG,                INFO_DEATH_MURDER_NADE_NORMAL,                     NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_SHOOTING_STAR,           NO_MSG,        INFO_DEATH_MURDER_SHOOTING_STAR,           NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_SLIME,                   NO_MSG,        INFO_DEATH_MURDER_SLIME,                   NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_SWAMP,                   NO_MSG,        INFO_DEATH_MURDER_SWAMP,                   NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_FIRE,                      NO_MSG,        INFO_DEATH_SELF_FIRE,                      CENTER_DEATH_SELF_FIRE) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_GENERIC,                   NO_MSG,        INFO_DEATH_SELF_GENERIC,                   CENTER_DEATH_SELF_GENERIC) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_LAVA,                      NO_MSG,        INFO_DEATH_SELF_LAVA,                      CENTER_DEATH_SELF_LAVA) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_NADE_NORMAL,                               NO_MSG,                INFO_DEATH_SELF_NADE_NORMAL,                       CENTER_DEATH_SELF_NADE) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_NOAMMO,                    NO_MSG,        INFO_DEATH_SELF_NOAMMO,                    CENTER_DEATH_SELF_NOAMMO) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_ROT,                       NO_MSG,        INFO_DEATH_SELF_ROT,                       CENTER_DEATH_SELF_ROT) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_SHOOTING_STAR,             NO_MSG,        INFO_DEATH_SELF_SHOOTING_STAR,             CENTER_DEATH_SELF_SHOOTING_STAR) \
        MSG_MULTI_NOTIF(1, ITEM_WEAPON_NOAMMO,                   NO_MSG,        INFO_ITEM_WEAPON_NOAMMO,                   CENTER_ITEM_WEAPON_NOAMMO) \
        MSG_MULTI_NOTIF(1, ITEM_WEAPON_PRIMORSEC,                NO_MSG,        INFO_ITEM_WEAPON_PRIMORSEC,                CENTER_ITEM_WEAPON_PRIMORSEC) \
        MSG_MULTI_NOTIF(1, ITEM_WEAPON_UNAVAILABLE,              NO_MSG,        INFO_ITEM_WEAPON_UNAVAILABLE,              CENTER_ITEM_WEAPON_UNAVAILABLE) \
-       MSG_MULTI_NOTIF(1, MULTI_ARENA_BEGIN,                    ANNCE_BEGIN,   NO_MSG,                                    CENTER_ARENA_BEGIN) \
        MSG_MULTI_NOTIF(1, MULTI_COUNTDOWN_BEGIN,                ANNCE_BEGIN,   NO_MSG,                                    CENTER_COUNTDOWN_BEGIN) \
        MSG_MULTI_NOTIF(1, MULTI_MINSTA_FINDAMMO,                ANNCE_NUM_10,  NO_MSG,                                    CENTER_MINSTA_FINDAMMO_FIRST) \
        MSG_MULTI_NOTIF(1, WEAPON_ACCORDEON_MURDER,              NO_MSG,        INFO_WEAPON_ACCORDEON_MURDER,              NO_MSG) \
@@@ -743,7 -749,7 +755,7 @@@ var float autocvar_notification_frag_ve
      f2race_time: mmssss of f2
      race_col: color of race time/position (i.e. good or bad)
      race_diff: show time difference between f2 and f3
-     kh_teams: show which teams still need players in keyhunt centerprint
+     missing_teams: show which teams still need players
      pass_key: find the keybind for "passing" or "dropping" in CTF game mode
      frag_ping: show the ping of a player
      frag_stats: show health/armor/ping of a player
@@@ -797,7 -803,7 +809,7 @@@ string arg_slot[NOTIF_MAX_ARGS]
      ARG_CASE(ARG_CS_SV,     "f3race_time",   mmssss(f3)) \
      ARG_CASE(ARG_CS_SV,     "race_col",      CCR(((f1 == 1) ? "^F1" : "^F2"))) \
      ARG_CASE(ARG_CS_SV,     "race_diff",     ((f2 > f3) ? sprintf(CCR("^1[+%s]"), mmssss(f2 - f3)) : sprintf(CCR("^2[-%s]"), mmssss(f3 - f2)))) \
-     ARG_CASE(ARG_CS,        "kh_teams",      notif_arg_kh_teams(f1, f2, f3, f4)) \
+     ARG_CASE(ARG_CS,        "missing_teams", notif_arg_missing_teams(f1, f2, f3, f4)) \
      ARG_CASE(ARG_CS,        "pass_key",      ((((tmp_s = getcommandkey("pass", "+use")) != "pass") && !(strstrofs(tmp_s, "not bound", 0) >= 0)) ? sprintf(CCR(_(" ^F1(Press %s)")), tmp_s) : "")) \
      ARG_CASE(ARG_CS,        "frag_ping",     notif_arg_frag_ping(TRUE, f2)) \
      ARG_CASE(ARG_CS,        "frag_stats",    notif_arg_frag_stats(f2, f3, f4)) \
@@@ -841,7 -847,7 +853,7 @@@ string notif_arg_frag_stats(float fheal
                return sprintf(CCR(_("\n(^F4Dead^BG)%s")), notif_arg_frag_ping(FALSE, fping));
  }
  
- string notif_arg_kh_teams(float f1, float f2, float f3, float f4)
+ string notif_arg_missing_teams(float f1, float f2, float f3, float f4)
  {
        return sprintf("%s%s%s%s",
                (f1 ?
index 92b5b1b8bc9662f4f5c78e17ad3841e422d48606,e6a242a70454a714e47bfbeeb151a875b45789d4..aef2ece8a755ff96223661fc3c6753ae7f79da3a
@@@ -57,6 -57,7 +57,7 @@@ float autocvar_bot_sound_monopoly
  #define autocvar_bot_suffix cvar_string("bot_suffix")
  float autocvar_bot_usemodelnames;
  float autocvar_bot_vs_human;
+ float autocvar_bot_debug;
  float autocvar_bot_debug_tracewalk;
  float autocvar_bot_debug_goalstack;
  float autocvar_bot_wander_enable;
@@@ -75,8 -76,8 +76,8 @@@ float autocvar_g_arena_maxspawned
  float autocvar_g_arena_point_leadlimit;
  float autocvar_g_arena_point_limit;
  float autocvar_g_arena_roundbased;
+ float autocvar_g_arena_round_timelimit;
  float autocvar_g_arena_warmup;
- float autocvar_g_assault;
  float autocvar_g_balance_armor_blockpercent;
  float autocvar_g_balance_armor_limit;
  float autocvar_g_balance_armor_regen;
@@@ -687,7 -688,6 +688,6 @@@ float autocvar_g_balance_uzi_sustained_
  float autocvar_g_balance_uzi_sustained_spread;
  float autocvar_g_balance_uzi_reload_ammo;
  float autocvar_g_balance_uzi_reload_time;
- float autocvar_g_balance_weaponswitchdelay;
  float autocvar_g_ballistics_density_corpse;
  float autocvar_g_ballistics_density_player;
  float autocvar_g_ballistics_materialconstant;
@@@ -709,6 -709,8 +709,8 @@@ float autocvar_g_ca_point_leadlimit
  float autocvar_g_ca_point_limit;
  float autocvar_g_ca_round_timelimit;
  float autocvar_g_ca_spectate_enemies;
+ float autocvar_g_ca_teams;
+ float autocvar_g_ca_teams_override;
  float autocvar_g_ca_warmup;
  float autocvar_g_campaign;
  #define autocvar_g_campaign_forceteam cvar("g_campaign_forceteam")
@@@ -814,11 -816,15 +816,15 @@@ string autocvar_g_forced_team_pink
  string autocvar_g_forced_team_red;
  string autocvar_g_forced_team_yellow;
  float autocvar_g_freezetag_frozen_force;
+ float autocvar_g_freezetag_frozen_maxtime;
  float autocvar_g_freezetag_point_leadlimit;
  float autocvar_g_freezetag_point_limit;
  float autocvar_g_freezetag_revive_extra_size;
  float autocvar_g_freezetag_revive_speed;
  float autocvar_g_freezetag_revive_clearspeed;
+ float autocvar_g_freezetag_round_timelimit;
+ float autocvar_g_freezetag_teams;
+ float autocvar_g_freezetag_teams_override;
  float autocvar_g_freezetag_warmup;
  #define autocvar_g_friendlyfire cvar("g_friendlyfire")
  #define autocvar_g_friendlyfire_virtual cvar("g_friendlyfire_virtual")
@@@ -861,6 -867,7 +867,7 @@@ float autocvar_g_keyhunt_teams
  float autocvar_g_keyhunt_teams_override;
  float autocvar_g_lms_campcheck_damage;
  float autocvar_g_lms_campcheck_distance;
+ float autocvar_g_lms_extra_lives;
  float autocvar_g_lms_campcheck_interval;
  float autocvar_g_lms_join_anytime;
  float autocvar_g_lms_last_join;
@@@ -891,6 -898,7 +898,7 @@@ float autocvar_g_midair_shieldtime
  float autocvar_g_minstagib_ammo_drop;
  float autocvar_g_minstagib_extralives;
  float autocvar_g_minstagib_speed_highspeed;
+ float autocvar_g_minstagib_invis_alpha;
  #define autocvar_g_mirrordamage cvar("g_mirrordamage")
  #define autocvar_g_mirrordamage_virtual cvar("g_mirrordamage_virtual")
  
@@@ -962,12 -970,11 +970,11 @@@ float autocvar_g_shootfromclient
  float autocvar_g_shootfromeye;
  string autocvar_g_shootfromfixedorigin;
  float autocvar_g_showweaponspawns;
+ float autocvar_g_spawn_alloweffects;
  float autocvar_g_spawn_furthest;
  float autocvar_g_spawn_useallspawns;
  float autocvar_g_spawnpoints_auto_move_out_of_solid;
  #define autocvar_g_spawnshieldtime cvar("g_spawnshieldtime")
- float autocvar_g_spawnsound;
- float autocvar_g_start_delay;
  #define autocvar_g_start_weapon_laser cvar("g_start_weapon_laser")
  float autocvar_g_tdm_team_spawns;
  float autocvar_g_tdm_teams;
@@@ -1226,14 -1233,3 +1233,14 @@@ float autocvar_g_touchexplode_radius
  float autocvar_g_touchexplode_damage;
  float autocvar_g_touchexplode_edgedamage;
  float autocvar_g_touchexplode_force;
 +float autocvar_g_riflearena_nades;
 +float autocvar_g_riflearena_nade_lifetime;
 +float autocvar_g_riflearena_nade_damage;
 +float autocvar_g_riflearena_nade_edgedamage;
 +float autocvar_g_riflearena_nade_radius;
 +float autocvar_g_riflearena_nade_force;
 +float autocvar_g_riflearena_nade_health;
 +float autocvar_g_riflearena_nade_newton_style;
 +float autocvar_g_riflearena_nade_minforce;
 +float autocvar_g_riflearena_nade_maxforce;
 +float autocvar_g_riflearena_nade_refire;
index f1d1f74682ccb34e00ec74ed5c9e45803521cdc2,f69b133213f50666be3099491ce665f7f9767abf..b0aa2c12dd5884b0d8280b9b105f74ce310e9ec4
@@@ -155,63 -155,6 +155,6 @@@ void GameLogClose(
      }
  }
  
- float spawnpoint_nag;
- void relocate_spawnpoint()
- {
-     // nudge off the floor
-     setorigin(self, self.origin + '0 0 1');
-     tracebox(self.origin, PL_MIN, PL_MAX, self.origin, TRUE, self);
-     if (trace_startsolid)
-     {
-         vector o;
-         o = self.origin;
-         self.mins = PL_MIN;
-         self.maxs = PL_MAX;
-         if (!move_out_of_solid(self))
-             objerror("could not get out of solid at all!");
-         print("^1NOTE: this map needs FIXING. Spawnpoint at ", vtos(o - '0 0 1'));
-         print(" needs to be moved out of solid, e.g. by '", ftos(self.origin_x - o_x));
-         print(" ", ftos(self.origin_y - o_y));
-         print(" ", ftos(self.origin_z - o_z), "'\n");
-         if (autocvar_g_spawnpoints_auto_move_out_of_solid)
-         {
-             if (!spawnpoint_nag)
-                 print("\{1}^1NOTE: this map needs FIXING (it contains spawnpoints in solid, see server log)\n");
-             spawnpoint_nag = 1;
-         }
-         else
-         {
-             setorigin(self, o);
-             self.mins = self.maxs = '0 0 0';
-             objerror("player spawn point in solid, mapper sucks!\n");
-             return;
-         }
-     }
-     self.use = spawnpoint_use;
-     self.team_saved = self.team;
-     if (!self.cnt)
-         self.cnt = 1;
-     if (have_team_spawns != 0)
-         if (self.team)
-             have_team_spawns = 1;
-     have_team_spawns_forteam[self.team] = 1;
-     if (autocvar_r_showbboxes)
-     {
-         // show where spawnpoints point at too
-         makevectors(self.angles);
-         entity e;
-         e = spawn();
-         e.classname = "info_player_foo";
-         setorigin(e, self.origin + v_forward * 24);
-         setsize(e, '-8 -8 -8', '8 8 8');
-         e.solid = SOLID_TRIGGER;
-     }
- }
  #define strstr strstrofs
  /*
  // NOTE: DO NOT USE THIS FUNCTION TOO OFTEN.
@@@ -589,7 -532,7 +532,7 @@@ void GetCvars(float f
  string playername(entity p)
  {
      string t;
-     if (teamplay && !intermission_running && p.classname == "player")
+     if (teamplay && !intermission_running && IS_PLAYER(p))
      {
          t = Team_ColorCode(p.team);
          return strcat(t, strdecolorize(p.netname));
@@@ -750,7 -693,7 +693,7 @@@ void readplayerstartcvars(
        s = cvar_string("g_weaponarena");
        if (s == "0" || s == "")
        {
-               if(g_lms || g_ca)
+               if(g_ca)
                        s = "most";
        }
  
  
        if (g_weaponarena)
        {
-               g_minstagib = 0; // incompatible
                g_pinata = 0; // incompatible
                g_weapon_stay = 0; // incompatible
                WEPSET_COPY_AA(start_weapons, g_weaponarena_weapons);
-               if(!(g_lms || g_ca))
-                       start_items |= IT_UNLIMITED_AMMO;
-       }
-       else if (g_minstagib)
-       {
-               g_pinata = 0; // incompatible
-               g_weapon_stay = 0; // incompatible
-               g_bloodloss = 0; // incompatible
-               start_health = 100;
-               start_armorvalue = 0;
-               WEPSET_COPY_AW(start_weapons, WEP_MINSTANEX);
-               g_minstagib_invis_alpha = cvar("g_minstagib_invis_alpha");
-               start_items |= IT_UNLIMITED_SUPERWEAPONS;
-               if (g_minstagib_invis_alpha <= 0)
-                       g_minstagib_invis_alpha = -1;
+               start_items |= IT_UNLIMITED_AMMO;
        }
        else
        {
        if(cvar("g_nexball"))
                start_items |= IT_UNLIMITED_SUPERWEAPONS; // FIXME BAD BAD BAD BAD HACK, NEXBALL SHOULDN'T ABUSE PORTO'S WEAPON SLOT
  
-       if(g_minstagib)
-       {
-               start_ammo_cells = cvar("g_minstagib_ammo_start");
-               start_ammo_fuel = cvar("g_start_ammo_fuel");
-       }
-       else if(start_items & IT_UNLIMITED_WEAPON_AMMO)
+       if(start_items & IT_UNLIMITED_WEAPON_AMMO)
        {
                start_ammo_rockets = 999;
                start_ammo_shells = 999;
        }
        else
        {
-               if(g_lms || g_ca)
-               {
-                       start_ammo_shells = cvar("g_lms_start_ammo_shells");
-                       start_ammo_nails = cvar("g_lms_start_ammo_nails");
-                       start_ammo_rockets = cvar("g_lms_start_ammo_rockets");
-                       start_ammo_cells = cvar("g_lms_start_ammo_cells");
-                       start_ammo_fuel = cvar("g_lms_start_ammo_fuel");
-               }
-               else
-               {
-                       start_ammo_shells = cvar("g_start_ammo_shells");
-                       start_ammo_nails = cvar("g_start_ammo_nails");
-                       start_ammo_rockets = cvar("g_start_ammo_rockets");
-                       start_ammo_cells = cvar("g_start_ammo_cells");
-                       start_ammo_fuel = cvar("g_start_ammo_fuel");
-               }
-       }
-       if (g_lms || g_ca)
-       {
-               start_health = cvar("g_lms_start_health");
-               start_armorvalue = cvar("g_lms_start_armor");
+               start_ammo_shells = cvar("g_start_ammo_shells");
+               start_ammo_nails = cvar("g_start_ammo_nails");
+               start_ammo_rockets = cvar("g_start_ammo_rockets");
+               start_ammo_cells = cvar("g_start_ammo_cells");
+               start_ammo_fuel = cvar("g_start_ammo_fuel");
        }
  
        if (inWarmupStage)
                WEPSET_COPY_AA(warmup_start_weapons_default, start_weapons_default);
                WEPSET_COPY_AA(warmup_start_weapons_defaultmask, start_weapons_defaultmask);
  
-               if (!g_weaponarena && !g_minstagib && !g_ca)
+               if (!g_weaponarena && !g_ca)
                {
                        warmup_start_ammo_shells = cvar("g_warmup_start_ammo_shells");
                        warmup_start_ammo_cells = cvar("g_warmup_start_ammo_cells");
@@@ -999,39 -904,25 +904,26 @@@ float sv_taunt
  string GetGametype(); // g_world.qc
  void readlevelcvars(void)
  {
-       g_minstagib = cvar("g_minstagib");
-       // load ALL the mutators
-       if(cvar("g_dodging"))
-               MUTATOR_ADD(mutator_dodging);
-       if(cvar("g_spawn_near_teammate"))
-               MUTATOR_ADD(mutator_spawn_near_teammate);
-       if(cvar("g_physical_items"))
-               MUTATOR_ADD(mutator_physical_items);
-       if(cvar("g_touchexplode"))
-               MUTATOR_ADD(mutator_touchexplode);
-       if(cvar("g_riflearena"))
-               MUTATOR_ADD(mutator_riflearena);
-       if(!g_minstagib)
-       {
-               if(cvar("g_invincible_projectiles"))
-                       MUTATOR_ADD(mutator_invincibleprojectiles);
-               if(cvar("g_new_toys"))
-                       MUTATOR_ADD(mutator_new_toys);
-               if(cvar("g_nix"))
-                       MUTATOR_ADD(mutator_nix);
-               if(cvar("g_rocket_flying"))
-                       MUTATOR_ADD(mutator_rocketflying);
-               if(cvar("g_vampire"))
-                       MUTATOR_ADD(mutator_vampire);           
-               if(cvar("g_superspectate"))
-                       MUTATOR_ADD(mutator_superspec);
-       }
-       // is this a mutator? is this a mode?
-       if(cvar("g_sandbox"))
-               MUTATOR_ADD(sandbox);
+       // load mutators
+       #define CHECK_MUTATOR_ADD(mut_cvar,mut_name,dependence) \
+               { if(cvar(mut_cvar) && dependence) { MUTATOR_ADD(mut_name); } }
+               
+       CHECK_MUTATOR_ADD("g_dodging", mutator_dodging, 1);
+       CHECK_MUTATOR_ADD("g_spawn_near_teammate", mutator_spawn_near_teammate, 1);
+       CHECK_MUTATOR_ADD("g_physical_items", mutator_physical_items, 1);
+       CHECK_MUTATOR_ADD("g_touchexplode", mutator_touchexplode, 1);
+       CHECK_MUTATOR_ADD("g_minstagib", mutator_minstagib, 1);
+       CHECK_MUTATOR_ADD("g_invincible_projectiles", mutator_invincibleprojectiles, !cvar("g_minstagib"));
+       CHECK_MUTATOR_ADD("g_new_toys", mutator_new_toys, !cvar("g_minstagib"));
+       CHECK_MUTATOR_ADD("g_nix", mutator_nix, !cvar("g_minstagib"));
+       CHECK_MUTATOR_ADD("g_rocket_flying", mutator_rocketflying, !cvar("g_minstagib"));
+       CHECK_MUTATOR_ADD("g_vampire", mutator_vampire, !cvar("g_minstagib"));
+       CHECK_MUTATOR_ADD("g_superspectate", mutator_superspec, 1);
+       CHECK_MUTATOR_ADD("g_sandbox", sandbox, 1);
++    CHECK_MUTATOR_ADD("g_riflearena", mutator_riflearena, !cvar("g_minstagib"));
+       
+       #undef CHECK_MUTATOR_ADD
+       
        if(cvar("sv_allow_fullbright"))
                serverflags |= SERVERFLAG_ALLOW_FULLBRIGHT;
  
      g_bugrigs_speed_ref = cvar("g_bugrigs_speed_ref");
      g_bugrigs_speed_pow = cvar("g_bugrigs_speed_pow");
      g_bugrigs_steer = cvar("g_bugrigs_steer");
+       
+       g_minstagib = cvar("g_minstagib");
  
        sv_clones = cvar("sv_clones");
        sv_foginterval = cvar("sv_foginterval");
        g_warmup_allguns = cvar("g_warmup_allguns");
        g_warmup_allow_timeout = cvar("g_warmup_allow_timeout");
  
-       if ((g_race && g_race_qualifying == 2) || g_arena || g_assault || cvar("g_campaign"))
+       if ((g_race && g_race_qualifying == 2) || g_arena || g_minstagib || g_assault || cvar("g_campaign"))
                inWarmupStage = 0; // these modes cannot work together, sorry
  
        g_pickup_respawntime_weapon = cvar("g_pickup_respawntime_weapon");
      if(!g_weapon_stay)
          g_weapon_stay = cvar("g_weapon_stay");
  
-       if not(inWarmupStage && !g_ca)
-               game_starttime = cvar("g_start_delay");
+       if not(inWarmupStage)
+               game_starttime = time + cvar("g_start_delay");
  
        readplayerstartcvars();
  }
@@@ -1179,7 -1072,7 +1073,7 @@@ float sound_allowed(float dest, entity 
              return TRUE;
      // sounds by players can be removed
      if (autocvar_bot_sound_monopoly)
-         if (clienttype(e) == CLIENTTYPE_REAL)
+         if (IS_REAL_CLIENT(e))
              return FALSE;
      // anything else may pass
      return TRUE;
index 3355f5baec6809b8a07517a39ef90c257e150cb7,0000000000000000000000000000000000000000..24a5fbce1aeeba237bf645d78e1278b9e720482f
mode 100644,000000..100644
--- /dev/null
@@@ -1,368 -1,0 +1,395 @@@
- void ra_toss_nade(vector _velocity, float _time)
 +.entity ra_nade;
 +.float ra_nade_refire;
 +
++float ra_CanThrowNade()
++{
++      if(self.vehicle)
++              return FALSE;
++              
++      if(gameover)
++              return FALSE;
++              
++      if not(autocvar_g_riflearena_nades)
++              return FALSE;
++              
++      if(forbidWeaponUse())
++              return FALSE;
++              
++      return TRUE;
++}
++
 +void ra_nade_timer_think()
 +{
 +      self.skin = 8 - (self.owner.wait - time) / (autocvar_g_riflearena_nade_lifetime / 10);
 +      self.nextthink = time;
 +      if(!self.owner || wasfreed(self.owner))
 +              remove(self);
 +      
 +}
 +
 +void ra_nade_burn_spawn(entity nade)
 +{
 +      switch(nade.realowner.team)
 +      {
 +              case NUM_TEAM_1:
 +                      CSQCProjectile(nade, TRUE, PROJECTILE_NADE_RED_BURN, TRUE);
 +                      break;
 +              case NUM_TEAM_2:
 +                      CSQCProjectile(nade, TRUE, PROJECTILE_NADE_BLUE_BURN, TRUE);
 +                      break;
 +              default:
 +                      CSQCProjectile(nade, TRUE, PROJECTILE_NADE_RED_BURN, TRUE);
 +                      break;
 +      }
 +}
 +
 +void ra_nade_spawn(entity nade)
 +{
 +      entity timer = spawn();
 +      setmodel(timer, "models/ok_nade_counter/ok_nade_counter.md3");
 +      setattachment(timer, nade, "");
 +      timer.classname = "nade_timer";
 +      timer.colormap = nade.colormap;
 +      timer.glowmod = nade.glowmod;
 +      timer.think = ra_nade_timer_think;
 +      timer.nextthink = time;
 +      timer.wait = nade.wait;
 +      timer.owner = nade;     
 +      timer.skin = 10;
 +      
 +      CSQCProjectile(nade, TRUE, ((nade.realowner.team == NUM_TEAM_2) ? PROJECTILE_NADE_BLUE: PROJECTILE_NADE_RED) , TRUE);
 +      
 +}
 +
 +void ra_nade_boom() // TODO: DamageInfo
 +{
 +      sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTN_NORM);
 +      sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
 +      pointparticles(particleeffectnum((self.realowner.team == NUM_TEAM_2) ? "nade_blue_explode" : "nade_red_explode"), self.origin + '0 0 1', '0 0 0', 1);
 +
 +
 +      self.takedamage = DAMAGE_NO;
 +      RadiusDamage(self, self.realowner, autocvar_g_riflearena_nade_damage, autocvar_g_riflearena_nade_edgedamage,
 +                               autocvar_g_riflearena_nade_radius, self, autocvar_g_riflearena_nade_force, self.projectiledeathtype, self.enemy);
 +
 +      remove(self);
 +}
 +
 +void ra_nade_touch()
 +{
 +      PROJECTILE_TOUCH;
 +      setsize(self, '-2 -2 -2', '2 2 2');
 +      UpdateCSQCProjectile(self);
 +      if(self.health == autocvar_g_riflearena_nade_health)
 +      {
 +              spamsound(self, CH_SHOTS, strcat("weapons/grenade_bounce", ftos(1 + rint(random() * 5)), ".wav"), VOL_BASE, ATTN_NORM);
 +              return;
 +      }
 +
 +      self.enemy = other;
 +      ra_nade_boom();
 +}
 +
 +void ra_nade_beep()
 +{
 +      sound(self, CH_SHOTS_SINGLE, "overkill/grenadebip.wav", VOL_BASE, 0.5 *(ATTN_LARGE + ATTN_MAX));
 +      self.think = ra_nade_boom;
 +      self.nextthink = max(self.wait, time);
 +}
 +
 +void ra_nade_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
 +{
 +      if(DEATH_ISWEAPON(deathtype, WEP_LASER))
 +              return;
 +      
 +      self.velocity += force;
 +
 +      if(!damage)
 +              return;
 +
 +      if(self.health == autocvar_g_riflearena_nade_health)
 +      {
 +              sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, 0.5 *(ATTN_LARGE + ATTN_MAX));
 +              self.nextthink = max(time + autocvar_g_riflearena_nade_lifetime, time);
 +              self.think = ra_nade_beep;
 +      }
 +
 +      self.health   -= damage;
 +      self.realowner = attacker;
 +
 +      if(self.health <= 0)
 +              W_PrepareExplosionByDamage(attacker, ra_nade_boom);
 +      else
 +              ra_nade_burn_spawn(self);
 +}
 +
-       entity _nade = self.ra_nade;
-       self.ra_nade = world;
++void ra_toss_nade(entity ent, vector _velocity, float _time)
 +{
-       if(self.crouch)
++      entity _nade = ent.ra_nade;
++      ent.ra_nade = world;
 +      
 +      setorigin(_nade, gettaginfo(_nade, gettagindex(_nade, "Object001")));
 +      setattachment(_nade, world, "");
 +      PROJECTILE_MAKETRIGGER(_nade);
 +      setsize(_nade, '-16 -16 -16', '16 16 16');
 +      _nade.movetype = MOVETYPE_BOUNCE;
 +      
-               _nade.velocity = self.velocity + _velocity;
++      if(ent.crouch)
 +              _nade.velocity = '0 0 -10';
 +      else if(autocvar_g_riflearena_nade_newton_style == 1)
-               _nade.velocity = W_CalculateProjectileVelocity(self.velocity, _velocity, FALSE);
++              _nade.velocity = ent.velocity + _velocity;
 +      else if(autocvar_g_riflearena_nade_newton_style == 2)
 +              _nade.velocity = _velocity;
 +      else
-       self.ra_nade_refire = time + autocvar_g_riflearena_nade_refire;
++              _nade.velocity = W_CalculateProjectileVelocity(ent.velocity, _velocity, FALSE);
 +
 +      _nade.solid = SOLID_BBOX;
 +      _nade.touch = ra_nade_touch;
 +      _nade.health = autocvar_g_riflearena_nade_health;
 +      _nade.takedamage = DAMAGE_YES;
 +      _nade.event_damage = ra_nade_damage;
 +      _nade.teleportable = TRUE;
 +
 +      ra_nade_spawn(_nade);
 +
 +      if(_time)
 +      {
 +              _nade.think = ra_nade_boom;
 +              _nade.nextthink = _time;
 +      }
 +      else
 +              _nade.projectiledeathtype = DEATH_NADE_NORMAL;
 +
-                       ra_toss_nade('0 0 0', time + 0.05);
++      ent.ra_nade_refire = time + autocvar_g_riflearena_nade_refire;
 +}
 +
 +void ra_nade_prime()
 +{
 +      if(self.ra_nade)
 +              remove(self.ra_nade);
 +      
 +      self.ra_nade = spawn();
 +      setmodel(self.ra_nade, "models/weapons/h_ok_grenade.iqm");
 +      setattachment(self.ra_nade, self.weaponentity, "");
 +      self.ra_nade.classname = "nade";
 +      self.ra_nade.realowner = self;
 +      self.ra_nade.colormap = self.colormap;
 +      self.ra_nade.glowmod = self.glowmod;
 +      self.ra_nade.wait = time + autocvar_g_riflearena_nade_lifetime;
 +      self.ra_nade.cnt = time;
 +      self.ra_nade.think = ra_nade_beep;
 +      self.ra_nade.nextthink = max(self.ra_nade.wait - 3, time);
 +      self.ra_nade.projectiledeathtype = DEATH_NADE_NORMAL;
 +}
 +
++MUTATOR_HOOKFUNCTION(ra_VehicleEnter)
++{
++      if(other.ra_nade)
++              ra_toss_nade(other, '0 0 100', max(other.ra_nade.wait, time + 0.05));
++              
++      return FALSE;
++}
++
 +MUTATOR_HOOKFUNCTION(ra_PlayerDamage)
 +{
 +      if(IS_PLAYER(frag_attacker))
 +      {
 +              if (DEATH_ISWEAPON(frag_deathtype, WEP_LASER))
 +              {
 +                      if(frag_attacker == frag_target)
 +                              frag_damage = 5;
 +                      else
 +                              frag_damage = 0;
 +                      if (frag_target != frag_attacker)
 +                      {
 +                              if (frag_target.health >= 1 && IS_PLAYER(frag_target))
 +                                      centerprint(frag_attacker, "Laser inflicts no damage!");
 +                              frag_force = '0 0 0';
 +                      }
 +              }
 +      }
 +              
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(ra_PlayerSpawn)
 +{
 +      WEPSET_CLEAR_E(self);
 +      WEPSET_OR_EW(self, WEP_RIFLE);
 +      WEPSET_OR_EW(self, WEP_LASER);
 +      
 +      self.ra_nade_refire = time + 1;
 +      
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(ra_FilterItem)
 +{
 +      switch (self.items)
 +      {
 +              case IT_5HP:
 +              case IT_ARMOR_SHARD:
 +                      return FALSE;
 +      }
 +              
 +      return TRUE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(ra_PlayerThink)
 +{
 +      if(self.ra_nade)
 +              if(self.ra_nade.wait - 0.1 <= time)
-                               ra_toss_nade((v_forward * 0.7 + v_up * 0.2 + v_right * 0.1) * _force, 0);
++                      ra_toss_nade(self, '0 0 0', time + 0.05);
 +
++      if(ra_CanThrowNade())
 +      if(self.ra_nade_refire < time)
 +      {
 +              if(self.BUTTON_HOOK)
 +              {
 +                      if(!self.ra_nade)
 +                              ra_nade_prime();
 +              }
 +              else if(time - self.ra_nade.cnt >= 1)
 +              {
 +                      if(self.ra_nade)
 +                      {
 +                              makevectors(self.v_angle);
 +                              float _force = time - self.ra_nade.cnt;
 +                              _force /= autocvar_g_riflearena_nade_lifetime;
 +                              _force = autocvar_g_riflearena_nade_minforce + (_force * (autocvar_g_riflearena_nade_maxforce - autocvar_g_riflearena_nade_minforce));                          
-               ra_toss_nade('0 0 100', max(self.ra_nade.wait, time + 0.05));
++                              ra_toss_nade(self, (v_forward * 0.7 + v_up * 0.2 + v_right * 0.1) * _force, 0);
 +                      }
 +              }
 +      }
 +      
 +      self.hasweapon_complain_spam = time + 5; // this isn't needed, so keep it off
 +      
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(ra_RemovePlayer)
 +{
 +      if(self.ra_nade)
 +              remove(self.ra_nade);
 +              
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(ra_StartItems)
 +{
 +      start_items |= IT_UNLIMITED_AMMO;
 +      start_ammo_nails = 100;
 +      
 +      g_grappling_hook = 0;
 +
 +      return FALSE;
 +}
 +
 +MUTATOR_HOOKFUNCTION(ra_PlayerDies)
 +{
 +      if(self.ra_nade)
-       if(self.freezetag_frozen || !autocvar_g_riflearena_nades || self.vehicle)
++              ra_toss_nade(self, '0 0 100', max(self.ra_nade.wait, time + 0.05));
 +
 +      return 0;
 +}
 +
 +MUTATOR_HOOKFUNCTION(ra_ForbidThrowCurrentWeapon)
 +{
-                       ra_toss_nade((v_forward * 0.75 + v_up * 0.2 + v_right * 0.05) * _force, 0);
++      if(!ra_CanThrowNade())
 +              return 1;
 +
 +      if(!self.ra_nade)
 +      {
 +              if(self.ra_nade_refire < time)
 +              {
 +                      Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_NADE);
 +                      ra_nade_prime();
 +                      self.ra_nade_refire  = time + autocvar_g_riflearena_nade_refire;
 +              }
 +      }
 +      else
 +      {
 +              if(time - self.ra_nade.cnt >= 1)
 +              {
 +                      makevectors(self.v_angle);
 +                      float _force = time - self.ra_nade.cnt;
 +                      _force /= autocvar_g_riflearena_nade_lifetime;
 +                      _force = autocvar_g_riflearena_nade_minforce + (_force * (autocvar_g_riflearena_nade_maxforce - autocvar_g_riflearena_nade_minforce));
++                      ra_toss_nade(self, (v_forward * 0.75 + v_up * 0.2 + v_right * 0.05) * _force, 0);
 +              }
 +      }
 +      return 1;
 +}
 +
 +MUTATOR_HOOKFUNCTION(ra_BuildMutatorsString)
 +{
 +      ret_string = strcat(ret_string, ":RA");
 +      return 0;
 +}
 +
 +MUTATOR_HOOKFUNCTION(ra_BuildMutatorsPrettyString)
 +{
 +      ret_string = strcat(ret_string, ", Rifle Arena");
 +      return 0;
 +}
 +
 +MUTATOR_HOOKFUNCTION(ra_SetModname)
 +{
 +      modname = "Rifle Arena";
 +      return TRUE;
 +}
 +
 +MUTATOR_DEFINITION(mutator_riflearena)
 +{
++      MUTATOR_HOOK(VehicleEnter, ra_VehicleEnter, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(PlayerDamage_Calculate, ra_PlayerDamage, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(PlayerSpawn, ra_PlayerSpawn, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(FilterItem, ra_FilterItem, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(SetStartItems, ra_StartItems, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(MakePlayerObserver, ra_RemovePlayer, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(ClientDisconnect, ra_RemovePlayer, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(PlayerDies, ra_PlayerDies, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(PlayerPreThink, ra_PlayerThink, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(ForbidThrowCurrentWeapon, ra_ForbidThrowCurrentWeapon, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(BuildMutatorsString, ra_BuildMutatorsString, CBC_ORDER_ANY);
 +      MUTATOR_HOOK(BuildMutatorsPrettyString, ra_BuildMutatorsPrettyString, CBC_ORDER_ANY);
 +      
 +      MUTATOR_ONADD
 +      {
 +              cvar_settemp("g_balance_rifle_secondary_spread", "0");
 +              cvar_settemp("g_balance_rifle_secondary_shots", "1");
 +              cvar_settemp("g_balance_rifle_secondary_animtime", "0.15");
 +              cvar_settemp("g_balance_rifle_secondary_refire", "0.15");
 +              cvar_settemp("g_balance_rifle_secondary_damage", "40");
 +              precache_model("models/ok_nade_counter/ok_nade_counter.md3");
 +              
 +              precache_model("models/weapons/h_ok_grenade.iqm");
 +              precache_model("models/weapons/v_ok_grenade.md3");
 +              precache_sound("weapons/rocket_impact.wav");
 +              precache_sound("weapons/grenade_bounce1.wav");
 +              precache_sound("weapons/grenade_bounce2.wav");
 +              precache_sound("weapons/grenade_bounce3.wav");
 +              precache_sound("weapons/grenade_bounce4.wav");
 +              precache_sound("weapons/grenade_bounce5.wav");
 +              precache_sound("weapons/grenade_bounce6.wav");
 +              precache_sound("overkill/grenadebip.wav");
 +              
 +              weapon_action(WEP_LASER, WR_PRECACHE);
 +              weapon_action(WEP_RIFLE, WR_PRECACHE);
 +              
 +              get_weaponinfo(WEP_HOOK).spawnflags |= WEP_FLAG_MUTATORBLOCKED;
 +      }
 +      
 +      MUTATOR_ONROLLBACK_OR_REMOVE
 +      {
 +              get_weaponinfo(WEP_HOOK).spawnflags &~= WEP_FLAG_MUTATORBLOCKED;
 +      }
 +      
 +      MUTATOR_ONREMOVE
 +      {
 +              print("This cannot be removed at runtime\n");
 +              return -1;
 +      }
 +
 +      return 0;
 +}
index cb0911d7056729c2d9d3ac6f4a6c3e60cf7fb271,3f9f020affc086c1968fbe80a2bfc64bd9a3d5e3..a6ace7b99fd6326788d860eabf2748eb2270d905
@@@ -1,3 -1,6 +1,6 @@@
+ MUTATOR_DECLARATION(gamemode_assault);
+ MUTATOR_DECLARATION(gamemode_arena);
+ MUTATOR_DECLARATION(gamemode_ca);
  MUTATOR_DECLARATION(gamemode_keyhunt);
  MUTATOR_DECLARATION(gamemode_freezetag);
  MUTATOR_DECLARATION(gamemode_keepaway);
@@@ -5,6 -8,7 +8,7 @@@ MUTATOR_DECLARATION(gamemode_ctf)
  MUTATOR_DECLARATION(gamemode_nexball);
  MUTATOR_DECLARATION(gamemode_onslaught);
  MUTATOR_DECLARATION(gamemode_domination);
+ MUTATOR_DECLARATION(gamemode_lms);
  
  MUTATOR_DECLARATION(mutator_dodging);
  MUTATOR_DECLARATION(mutator_invincibleprojectiles);
@@@ -15,7 -19,7 +19,8 @@@ MUTATOR_DECLARATION(mutator_spawn_near_
  MUTATOR_DECLARATION(mutator_physical_items);
  MUTATOR_DECLARATION(mutator_vampire);
  MUTATOR_DECLARATION(mutator_superspec);
+ MUTATOR_DECLARATION(mutator_minstagib);
  MUTATOR_DECLARATION(mutator_touchexplode);
 +MUTATOR_DECLARATION(mutator_riflearena);
  
  MUTATOR_DECLARATION(sandbox);
diff --combined qcsrc/server/progs.src
index 74b15b53ae22fda1629af33ae238ee6d3216ce05,df5623f0535a42bd3c5b1a4b04baa0b516aa57b8..8ce3adc7397b5e1d8d1f6c92d04c9016543efc69
@@@ -35,11 -35,15 +35,15 @@@ defs.qh            // Should rename this, it has 
  
  mutators/base.qh
  mutators/mutators.qh
+ mutators/gamemode_assault.qh
+ mutators/gamemode_arena.qh
+ mutators/gamemode_ca.qh
  mutators/gamemode_ctf.qh
  mutators/gamemode_domination.qh
  mutators/gamemode_keyhunt.qh // TODO fix this
  mutators/gamemode_keepaway.qh
  mutators/gamemode_nexball.qh 
+ mutators/gamemode_lms.qh
  mutators/mutator_dodging.qh
  
  //// tZork Turrets ////
@@@ -77,6 -81,8 +81,8 @@@ w_laser.q
  
  scores.qh
  
+ spawnpoints.qh
  ipban.qh
  
  race.qh
@@@ -85,6 -91,8 +91,8 @@@ antilag.q
  
  playerdemo.qh
  
+ round_handler.qh
  // singleplayer stuff
  item_key.qh
  secret.qh
@@@ -102,7 -110,6 +110,6 @@@ g_subs.q
  g_tetris.qc
  
  //runematch.qc
- arena.qc
  
  g_violence.qc
  g_damage.qc
@@@ -173,7 -180,7 +180,7 @@@ command/getreplies.q
  command/cmd.qc
  command/sv_cmd.qc
  
- assault.qc
//assault.qc
  
  ipban.qc
  
@@@ -192,6 -199,8 +199,8 @@@ vehicles/vehicles.q
  
  scores.qc
  
+ spawnpoints.qc
  portals.qc
  
  target_spawn.qc
@@@ -211,9 -220,14 +220,14 @@@ anticheat.q
  cheats.qc
  playerstats.qc
  
+ round_handler.qc
  ../common/explosion_equation.qc
  
  mutators/base.qc
+ mutators/gamemode_assault.qc
+ mutators/gamemode_arena.qc
+ mutators/gamemode_ca.qc
  mutators/gamemode_ctf.qc
  mutators/gamemode_domination.qc
  mutators/gamemode_freezetag.qc
@@@ -221,6 -235,7 +235,7 @@@ mutators/gamemode_keyhunt.q
  mutators/gamemode_keepaway.qc
  mutators/gamemode_nexball.qc
  mutators/gamemode_onslaught.qc
+ mutators/gamemode_lms.qc
  mutators/mutator_invincibleproj.qc
  mutators/mutator_new_toys.qc
  mutators/mutator_nix.qc
@@@ -231,8 -246,8 +246,9 @@@ mutators/mutator_spawn_near_teammate.q
  mutators/mutator_physical_items.qc
  mutators/sandbox.qc
  mutators/mutator_superspec.qc
+ mutators/mutator_minstagib.qc
  mutators/mutator_touchexplode.qc
 +mutators/mutator_riflearena.qc
  
  ../warpzonelib/anglestransform.qc
  ../warpzonelib/mathlib.qc