]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into terencehill/ca_ft_fixes
authorterencehill <piuntn@gmail.com>
Sun, 5 Jan 2014 18:00:43 +0000 (19:00 +0100)
committerterencehill <piuntn@gmail.com>
Sun, 5 Jan 2014 18:00:43 +0000 (19:00 +0100)
Conflicts:
gamemodes.cfg
qcsrc/server/g_world.qc
qcsrc/server/mutators/gamemode_arena.qc
qcsrc/server/mutators/gamemode_ca.qc

1  2 
gamemodes.cfg
qcsrc/server/autocvars.qh
qcsrc/server/cl_impulse.qc
qcsrc/server/g_world.qc
qcsrc/server/mutators/gamemode_ca.qc
qcsrc/server/mutators/gamemode_freezetag.qc
qcsrc/server/mutators/gamemode_lms.qc
qcsrc/server/scores_rules.qc
qcsrc/server/teamplay.qc

diff --combined gamemodes.cfg
index 7d1194f0a4d64c89430f31f8680eb2d283bad42d,feed7488b5c2681d4e78565c600d6cf69a2350e0..b5b460fe3a489759f62dd6603ac8008f4ba1f91b
@@@ -27,7 -27,6 +27,6 @@@ alias cl_hook_gamestart_td
  alias cl_hook_gamestart_dom
  alias cl_hook_gamestart_ctf
  alias cl_hook_gamestart_lms
- alias cl_hook_gamestart_arena
  alias cl_hook_gamestart_ca
  alias cl_hook_gamestart_kh
  alias cl_hook_gamestart_ons
@@@ -48,7 -47,6 +47,6 @@@ alias sv_hook_gamestart_td
  alias sv_hook_gamestart_dom
  alias sv_hook_gamestart_ctf
  alias sv_hook_gamestart_lms
- alias sv_hook_gamestart_arena
  alias sv_hook_gamestart_ca
  alias sv_hook_gamestart_kh
  alias sv_hook_gamestart_ons
@@@ -73,8 -71,6 +71,6 @@@ seta fraglimit_override -1    "Frag limit 
  seta leadlimit_override -1    "Lead limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
  seta capturelimit_override -1 "Capture limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
  seta captureleadlimit_override -1     "Capture llead imit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
- seta g_arena_point_limit -1   "Arena point limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
- seta g_arena_point_leadlimit -1       "Arena point lead limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
  seta g_domination_point_limit -1      "Domination point limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
  seta g_domination_point_leadlimit -1  "Domination point lead limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
  seta g_keyhunt_point_limit -1 "Keyhunt point limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)"
@@@ -110,9 -106,6 +106,6 @@@ set g_ka_weapon_stay 
  set g_kh_respawn_delay 0
  set g_kh_respawn_waves 0
  set g_kh_weapon_stay 0
- set g_arena_respawn_delay 0
- set g_arena_respawn_waves 0
- set g_arena_weapon_stay 0
  set g_ca_respawn_delay 0
  set g_ca_respawn_waves 0
  set g_ca_weapon_stay 0
@@@ -136,16 -129,6 +129,6 @@@ set g_ft_respawn_delay 
  set g_ft_weapon_stay 0
  
  
- // =======
- //  arena
- // =======
- set g_arena 0 "Arena: many one-on-one rounds are played to find the winner"
- set g_arena_maxspawned 2      "maximum number of players to spawn at once (the rest is spectating, waiting for their turn)"
- set g_arena_roundbased 1      "if disabled, the next player will spawn as soon as someone dies"
- set g_arena_round_timelimit 180 "round time limit in seconds"
- set g_arena_warmup 5  "time, newly spawned players have to prepare themselves in round based matches"
  // =========
  //  assault
  // =========
@@@ -161,13 -144,11 +144,12 @@@ set g_ca_point_leadlimit 
  set g_ca_spectate_enemies 0 "Allow spectating enemy player by dead player during clan arena games."
  set g_ca_warmup 10 "how long the players will have time to run around the map before the round starts"
  set g_ca_damage2score_multiplier 0.01
 -set g_ca_round_timelimit 180
 +set g_ca_round_timelimit 180 "round time limit in seconds"
  seta g_ca_teams_override 0
 +set g_ca_team_spawns 0 "when 1, players spawn from the team spawnpoints of the map, if any"
  set g_ca_teams 0
  
  
  // ==================
  //  capture the flag
  // ==================
@@@ -250,7 -231,7 +232,7 @@@ set g_cts_finish_kill_delay 10 "preven
  // ==========================
  set g_dm 1 "Deathmatch: killing any other player is one frag, player with most frags wins"
  set g_tdm_teams 2 "how many teams are in team deathmatch (set by mapinfo)"
 -set g_tdm_team_spawns 0 "when 1, a map can define team spawnpoints for TDM"
 +set g_tdm_team_spawns 0 "when 1, players spawn from the team spawnpoints of the map, if any"
  seta g_tdm_teams_override 0   "how many teams are in team deathmatch"
  
  
@@@ -281,11 -262,10 +263,11 @@@ set g_freezetag_revive_clearspeed 1.6 "
  set g_freezetag_revive_extra_size 100 "Distance in qu that you can stand from a frozen teammate to keep reviving him"
  set g_freezetag_revive_falldamage 0 "Enable reviving from this amount of fall damage"
  set g_freezetag_revive_falldamage_health 40 "Amount of health player has if they revived from falling"
 -set g_freezetag_round_timelimit 180
 +set g_freezetag_round_timelimit 180 "round time limit in seconds"
  set g_freezetag_frozen_force 0.6 "How much to multiply the force on a frozen player with"
  set g_freezetag_frozen_maxtime 60 "frozen players will be automatically unfrozen after this time in seconds"
  seta g_freezetag_teams_override 0
 +set g_freezetag_team_spawns 0 "when 1, players spawn from the team spawnpoints of the map, if any"
  set g_freezetag_teams 0
  
  
index f5a29b277e8c9b2d563f1e0f231ccf1670f3c583,ada0d4bda9b5eb23619f9d45841839ebafb7fe5b..bd1143d4a8b8e90043e4d981f2bc8487668df4b9
@@@ -70,14 -70,7 +70,7 @@@ float autocvar_ekg
  #define autocvar_fraglimit_override cvar("fraglimit_override")
  float autocvar_g_allow_oldnexbeam;
  float autocvar_g_antilag;
- float autocvar_g_antilag_bullets;
  float autocvar_g_antilag_nudge;
- 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_balance_armor_blockpercent;
  float autocvar_g_balance_armor_limit;
  float autocvar_g_balance_armor_regen;
@@@ -90,30 -83,26 +83,26 @@@ float autocvar_g_balance_armor_start
  float autocvar_g_balance_rifle_bursttime;
  float autocvar_g_balance_rifle_primary_ammo;
  float autocvar_g_balance_rifle_primary_animtime;
- float autocvar_g_balance_rifle_primary_bulletconstant;
  float autocvar_g_balance_rifle_primary_bullethail;
  float autocvar_g_balance_rifle_primary_burstcost;
  float autocvar_g_balance_rifle_primary_damage;
  float autocvar_g_balance_rifle_primary_force;
- float autocvar_g_balance_rifle_primary_lifetime;
  float autocvar_g_balance_rifle_primary_refire;
  float autocvar_g_balance_rifle_primary_shots;
- float autocvar_g_balance_rifle_primary_speed;
+ float autocvar_g_balance_rifle_primary_solidpenetration;
  float autocvar_g_balance_rifle_primary_spread;
  float autocvar_g_balance_rifle_primary_tracer;
  float autocvar_g_balance_rifle_secondary;
  float autocvar_g_balance_rifle_secondary_ammo;
  float autocvar_g_balance_rifle_secondary_animtime;
- float autocvar_g_balance_rifle_secondary_bulletconstant;
  float autocvar_g_balance_rifle_secondary_bullethail;
  float autocvar_g_balance_rifle_secondary_burstcost;
  float autocvar_g_balance_rifle_secondary_damage;
  float autocvar_g_balance_rifle_secondary_force;
- float autocvar_g_balance_rifle_secondary_lifetime;
  float autocvar_g_balance_rifle_secondary_reload;
  float autocvar_g_balance_rifle_secondary_refire;
  float autocvar_g_balance_rifle_secondary_shots;
- float autocvar_g_balance_rifle_secondary_speed;
+ float autocvar_g_balance_rifle_secondary_solidpenetration;
  float autocvar_g_balance_rifle_secondary_spread;
  float autocvar_g_balance_rifle_secondary_tracer;
  float autocvar_g_balance_rifle_reload_ammo;
@@@ -347,6 -336,7 +336,6 @@@ float autocvar_g_balance_health_regenst
  float autocvar_g_balance_health_rot;
  float autocvar_g_balance_health_rotlinear;
  float autocvar_g_balance_health_rotstable;
 -float autocvar_g_balance_health_start;
  float autocvar_g_balance_hlac_primary_ammo;
  float autocvar_g_balance_hlac_primary_animtime;
  float autocvar_g_balance_hlac_primary_damage;
@@@ -627,12 -617,11 +616,11 @@@ float autocvar_g_balance_seeker_reload_
  float autocvar_g_balance_selfdamagepercent;
  float autocvar_g_balance_shotgun_primary_ammo;
  float autocvar_g_balance_shotgun_primary_animtime;
- float autocvar_g_balance_shotgun_primary_bulletconstant;
  float autocvar_g_balance_shotgun_primary_bullets;
  float autocvar_g_balance_shotgun_primary_damage;
  float autocvar_g_balance_shotgun_primary_force;
  float autocvar_g_balance_shotgun_primary_refire;
- float autocvar_g_balance_shotgun_primary_speed;
+ float autocvar_g_balance_shotgun_primary_solidpenetration;
  float autocvar_g_balance_shotgun_primary_spread;
  float autocvar_g_balance_shotgun_secondary;
  float autocvar_g_balance_shotgun_secondary_animtime;
@@@ -660,7 -649,6 +648,6 @@@ float autocvar_g_balance_tuba_edgedamag
  float autocvar_g_balance_tuba_force;
  float autocvar_g_balance_tuba_radius;
  float autocvar_g_balance_tuba_refire;
- float autocvar_g_balance_uzi_bulletconstant;
  float autocvar_g_balance_uzi_burst;
  float autocvar_g_balance_uzi_burst_ammo;
  float autocvar_g_balance_uzi_burst_animtime;
@@@ -674,7 -662,7 +661,7 @@@ float autocvar_g_balance_uzi_first_forc
  float autocvar_g_balance_uzi_first_refire;
  float autocvar_g_balance_uzi_first_spread;
  float autocvar_g_balance_uzi_mode;
- float autocvar_g_balance_uzi_speed;
+ float autocvar_g_balance_uzi_solidpenetration;
  float autocvar_g_balance_uzi_spread_add;
  float autocvar_g_balance_uzi_spread_max;
  float autocvar_g_balance_uzi_spread_min;
@@@ -687,7 -675,6 +674,6 @@@ float autocvar_g_balance_uzi_reload_amm
  float autocvar_g_balance_uzi_reload_time;
  float autocvar_g_ballistics_density_corpse;
  float autocvar_g_ballistics_density_player;
- float autocvar_g_ballistics_materialconstant;
  float autocvar_g_ballistics_mindistance;
  float autocvar_g_ban_default_bantime;
  float autocvar_g_ban_default_masksize;
@@@ -708,7 -695,6 +694,7 @@@ 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_team_spawns;
  float autocvar_g_ca_warmup;
  float autocvar_g_campaign;
  #define autocvar_g_campaign_forceteam cvar("g_campaign_forceteam")
@@@ -808,6 -794,7 +794,7 @@@ float autocvar_g_domination_point_leadl
  float autocvar_g_domination_point_rate;
  float autocvar_g_domination_teams_override;
  float autocvar_g_forced_respawn;
+ float autocvar_g_respawn_delay_max;
  string autocvar_g_forced_team_blue;
  string autocvar_g_forced_team_otherwise;
  string autocvar_g_forced_team_pink;
@@@ -825,7 -812,6 +812,7 @@@ float autocvar_g_freezetag_revive_clear
  float autocvar_g_freezetag_round_timelimit;
  float autocvar_g_freezetag_teams;
  float autocvar_g_freezetag_teams_override;
 +float autocvar_g_freezetag_team_spawns;
  float autocvar_g_freezetag_warmup;
  #define autocvar_g_friendlyfire cvar("g_friendlyfire")
  #define autocvar_g_friendlyfire_virtual cvar("g_friendlyfire_virtual")
@@@ -1205,7 -1191,6 +1192,6 @@@ float autocvar_timelimit_overtimes
  float autocvar_timelimit_suddendeath;
  #define autocvar_utf8_enable cvar("utf8_enable")
  float autocvar_waypoint_benchmark;
- float autocvar_welcome_message_time;
  float autocvar_sv_gameplayfix_gravityunaffectedbyticrate;
  float autocvar_g_trueaim_minrange;
  float autocvar_g_debug_defaultsounds;
index a80f462f370920e1f2c1b405ef4f52d214cdc124,a4376bd418a101096d5fdf7d2e68c76070796578..dc8a1e072b86985185f4c89042f9f0cba9a02cd2
@@@ -46,20 -46,19 +46,20 @@@ void ImpulseCommands (void
                return;
        self.impulse = 0;
  
 -      // forbid impulses when not in round time
 +      // allow only weapon change impulses when not in round time
        if(round_handler_IsActive() && !round_handler_IsRoundStarted())
 +      if(imp == 17 || (imp >= 20 && imp < 200) || imp > 253)
                return;
  
        if (timeout_status == TIMEOUT_ACTIVE) //don't allow any impulses while the game is paused
                return;
-     
      if(self.vehicle)
          if(self.vehicle.deadflag == DEAD_NO)
              if(self.vehicle.vehicles_impusle)
                  if(self.vehicle.vehicles_impusle(imp))
                      return;
-     
        if(CheatImpulse(imp))
        {
        }
                        case 33:
                                if(self.deadflag == DEAD_NO && teamplay)
                                {
-                                       if not(MUTATOR_CALLHOOK(HelpMePing))
+                                       if (!MUTATOR_CALLHOOK(HelpMePing))
                                        {
                                                wp = WaypointSprite_Attach("helpme", TRUE, RADARICON_HELPME, '1 0.5 0');
                                                if(!wp)
                                case 104:
                                        e = navigation_findnearestwaypoint(self, FALSE);
                                        if (e)
-                                       if not(e.wpflags & WAYPOINTFLAG_GENERATED)
+                                       if (!(e.wpflags & WAYPOINTFLAG_GENERATED))
                                        {
                                                bprint(strcat("Waypoint removed at ",vtos(e.origin),"\n"));
                                                waypoint_remove(e);
                                                {
                                                        print("cannot reach me: ", etos(e), " ", vtos(e.origin), "\n");
                                                        e.colormod_x = 8;
-                                                       if not(e.effects & EF_NODEPTHTEST) // not already reported before
+                                                       if(!(e.effects & EF_NODEPTHTEST)) // not already reported before
                                                                ++m;
                                                        e.effects |= EF_NODEPTHTEST | EF_RED;
                                                        ++i;
diff --combined qcsrc/server/g_world.qc
index e7a3ad96cc0997be032fd1a3de40d4245dd87f3d,42c2d7a8e4e74cad37e0a1cacc88f0b74361fd6e..c51df593f0fd0eced190c73926e0089704b2d6ca
@@@ -253,7 -253,6 +253,6 @@@ void cvar_changes_init(
  
                // mapinfo
                BADCVAR("fraglimit");
-               BADCVAR("g_arena");
                BADCVAR("g_assault");
                BADCVAR("g_ca");
                BADCVAR("g_ca_teams");
  
                // does nothing visible
                BADCVAR("captureleadlimit_override");
-               BADCVAR("g_arena_point_leadlimit");
                BADCVAR("g_balance_kill_delay");
                BADCVAR("g_ca_point_leadlimit");
                BADCVAR("g_ctf_captimerecord_always");
                BADCVAR("sv_fraginfo");
                BADCVAR("sv_timeout");
                BADPREFIX("sv_timeout_");
-               BADCVAR("welcome_message_time");
                BADPREFIX("crypto_");
                BADPREFIX("g_chat_");
                BADPREFIX("g_ctf_captimerecord_");
                BADCVAR("g_nix");
                BADCVAR("g_grappling_hook");
                BADCVAR("g_jetpack");
-               
  #undef BADPREFIX
  #undef BADCVAR
  
@@@ -1049,6 -1046,8 +1046,8 @@@ float() MaplistMethod_Iterate = // usua
  {
        float pass, i;
  
+       dprint("Trying MaplistMethod_Iterate\n");
        for(pass = 1; pass <= 2; ++pass)
        {
                for(i = 1; i < Map_Count; ++i)
  
  float() MaplistMethod_Repeat = // fallback method
  {
+       dprint("Trying MaplistMethod_Repeat\n");
        if(Map_Check(Map_Current, 2))
                return Map_Current;
        return -2;
@@@ -1073,6 -1074,8 +1074,8 @@@ float() MaplistMethod_Random = // rando
  {
        float i, imax;
  
+       dprint("Trying MaplistMethod_Random\n");
        imax = 42;
  
        for(i = 0; i <= imax; ++i)
@@@ -1091,6 -1094,8 +1094,8 @@@ float(float exponent) MaplistMethod_Shu
  {
        float i, j, imax, insertpos;
  
+       dprint("Trying MaplistMethod_Shuffle\n");
        imax = 42;
  
        for(i = 0; i <= imax; ++i)
  void Maplist_Init()
  {
        Map_Count = tokenizebyseparator(autocvar_g_maplist, " ");
-       if(Map_Count == 0)
+       float i;
+       for (i = 0; i < Map_Count; ++i)
+               if (Map_Check(i, 2))
+                       break;
+       if (i == Map_Count)
        {
-               bprint( "Maplist is empty!  Resetting it to default map list.\n" );
-               cvar_set("g_maplist", MapInfo_ListAllAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
+               bprint( "Maplist contains no usable maps!  Resetting it to default map list.\n" );
+               cvar_set("g_maplist", MapInfo_ListAllAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags() | MAPINFO_FLAG_NOAUTOMAPLIST));
                if(autocvar_g_maplist_shuffle)
                        ShuffleMaplist();
                localcmd("\nmenu_cmd sync\n");
@@@ -1231,31 -1240,12 +1240,12 @@@ void GotoNextMap(float reinit
                return;
        alreadychangedlevel = TRUE;
  
-       {
-               string nextMap;
-               float allowReset;
-               for(allowReset = 1; allowReset >= 0; --allowReset)
-               {
-                       nextMap = GetNextMap();
-                       if(nextMap != "")
-                               break;
+       string nextMap;
  
-                       if(allowReset)
-                       {
-                               bprint( "Maplist contains no single playable map!  Resetting it to default map list.\n" );
-                               cvar_set("g_maplist", MapInfo_ListAllAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
-                               if(autocvar_g_maplist_shuffle)
-                                       ShuffleMaplist();
-                               localcmd("\nmenu_cmd sync\n");
-                       }
-                       else
-                       {
-                               error("Everything is broken - not even the default map list works. Please report this to the developers.");
-                       }
-               }
-               Map_Goto(reinit);
-       }
+       nextMap = GetNextMap();
+       if(nextMap == "")
+               error("Everything is broken - cannot find a next map. Please report this to the developers.");
+       Map_Goto(reinit);
  }
  
  
@@@ -1409,7 -1399,7 +1399,7 @@@ void DumpStats(float final
                {
                        s = strcat(":player:see-labels:", GetPlayerScoreString(other, 0), ":");
                        s = strcat(s, ftos(rint(time - other.jointime)), ":");
-                       if(IS_PLAYER(other) || g_arena || other.caplayer == 1 || g_lms)
+                       if(IS_PLAYER(other) || other.caplayer == 1 || g_lms)
                                s = strcat(s, ftos(other.team), ":");
                        else
                                s = strcat(s, "spectator:");
@@@ -1522,7 -1512,7 +1512,7 @@@ void NextLevel(
                PlayerStats_AddGlobalInfo(e);
        PlayerStats_Shutdown();
        WeaponStats_Shutdown();
-       
        Kill_Notification(NOTIF_ALL, world, MSG_CENTER, 0); // kill all centerprints now
  
        if(autocvar_sv_eventlog)
@@@ -1863,7 -1853,7 +1853,7 @@@ float WinningCondition_Scores(float lim
        if(WinningConditionHelper_zeroisworst)
                leadlimit = 0; // not supported in this mode
  
-       if(g_dm || g_tdm || g_arena || g_ca || g_freezetag || (g_race && !g_race_qualifying) || g_nexball)
 -      if(g_dm || g_tdm || g_ca || (g_race && !g_race_qualifying) || g_nexball)
++      if(g_dm || g_tdm || g_ca || g_freezetag || (g_race && !g_race_qualifying) || g_nexball)
        // these modes always score in increments of 1, thus this makes sense
        {
                if(leaderfrags != WinningConditionHelper_topscore)
@@@ -2246,7 -2236,7 +2236,7 @@@ string MapVote_Suggest(string m
        if(mapvote_initialized)
                return "Can't suggest - voting is already in progress!";
        m = MapInfo_FixName(m);
-       if not(m)
+       if (!m)
                return "The map you suggested is not available on this server.";
        if(!autocvar_g_maplist_votable_suggestions_override_mostrecent)
                if(Map_IsRecent(m))
index 0a89494a21735a5d5995ed9106e2afb6c66f05c1,9fbd483cabacd754e3fc22063d322533923aa9ae..9df6b42a219645e9f0d09a959dba94211bdb2108
@@@ -144,7 -144,6 +144,7 @@@ MUTATOR_HOOKFUNCTION(ca_PutClientInServ
        if(!allowed_to_spawn)
        {
                self.classname = "observer";
 +              if(self.jointime != time) //not when connecting
                if(!self.caplayer)
                {
                        self.caplayer = 0.5;
@@@ -159,7 -158,6 +159,7 @@@ MUTATOR_HOOKFUNCTION(ca_reset_map_playe
  {
        FOR_EACH_CLIENT(self)
        {
 +              self.killcount = 0;
                if(self.caplayer)
                {
                        self.classname = "player";
@@@ -184,8 -182,12 +184,8 @@@ MUTATOR_HOOKFUNCTION(ca_reset_map_globa
  
  MUTATOR_HOOKFUNCTION(ca_GetTeamCount)
  {
 -      ca_teams = autocvar_g_ca_teams_override;
 -      if(ca_teams < 2)
 -              ca_teams = autocvar_g_ca_teams;
 -      ca_teams = bound(2, ca_teams, 4);
        ret_float = ca_teams;
 -      return 1;
 +      return 0;
  }
  
  MUTATOR_HOOKFUNCTION(ca_PlayerDies)
@@@ -222,14 -224,16 +222,14 @@@ MUTATOR_HOOKFUNCTION(ca_GiveFragsForKil
  
  MUTATOR_HOOKFUNCTION(ca_SetStartItems)
  {
 -      start_health = cvar("g_lms_start_health");
 -      start_armorvalue = cvar("g_lms_start_armor");
 -
 -      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");
 -
        start_items &= ~IT_UNLIMITED_AMMO;
 +      start_health       = warmup_start_health       = cvar("g_lms_start_health");
 +      start_armorvalue   = warmup_start_armorvalue   = cvar("g_lms_start_armor");
 +      start_ammo_shells  = warmup_start_ammo_shells  = cvar("g_lms_start_ammo_shells");
 +      start_ammo_nails   = warmup_start_ammo_nails   = cvar("g_lms_start_ammo_nails");
 +      start_ammo_rockets = warmup_start_ammo_rockets = cvar("g_lms_start_ammo_rockets");
 +      start_ammo_cells   = warmup_start_ammo_cells   = cvar("g_lms_start_ammo_cells");
 +      start_ammo_fuel    = warmup_start_ammo_fuel    = cvar("g_lms_start_ammo_fuel");
  
        return 0;
  }
@@@ -240,9 -244,9 +240,9 @@@ MUTATOR_HOOKFUNCTION(ca_PlayerDamage
        if(frag_target.deadflag == DEAD_NO)
        if(frag_target == frag_attacker || SAME_TEAM(frag_target, frag_attacker) || frag_deathtype == DEATH_FALL)
                frag_damage = 0;
-               
        frag_mirrordamage = 0;
-               
        return FALSE;
  }
  
@@@ -251,34 -255,40 +251,34 @@@ MUTATOR_HOOKFUNCTION(ca_FilterItem
        if(autocvar_g_powerups <= 0)
        if(self.flags & FL_POWERUP)
                return TRUE;
-               
        if(autocvar_g_pickup_items <= 0)
                return TRUE;
-               
        return FALSE;
  }
  
  MUTATOR_HOOKFUNCTION(ca_PlayerDamage_SplitHealthArmor)
  {
        float excess = max(0, frag_damage - damage_take - damage_save);
-       
        if(frag_target != frag_attacker && IS_PLAYER(frag_attacker))
                PlayerTeamScore_Add(frag_attacker, SP_SCORE, ST_SCORE, (frag_damage - excess) * autocvar_g_ca_damage2score_multiplier);
-               
        return FALSE;
  }
  
 -// scoreboard setup
 -void ca_ScoreRules()
 -{
 -      ScoreRules_basics(2, SFL_SORT_PRIO_PRIMARY, 0, TRUE);
 -      ScoreInfo_SetLabel_TeamScore  (ST_CA_ROUNDS,    "rounds",    SFL_SORT_PRIO_PRIMARY);
 -      ScoreRules_basics_end();
 -}
 -
 -void ca_DelayedInit() // Do this check with a delay so we can wait for teams to be set up.
 -{
 -      ca_ScoreRules();
 -}
 -
  void ca_Initialize()
  {
        allowed_to_spawn = TRUE;
  
 +      ca_teams = autocvar_g_ca_teams_override;
 +      if(ca_teams < 2)
 +              ca_teams = autocvar_g_ca_teams;
 +      ca_teams = bound(2, ca_teams, 4);
 +      ret_float = ca_teams;
 +      ScoreRules_ca(ca_teams);
 +
        round_handler_Spawn(CA_CheckTeams, CA_CheckWinner, CA_RoundStart);
        round_handler_Init(5, autocvar_g_ca_warmup, autocvar_g_ca_round_timelimit);
  
        addstat(STAT_BLUEALIVE, AS_INT, bluealive_stat);
        addstat(STAT_YELLOWALIVE, AS_INT, yellowalive_stat);
        addstat(STAT_PINKALIVE, AS_INT, pinkalive_stat);
 -
 -      InitializeEntity(world, ca_DelayedInit, INITPRIO_GAMETYPE);
  }
  
  MUTATOR_DEFINITION(gamemode_ca)
index 406cf07ced4f6a7b70b7dbf5c0af123641619374,9bc06522374aaae4e22b810d3c1a73afbaf3b46c..bfc2601e9a8884a06203f5215a2a530c62142a66
@@@ -100,10 -100,7 +100,10 @@@ float freezetag_CheckWinner(
                Send_Notification(NOTIF_ALL, world, MSG_CENTER, CENTER_ROUND_OVER);
                Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_ROUND_OVER);
                FOR_EACH_PLAYER(e)
 +              {
                        e.freezetag_frozen_timeout = 0;
 +                      e.freezetag_revive_progress = 0;
 +              }
                round_handler_Init(5, autocvar_g_freezetag_warmup, autocvar_g_freezetag_round_timelimit);
                return 1;
        }
        }
  
        FOR_EACH_PLAYER(e)
 +      {
                e.freezetag_frozen_timeout = 0;
 +              e.freezetag_revive_progress = 0;
 +      }
        round_handler_Init(5, autocvar_g_freezetag_warmup, autocvar_g_freezetag_round_timelimit);
        return 1;
  }
@@@ -407,7 -401,6 +407,7 @@@ MUTATOR_HOOKFUNCTION(freezetag_reset_ma
  {
        FOR_EACH_PLAYER(self)
        {
 +              self.killcount = 0;
                if (self.freezetag_frozen)
                        freezetag_Unfreeze(world);
                self.freezetag_frozen_timeout = -1;
@@@ -475,10 -468,7 +475,10 @@@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPr
        if(n && self.freezetag_frozen) // OK, there is at least one teammate reviving us
        {
                self.freezetag_revive_progress = bound(0, self.freezetag_revive_progress + frametime * max(1/60, autocvar_g_freezetag_revive_speed), 1);
 -              self.health = max(1, self.freezetag_revive_progress * autocvar_g_balance_health_start);
 +              if(warmup_stage)
 +                      self.health = max(1, self.freezetag_revive_progress * warmup_start_health);
 +              else
 +                      self.health = max(1, self.freezetag_revive_progress * start_health);
  
                if(self.freezetag_revive_progress >= 1)
                {
        else if(!n && self.freezetag_frozen) // only if no teammate is nearby will we reset
        {
                self.freezetag_revive_progress = bound(0, self.freezetag_revive_progress - frametime * autocvar_g_freezetag_revive_clearspeed, 1);
 -              self.health = max(1, self.freezetag_revive_progress * autocvar_g_balance_health_start);
 +              if(warmup_stage)
 +                      self.health = max(1, self.freezetag_revive_progress * warmup_start_health);
 +              else
 +                      self.health = max(1, self.freezetag_revive_progress * start_health);
        }
        else if(!n)
        {
@@@ -544,7 -531,7 +544,7 @@@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPh
                }
                else
                        self.movement = '0 0 0';
-                       
                self.disableclientprediction = 1;
        }
        return 1;
@@@ -564,7 -551,7 +564,7 @@@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDa
                        Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_FREEZETAG_REVIVED_FALL, frag_target.netname);
                        Send_Notification(NOTIF_ONE, frag_target, MSG_CENTER, CENTER_FREEZETAG_REVIVE_FALL);
                }
-       
                frag_damage = 0;
                frag_force = frag_force * autocvar_g_freezetag_frozen_force;
        }
@@@ -575,7 -562,7 +575,7 @@@ MUTATOR_HOOKFUNCTION(freezetag_PlayerJu
  {
        if(self.freezetag_frozen)
                return TRUE; // no jumping in freezetag when frozen
-       
        return FALSE;
  }
  
@@@ -595,7 -582,7 +595,7 @@@ MUTATOR_HOOKFUNCTION(freezetag_ItemTouc
  
  MUTATOR_HOOKFUNCTION(freezetag_BotRoles)
  {
-       if not(self.deadflag)
+       if (!self.deadflag)
        {
                if (random() < 0.5)
                        self.havocbot_role = havocbot_role_ft_freeing;
@@@ -615,6 -602,10 +615,6 @@@ MUTATOR_HOOKFUNCTION(freezetag_Spectate
  
  MUTATOR_HOOKFUNCTION(freezetag_GetTeamCount)
  {
 -      freezetag_teams = autocvar_g_freezetag_teams_override;
 -      if(freezetag_teams < 2)
 -              freezetag_teams = autocvar_g_freezetag_teams;
 -      freezetag_teams = bound(2, freezetag_teams, 4);
        ret_float = freezetag_teams;
        return 0;
  }
@@@ -623,19 -614,14 +623,19 @@@ MUTATOR_HOOKFUNCTION(freezetag_VehicleT
  {
        if(other.freezetag_frozen)
                return TRUE;
-               
        return FALSE;
  }
  
  void freezetag_Initialize()
  {
        precache_model("models/ice/ice.md3");
 -      ScoreRules_freezetag();
 +
 +      freezetag_teams = autocvar_g_freezetag_teams_override;
 +      if(freezetag_teams < 2)
 +              freezetag_teams = autocvar_g_freezetag_teams;
 +      freezetag_teams = bound(2, freezetag_teams, 4);
 +      ScoreRules_freezetag(freezetag_teams);
  
        round_handler_Spawn(freezetag_CheckTeams, freezetag_CheckWinner, func_null);
        round_handler_Init(5, autocvar_g_freezetag_warmup, autocvar_g_freezetag_round_timelimit);
index 850b4e21e261598300d624f31f218d68cd6e2f72,928c78b349470e078d3f22eacf4a2ffb377cd6b0..e782fbf7b7e18c5ded767c0105b660f6030afeba
@@@ -22,7 -22,7 +22,7 @@@ MUTATOR_HOOKFUNCTION(lms_ResetMap
  {
        lms_lowest_lives = 999;
        lms_next_place = player_count;
-       
        return FALSE;
  }
  
@@@ -32,7 -32,7 +32,7 @@@ MUTATOR_HOOKFUNCTION(lms_ResetPlayers
        FOR_EACH_CLIENT(self)
        if(IS_PLAYER(self))
                PlayerScore_Add(self, SP_LMS_LIVES, LMS_NewPlayerLives());
-       
        return FALSE;
  }
  
@@@ -49,7 -49,7 +49,7 @@@ MUTATOR_HOOKFUNCTION(lms_PlayerPreSpawn
  MUTATOR_HOOKFUNCTION(lms_PlayerDies)
  {
        self.respawn_flags |= RESPAWN_FORCE;
-       
        return FALSE;
  }
  
@@@ -60,13 -60,13 +60,13 @@@ MUTATOR_HOOKFUNCTION(lms_RemovePlayer
                self.frags = FRAGS_SPECTATOR;
        else
                self.frags = FRAGS_LMS_LOSER;
-               
        if(self.killcount != -666)
                if(PlayerScore_Add(self, SP_LMS_RANK, 0) > 0 && self.lms_spectate_warning != 2)
                        Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_LMS_NOLIVES, self.netname);
                else
                        Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_LMS_FORFEIT, self.netname);
-               
        return FALSE;
  }
  
@@@ -74,13 -74,13 +74,13 @@@ MUTATOR_HOOKFUNCTION(lms_ClientConnect
  {
        self.classname = "player";
        campaign_bots_may_start = 1;
-       
        if(PlayerScore_Add(self, SP_LMS_LIVES, LMS_NewPlayerLives()) <= 0)
        {
                PlayerScore_Add(self, SP_LMS_RANK, 666);
                self.frags = FRAGS_SPECTATOR;
        }
-                       
        return FALSE;
  }
  
@@@ -88,7 -88,7 +88,7 @@@ MUTATOR_HOOKFUNCTION(lms_PlayerThink
  {
        if(self.deadflag == DEAD_DYING)
                self.deadflag = DEAD_RESPAWNING;
-               
        return FALSE;
  }
  
@@@ -115,20 -115,20 +115,20 @@@ MUTATOR_HOOKFUNCTION(lms_GiveFragsForKi
                --lms_next_place;
        }
        frag_score = 0;
-               
        return TRUE;
  }
  
  MUTATOR_HOOKFUNCTION(lms_SetStartItems)
  {
        start_items &= ~IT_UNLIMITED_AMMO;
 -      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");
 -      start_health = cvar("g_lms_start_health");
 -      start_armorvalue = cvar("g_lms_start_armor");
 +      start_health       = warmup_start_health       = cvar("g_lms_start_health");
 +      start_armorvalue   = warmup_start_armorvalue   = cvar("g_lms_start_armor");
 +      start_ammo_shells  = warmup_start_ammo_shells  = cvar("g_lms_start_ammo_shells");
 +      start_ammo_nails   = warmup_start_ammo_nails   = cvar("g_lms_start_ammo_nails");
 +      start_ammo_rockets = warmup_start_ammo_rockets = cvar("g_lms_start_ammo_rockets");
 +      start_ammo_cells   = warmup_start_ammo_cells   = cvar("g_lms_start_ammo_cells");
 +      start_ammo_fuel    = warmup_start_ammo_fuel    = cvar("g_lms_start_ammo_fuel");
  
        return FALSE;
  }
@@@ -147,7 -147,7 +147,7 @@@ MUTATOR_HOOKFUNCTION(lms_FilterItem
                self.max_health = 1;
                return FALSE;
        }
-       
        return TRUE;
  }
  
@@@ -159,7 -159,7 +159,7 @@@ MUTATOR_HOOKFUNCTION(lms_ItemTouch
                Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_EXTRALIVES);
                PlayerScore_Add(other, SP_LMS_LIVES, autocvar_g_lms_extra_lives);
        }
-       
        return MUT_ITEMTOUCH_CONTINUE;
  }
  
@@@ -176,7 -176,7 +176,7 @@@ void lms_Initialize(
  {
        lms_lowest_lives = 9999;
        lms_next_place = 0;
-       
        lms_ScoreRules();
  }
  
index e3649f611b0df0d7188028d9b8e885157a4c809e,b57666a6899ece808ef529f8267a721c2da41ee0..c55195c8375597551638a1e6ee4a1cbef561e1f6
@@@ -17,12 -17,12 +17,12 @@@ void ScoreRules_basics(float teams, flo
        if(score_enabled)
                ScoreInfo_SetLabel_TeamScore  (ST_SCORE,        "score",     stprio);
  
-       if not(INDEPENDENT_PLAYERS)
+       if (!INDEPENDENT_PLAYERS)
                ScoreInfo_SetLabel_PlayerScore(SP_KILLS,        "kills",     0);
  
        ScoreInfo_SetLabel_PlayerScore(SP_DEATHS,       "deaths",    SFL_LOWER_IS_BETTER);
  
-       if not(INDEPENDENT_PLAYERS)
+       if (!INDEPENDENT_PLAYERS)
                ScoreInfo_SetLabel_PlayerScore(SP_SUICIDES,     "suicides",  SFL_LOWER_IS_BETTER);
  
        if(score_enabled)
@@@ -106,18 -106,12 +106,18 @@@ void ScoreRules_nexball(float teams
        ScoreRules_basics_end();
  }
  
 -// FreezeTag stuff
  #define SP_FREEZETAG_REVIVALS 4
 -void ScoreRules_freezetag()
 +void ScoreRules_freezetag(float teams)
  {
 -      CheckAllowedTeams(world);
 -      ScoreRules_basics(((c4>=0) ? 4 : (c3>=0) ? 3 : 2), SFL_SORT_PRIO_PRIMARY, SFL_SORT_PRIO_PRIMARY, TRUE); // SFL_SORT_PRIO_PRIMARY
 +      ScoreRules_basics(teams, SFL_SORT_PRIO_PRIMARY, SFL_SORT_PRIO_PRIMARY, TRUE); // SFL_SORT_PRIO_PRIMARY
        ScoreInfo_SetLabel_PlayerScore(SP_FREEZETAG_REVIVALS,           "revivals",             0);
        ScoreRules_basics_end();
  }
 +
 +#define ST_CA_ROUNDS 1
 +void ScoreRules_ca(float teams)
 +{
 +      ScoreRules_basics(teams, SFL_SORT_PRIO_PRIMARY, 0, TRUE);
 +      ScoreInfo_SetLabel_TeamScore(ST_CA_ROUNDS, "rounds", SFL_SORT_PRIO_PRIMARY);
 +      ScoreRules_basics_end();
 +}
diff --combined qcsrc/server/teamplay.qc
index a9ce5499b663897acd644be18c08d24a6b3b2c17,5185b2c611a639093d1f343911182e98d8009cf3..49e824ff0ddaecac78580cb648df75d026f9fc53
@@@ -56,7 -56,7 +56,7 @@@ void InitGameplayMode(
        teamplay = 0;
        serverflags &= ~SERVERFLAG_TEAMPLAY;
  
-       if not(cvar_value_issafe(world.fog))
+       if (!cvar_value_issafe(world.fog))
        {
                print("The current map contains a potentially harmful fog setting, ignored\n");
                world.fog = string_null;
                MUTATOR_ADD(gamemode_lms);
        }
  
-       if(g_arena)
-       {
-               fraglimit_override = autocvar_g_arena_point_limit;
-               leadlimit_override = autocvar_g_arena_point_leadlimit;
-               MUTATOR_ADD(gamemode_arena);
-       }
        if(g_ca)
        {
                ActivateTeamplay();
                fraglimit_override = autocvar_g_ca_point_limit;
                leadlimit_override = autocvar_g_ca_point_leadlimit;
                MUTATOR_ADD(gamemode_ca);
 +              if(autocvar_g_ca_team_spawns)
 +                      have_team_spawns = -1; // request team spawns
        }
  
        if(g_keyhunt)
                fraglimit_override = autocvar_g_freezetag_point_limit;
                leadlimit_override = autocvar_g_freezetag_point_leadlimit;
                MUTATOR_ADD(gamemode_freezetag);
 +              if(autocvar_g_freezetag_team_spawns)
 +                      have_team_spawns = -1; // request team spawns
        }
  
        if(g_assault)
          have_team_spawns = -1; // request team spawns
            MUTATOR_ADD(gamemode_nexball);
        }
-         
        if(g_keepaway)
        {
                MUTATOR_ADD(gamemode_keepaway);
@@@ -604,7 -593,7 +597,7 @@@ float TeamSmallerEqThanTeam(float ta, f
                        cb -= cbb * 0.999;
                }
        }
-       
        // keep teams alive (teams of size 0 always count as smaller, ignoring score)
        if(ca < 1)
                if(cb >= 1)
@@@ -675,7 -664,7 +668,7 @@@ float FindSmallestTeam(entity pl, floa
                GetTeamCounts(world);
  
        RandomSelection_Init();
-       
        t = 1;
        if(TeamSmallerEqThanTeam(2, t, pl))
                t = 2;