From e438f03d1ab90c597c73c19d534574609be7e841 Mon Sep 17 00:00:00 2001 From: Nord1cWarr1or <47604048+Nord1cWarr1or@users.noreply.github.com> Date: Fri, 13 Dec 2019 02:42:48 +0300 Subject: [PATCH] Updated to version 0.3.8 - Added feature for balancing admins between teams --- data/lang/dm_autobalance.txt | 44 ++++++------ scripting/AutoBalance.sma | 130 +++++++++++++++++++++++++---------- 2 files changed, 119 insertions(+), 55 deletions(-) diff --git a/data/lang/dm_autobalance.txt b/data/lang/dm_autobalance.txt index f2fd74b..3d0c89a 100644 --- a/data/lang/dm_autobalance.txt +++ b/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. \ No newline at end of file +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. \ No newline at end of file diff --git a/scripting/AutoBalance.sma b/scripting/AutoBalance.sma index ce20608..df5b248 100644 --- a/scripting/AutoBalance.sma +++ b/scripting/AutoBalance.sma @@ -4,7 +4,7 @@ #include #include -new const PLUGIN_VERSION[] = "0.3.7"; +new const PLUGIN_VERSION[] = "0.3.8"; #define GetCvarDesc(%0) fmt("%L", LANG_SERVER, %0) @@ -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]; @@ -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"); @@ -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; @@ -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[]) @@ -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); @@ -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", @@ -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:...)