Skip to content

Commit

Permalink
Updated to version 0.3.8
Browse files Browse the repository at this point in the history
- Added feature for balancing admins between teams
  • Loading branch information
Nord1cWarr1or committed Dec 12, 2019
1 parent 695bcd6 commit e438f03
Show file tree
Hide file tree
Showing 2 changed files with 119 additions and 55 deletions.
44 changes: 24 additions & 20 deletions data/lang/dm_autobalance.txt
@@ -1,23 +1,27 @@
[en]
DMTB_CVAR_MAX_DIFF = Maximum allowable difference between teams
DMTB_CVAR_MODE = Transfer mode^n1 - simple player's respawn^n2 - teleport to spawnspot
DMTB_CVAR_TIME = Time before switching a player for another team
DMTB_CVAR_IMMUNITY = A flag that gives immunity from balance
DMTB_CVAR_BOTS = Do you have to consider the bots when balancing?
DMTB_DHUD_WILL_BALANCED = You will be switched to opposite team via %.0f sec.
DMTB_DHUD_BALANCED_CT = You've been switched to team ct
DMTB_DHUD_BALANCED_TE = You've been switched to team terrorists
DMTB_CHAT_BALANCED_CT = ^4* ^3%n ^1has been moved to ^3team ct^1.
DMTB_CHAT_BALANCED_TE = ^4* ^3%n ^1has been moved to ^3team terrorists^1.
DMTB_CVAR_MAX_DIFF = Maximum allowable difference between teams
DMTB_CVAR_MODE = Transfer mode^n1 - simple player's respawn^n2 - teleport to spawnspot
DMTB_CVAR_TIME = Time before switching a player for another team
DMTB_CVAR_IMMUNITY = A flag that gives immunity from balance
DMTB_CVAR_BOTS = Do you have to consider the bots when balancing?
DMTB_CVAR_ADMIN_MODE = Admins balancing mode.^n0 - switch like normal players.^n1 - do not switch team.^n2 - distribute between teams
DMTB_CVAR_MAX_DIFF_ADMINS = Maximum allowable difference between the number of admins in the commands
DMTB_DHUD_WILL_BALANCED = You will be switched to opposite team via %.0f sec.
DMTB_DHUD_BALANCED_CT = You've been switched to team ct
DMTB_DHUD_BALANCED_TE = You've been switched to team terrorists
DMTB_CHAT_BALANCED_CT = ^4* ^3%n ^1has been moved to ^3team ct^1.
DMTB_CHAT_BALANCED_TE = ^4* ^3%n ^1has been moved to ^3team terrorists^1.

[ru]
DMTB_CVAR_MAX_DIFF = Максимально допустимая разница между командами
DMTB_CVAR_MODE = Режим работы переноса^n1 - простой респавн игрока^n2 - телепорт на спавн
DMTB_CVAR_TIME = Время перед перемещением игрока за другую команду
DMTB_CVAR_IMMUNITY = Флаг, дающий иммунитет от баланса
DMTB_CVAR_BOTS = Учитывать ли ботов при балансе?
DMTB_DHUD_WILL_BALANCED = Вы будете перемещены за другую команду через %.0f сек.
DMTB_DHUD_BALANCED_CT = Вы были перемещены за контр-террористов
DMTB_DHUD_BALANCED_TE = Вы были перемещены за террористов
DMTB_CHAT_BALANCED_CT = ^4* ^3%n ^1был перемещён за ^3контр-террористов^1.
DMTB_CHAT_BALANCED_TE = ^4* ^3%n ^1был перемещён за ^3террористов^1.
DMTB_CVAR_MAX_DIFF = Максимально допустимая разница между командами
DMTB_CVAR_MODE = Режим работы переноса^n1 - простой респавн игрока^n2 - телепорт на спавн
DMTB_CVAR_TIME = Время перед перемещением игрока за другую команду
DMTB_CVAR_IMMUNITY = Флаг, дающий иммунитет от баланса
DMTB_CVAR_BOTS = Учитывать ли ботов при балансе?
DMTB_CVAR_ADMIN_MODE = Режим балансировки админов.^n0 - переводить вместе со всеми^n1 - не переводить^n2 - распределять между командами
DMTB_CVAR_MAX_DIFF_ADMINS = Максимально допустимая разница между количеством админов в командах
DMTB_DHUD_WILL_BALANCED = Вы будете перемещены за другую команду через %.0f сек.
DMTB_DHUD_BALANCED_CT = Вы были перемещены за контр-террористов
DMTB_DHUD_BALANCED_TE = Вы были перемещены за террористов
DMTB_CHAT_BALANCED_CT = ^4* ^3%n ^1был перемещён за ^3контр-террористов^1.
DMTB_CHAT_BALANCED_TE = ^4* ^3%n ^1был перемещён за ^3террористов^1.
130 changes: 95 additions & 35 deletions scripting/AutoBalance.sma
Expand Up @@ -4,7 +4,7 @@
#include <xs>
#include <screenfade_util>

new const PLUGIN_VERSION[] = "0.3.7";
new const PLUGIN_VERSION[] = "0.3.8";

#define GetCvarDesc(%0) fmt("%L", LANG_SERVER, %0)

Expand All @@ -21,8 +21,10 @@ enum _:Cvars
MAX_DIFF,
MODE,
Float:TIME_TO_PREPARE,
IMMUNITY_FLAG[2],
BOTS
ADMIN_FLAG[2],
BOTS,
ADMIN_MODE,
MAX_DIFF_ADMINS
};

new g_iCvar[Cvars];
Expand All @@ -47,6 +49,9 @@ new g_iNumSpawnsCT, g_iNumSpawnsTE;

new g_pCvarMode;

new g_iPlayersInTeam[TeamName][MAX_PLAYERS], g_iCountPlayersInTeam[TeamName];
new g_iAdminsInTeam[TeamName][MAX_PLAYERS], g_iCountAdminsInTeam[TeamName];

public plugin_init()
{
register_plugin("DM AutoBalance", PLUGIN_VERSION, "Nordic Warrior");
Expand Down Expand Up @@ -135,7 +140,6 @@ public CheckTeams()

get_players_ex(iPlayers, iPlayersNum, g_iCvar[BOTS] ? GetPlayers_ExcludeHLTV : (GetPlayers_ExcludeBots | GetPlayers_ExcludeHLTV));

new iPlayersInTeam[TeamName][MAX_PLAYERS], iCountInTeam[TeamName];
new TeamName:iTeam;
new iPlayer;

Expand All @@ -145,51 +149,83 @@ public CheckTeams()

iTeam = get_member(iPlayer, m_iTeam);

iPlayersInTeam[iTeam][iCountInTeam[iTeam]++] = iPlayer;
g_iPlayersInTeam[iTeam][g_iCountPlayersInTeam[iTeam]++] = iPlayer;

if(has_flag(iPlayer, g_iCvar[ADMIN_FLAG]) && g_iCvar[ADMIN_MODE] == 2)
{
g_iAdminsInTeam[iTeam][g_iCountAdminsInTeam[iTeam]++] = iPlayer;
}
}

#if defined DEBUG
log_amx("TE = %i, CT = %i", iCountInTeam[TEAM_TERRORIST], iCountInTeam[TEAM_CT]);
log_amx("TE = %i, CT = %i", g_iCountPlayersInTeam[TEAM_TERRORIST], g_iCountPlayersInTeam[TEAM_CT]);
log_amx("ADM TE = %i, ADM CT = %i", g_iCountAdminsInTeam[TEAM_TERRORIST], g_iCountAdminsInTeam[TEAM_CT]);
#endif

if(xs_abs(iCountInTeam[TEAM_TERRORIST] - iCountInTeam[TEAM_CT]) > g_iCvar[MAX_DIFF])
if(xs_abs(g_iCountPlayersInTeam[TEAM_TERRORIST] - g_iCountPlayersInTeam[TEAM_CT]) > g_iCvar[MAX_DIFF])
{
new iTeamToBalance = xs_sign(iCountInTeam[TEAM_TERRORIST] - iCountInTeam[TEAM_CT]);
new iRandomPlayer;
GetPlayerForBalance(g_iCountPlayersInTeam[TEAM_TERRORIST], g_iCountPlayersInTeam[TEAM_CT]);
}
else if(g_iCvar[ADMIN_MODE] == 2 && xs_abs(g_iCountAdminsInTeam[TEAM_TERRORIST] - g_iCountAdminsInTeam[TEAM_CT]) > g_iCvar[MAX_DIFF_ADMINS])
{
GetPlayerForBalance(g_iCountAdminsInTeam[TEAM_TERRORIST], g_iCountAdminsInTeam[TEAM_CT], true);
}
ArrayZeroing();
return PLUGIN_HANDLED;
}

if(iTeamToBalance == 1)
{
iRandomPlayer = iPlayersInTeam[TEAM_TERRORIST][random(iCountInTeam[TEAM_TERRORIST])];
g_iNewPlayerTeam[iRandomPlayer] = TEAM_CT;
}
else if(iTeamToBalance == -1)
{
iRandomPlayer = iPlayersInTeam[TEAM_CT][random(iCountInTeam[TEAM_CT])];
g_iNewPlayerTeam[iRandomPlayer] = TEAM_TERRORIST;
}
GetPlayerForBalance(const iNumTE, const iNumCT, bool:bAdmins = false)
{
new iTeamToBalance = xs_sign(iNumTE - iNumCT);
new iRandomPlayer;

if(iTeamToBalance == 1 && !bAdmins)
{
iRandomPlayer = g_iPlayersInTeam[TEAM_TERRORIST][random(g_iCountPlayersInTeam[TEAM_TERRORIST])];
g_iNewPlayerTeam[iRandomPlayer] = TEAM_CT;
}
else if(iTeamToBalance == -1 && !bAdmins)
{
iRandomPlayer = g_iPlayersInTeam[TEAM_CT][random(g_iCountPlayersInTeam[TEAM_CT])];
g_iNewPlayerTeam[iRandomPlayer] = TEAM_TERRORIST;
}
else if(iTeamToBalance == 1 && bAdmins)
{
iRandomPlayer = g_iAdminsInTeam[TEAM_TERRORIST][random(g_iCountAdminsInTeam[TEAM_TERRORIST])];
g_iNewPlayerTeam[iRandomPlayer] = TEAM_CT;
}
else if(iTeamToBalance == -1 && bAdmins)
{
iRandomPlayer = g_iAdminsInTeam[TEAM_CT][random(g_iCountAdminsInTeam[TEAM_CT])];
g_iNewPlayerTeam[iRandomPlayer] = TEAM_TERRORIST;
}

#if defined DEBUG
log_amx("Balanced player: <%n>, ID: %i", iRandomPlayer, iRandomPlayer);
#endif

if(!bAdmins && has_flag(iRandomPlayer, g_iCvar[ADMIN_FLAG]) && (g_iCvar[ADMIN_MODE] == 1 || g_iCvar[ADMIN_MODE] == 2))
{
#if defined DEBUG
log_amx("Balanced player: <%n>, ID: %i", iRandomPlayer, iRandomPlayer);
log_amx("Player <%n> has immunity", iRandomPlayer);
#endif

if(has_flag(iRandomPlayer, g_iCvar[IMMUNITY_FLAG]))
{
#if defined DEBUG
log_amx("Player <%n> has immunity", iRandomPlayer);
#endif
RequestFrame("CheckTeams");
return PLUGIN_HANDLED;
}

RequestFrame("CheckTeams");
return PLUGIN_HANDLED;
}
NotifyAndBalancePlayer(iRandomPlayer);
return PLUGIN_HANDLED;
}

new iData[1]; iData[0] = iRandomPlayer;
NotifyAndBalancePlayer(const id)
{
new iData[1]; iData[0] = id;

set_task(g_iCvar[TIME_TO_PREPARE], "BalancePlayer", TASKID__BALANCE_PLAYER, iData, sizeof iData);
set_task(g_iCvar[TIME_TO_PREPARE], "BalancePlayer", TASKID__BALANCE_PLAYER, iData, sizeof iData);

set_dhudmessage(255, 255, 255, -1.0, 0.42, 0, 0.0, 3.0, 0.1, 0.1);
show_dhudmessage(iRandomPlayer, "%l", "DMTB_DHUD_WILL_BALANCED", g_iCvar[TIME_TO_PREPARE]);
}
return PLUGIN_HANDLED;
set_dhudmessage(255, 255, 255, -1.0, 0.42, 0, 0.0, 3.0, 0.1, 0.1);
show_dhudmessage(id, "%l", "DMTB_DHUD_WILL_BALANCED", g_iCvar[TIME_TO_PREPARE]);
}

public BalancePlayer(iData[])
Expand All @@ -212,6 +248,11 @@ public BalancePlayer(iData[])

rg_switch_team(id);

if(has_flag(id, g_iCvar[ADMIN_FLAG]) && g_iCvar[ADMIN_MODE] == 2)
{
RequestFrame("CheckTeams");
}

switch(g_iCvar[MODE])
{
case 1: rg_round_respawn(id);
Expand Down Expand Up @@ -241,6 +282,14 @@ public ShowHud(id)
ClientPrintToAllExcludeOne(id, id, "%l", g_iNewPlayerTeam[id] == TEAM_CT ? "DMTB_CHAT_BALANCED_CT" : "DMTB_CHAT_BALANCED_TE", id);
}

ArrayZeroing()
{
arrayset(g_iPlayersInTeam[any:0][0], 0, sizeof g_iPlayersInTeam * sizeof g_iPlayersInTeam[]);
arrayset(g_iCountPlayersInTeam[any:0], 0, sizeof g_iCountPlayersInTeam);
arrayset(g_iAdminsInTeam[any:0][0], 0, sizeof g_iAdminsInTeam * sizeof g_iPlayersInTeam[]);
arrayset(g_iCountAdminsInTeam[any:0], 0, sizeof g_iCountAdminsInTeam);
}

public CreateCvars()
{
bind_pcvar_num(create_cvar("dmtb_max_diff", "1",
Expand All @@ -259,13 +308,24 @@ public CreateCvars()

bind_pcvar_string(create_cvar("dmtb_immunity", "a",
.description = GetCvarDesc("DMTB_CVAR_IMMUNITY")),
g_iCvar[IMMUNITY_FLAG], charsmax(g_iCvar[IMMUNITY_FLAG]));
g_iCvar[ADMIN_FLAG], charsmax(g_iCvar[ADMIN_FLAG]));

bind_pcvar_num(create_cvar("dmtb_bots", "0",
.description = GetCvarDesc("DMTB_CVAR_BOTS"),
.has_min = true, .min_val = 0.0,
.has_max = true, .max_val = 1.0),
g_iCvar[BOTS]);

bind_pcvar_num(create_cvar("dmtb_admin_mode", "1",
.description = GetCvarDesc("DMTB_CVAR_ADMIN_MODE"),
.has_min = true, .min_val = 0.0,
.has_max = true, .max_val = 2.0),
g_iCvar[ADMIN_MODE]);

bind_pcvar_num(create_cvar("dmtb_max_diff_admins", "1",
.description = GetCvarDesc("DMTB_CVAR_MAX_DIFF_ADMINS"),
.has_min = true, .min_val = 1.0),
g_iCvar[MAX_DIFF_ADMINS]);
}

stock ClientPrintToAllExcludeOne(const iExcludePlayer, const iSender, const szMessage[], any:...)
Expand Down

0 comments on commit e438f03

Please sign in to comment.