From 87512bb6ad972ecb01fb0c6aae9386f8c0ca0ea9 Mon Sep 17 00:00:00 2001 From: div0 Date: Sun, 12 Jul 2009 12:02:49 +0000 Subject: [PATCH] bye bye "Race", hello "CTS" and "Race" (in mapinfo: rc) git-svn-id: svn://svn.icculus.org/nexuiz/trunk@7201 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/defaultNexuiz.cfg | 12 +++---- data/maps/racetrack.mapinfo | 2 +- data/qcsrc/client/sbar.qc | 2 +- data/qcsrc/common/constants.qh | 1 + data/qcsrc/common/mapinfo.qc | 46 +++++++++++++++++++------ data/qcsrc/common/mapinfo.qh | 1 + data/qcsrc/server/cl_client.qc | 2 +- data/qcsrc/server/clientcommands.qc | 10 +++--- data/qcsrc/server/constants.qh | 2 +- data/qcsrc/server/defs.qh | 2 +- data/qcsrc/server/g_world.qc | 5 +-- data/qcsrc/server/havocbot_roles.qc | 2 +- data/qcsrc/server/miscfunctions.qc | 7 ++-- data/qcsrc/server/race.qc | 15 ++++---- data/qcsrc/server/race.qh | 1 + data/qcsrc/server/t_teleporters.qc | 2 +- data/qcsrc/server/teamplay.qc | 53 +++++++++++++++++++++-------- 17 files changed, 110 insertions(+), 55 deletions(-) diff --git a/data/defaultNexuiz.cfg b/data/defaultNexuiz.cfg index bbf3da47b..0999e74a8 100644 --- a/data/defaultNexuiz.cfg +++ b/data/defaultNexuiz.cfg @@ -24,7 +24,7 @@ alias if_dedicated "_detect_dedicated_$qport $*" seta g_configversion 0 "Configuration file version (used to upgrade settings) 0: first run, or previous start was <2.4.1 Later, it's overridden by config.cfg, version ranges are defined in config_update.cfg" // default.cfg versioning (update using update-cvarcount.sh, run that every time after adding a new cvar) -set cvar_check_default 9b8ca48c50d9e2af73245655fdb29b04 +set cvar_check_default 1247e8cd8be7bda1c260795d5bebb20b // Nexuiz version (formatted for machines) // used to determine if a client version is compatible @@ -667,13 +667,13 @@ set g_assault 0 "Assault: attack the enemy base as fast as you can, then defend // race set g_race 0 "Race: be faster than your opponents" -set g_race_qualifying 2 -// Qualifying uses timelimit, and the one with the best time wins. Fraglimit is nonfunctional then. -// Normal race uses fraglimit as a limit for the laps. -// Special mode: g_race_qualifying 2. First runs a qualifying, after -// ready-restart it turns into a race. TODO not done yet (e.g. timing display) +set g_race_qualifying_timelimit 0 +set g_race_qualifying_timelimit_override -1 set g_race_teams 0 "when 2, 3, or 4, the race is played as a team game (the team members can add up their laps)" +// cts +set g_cts 0 "CTS: complete the stage" + // nexball set g_nexball 0 "Nexball: Basketball and Soccer go Nexuiz" diff --git a/data/maps/racetrack.mapinfo b/data/maps/racetrack.mapinfo index 09163f2a0..90ced4b93 100644 --- a/data/maps/racetrack.mapinfo +++ b/data/maps/racetrack.mapinfo @@ -4,5 +4,5 @@ author Morphed _diameter 9083.417969 _spawnpoints 0 has weapons -type race 5 20 15 +type rc 20 5 7 15 cdtrack 7 diff --git a/data/qcsrc/client/sbar.qc b/data/qcsrc/client/sbar.qc index 4321aa581..add543b6d 100644 --- a/data/qcsrc/client/sbar.qc +++ b/data/qcsrc/client/sbar.qc @@ -1458,7 +1458,7 @@ void Sbar_Score(float margin) Sbar_DrawXNum(topright - '36 0 0' - '3 0 0' + '0 2 0', seconds, -2, 18, timer_color, 0, 0, sbar_alpha_fg, DRAWFLAG_NORMAL); } - if(gametype == GAME_RACE) + if(gametype == GAME_RACE || gametype == GAME_CTS) { drawfont = sbar_bigfont; float a, t; diff --git a/data/qcsrc/common/constants.qh b/data/qcsrc/common/constants.qh index e0129e293..06ebc5ebf 100644 --- a/data/qcsrc/common/constants.qh +++ b/data/qcsrc/common/constants.qh @@ -37,6 +37,7 @@ const float GAME_ASSAULT = 9; const float GAME_ONSLAUGHT = 10; const float GAME_RACE = 11; const float GAME_NEXBALL = 12; +const float GAME_CTS = 13; const float AS_STRING = 1; const float AS_INT = 2; diff --git a/data/qcsrc/common/mapinfo.qc b/data/qcsrc/common/mapinfo.qc index 8e20d9121..6669b97e3 100644 --- a/data/qcsrc/common/mapinfo.qc +++ b/data/qcsrc/common/mapinfo.qc @@ -348,12 +348,8 @@ float _MapInfo_Generate(string pFilename) // 0: failure, 1: ok ent, 2: ok bsp } else if(k == "race_place") { - if(v == "1") - spawnplaces |= 1; - else if(v == "2") - spawnplaces |= 2; - else if(v == "3") - spawnplaces |= 4; + if(stof(v) > 0) + spawnplaces = 1; } else if(k == "classname") { @@ -418,8 +414,11 @@ float _MapInfo_Generate(string pFilename) // 0: failure, 1: ok ent, 2: ok bsp } if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_RACE) - if(spawnplaces != 7) - MapInfo_Map_flags |= MAPINFO_FLAG_FRUSTRATING; + if(!spawnplaces) + { + MapInfo_Map_supportedGametypes &~= MAPINFO_TYPE_RACE; + MapInfo_Map_supportedGametypes |= MAPINFO_TYPE_CTS; + } dprint("-> diameter ", ftos(diameter)); dprint("; spawnpoints ", ftos(spawnpoints)); @@ -451,7 +450,7 @@ void _MapInfo_Map_ApplyGametype(string s, float pWantedType, float pThisType) if(!(pThisType & pWantedType)) return; - if(pWantedType == MAPINFO_TYPE_ASSAULT || pWantedType == MAPINFO_TYPE_ONSLAUGHT) // these modes don't use fraglimit + if(pWantedType == MAPINFO_TYPE_ASSAULT || pWantedType == MAPINFO_TYPE_ONSLAUGHT || pWantedType == MAPINFO_TYPE_RACE || pWantedType == MAPINFO_TYPE_CTS) // these modes don't use fraglimit { cvar_set("fraglimit", "0"); } @@ -486,7 +485,25 @@ void _MapInfo_Map_ApplyGametype(string s, float pWantedType, float pThisType) s = cdr(s); } + // rc = timelimit timelimit_qualification laps laps_teamplay if(pWantedType == MAPINFO_TYPE_RACE) + { + sa = car(s); if(sa == "") sa = cvar_string("timelimit"); + cvar_set("g_race_qualifying_timelimit", sa); + s = cdr(s); + + sa = car(s); if(sa == "") sa = "10"; + if(cvar("g_race_teams") < 2) + cvar_set("fraglimit", sa); + s = cdr(s); + + sa = car(s); if(sa == "") sa = "20"; + if(cvar("g_race_teams") >= 2) + cvar_set("fraglimit", sa); + s = cdr(s); + } + + if(pWantedType == MAPINFO_TYPE_CTS) { sa = car(s); if(sa == "") sa = cvar_string("fraglimit"); if(cvar("g_race_teams")) @@ -511,8 +528,9 @@ float MapInfo_Type_FromString(string t) else if(t == "kh") return MAPINFO_TYPE_KEYHUNT; else if(t == "as") return MAPINFO_TYPE_ASSAULT; else if(t == "ons") return MAPINFO_TYPE_ONSLAUGHT; - else if(t == "race") return MAPINFO_TYPE_RACE; + else if(t == "rc") return MAPINFO_TYPE_RACE; else if(t == "nexball") return MAPINFO_TYPE_NEXBALL; + else if(t == "cts") return MAPINFO_TYPE_CTS; else if(t == "all") return MAPINFO_TYPE_ALL; else return 0; } @@ -595,9 +613,10 @@ float MapInfo_Get_ByName(string pFilename, float pAllowGenerate, float pGametype if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ARENA) fputs(fh, "type arena 10 20\n"); if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_KEYHUNT) fputs(fh, "type kh 1000 20 3\n"); if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ASSAULT) fputs(fh, "type as 20\n"); - if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_RACE) fputs(fh, "type race 5 20 15\n"); + if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_RACE) fputs(fh, "type rc 20 5 7 15\n"); if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ONSLAUGHT) fputs(fh, "type ons 20\n"); if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_NEXBALL) fputs(fh, "type nexball 5 20\n"); + if(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_CTS) fputs(fh, "type cts 20 0\n"); fh2 = fopen(strcat("scripts/", pFilename, ".arena"), FILE_READ); if(fh2 >= 0) @@ -880,6 +899,8 @@ float MapInfo_CurrentGametype() return MAPINFO_TYPE_RACE; else if(cvar("g_nexball")) return MAPINFO_TYPE_NEXBALL; + else if(cvar("g_cts")) + return MAPINFO_TYPE_CTS; else return MAPINFO_TYPE_DEATHMATCH; } @@ -918,6 +939,8 @@ string MapInfo_GetGameTypeCvar(float t) case MAPINFO_TYPE_ASSAULT: return "g_assault"; case MAPINFO_TYPE_ONSLAUGHT: return "g_onslaught"; case MAPINFO_TYPE_RACE: return "g_race"; + case MAPINFO_TYPE_NEXBALL: return "g_nexball"; + case MAPINFO_TYPE_CTS: return "g_cts"; default: return ""; } } @@ -937,6 +960,7 @@ void MapInfo_SwitchGameType(float t) cvar_set("g_onslaught", (t == MAPINFO_TYPE_ONSLAUGHT) ? "1" : "0"); cvar_set("g_race", (t == MAPINFO_TYPE_RACE) ? "1" : "0"); cvar_set("g_nexball", (t == MAPINFO_TYPE_NEXBALL) ? "1" : "0"); + cvar_set("g_cts", (t == MAPINFO_TYPE_CTS) ? "1" : "0"); } void MapInfo_LoadMap(string s) diff --git a/data/qcsrc/common/mapinfo.qh b/data/qcsrc/common/mapinfo.qh index abe6645b6..7c06a98da 100644 --- a/data/qcsrc/common/mapinfo.qh +++ b/data/qcsrc/common/mapinfo.qh @@ -10,6 +10,7 @@ float MAPINFO_TYPE_LMS = 256; float MAPINFO_TYPE_ARENA = 512; float MAPINFO_TYPE_KEYHUNT = 1024; float MAPINFO_TYPE_NEXBALL = 2048; +float MAPINFO_TYPE_CTS = 4096; float MAPINFO_TYPE_ALL = 65535; // this has to include all above bits float MAPINFO_FEATURE_WEAPONS = 1; // not defined for minstagib-only maps diff --git a/data/qcsrc/server/cl_client.qc b/data/qcsrc/server/cl_client.qc index 0fb0c3624..889205550 100644 --- a/data/qcsrc/server/cl_client.qc +++ b/data/qcsrc/server/cl_client.qc @@ -2533,7 +2533,7 @@ void PlayerPreThink (void) if(self.spectatee_status != oldspectatee_status) { ClientData_Touch(self); - if(g_race) + if(g_race || g_cts) race_InitSpectator(); } diff --git a/data/qcsrc/server/clientcommands.qc b/data/qcsrc/server/clientcommands.qc index 4d704d95e..f86964bc2 100644 --- a/data/qcsrc/server/clientcommands.qc +++ b/data/qcsrc/server/clientcommands.qc @@ -233,7 +233,7 @@ void SV_ParseClientCommand(string s) { return; if((inWarmupStage && 0 >= g_warmup_limit) // with unlimited warmup players have to be able to restart - || cvar("sv_ready_restart")) + || cvar("sv_ready_restart") || g_race_qualifying == 2) { if(!readyrestart_happened || cvar("sv_ready_restart_repeatable")) { @@ -454,7 +454,7 @@ void ReadyRestartForce() VoteReset(); // clear overtime - if (checkrules_overtimesadded > 0) { + if (checkrules_overtimesadded > 0 && g_race_qualifying != 2) { //we have to decrease timelimit to its original value again!! float newTL; newTL = cvar("timelimit"); @@ -511,13 +511,13 @@ void ReadyRestart() if(g_arena | g_assault | gameover | intermission_running | race_completing) localcmd("restart\n"); + ReadyRestartForce(); + // reset ALL scores, but only do that at the beginning //of the countdown if sv_ready_restart_after_countdown is off! //Otherwise scores could be manipulated during the countdown! if (!cvar("sv_ready_restart_after_countdown")) Score_ClearAll(); - - ReadyRestartForce(); } /** @@ -558,8 +558,8 @@ void ReadyCount() */ void restartTimer_Think() { restart_mapalreadyrestarted = 1; - Score_ClearAll(); reset_map(TRUE); + Score_ClearAll(); remove(self); return; } diff --git a/data/qcsrc/server/constants.qh b/data/qcsrc/server/constants.qh index 4e4cfb5d8..4c06cfe3a 100644 --- a/data/qcsrc/server/constants.qh +++ b/data/qcsrc/server/constants.qh @@ -1,4 +1,4 @@ -string CVAR_CHECK_DEFAULT = "9b8ca48c50d9e2af73245655fdb29b04"; +string CVAR_CHECK_DEFAULT = "1247e8cd8be7bda1c260795d5bebb20b"; string CVAR_CHECK_WEAPONS = "4f7b4c1e2feeef4988b02a93ff35a2ca"; float FALSE = 0; diff --git a/data/qcsrc/server/defs.qh b/data/qcsrc/server/defs.qh index 5371283e3..8f85f4645 100644 --- a/data/qcsrc/server/defs.qh +++ b/data/qcsrc/server/defs.qh @@ -17,7 +17,7 @@ float require_spawnfunc_prefix; // if this float exists, only functions with spa float ctf_score_value(string parameter); -float g_dm, g_domination, g_ctf, g_tdm, g_keyhunt, g_onslaught, g_assault, g_arena, g_lms, g_runematch, g_race, g_nexball; +float g_dm, g_domination, g_ctf, g_tdm, g_keyhunt, g_onslaught, g_assault, g_arena, g_lms, g_runematch, g_race, g_nexball, g_cts; float g_cloaked, g_footsteps, g_jump_grunt, g_grappling_hook, g_laserguided_missile, g_midair, g_minstagib, g_nixnex, g_nixnex_with_laser, g_pinata, g_norecoil, g_vampire, g_minstagib_invis_alpha, g_bloodloss; float g_warmup_limit; float g_warmup_allguns; diff --git a/data/qcsrc/server/g_world.qc b/data/qcsrc/server/g_world.qc index 7095c541a..72373fe4d 100644 --- a/data/qcsrc/server/g_world.qc +++ b/data/qcsrc/server/g_world.qc @@ -251,6 +251,7 @@ void cvar_changes_init() BADCVAR("g_keyhunt_teams"); BADCVAR("g_onslaught"); BADCVAR("g_race"); + BADCVAR("g_cts"); BADCVAR("g_runematch"); BADCVAR("g_tdm"); BADCVAR("teamplay"); @@ -1899,9 +1900,9 @@ void CheckRules_World() ++readyplayers; } - // at least 2/3 of the players have completed a lap: start the RACE + // at least 2 of the players have completed a lap: start the RACE // otherwise, the players should end the qualifying on their own - if(readyplayers || ((totalplayers >= 3) && (playerswithlaps * 3 >= totalplayers * 2))) + if(readyplayers || playerswithlaps >= 2) { checkrules_suddendeathend = 0; ReadyRestart(); // go to race diff --git a/data/qcsrc/server/havocbot_roles.qc b/data/qcsrc/server/havocbot_roles.qc index 2fd4d0e92..1eea22f1d 100644 --- a/data/qcsrc/server/havocbot_roles.qc +++ b/data/qcsrc/server/havocbot_roles.qc @@ -637,7 +637,7 @@ void havocbot_chooserole() havocbot_chooserole_dom(); else if (g_keyhunt) havocbot_chooserole_kh(); - else if (g_race) + else if (g_race || g_cts) havocbot_chooserole_race(); else if (g_onslaught) havocbot_chooserole_ons(); diff --git a/data/qcsrc/server/miscfunctions.qc b/data/qcsrc/server/miscfunctions.qc index 342d85bf7..5e44d0d5b 100644 --- a/data/qcsrc/server/miscfunctions.qc +++ b/data/qcsrc/server/miscfunctions.qc @@ -876,7 +876,7 @@ void readplayerstartcvars() { if (g_lms) t = (e.spawnflags & WEPSPAWNFLAG_NORMAL); - else if (g_race) + else if (g_race || g_cts) t = (i == WEP_LASER); else if (g_nexball) t = 0; // weapon is set a few lines later @@ -1051,7 +1051,7 @@ void readlevelcvars(void) 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_assault || cvar("g_campaign")) inWarmupStage = 0; // these modes cannot work together, sorry g_pickup_respawntime_weapon = cvar("g_pickup_respawntime_weapon"); @@ -1960,7 +1960,7 @@ string getrecords() } } - if (g_race) + if (g_race || g_cts) { for (i = 0; i < MapInfo_count; ++i) { @@ -1975,6 +1975,7 @@ string getrecords() } } } + MapInfo_ClearTemps(); if (s == "") diff --git a/data/qcsrc/server/race.qc b/data/qcsrc/server/race.qc index a38d07525..cef356360 100644 --- a/data/qcsrc/server/race.qc +++ b/data/qcsrc/server/race.qc @@ -502,7 +502,7 @@ void trigger_race_checkpoint_verify() void spawnfunc_trigger_race_checkpoint() { vector o; - if(!g_race) + if(!g_race && !g_cts) { remove(self); return; @@ -569,7 +569,7 @@ void race_PreparePlayer() void race_RetractPlayer() { - if(!g_race) + if(!g_race && !g_cts) return; self.race_checkpoint = race_PreviousCheckpoint(self.race_checkpoint); if(self.race_checkpoint == 0) @@ -581,7 +581,7 @@ void race_RetractPlayer() void race_PreDie() { - if(!g_race) + if(!g_race && !g_cts) return; race_AbandonRaceCheck(self); @@ -589,7 +589,7 @@ void race_PreDie() void race_PreSpawn() { - if(!g_race) + if(!g_race && !g_cts) return; if(self.killcount == -666 || g_race_qualifying) race_PreparePlayer(); @@ -599,7 +599,7 @@ void race_PreSpawn() void race_PostSpawn(entity spot) { - if(!g_race) + if(!g_race && !g_cts) return; if(self.killcount != -666 && !g_race_qualifying) { @@ -618,14 +618,14 @@ void race_PostSpawn(entity spot) void race_PreSpawnObserver() { - if(!g_race) + if(!g_race && !g_cts) return; race_PreparePlayer(); } void spawnfunc_info_player_race (void) { - if(!g_race) + if(!g_race && !g_cts) { remove(self); return; @@ -673,6 +673,7 @@ void race_ReadyRestart() independent_players = 0; cvar_set("fraglimit", ftos(race_fraglimit)); cvar_set("leadlimit", ftos(race_leadlimit)); + cvar_set("timelimit", ftos(race_timelimit)); ScoreRules_race(); } } diff --git a/data/qcsrc/server/race.qh b/data/qcsrc/server/race.qh index c3bdda7ca..6a982ae9e 100644 --- a/data/qcsrc/server/race.qh +++ b/data/qcsrc/server/race.qh @@ -13,6 +13,7 @@ float race_highest_place_spawn; // number of places; a place higher gets spawned float race_lowest_place_spawn; // where to spawn in qualifying float race_fraglimit; float race_leadlimit; +float race_timelimit; .float race_place; .float race_completed; float race_completing; diff --git a/data/qcsrc/server/t_teleporters.qc b/data/qcsrc/server/t_teleporters.qc index 592d1019a..04e7030a4 100644 --- a/data/qcsrc/server/t_teleporters.qc +++ b/data/qcsrc/server/t_teleporters.qc @@ -83,7 +83,7 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle if(player.classname == "player") { - if(player.takedamage && player.deadflag == DEAD_NO && !g_race && cvar("g_telefrags")) + if(player.takedamage && player.deadflag == DEAD_NO && !g_race && !g_cts && cvar("g_telefrags")) tdeath(player, teleporter, telefragger, telefragmin, telefragmax); // player no longer is on ground diff --git a/data/qcsrc/server/teamplay.qc b/data/qcsrc/server/teamplay.qc index 8b21d30e0..ae6643276 100644 --- a/data/qcsrc/server/teamplay.qc +++ b/data/qcsrc/server/teamplay.qc @@ -98,6 +98,7 @@ void WriteGameCvars() cvar_set("g_onslaught", ftos(g_onslaught)); cvar_set("g_race", ftos(g_race)); cvar_set("g_nexball", ftos(g_nexball)); + cvar_set("g_cts", ftos(g_cts)); } void ReadGameCvars() @@ -122,6 +123,7 @@ void ReadGameCvars() found += (g_onslaught = (!found && (prev != GAME_ONSLAUGHT) && cvar("g_onslaught"))); found += (g_race = (!found && (prev != GAME_RACE) && cvar("g_race"))); found += (g_nexball = (!found && (prev != GAME_NEXBALL) && cvar("g_nexball"))); + found += (g_cts = (!found && (prev != GAME_CTS) && cvar("g_cts"))); if(found) break; @@ -163,7 +165,9 @@ void ActivateTeamplay() void InitGameplayMode() { - float fraglimit_override, timelimit_override, leadlimit_override; + float fraglimit_override, timelimit_override, leadlimit_override, qualifying_override; + + qualifying_override = -1; VoteReset(); @@ -315,28 +319,30 @@ void InitGameplayMode() { game = GAME_RACE; gamemode_name = "Race"; - g_race_qualifying = cvar("g_race_qualifying"); if(cvar("g_race_teams")) { - g_race_qualifying = 0; // not supported! ActivateTeamplay(); race_teams = bound(2, cvar("g_race_teams"), 4); } else race_teams = 0; - if(g_race_qualifying == 1) - fraglimit_override = 0; - else - fraglimit_override = cvar("g_race_laps_limit"); - + qualifying_override = cvar("g_race_qualifying_timelimit_override"); + fraglimit_override = cvar("g_race_laps_limit"); leadlimit_override = 0; // currently not supported by race if(g_race_qualifying) independent_players = 1; + } - ScoreRules_race(); + if(g_cts) + { + game = GAME_CTS; + gamemode_name = "CTS"; + g_race_qualifying = 1; + fraglimit_override = 0; + leadlimit_override = 0; } if(g_nexball) @@ -367,14 +373,33 @@ void InitGameplayMode() cvar_set("timelimit", ftos(timelimit_override)); if(leadlimit_override >= 0) cvar_set("leadlimit", ftos(leadlimit_override)); + if(qualifying_override >= 0) + cvar_set("g_race_qualifying_timelimit", ftos(qualifying_override)); } - if(g_race && g_race_qualifying == 2) + if(g_race) { - race_fraglimit = cvar("fraglimit"); - cvar_set("fraglimit", "0"); - race_leadlimit = cvar("leadlimit"); - cvar_set("leadlimit", "0"); + // we need to find out the correct value for g_race_qualifying + if(cvar("g_race_qualifying_timelimit") > 0) + { + g_race_qualifying = 2; + race_fraglimit = cvar("fraglimit"); + race_leadlimit = cvar("leadlimit"); + race_timelimit = cvar("timelimit"); + cvar_set("fraglimit", "0"); + cvar_set("leadlimit", "0"); + cvar_set("timelimit", cvar_string("g_race_qualifying_timelimit")); + } + else + g_race_qualifying = 0; + } + + if(g_race || g_cts) + { + if(g_race_qualifying) + independent_players = 1; + + ScoreRules_race(); } InitializeEntity(world, default_delayedinit, INITPRIO_GAMETYPE_FALLBACK); -- 2.39.2