#include <amxmisc>
#include <reapi>
new mp_autoteambalance_ignore;
new mp_autoteambalance_ignore_flag[16];
new mp_limitteams_ignore;
new mp_limitteams_ignore_flag[16];
new mp_kill_filled_spawn;
new giATBFlag, giLTFlag;
new g_pClient;
public plugin_init()
{
register_plugin("Ignore Team Balance", "27.08.2025", "@emmajule");
RegisterHookChain(RG_CBasePlayer_CanSwitchTeam, "CBasePlayer_CanSwitchTeam", false);
#if REAPI_VERSION >= 522254
RegisterHookChain(RG_CSGameRules_TeamStacked, "CSGameRules_TeamStacked", false);
RegisterHookChain(RG_CSGameRules_TeamFull, "CSGameRules_TeamFull", false);
#endif
RegisterHookChain(RG_HandleMenu_ChooseTeam, "HandleMenu_ChooseTeam", false);
RegisterHookChain(RG_HandleMenu_ChooseTeam, "HandleMenu_ChooseTeam_Post", true);
parse_cfg();
}
public plugin_cfg()
{
new cvar = get_cvar_pointer("mp_kill_filled_spawn");
mp_kill_filled_spawn = get_pcvar_num(cvar);
hook_cvar_change(cvar, "cvar_change_callback");
giATBFlag = read_flags_ex(mp_autoteambalance_ignore_flag);
giLTFlag = read_flags_ex(mp_limitteams_ignore_flag);
}
// mp_autoteambalance
public CBasePlayer_CanSwitchTeam(const id)
{
if (!mp_autoteambalance_ignore) {
return HC_CONTINUE;
}
if (giATBFlag > 0 && (get_user_flags(id) & giATBFlag))
{
SetHookChainReturn(ATYPE_BOOL, false);
return HC_SUPERCEDE;
}
return HC_CONTINUE;
}
public HandleMenu_ChooseTeam(const id, const MenuChooseTeam:slot)
{
if (!mp_limitteams_ignore) {
return HC_CONTINUE;
}
g_pClient = id;
return HC_CONTINUE;
}
public HandleMenu_ChooseTeam_Post(const id, const MenuChooseTeam:slot)
{
g_pClient = 0;
}
// mp_limitteams
public CSGameRules_TeamStacked(newTeam_id, curTeam_id)
{
if (!g_pClient) {
return HC_CONTINUE;
}
if (giLTFlag > 0 && (get_user_flags(g_pClient) & giLTFlag))
{
SetHookChainReturn(ATYPE_INTEGER, false);
return HC_SUPERCEDE;
}
return HC_CONTINUE;
}
public CSGameRules_TeamFull(newTeam_id, curTeam_id)
{
if (!g_pClient) {
return HC_CONTINUE;
}
if (mp_kill_filled_spawn) {
return HC_CONTINUE;
}
if (giLTFlag > 0 && (get_user_flags(g_pClient) & giLTFlag))
{
SetHookChainReturn(ATYPE_INTEGER, false);
return HC_SUPERCEDE;
}
return HC_CONTINUE;
}
public cvar_change_callback(cvar, new_val[], old_val[])
{
mp_kill_filled_spawn = str_to_num(new_val);
}
parse_cfg()
{
bind_pcvar_num(create_cvar("mp_autoteambalance_ignore", "1", .description = "Игнорировать квар mp_autoteambalance"), mp_autoteambalance_ignore);
bind_pcvar_string(create_cvar("mp_autoteambalance_ignore_flag", "t", .description = "Флаг(и) доступа к игнорированию квара mp_autoteambalance"), mp_autoteambalance_ignore_flag, 15);
bind_pcvar_num(create_cvar("mp_limitteams_ignore", "1", .description = "Игнорировать квар mp_limitteams"), mp_limitteams_ignore);
bind_pcvar_string(create_cvar("mp_limitteams_ignore_flag", "t", .description = "Флаг(и) доступа к игнорированию квара mp_limitteams"), mp_limitteams_ignore_flag, 15);
new path[PLATFORM_MAX_PATH];
get_configsdir(path, charsmax(path));
// strcat(path, "/plugins/no_team_balance.cfg", charsmax(path));
strcat(path, "/ignore_team_balance.cfg", charsmax(path));
server_cmd("exec %s", path);
server_exec();
}
stock read_flags_ex(const flags[])
{
if (!flags[0] || flags[0] == '0') {
return ADMIN_ALL;
}
return read_flags(flags);
}