Ignore Team Balance

Ignore Team Balance 27.08.2025

Нет прав для скачивания
C++:
#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);
}
Назад
Верх