alias sv_hook_gamestart_ka
alias sv_hook_gamestart_ft
alias sv_hook_gamestart_inv
+alias sv_hook_gamestart_duel
alias sv_hook_gamerestart
alias sv_hook_gameend
alias sv_vote_gametype_hook_ons
alias sv_vote_gametype_hook_rc
alias sv_vote_gametype_hook_tdm
+alias sv_vote_gametype_hook_duel
-// Example preset to allow duel to be used for the gametype voting screen
+// Example preset to allow 1v1ctf to be used for the gametype voting screen
// sv_vote_gametype_*_type Must be set to the name of the gametype the option is based on
// sv_vote_gametype_*_name Contains a human-readable name of the gametype
// sv_vote_gametype_*_description Contains a longer description
-//set sv_vote_gametype_duel_type dm
-//set sv_vote_gametype_duel_name Duel
-//set sv_vote_gametype_duel_description "One vs One match"
+//set sv_vote_gametype_1v1ctf_type ctf
+//set sv_vote_gametype_1v1ctf_name "Capture the Flag Duel"
+//set sv_vote_gametype_1v1ctf_description "One vs One match in CTF"
//alias sv_vote_gametype_hook_all "set g_maxplayers 0"
-//alias sv_vote_gametype_hook_duel "set g_maxplayers 2"
+//alias sv_vote_gametype_hook_1v1ctf "set g_maxplayers 2"
// ===========
set g_inv_respawn_delay_max 0
set g_inv_respawn_waves 0
set g_inv_weapon_stay 0
+set g_duel_respawn_delay_small 0
+set g_duel_respawn_delay_small_count 0
+set g_duel_respawn_delay_large 0
+set g_duel_respawn_delay_large_count 0
+set g_duel_respawn_delay_max 0
+set g_duel_respawn_waves 0
+set g_duel_weapon_stay 0
// =========
// deathmatch (ffa or team)
// ==========================
set g_dm 1 "Deathmatch: killing any other player is one frag, player with most frags wins"
+ set g_tdm 0 "Team Deathmatch: the team who kills their opponents most often wins"
+ set g_tdm_on_dm_maps 0 "when this is set, all DM maps automatically support TDM"
set g_tdm_teams 2 "how many teams are in team deathmatch (set by mapinfo)"
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"
set g_invasion_teams 0 "number of teams in invasion (note: use mapinfo to set this)"
set g_invasion_team_spawns 1 "use team spawns in teamplay invasion mode"
set g_invasion_type 0 "type of invasion mode - 0: round-based, 1: hunting, 2: complete the stage (note: use mapinfo to set this)"
+
+// ======
+// duel
+// ======
+set g_duel 0 "Duel: frag the opponent more in a one versus one arena battle"
});
}
+ //int player_limit = GetPlayerLimit(); // TODO: use this instead of maxclients!
int bots;
// But don't remove bots immediately on level change, as the real players
// usually haven't rejoined yet
// add bots to reach minplayers if needed
bots = max(minbots, minplayers - activerealplayers);
// cap bots to the max players allowed by the server
+ if(autocvar_g_maxplayers)
+ bots = min(bots, autocvar_g_maxplayers - activerealplayers);
bots = min(bots, maxclients - realplayers);
if(bots > minbots)
if (IS_REAL_CLIENT(this))
sv_notice_join(this);
- this.move_qcphysics = true;
+ this.move_qcphysics = false;
// update physics stats (players can spawn before physics runs)
Physics_UpdateStats(this);
this.team_selected = false;
}
+int GetPlayerLimit()
+{
+ int player_limit = autocvar_g_maxplayers;
+ MUTATOR_CALLHOOK(GetPlayerLimit, player_limit);
+ player_limit = M_ARGV(0, int);
+ return player_limit;
+}
+
/**
* Determines whether the player is allowed to join. This depends on cvar
* g_maxplayers, if it isn't used this function always return true, otherwise
++currentlyPlaying;
});
+ int player_limit = GetPlayerLimit();
+
float free_slots = 0;
- if (!autocvar_g_maxplayers)
+ if (!player_limit)
free_slots = maxclients - totalClients;
- else if(currentlyPlaying < autocvar_g_maxplayers)
- free_slots = min(maxclients - totalClients, autocvar_g_maxplayers - currentlyPlaying);
+ else if(currentlyPlaying < player_limit)
+ free_slots = min(maxclients - totalClients, player_limit - currentlyPlaying);
static float join_prevent_msg_time = 0;
if(this && ignore && !free_slots && time > join_prevent_msg_time)