ReAPI [untested] Team Balancer

neygomon

Его Темнейшество :j
Администратор
Регистрация
8 Июн 2017
Сообщения
1.090
Симпатии
448
Лучшие ответы
1
Пол
Мужской
#1
Очередной балансер от меня :D
Без описания... пока что....

Просто ставьте и тестируйте (и ловите баги XD)
C++:
#define DEBUG_BALANCE

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

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

Вложения

laymon91

Пользователь
Регистрация
10 Июн 2017
Сообщения
64
Симпатии
1
Лучшие ответы
0
Пол
Мужской
#2
Загнешься опять на условии)
а для Кт кто будет делать?


Код:
if(
        g_iSkillBalance-- <= 0 &&
        get_playersnum() >= MIN_PLAYERS &&
        abs(iTTWins - iCTWins) >= SCORE_DIFF &&
        abs(g_iTeamWinStreaks[TEAM_TERRORIST] - g_iTeamWinStreaks[TEAM_CT]) < WINSTREAKS_DIFF
    )
 

laymon91

Пользователь
Регистрация
10 Июн 2017
Сообщения
64
Симпатии
1
Лучшие ответы
0
Пол
Мужской
#3
#define SCORE_DIFF 2
#define WINSTREAKS_DIFF 3

ТТ 2 : КТ 0
abs(iTTWins - iCTWins) >= SCORE_DIFF - Работает
abs(g_iTeamWinStreaks[TEAM_TERRORIST] - g_iTeamWinStreaks[TEAM_CT]) < WINSTREAKS_DIFF - Работает

ТТ 3 : КТ 0
abs(iTTWins - iCTWins) >= SCORE_DIFF - Работает
abs(g_iTeamWinStreaks[TEAM_TERRORIST] - g_iTeamWinStreaks[TEAM_CT]) < WINSTREAKS_DIFF - Не работает) Потому что винстрик ТТ уже больше заданого)
 

neygomon

Его Темнейшество :j
Администратор
Регистрация
8 Июн 2017
Сообщения
1.090
Симпатии
448
Лучшие ответы
1
Пол
Мужской
#4
laymon91,

ОКЕЙ
замени таким:
g_iSkillBalance-- <= 0 &&
get_playersnum() >= MIN_PLAYERS &&
abs(iTTWins - iCTWins) >= SCORE_DIFF &&
((iTTWins > iCTWins && g_iTeamWinStreaks[TEAM_CT] - g_iTeamWinStreaks[TEAM_TERRORIST] < WINSTREAKS_DIFF) ||
(iCTWins > iTTWins && g_iTeamWinStreaks[TEAM_TERRORIST] - g_iTeamWinStreaks[TEAM_CT] < WINSTREAKS_DIFF))
 

neygomon

Его Темнейшество :j
Администратор
Регистрация
8 Июн 2017
Сообщения
1.090
Симпатии
448
Лучшие ответы
1
Пол
Мужской
#5
собсна, с условием выше:
L 02/13/2018 - 10:19:53: ==== Start balance ====
L 02/13/2018 - 10:19:53: [leader 2][diff 6.333333] Player 2(skill 6.000000) transfered to 1
L 02/13/2018 - 10:19:53: [leader 2][diff 1.333333] Player 9(skill 5.000000) transfered to 1
L 02/13/2018 - 10:19:53: [leader 2][diff 0.333333] Player 1(skill 1.000000) transfered to 1
L 02/13/2018 - 10:19:53: [leader 2][diff -0.666666] Player 7(skill 1.000000) transfered to 1
L 02/13/2018 - 10:19:53: Transfered 4 players
L 02/13/2018 - 10:19:53: [leader 1] Player 15(skill 0.000000) transfered to 2
L 02/13/2018 - 10:19:53: [leader 1] Player 14(skill 1.000000) transfered to 2
L 02/13/2018 - 10:19:53: [leader 1] Player 13(skill 0.000000) transfered to 2
L 02/13/2018 - 10:19:53: [leader 1] Player 11(skill 0.000000) transfered to 2
L 02/13/2018 - 10:19:53: ==== End balance ====
L 02/13/2018 - 10:28:53: ==== Start balance ====
L 02/13/2018 - 10:28:53: [leader 2][diff 2.138094] Player 15(skill 2.599999) transfered to 1
L 02/13/2018 - 10:28:53: [leader 2][diff 0.838094] Player 10(skill 1.299999) transfered to 1
L 02/13/2018 - 10:28:53: [leader 2][diff -0.161905] Player 3(skill 1.000000) transfered to 1
L 02/13/2018 - 10:28:53: Transfered 3 players
L 02/13/2018 - 10:28:53: [leader 1] Player 11(skill 1.500000) transfered to 2
L 02/13/2018 - 10:28:53: [leader 1] Player 7(skill 0.600000) transfered to 2
L 02/13/2018 - 10:28:53: [leader 1] Player 1(skill 2.000000) transfered to 2
L 02/13/2018 - 10:28:53: ==== End balance ====
 

laymon91

Пользователь
Регистрация
10 Июн 2017
Сообщения
64
Симпатии
1
Лучшие ответы
0
Пол
Мужской
#6
а если у игрока счет 16:0

Код:
Float:get_entvar(SortedTt[i], var_frags) / float(get_member(SortedTt[i], m_iDeaths))
--->
правило гласит, что на ноль делить нельзя.
И что это за магический дефайн?)

#define PLAYER_DIFF 1 // Разница в кол-ве игроков в командах (При входе на сервер, чтоб равномерно заполнять команды)
 

neygomon

Его Темнейшество :j
Администратор
Регистрация
8 Июн 2017
Сообщения
1.090
Симпатии
448
Лучшие ответы
1
Пол
Мужской
#7

laymon91

Пользователь
Регистрация
10 Июн 2017
Сообщения
64
Симпатии
1
Лучшие ответы
0
Пол
Мужской
#8

neygomon

Его Темнейшество :j
Администратор
Регистрация
8 Июн 2017
Сообщения
1.090
Симпатии
448
Лучшие ответы
1
Пол
Мужской
#9
laymon91, делить и нельзя, вернет просто 0
(можно наделать проверок конечно)
чет типа такого:
Код:
#include <amxmodx>

public plugin_init()
{
    for(new i; i < 10; ++i)
    {
        if(i == 0)
            server_print("-> %f", 1000.0 - float(i));
        else    server_print("-> %f", 1000.0 / float(i));
    }
}
 

laymon91

Пользователь
Регистрация
10 Июн 2017
Сообщения
64
Симпатии
1
Лучшие ответы
0
Пол
Мужской
#10
laymon91, делить и нельзя, вернет просто 0
(можно наделать проверок конечно)
чет типа такого:
Код:
#include <amxmodx>

public plugin_init()
{
    for(new i; i < 10; ++i)
    {
        if(i == 0)
            server_print("-> %f", 1000.0 - float(i));
        else    server_print("-> %f", 1000.0 / float(i));
    }
}
Смотри там по поводу игнора баланса по скиллу...

Как оно определяет сколько нужно человек сменить? в зависимости от кол-ва людей на сервере и скилла?
И зачем делать грабли "g_iSkillBalance--" , если пока счет не станет 2-0 (по дефолту) скилл баланс не сработает из условия?
 

neygomon

Его Темнейшество :j
Администратор
Регистрация
8 Июн 2017
Сообщения
1.090
Симпатии
448
Лучшие ответы
1
Пол
Мужской
#11

laymon91

Пользователь
Регистрация
10 Июн 2017
Сообщения
64
Симпатии
1
Лучшие ответы
0
Пол
Мужской
#12

neygomon

Его Темнейшество :j
Администратор
Регистрация
8 Июн 2017
Сообщения
1.090
Симпатии
448
Лучшие ответы
1
Пол
Мужской
#13
laymon91, суть винстрика - не давать балансить команду, если та, которая сливает по счету, выигрывает N раундов подряд
 

laymon91

Пользователь
Регистрация
10 Июн 2017
Сообщения
64
Симпатии
1
Лучшие ответы
0
Пол
Мужской
#14
laymon91, суть винстрика - не давать балансить команду, если та, которая сливает по счету, выигрывает N раундов подряд
#define SCORE_DIFF 2
#define WINSTREAKS_DIFF 3
#define ROUND_BSKILL 3

Счет 3:0
------------балансим
Счет 4:0
------------ничего
Счет 5:0
------------ничего
Счет 6:0
----------- оооо сбалансили
но мы опять про*бали и Счет 7:0
----------------ничего
Счет 6:1 --- Винстрик даже не намечается)
Сбалансили нормасик)
 

neygomon

Его Темнейшество :j
Администратор
Регистрация
8 Июн 2017
Сообщения
1.090
Симпатии
448
Лучшие ответы
1
Пол
Мужской
#15
omg...
ROUND_BSKILL убери и будет балансить каждый раунд, пока винстрик не пойдет на другую тиму
 

Bulls

Пользователь
Регистрация
13 Июн 2017
Сообщения
21
Симпатии
0
Лучшие ответы
0
Пол
Мужской
#16
laymon91,

ОКЕЙ
замени таким:
g_iSkillBalance-- <= 0 &&
get_playersnum() >= MIN_PLAYERS &&
abs(iTTWins - iCTWins) >= SCORE_DIFF &&
((iTTWins > iCTWins && g_iTeamWinStreaks[TEAM_CT] - g_iTeamWinStreaks[TEAM_TERRORIST] < WINSTREAKS_DIFF) ||
(iCTWins > iTTWins && g_iTeamWinStreaks[TEAM_TERRORIST] - g_iTeamWinStreaks[TEAM_CT] < WINSTREAKS_DIFF))
На сервере хрень с балансом бывает, а именно сервер оставляет одного против 9, а то и больше.
Балансит так что один раунд террорист один против всех ментов, с кт такого еще не наблюдал.

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

Bulls

Пользователь
Регистрация
13 Июн 2017
Сообщения
21
Симпатии
0
Лучшие ответы
0
Пол
Мужской
#17
С флагом ADMIN_RCON переводит в другую команду просто не пишет что такой переведён! и вовремя трансфера сразу несколько игроков наблюдаются лаги!
 

Bulls

Пользователь
Регистрация
13 Июн 2017
Сообщения
21
Симпатии
0
Лучшие ответы
0
Пол
Мужской
#18
L 02/08/2019 - 18:18:03: [ReAPI] rg_switch_team: invalid player index 0 [arg_index]
На плагин ругается.
 

neygomon

Его Темнейшество :j
Администратор
Регистрация
8 Июн 2017
Сообщения
1.090
Симпатии
448
Лучшие ответы
1
Пол
Мужской
#19
вовремя трансфера сразу несколько игроков наблюдаются
да ну? как они могут лагать, если цикл по игрокам проходит еще до того как они заспавнились? -_-
 

Bulls

Пользователь
Регистрация
13 Июн 2017
Сообщения
21
Симпатии
0
Лучшие ответы
0
Пол
Мужской
#20
да ну? как они могут лагать, если цикл по игрокам проходит еще до того как они заспавнились? -_-
Да может на счёт лагов я погорячился, но вот то что при данном балансере и приложенном выше варианте .sma проскакивает периодически баланс, таким образом что тер остаётся один на раунд. а в следующем уже снова балансит поровну.
 
Сверху