ReAPI [1.1] Round Balancer

izzatillo

Пользователь
Регистрация
8 Июн 2017
Сообщения
254
Симпатии
78
Пол
Мужской
#1
Author: neugomon
Name: Round Balancer
Version: 1.1

Особенности :
Round Balancer - плагин балансировки команд по скиллу и по онлайну.
Описывать лень. Плагин - допиленная и урезанная по настройкам версия Lite Balancer

Настройки :

PHP:
#define ACCESS_IMMUNITY ADMIN_RCON    // Иммунитет для админов при балансе (Админы игнорируются любым балансом(по числу/по скиллу))

#define REPLACED_MENU            // Кастомное меню с 2-мя пунктами.
#define SCORE_DIFF    2        // Разница в счете между командами (Вкл. аланс по скиллу, если одна команда перееигрывает другую на n раундов)
#define MIN_PLAYERS    10        // Минимальное кол-во игроков на сервере для баланса по силам ()
#define ROUND_BSKILL    3        // Каждые n раундов баланс по скиллу (Ну а че, нахер каждый раунд по скиллу то уравнивать?)
#define PL_IGNORE_NUM    3        // Каждые n перемещений в командах для одного игрока (баланс по кол-ву игроков) (Чтобы не кидало одного и того же)
#define PL_IGNORE_SKILL    3        // Каждые n замен по скиллу игрока может перемещать  (Чтобы не кидало одного и того же)

Установка:

  • скачать архив, распаковать
  • прописать настройки в исходнике
  • залить на сервер, прописать в списке плагинов
 

Вложения

Последнее редактирование: izzatillo

Lite Style

Пользователь
Регистрация
11 Июн 2017
Сообщения
17
Симпатии
1
Пол
Женский
#2
Помню раньше был на HLDS, только версия 1.0
Если у кого-нибудь осталось, скиньте пожалуйста
 

Le$hiy

Пользователь
Регистрация
10 Июн 2017
Сообщения
196
Симпатии
69
Пол
Мужской
#3
Lite Style,
PHP:
#include amxmodx
#include fakemeta
#include hamsandwich

#define ACCESS_IMMUNITY ADMIN_BAN    // Иммунитет для админов при балансе (Админы игнорируются любым балансом(по числу/по скиллу))
//#define REPLACED_MENU            // Кастомное меню с 2-мя пунктами.
#define SCORE_DIFF    2        // Разница в счете между командами (Вкл. баланс по скиллу, если одна команда перееигрывает другую на n раундов)
#define MIN_PLAYERS    10        // Минимальное кол-во игроков на сервере для баланса по силам ()
#define ROUND_BSKILL    3        // Каждые n раундов баланс по скиллу (Ну а че, нахер каждый раунд по скиллу то уравнивать?)   
#define PL_IGNORE_NUM    3        // Каждые n перемещений в командах для одного игрока (баланс по кол-ву игроков) (Чтобы не кидало одного и того же)
#define PL_IGNORE_SKILL    3        // Каждые n замен по скиллу игрока может перемещать  (Чтобы не кидало одного и того же)

/* Словарь плагина */
#define MSG_TRANSFER     "^1[^4LTB^1] ^3%s ^4будет перенеcён за команду ^3%s ^4в новом раунде."
#define MSG_TRANSFER_CT    "контр-террористов"
#define MSG_TRANSFER_T    "террористов"
#define MSG_REPLACE    "^1[^4LTB^1] ^4Сильный ^3%s ^4будет заменён на слабого ^3%s ^4в новом раунде."
/* Конец словаря */   

#if !defined MAX_PLAYERS
#define MAX_PLAYERS 32
#endif

new g_iRoundCount;
new g_iScoreTt, g_iScoreCt;
new g_iNumTt, g_iNumCt;
new g_iSkipNPl[MAX_PLAYERS+1], g_iSkipSPl[MAX_PLAYERS+1];
new g_iNewTeam[MAX_PLAYERS+1];

#define GetTeam(%0) get_pdata_int(%0, 114, 5)

#define msgSayText 76
#define msgTeamInfo 86
#define msgShowOldMenu 96
#define msgShowVGUIMenu 114

public plugin_init()
{
    register_plugin("Round Balancer", "1.0 build 1337", "neygomon");
    
    RegisterHam(Ham_Spawn, "player", "fwdPlayerSpawnPre", false);
#if defined REPLACED_MENU   
    register_clcmd("chooseteam",     "ShowMenu");
    
    register_menucmd(register_menuid("Team Menu"), MENU_KEY_1|MENU_KEY_6|MENU_KEY_0, "TeamMenuHandler");
    register_message(msgShowOldMenu, "mShowMenu");
    register_message(msgShowVGUIMenu, "mShowMenu");
#endif   
    register_event("TeamScore", "eTeamScore", "a");
    register_logevent("_RoundEnd", 2, "1=Round_End");   
    register_logevent("_RestartRound", 2, "1&Restart_Round_");
    
    set_task(1.0, "ChangeServerCvars");
}

public ChangeServerCvars()
{
    set_cvar_num("mp_autoteambalance",     0);
    set_cvar_num("mp_limitteams",         0);
}

public client_putinserver(id)
    g_iNewTeam[id] = g_iSkipSPl[id] = g_iSkipNPl[id] = 0;

public eTeamScore()
{
    new szTeam[2]; read_data(1, szTeam, charsmax(szTeam));
    
    switch(szTeam[0])
    {
        case 'T': g_iScoreTt = read_data(2);
        case 'C': g_iScoreCt = read_data(2);
    }
}

public _RestartRound()
    g_iRoundCount = 0, _RoundEnd();

public _RoundEnd()
{
    new players[32], pnum, szName[32], iTransferNum;
    
    GetUsersInTeam(g_iNumTt, g_iNumCt);
    iTransferNum = abs(g_iNumTt - g_iNumCt) / 2;
    
    if(iTransferNum > 0)
    {   
        get_players(players, pnum, "e", (g_iNumTt > g_iNumCt) ? "TERRORIST" : "CT");
        for(new i; i < pnum; i++)
        {
            if(g_iSkipNPl[players[i]]-- || get_user_flags(players[i]) & ACCESS_IMMUNITY)
                continue;
            
            get_user_name(players[i], szName, charsmax(szName));
            
            if(g_iNumTt > g_iNumCt)
                ChatColor(MSG_TRANSFER, szName, MSG_TRANSFER_CT), g_iNewTeam[players[i]] = 2;
            else    ChatColor(MSG_TRANSFER, szName, MSG_TRANSFER_T),  g_iNewTeam[players[i]] = 1;
            
            g_iSkipNPl[players[i]] = PL_IGNORE_NUM;
            if(--iTransferNum < 1) break;
        }
    }

    if(++g_iRoundCount % ROUND_BSKILL || MIN_PLAYERS > get_playersnum() || SCORE_DIFF > abs(g_iScoreTt - g_iScoreCt))
        return;   
    new iTeam, iLeader = (g_iScoreTt > g_iScoreCt) ? 1 : 2;
    new iRatio[MAX_PLAYERS+1];
    new pEnt1, pEnt2;
    
    get_players(players, pnum);
    for(new i; i < pnum; i++)
    {
        if(g_iSkipSPl[players[i]]-- || get_user_flags(players[i]) & ACCESS_IMMUNITY)
            continue;

        iTeam = GetTeam(players[i]);
        switch(iTeam)
        {
            case 1, 2:
            {
                iRatio[players[i]] = get_user_frags(players[i]) - get_user_deaths(players[i]);
                if(iTeam == iLeader)
                {
                    if(iRatio[players[i]] > iRatio[pEnt1])
                        pEnt1 = players[i];
                }
                else if(iRatio[pEnt2] > iRatio[players[i]])
                    pEnt2 = players[i];           
            }
        }
    }
    if(!pEnt1 || !pEnt2) return;
    
    static szName1[32], szName2[32];
    get_user_name(pEnt1, szName1, charsmax(szName1));
    get_user_name(pEnt2, szName2, charsmax(szName2));
    
    ChatColor(MSG_REPLACE, szName1, szName2);
    switch(iLeader)
    {
        case 1: g_iNewTeam[pEnt1] = 2, g_iNewTeam[pEnt2] = 1;
        case 2: g_iNewTeam[pEnt1] = 1, g_iNewTeam[pEnt2] = 2;
    }
    g_iSkipSPl[pEnt1] = g_iSkipSPl[pEnt2] = PL_IGNORE_SKILL;
}

public fwdPlayerSpawnPre(const id)
{
    if(!g_iNewTeam[id]) return;
    
    fm_set_user_team(id, g_iNewTeam[id]);
    g_iNewTeam[id] = 0;
}
#if defined REPLACED_MENU
public mShowMenu(msgId, msgDest, msgEnt)
{
    if(msgId == msgShowOldMenu)
    {
        static szArg4[20]; get_msg_arg_string(4, szArg4, charsmax(szArg4));
        if(contain(szArg4, "Team_Select") == -1)
            return PLUGIN_CONTINUE;
    }
    else if(get_msg_arg_int(1) != 2)
        return PLUGIN_CONTINUE;

    set_pdata_int(msgEnt, 205, 0);
    ShowMenu(msgEnt);
    return PLUGIN_HANDLED;
}

public ShowMenu(id)
    return show_menu(id, MENU_KEY_0|MENU_KEY_1|MENU_KEY_6, "\d[\rLTB\d] \yВыберите действие:^n^n\y1. \rВойти в игру^n\y6. \wНаблюдение^n^n\y0. \wВыход", -1, "Team Menu");

public TeamMenuHandler(id, iKey)
{
    switch(iKey)
    {
        case 0:
        {
            GetUsersInTeam(g_iNumTt, g_iNumCt);
            set_pdata_int(id, 125, get_pdata_int(id, 125) & ~(1<<8));
            engclient_cmd(id, "jointeam", (g_iNumTt > g_iNumCt) ? "2" : "1");
        }
        case 5: user_silentkill(id), engclient_cmd(id, "jointeam", "6");
    }
    return PLUGIN_HANDLED;
}
#endif
stock ChatColor(const szMessage[], any:...)
{
    static players[32], pnum;     get_players(players, pnum, "c");
    static szMsg[190];         vformat(szMsg, charsmax(szMsg), szMessage, 2);

    for(new i; i < pnum; i++)
    {
        message_begin(MSG_ONE_UNRELIABLE, msgSayText, .player = players[i]);
        write_byte(players[i]);
        write_string(szMsg);
        message_end();
    }
}

stock GetUsersInTeam(&tt, &ct, players[32]="", pnum=0)
{
    tt = ct = 0;
    get_players(players, pnum);
    
    for(new i; i < pnum; i++)
    {
        switch(GetTeam(players[i]))
        {
            case 1: tt++;
            case 2: ct++;
        }
    }
}

stock fm_set_user_team(id, team)
{
    set_pdata_int(id, 114, team, 5);
    dllfunc(DLLFunc_ClientUserInfoChanged, id, engfunc(EngFunc_GetInfoKeyBuffer, id));
    
    emessage_begin(MSG_ALL, msgTeamInfo);
    ewrite_byte(id);
    switch(team)
    {
        case 1: ewrite_string("TERRORIST");
        case 2: ewrite_string("CT");
    }
    emessage_end();   
}
 

Lite Style

Пользователь
Регистрация
11 Июн 2017
Сообщения
17
Симпатии
1
Пол
Женский
#4
Le$hiy, сам плагин вроде работает, вот только меню не показывает
 

Вложения

  • 1,9 MB 126

neygomon

Его Темнейшество :j
Пользователь
Регистрация
8 Июн 2017
Сообщения
834
Симпатии
379
Пол
Мужской
#5
Lite Style, локально компилируй и используй для редактирования плагина notepad++
 

bob001

Пользователь
Регистрация
17 Июн 2017
Сообщения
1
Симпатии
0
Пол
Мужской
#7
Lite Style, локально компилируй и используй для редактирования плагина notepad++
иногда выдает ошибку этот авто баланс
L 06/23/2017 - 10:51:24: [ReAPI] set_member: invalid or uninitialized entity
L 06/23/2017 - 10:51:24: [AMXX] Run time error 10 (plugin "amxtmbalanc.amxx") (native "set_member") - debug not enabled!
L 06/23/2017 - 10:51:24: [AMXX] To enable debug mode, add "debug" after the plugin name in plugins.ini (without quotes).
 

nakazatel

Пользователь
Регистрация
10 Июн 2017
Сообщения
15
Симпатии
0
Пол
Мужской
#8
иногда выдает ошибку этот авто баланс
L 06/23/2017 - 10:51:24: [ReAPI] set_member: invalid or uninitialized entity
L 06/23/2017 - 10:51:24: [AMXX] Run time error 10 (plugin "amxtmbalanc.amxx") (native "set_member") - debug not enabled!
L 06/23/2017 - 10:51:24: [AMXX] To enable debug mode, add "debug" after the plugin name in plugins.ini (without quotes).
amxtmbalanc.amxx debug
 

famas

Пользователь
Регистрация
13 Июн 2017
Сообщения
39
Симпатии
2
Пол
Мужской
#9
Установил всё работает нормально!!
 

GIT

Пользователь
Регистрация
9 Июн 2017
Сообщения
99
Симпатии
4
Пол
Мужской
#10
#define VERSION "2.3"
// 2.2: add winstreak for skill balancer
// 2.3: remake hooks
register_plugin("[ReAPI] Lite TeamBalancer", VERSION, "neugomon");
Это что за версия у меня ?
 

GIT

Пользователь
Регистрация
9 Июн 2017
Сообщения
99
Симпатии
4
Пол
Мужской
#11
#define VERSION "2.3"
// 2.2: add winstreak for skill balancer
// 2.3: remake hooks
register_plugin("[ReAPI] Lite TeamBalancer", VERSION, "neugomon");
Это что за версия у меня ?
чем отличаются 2 версии что я скинул выше
 

f0rt1k

Пользователь
Регистрация
19 Июн 2017
Сообщения
2
Симпатии
0
Пол
Мужской
#12
Подскажите пожалуйста, как сделать, чтобы при входе на сервер было стандартное меню выбора команд!
Заранее благодарю за ответ!
 

Mmonster

Пользователь
Регистрация
9 Июн 2017
Сообщения
462
Симпатии
211
Пол
Мужской
#13
f0rt1k ,вроде в описание это есть #define REPLACED_MENU // Кастомное меню с 2-мя пунктами. => вам нужно
C++:
//#define REPLACED_MENU            // Кастомное меню с 2-мя пунктами.
 

f0rt1k

Пользователь
Регистрация
19 Июн 2017
Сообщения
2
Симпатии
0
Пол
Мужской
#14
f0rt1k ,вроде в описание это есть #define REPLACED_MENU // Кастомное меню с 2-мя пунктами. => вам нужно
C++:
//#define REPLACED_MENU            // Кастомное меню с 2-мя пунктами.
мне нужно, чтобы было так:
1) Террористы
2) Контер-Террористы
3) Автоматический выбор команды
4) Наблюдатели

А не:
1) Войти в игру
2) Наблюдатели
 

Coder

Пользователь
Регистрация
10 Июн 2017
Сообщения
101
Симпатии
33
Пол
Мужской
#15
Напишу предложение для данного плагина, а более опытные скриптеры ответьте стоит ли оно того (имею ввиду нагрузку и саму реализацию). А что если делать балансировку игроков по скиллу статистики (неугомона, фримена или скальпеля). В конце или начале раунда суммировать общий скилл двух команд, а потом его сравнить, если он расходится более чем 50 например, то тогда поменять слабого по скиллу на сильного, ну и при этом конечно же соблюдать количество людей в командах.
 

Владюша

Пользователь
Регистрация
9 Июн 2017
Сообщения
11
Симпатии
1
Пол
Мужской
#16
Часто бывает такое: Игрок1 будет заменен на слабого Игрок2. Хотя Игрок1 находится в спектрах