BADCVAR("g_domination");
BADCVAR("g_domination_default_teams");
BADCVAR("g_duel");
+ BADCVAR("g_duel_not_dm_maps");
BADCVAR("g_freezetag");
BADCVAR("g_freezetag_teams");
BADCVAR("g_invasion_teams");
BADCVAR("g_shootfromeye");
BADCVAR("g_snafu");
BADCVAR("g_tdm");
+ BADCVAR("g_tdm_on_dm_maps");
BADCVAR("g_tdm_teams");
BADCVAR("g_vip");
BADCVAR("leadlimit");
BADCVAR("teamplay");
BADCVAR("timelimit");
BADCVAR("g_mapinfo_ignore_warnings");
+ BADCVAR("g_maplist_ignore_sizes");
+ BADCVAR("g_maplist_sizes_count_bots");
// long
BADCVAR("hostname");
BADCVAR("captureleadlimit_override");
BADCVAR("condump_stripcolors");
BADCVAR("gameversion");
+ BADCVAR("fs_gamedir");
BADCVAR("g_allow_oldvortexbeam");
BADCVAR("g_balance_kill_delay");
BADCVAR("g_buffs_pickup_anyway");
BADCVAR("g_buffs_randomize");
+ BADCVAR("g_buffs_randomize_teamplay");
BADCVAR("g_campcheck_distance");
BADCVAR("g_ca_point_leadlimit");
BADCVAR("g_ca_point_limit");
BADCVAR("g_ctf_captimerecord_always");
BADCVAR("g_ctf_flag_glowtrails");
+ BADCVAR("g_ctf_dynamiclights");
BADCVAR("g_ctf_flag_pickup_verbosename");
BADCVAR("g_domination_point_leadlimit");
BADCVAR("g_forced_respawn");
BADCVAR("g_jump_grunt");
BADCVAR("g_keyhunt_point_leadlimit");
BADCVAR("g_nexball_goalleadlimit");
+ BADCVAR("g_new_toys_autoreplace");
BADCVAR("g_new_toys_use_pickupsound");
BADCVAR("g_physics_predictall");
BADCVAR("g_piggyback");
BADCVAR("sv_damagetext");
BADCVAR("sv_db_saveasdump");
BADCVAR("sv_intermission_cdtrack");
+ BADCVAR("sv_mapchange_delay");
BADCVAR("sv_minigames");
BADCVAR("sv_namechangetimer");
BADCVAR("sv_precacheplayermodels");
BADCVAR("g_ban_sync_uri");
BADCVAR("g_buffs");
BADCVAR("g_ca_teams_override");
+ BADCVAR("g_ctf_fullbrightflags");
BADCVAR("g_ctf_ignore_frags");
BADCVAR("g_ctf_leaderboard");
BADCVAR("g_domination_point_limit");
BADCVAR("g_physics_clientselect");
BADCVAR("g_pinata");
BADCVAR("g_powerups");
+ BADCVAR("g_player_brightness");
+ BADCVAR("g_rocket_flying");
+ BADCVAR("g_rocket_flying_disabledelays");
BADCVAR("g_spawnshieldtime");
BADCVAR("g_start_delay");
BADCVAR("g_superspectate");
BADCVAR("g_ca_weaponarena");
BADCVAR("g_freezetag_weaponarena");
BADCVAR("g_lms_weaponarena");
+ BADCVAR("g_ctf_stalemate_time");
+
+ if(cvar_string("g_mod_balance") == "Testing")
+ {
+ // (temporary) while using the Testing balance, any weapon balance cvars are allowed to be changed
+ BADPREFIX("g_balance_");
+ }
#undef BADPRESUFFIX
#undef BADPREFIX
if(this.spawnflags & SPAWNFLAG_NO_WAYPOINTS_FOR_ITEMS)
bot_waypoints_for_items = 0;
- precache();
-
WaypointSprite_Init();
GameLogInit(); // prepare everything
MapInfo_Enumerate();
MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 1);
+ if(fexists(strcat("scripts/", mapname, ".arena")))
+ cvar_settemp("sv_q3acompat_machineshotgunswap", "1");
+
+ if(fexists(strcat("scripts/", mapname, ".defi")))
+ cvar_settemp("sv_q3defragcompat", "1");
+
if(whichpack(strcat("maps/", mapname, ".cfg")) != "")
{
int fd = fopen(strcat("maps/", mapname, ".cfg"), FILE_READ);
// physics/balance/config changes that count as mod
if(cvar_string("g_mod_physics") != cvar_defstring("g_mod_physics"))
modname = cvar_string("g_mod_physics");
- if(cvar_string("g_mod_balance") != cvar_defstring("g_mod_balance"))
+ if(cvar_string("g_mod_balance") != cvar_defstring("g_mod_balance") && cvar_string("g_mod_balance") != "Testing")
modname = cvar_string("g_mod_balance");
if(cvar_string("g_mod_config") != cvar_defstring("g_mod_config"))
modname = cvar_string("g_mod_config");
// open map size restriction file
string opensize_msg = strcat("opensize ", map);
float fh = fopen(strcat("maps/", map, ".sizes"), FILE_READ);
+ int pcount = player_count;
+ if(!autocvar_g_maplist_sizes_count_bots)
+ pcount -= currentbots;
if(fh >= 0)
{
opensize_msg = strcat(opensize_msg, ": ok, ");
int mapmin = stoi(fgets(fh));
int mapmax = stoi(fgets(fh));
fclose(fh);
- if(player_count < mapmin)
+ if(pcount < mapmin)
{
LOG_TRACE(opensize_msg, "not enough");
return false;
}
- if(mapmax && player_count > mapmax)
+ if(mapmax && pcount > mapmax)
{
LOG_TRACE(opensize_msg, "too many");
return false;
break;
}
}
-
+
if (i == Map_Count)
{
bprint( "Maplist contains no usable maps! Resetting it to default map list.\n" );
MapVote_Start();
}
-/*
-============
-FindIntermission
-
-Returns the entity to view from
-============
-*/
-/*
-entity FindIntermission()
-{
- local entity spot;
- local float cyc;
-
-// look for info_intermission first
- spot = find(NULL, classname, "info_intermission");
- if (spot)
- { // pick a random one
- cyc = random() * 4;
- while (cyc > 1)
- {
- spot = find(spot, classname, "info_intermission");
- if (!spot)
- spot = find(spot, classname, "info_intermission");
- cyc = cyc - 1;
- }
- return spot;
- }
-
-// then look for the start position
- spot = find(NULL, classname, "info_player_start");
- if (spot)
- return spot;
-
-// testinfo_player_start is only found in regioned levels
- spot = find(NULL, classname, "testplayerstart");
- if (spot)
- return spot;
-
-// then look for the start position
- spot = find(NULL, classname, "info_player_deathmatch");
- if (spot)
- return spot;
-
- //objerror ("FindIntermission: no spot");
- return NULL;
-}
-*/
-
/*
===============================================================================
cvar_set("g_maplist", shufflewords(autocvar_g_maplist));
}
-float leaderfrags;
+float leaderscore;
+float secondscore;
+int fragsleft_last;
float WinningCondition_Scores(float limit, float leadlimit)
{
float limitreached;
if(MUTATOR_CALLHOOK(Scores_CountFragsRemaining))
// these modes always score in increments of 1, thus this makes sense
{
- if(leaderfrags != WinningConditionHelper_topscore)
+ if (leaderscore != WinningConditionHelper_topscore ||
+ secondscore != WinningConditionHelper_secondscore)
{
- leaderfrags = WinningConditionHelper_topscore;
+ int fragsleft = 0;
+
+ leaderscore = WinningConditionHelper_topscore;
+ secondscore = WinningConditionHelper_secondscore;
if (limit)
{
- if (leaderfrags == limit - 1)
+ if (leaderscore == limit - 1)
+ fragsleft |= BIT(1);
+ else if (leaderscore == limit - 2)
+ fragsleft |= BIT(2);
+ else if (leaderscore == limit - 3)
+ fragsleft |= BIT(3);
+ }
+ if (leadlimit)
+ {
+ if (leaderscore == leadlimit + secondscore - 1)
+ fragsleft |= BIT(1);
+ else if (leaderscore == leadlimit + secondscore - 2)
+ fragsleft |= BIT(2);
+ else if (leaderscore == leadlimit + secondscore - 3)
+ fragsleft |= BIT(3);
+ }
+
+ fragsleft = fragsleft & -fragsleft; // least significant bit where 1 is set
+
+ if (fragsleft_last != fragsleft) // do not announce same remaining frags multiple times
+ {
+ if (fragsleft & BIT(1))
Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_1);
- else if (leaderfrags == limit - 2)
+ else if (fragsleft & BIT(2))
Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_2);
- else if (leaderfrags == limit - 3)
+ else if (fragsleft & BIT(3))
Send_Notification(NOTIF_ALL, NULL, MSG_ANNCE, ANNCE_REMAINING_FRAG_3);
+
+ fragsleft_last = fragsleft;
}
}
}
return "Map switch will happen after scoreboard.";
}
-bool autocvar_sv_gameplayfix_multiplethinksperframe;
+bool autocvar_sv_gameplayfix_multiplethinksperframe = true;
void RunThink(entity this)
{
// don't let things stay in the past.
}
bool autocvar_sv_freezenonclients;
-bool autocvar_sv_gameplayfix_delayprojectiles;
+bool autocvar_sv_gameplayfix_delayprojectiles = false;
void Physics_Frame()
{
if(autocvar_sv_freezenonclients)
return;
- FOREACH_ENTITY_FLOAT(pure_data, false,
+ IL_EACH(g_moveables, true,
{
if(IS_CLIENT(it) || it.classname == "" || it.move_movetype == MOVETYPE_PUSH || it.move_movetype == MOVETYPE_FAKEPUSH || it.move_movetype == MOVETYPE_PHYSICS)
continue;
if(autocvar_sv_gameplayfix_delayprojectiles >= 0)
return;
- FOREACH_ENTITY_FLOAT(move_qcphysics, true,
+ IL_EACH(g_moveables, it.move_qcphysics,
{
if(IS_CLIENT(it) || is_pure(it) || it.classname == "" || it.move_movetype == MOVETYPE_NONE)
continue;
else
db_save(ServerProgsDB, strcat("server.db", autocvar_sessionid));
}
- if(autocvar_developer)
+ if(autocvar_developer > 0)
{
if(autocvar_sv_db_saveasdump)
db_dump(TemporaryDB, "server-temp.db");