Hello, can you help me please be red writing to both teams where i ^ 3?
// *************************************************************************************//
// Плагин загружен с www.neugomon.ru //
// Автор: Neygomon [ https://neugomon.ru/members/1/ ] //
// Официальная тема поддержки: https://neugomon.ru/threads/2846/ //
// При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА! //
// *************************************************************************************//
#include <amxmodx>
#include <reapi>
#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 "^3[SS] ^1Jucatorul ^4%s ^1a fost transferat la ^4%s^1."
#define MSG_TRANSFER_CT "Counter-Terrorists"
#define MSG_TRANSFER_T "Terrorists"
#define MSG_REPLACE "^3[SS] ^1Jucatorul ^4%s ^1a fost schimbat cu ^4%s^1."
/* Конец словаря */
// Избавляемся от магии в коде )))
#if !defined MAX_PLAYERS
#define MAX_PLAYERS 32
#endif
#if !defined MAX_NAME_LENGTH
#define MAX_NAME_LENGTH 32
#endif
#define NULL 0
new g_iSkipNPl[MAX_PLAYERS + 1], g_iSkipSPl[MAX_PLAYERS + 1];
new g_iTeamWinStreaks[any:TeamName];
new g_iSkillBalance = ROUND_BSKILL;
public plugin_init()
{
#define VERSION "2.3"
// 2.2: add winstreak for skill balancer
// 2.3: remake hooks
register_plugin("[ReAPI] Lite TeamBalancer", VERSION, "neugomon");
register_cvar("reapi_lite_teambalancer", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
RegisterHookChain(RG_CSGameRules_RestartRound, "CSGameRules_RestartRound_Pre", false);
#if defined CUSTOM_MENU
register_clcmd("chooseteam", "CMD_ChooseTeam");
RegisterHookChain(RG_ShowVGUIMenu, "fwdShowVGUIMenu", false);
RegisterHookChain(RG_HandleMenu_ChooseTeam, "fwdHandleMenu_ChooseTeam", false);
#endif
set_task(1.2, "ChangeServerCvars");
}
public ChangeServerCvars()
{
set_cvar_num("mp_autoteambalance", NULL);
#if defined CUSTOM_MENU
set_cvar_num("mp_limitteams", NULL);
#endif
}
public client_putinserver(id)
g_iSkipSPl[id] = g_iSkipNPl[id] = NULL;
public CSGameRules_RestartRound_Pre()
{
if(get_member_game(m_bCompleteReset))
{
arrayset(g_iTeamWinStreaks, 0, sizeof g_iTeamWinStreaks);
g_iSkillBalance = ROUND_BSKILL;
}
else
{
switch(WinStatus:get_member_game(m_iRoundWinStatus))
{
case WINSTATUS_TERRORISTS:
{
g_iTeamWinStreaks[TEAM_TERRORIST]++;
g_iTeamWinStreaks[TEAM_CT] = 0;
}
case WINSTATUS_CTS:
{
g_iTeamWinStreaks[TEAM_CT]++;
g_iTeamWinStreaks[TEAM_TERRORIST] = 0;
}
}
}
new players[MAX_PLAYERS], pnum;
new iTTWins = get_member_game(m_iNumTerroristWins), iCTWins = get_member_game(m_iNumCTWins);
if(
g_iSkillBalance-- <= NULL &&
get_playersnum() >= MIN_PLAYERS &&
abs(iTTWins - iCTWins) >= SCORE_DIFF &&
abs(g_iTeamWinStreaks[TEAM_TERRORIST] - g_iTeamWinStreaks[TEAM_CT]) < WINSTREAKS_DIFF
)
{
new pEnt1, pEnt2;
get_players(players, pnum);
for(new i, TeamName:iTeam, TeamName:iLeader = (iTTWins > iCTWins) ? TEAM_TERRORIST : TEAM_CT, iStats, iCache[2]; i < pnum; i++)
{
if(g_iSkipSPl[players]-- || get_user_flags(players) & ACCESS_IMMUNITY)
continue;
switch((iTeam = get_member(players, m_iTeam)))
{
case TEAM_TERRORIST, TEAM_CT:
{
iStats = get_user_frags(players) - get_member(players, m_iDeaths);
if(iTeam == iLeader)
{
if(iStats > iCache[0])
{
pEnt1 = players;
iCache[0] = iStats;
}
}
else if(iCache[1] > iStats)
{
pEnt2 = players;
iCache[1] = iStats;
}
}
}
}
if(pEnt1 && pEnt2)
{
new szName1[MAX_NAME_LENGTH], szName2[MAX_NAME_LENGTH];
get_entvar(pEnt1, var_netname, szName1, charsmax(szName1));
get_entvar(pEnt2, var_netname, szName2, charsmax(szName1));
ChatColor(pEnt1, MSG_REPLACE, szName1, szName2);
g_iSkipSPl[pEnt1] = PL_IGNORE_SKILL;
g_iSkipSPl[pEnt2] = PL_IGNORE_SKILL;
rg_switch_team(pEnt1);
rg_switch_team(pEnt2);
g_iSkillBalance = ROUND_BSKILL;
}
}
new iNumTt = get_member_game(m_iNumTerrorist);
new iNumCt = get_member_game(m_iNumCT);
new iTransferNum = abs(iNumTt - iNumCt) / 2;
if(iTransferNum > NULL)
{
get_players(players, pnum, "e", (iNumTt > iNumCt) ? "TERRORIST" : "CT");
for(new i, szName[MAX_NAME_LENGTH]; i < pnum; i++)
{
if(g_iSkipNPl[players]-- || g_iSkipSPl[players] == PL_IGNORE_SKILL || get_user_flags(players) & ACCESS_IMMUNITY)
continue;
get_entvar(players, var_netname, szName, charsmax(szName));
ChatColor(players, MSG_TRANSFER, szName, (iNumTt > iNumCt) ? MSG_TRANSFER_CT : MSG_TRANSFER_T);
g_iSkipNPl[players] = PL_IGNORE_NUM;
rg_switch_team(players);
if(--iTransferNum < 1)
break;
}
}
}
stock ChatColor(playerColorIndex, const szMessage[], any:...)
{
#define msgSayText 76
new szMsg[190];
vformat(szMsg, charsmax(szMsg), szMessage, 3);
message_begin(MSG_ALL, msgSayText);
write_byte(playerColorIndex);
write_string(szMsg);
message_end();
}
// Плагин загружен с www.neugomon.ru //
// Автор: Neygomon [ https://neugomon.ru/members/1/ ] //
// Официальная тема поддержки: https://neugomon.ru/threads/2846/ //
// При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА! //
// *************************************************************************************//
#include <amxmodx>
#include <reapi>
#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 "^3[SS] ^1Jucatorul ^4%s ^1a fost transferat la ^4%s^1."
#define MSG_TRANSFER_CT "Counter-Terrorists"
#define MSG_TRANSFER_T "Terrorists"
#define MSG_REPLACE "^3[SS] ^1Jucatorul ^4%s ^1a fost schimbat cu ^4%s^1."
/* Конец словаря */
// Избавляемся от магии в коде )))
#if !defined MAX_PLAYERS
#define MAX_PLAYERS 32
#endif
#if !defined MAX_NAME_LENGTH
#define MAX_NAME_LENGTH 32
#endif
#define NULL 0
new g_iSkipNPl[MAX_PLAYERS + 1], g_iSkipSPl[MAX_PLAYERS + 1];
new g_iTeamWinStreaks[any:TeamName];
new g_iSkillBalance = ROUND_BSKILL;
public plugin_init()
{
#define VERSION "2.3"
// 2.2: add winstreak for skill balancer
// 2.3: remake hooks
register_plugin("[ReAPI] Lite TeamBalancer", VERSION, "neugomon");
register_cvar("reapi_lite_teambalancer", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
RegisterHookChain(RG_CSGameRules_RestartRound, "CSGameRules_RestartRound_Pre", false);
#if defined CUSTOM_MENU
register_clcmd("chooseteam", "CMD_ChooseTeam");
RegisterHookChain(RG_ShowVGUIMenu, "fwdShowVGUIMenu", false);
RegisterHookChain(RG_HandleMenu_ChooseTeam, "fwdHandleMenu_ChooseTeam", false);
#endif
set_task(1.2, "ChangeServerCvars");
}
public ChangeServerCvars()
{
set_cvar_num("mp_autoteambalance", NULL);
#if defined CUSTOM_MENU
set_cvar_num("mp_limitteams", NULL);
#endif
}
public client_putinserver(id)
g_iSkipSPl[id] = g_iSkipNPl[id] = NULL;
public CSGameRules_RestartRound_Pre()
{
if(get_member_game(m_bCompleteReset))
{
arrayset(g_iTeamWinStreaks, 0, sizeof g_iTeamWinStreaks);
g_iSkillBalance = ROUND_BSKILL;
}
else
{
switch(WinStatus:get_member_game(m_iRoundWinStatus))
{
case WINSTATUS_TERRORISTS:
{
g_iTeamWinStreaks[TEAM_TERRORIST]++;
g_iTeamWinStreaks[TEAM_CT] = 0;
}
case WINSTATUS_CTS:
{
g_iTeamWinStreaks[TEAM_CT]++;
g_iTeamWinStreaks[TEAM_TERRORIST] = 0;
}
}
}
new players[MAX_PLAYERS], pnum;
new iTTWins = get_member_game(m_iNumTerroristWins), iCTWins = get_member_game(m_iNumCTWins);
if(
g_iSkillBalance-- <= NULL &&
get_playersnum() >= MIN_PLAYERS &&
abs(iTTWins - iCTWins) >= SCORE_DIFF &&
abs(g_iTeamWinStreaks[TEAM_TERRORIST] - g_iTeamWinStreaks[TEAM_CT]) < WINSTREAKS_DIFF
)
{
new pEnt1, pEnt2;
get_players(players, pnum);
for(new i, TeamName:iTeam, TeamName:iLeader = (iTTWins > iCTWins) ? TEAM_TERRORIST : TEAM_CT, iStats, iCache[2]; i < pnum; i++)
{
if(g_iSkipSPl[players]-- || get_user_flags(players) & ACCESS_IMMUNITY)
continue;
switch((iTeam = get_member(players, m_iTeam)))
{
case TEAM_TERRORIST, TEAM_CT:
{
iStats = get_user_frags(players) - get_member(players, m_iDeaths);
if(iTeam == iLeader)
{
if(iStats > iCache[0])
{
pEnt1 = players;
iCache[0] = iStats;
}
}
else if(iCache[1] > iStats)
{
pEnt2 = players;
iCache[1] = iStats;
}
}
}
}
if(pEnt1 && pEnt2)
{
new szName1[MAX_NAME_LENGTH], szName2[MAX_NAME_LENGTH];
get_entvar(pEnt1, var_netname, szName1, charsmax(szName1));
get_entvar(pEnt2, var_netname, szName2, charsmax(szName1));
ChatColor(pEnt1, MSG_REPLACE, szName1, szName2);
g_iSkipSPl[pEnt1] = PL_IGNORE_SKILL;
g_iSkipSPl[pEnt2] = PL_IGNORE_SKILL;
rg_switch_team(pEnt1);
rg_switch_team(pEnt2);
g_iSkillBalance = ROUND_BSKILL;
}
}
new iNumTt = get_member_game(m_iNumTerrorist);
new iNumCt = get_member_game(m_iNumCT);
new iTransferNum = abs(iNumTt - iNumCt) / 2;
if(iTransferNum > NULL)
{
get_players(players, pnum, "e", (iNumTt > iNumCt) ? "TERRORIST" : "CT");
for(new i, szName[MAX_NAME_LENGTH]; i < pnum; i++)
{
if(g_iSkipNPl[players]-- || g_iSkipSPl[players] == PL_IGNORE_SKILL || get_user_flags(players) & ACCESS_IMMUNITY)
continue;
get_entvar(players, var_netname, szName, charsmax(szName));
ChatColor(players, MSG_TRANSFER, szName, (iNumTt > iNumCt) ? MSG_TRANSFER_CT : MSG_TRANSFER_T);
g_iSkipNPl[players] = PL_IGNORE_NUM;
rg_switch_team(players);
if(--iTransferNum < 1)
break;
}
}
}
stock ChatColor(playerColorIndex, const szMessage[], any:...)
{
#define msgSayText 76
new szMsg[190];
vformat(szMsg, charsmax(szMsg), szMessage, 3);
message_begin(MSG_ALL, msgSayText);
write_byte(playerColorIndex);
write_string(szMsg);
message_end();
}