Raised This Month: $51 Target: $400
 12% 

[REQ] Help with [H] Balance


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
CrazySkull2k
Member
Join Date: Feb 2017
Old 01-07-2019 , 03:47   [REQ] Help with [H] Balance
Reply With Quote #1

Hi, I was wondering if anyone can help me with this plugin: https://forums.alliedmods.net/showthread.php?p=1869075

The thing is I want to turn off the notifications that appear in the chat everytime the teams have been balanced, I want it just to show "<player> has been moved from <team> to <team>
Also there is this weird bug, it always says <player> has been moved from TERORRISTS to TERORRISTS and the only difference is the color (blue=CT, orange=T)
If anyone could help me that would be great.. I can even pay if you want

Here is the code
Quote:
#pragma semicolon 1

#include <sourcemod>
#include <sdktools>
#include <cstrike>
#undef REQUIRE_EXTENSIONS

#define PLUGIN_VERSION "1.6.6"
#define TRANSLATION_FILE "hbalance.phrases"

#define MIN_DAMPING 3
#define _DEBUG 1

#define LOG_NEVER 0
#define LOG_ONACTION 1
#define LOG_ALWAYS 2

#define ADMIN_PROT_NONE 0
#define ADMIN_PROT_MODERATE 1
#define ADMIN_PROT_FULL 2

#define MODE_CONTINOUS 0
#define MODE_ROUND_BASED 1

Handle s_activatePlugin = INVALID_HANDLE;
Handle s_dampingFactor = INVALID_HANDLE;
Handle s_logLevel = INVALID_HANDLE;
Handle s_roundRestartDelay = INVALID_HANDLE;
Handle s_adminProt = INVALID_HANDLE;
Handle s_gameMode = INVALID_HANDLE;
Handle s_minPlayers = INVALID_HANDLE;
Handle s_warmupTime = INVALID_HANDLE;

EngineVersion g_Game;

public Plugin myinfo =
{
name = "HANSE-Balance",
author = "red!",
description = "Generic Team balancer (supporting CS:GO)",
version = PLUGIN_VERSION,
url = "http://www.hanse-clan.de"
};


// globals
int s_streak[4] = {0, 0, 0, 0};
int s_kills[4] = {0, 0, 0, 0};
bool s_isCstrike = true;
int s_lastSwitch[MAXPLAYERS+1];
int s_minGracePeriod = 3;
int s_teamCountCT = 0;
int s_teamCountT = 0;
Handle s_teamTableCT = INVALID_HANDLE;
Handle s_teamTableT = INVALID_HANDLE;
int s_lastBalanceTime = 0;
bool s_continousMode = false;
bool s_isWarmup = false;

public OnPluginStart()
{
g_Game = GetEngineVersion();
if(g_Game == Engine_CSGO || g_Game == Engine_CSS)
{
s_isCstrike = true;
LogMessage("hbalance is running in counter strike mode");
}
else
{
s_isCstrike = false;
LogMessage("hbalance is running in generic game mode");
}

LoadTranslations(TRANSLATION_FILE);
CreateConVar("hbalance_version", PLUGIN_VERSION, "Version of [HANSE] Team Balance", FCVAR_PLUGIN|FCVAR_NOTIFY|FCVAR_SPONLY);
s_teamTableCT = CreateArray(2, MAXPLAYERS);
s_teamTableT = CreateArray(2, MAXPLAYERS);

// register commands & events
RegAdminCmd("sm_hbalance_dbg", consoleDbgCmd, ADMFLAG_GENERIC);
RegAdminCmd("sm_force_balance", consoleForceBalance, ADMFLAG_CHANGEMAP | ADMFLAG_KICK );
s_activatePlugin= CreateConVar("sm_teambalance", "1", "Activate H-Balance team balancer",0, true, 0.0, true, 1.0);
s_dampingFactor = CreateConVar("sm_balanceDamping", "2", "The higher the value, the slower the plugin reacts", 0, true, 0.0);
s_adminProt = CreateConVar("sm_adminProtection", "0", "0=no protection, 1=moderate protection, 2=full protection (BALANCE PERFORMANCE MAY BE REDUCED MASIVELY)", 0, true, 0.0, true, 2.0);
s_roundRestartDelay = FindConVar("mp_round_restart_delay");
s_logLevel= CreateConVar("sm_balance_log_level", "1", "Amount of logging (0=off, 1=on balance, 2=always)",0, true, 0.0, true, 2.0);
s_gameMode= CreateConVar("sm_balance_mode", (s_isCstrike) ? "1" : "0", "EXPERIMENTAL[!!!]: Balancing mode (0=continous/respawn, 1=round based)",0, true, 0.0, true, 1.0);
s_minPlayers = CreateConVar("sm_balance_min_players", "3", "Minimum players in game to start balancing",0, true, 2.0);
s_warmupTime = FindConVar("mp_warmuptime");
s_lastBalanceTime = GetTime();

AutoExecConfig(true, "hbalance");

HookEvent("round_end", EventRoundEnd,EventHookMode_PostNoCopy);
HookEvent("player_death", EventPlayerDeath);
CreateTimer(60.0, Timer_Grace, INVALID_HANDLE, TIMER_REPEAT);
}

public OnClientPutInServer(client)
{
s_lastSwitch[client] = 0;
}

public OnMapStart()
{
s_streak[CS_TEAM_CT] = 0;
s_streak[CS_TEAM_T] = 0;

if(g_Game != Engine_CSGO)
{
float warmupTime = 0.0;
if (s_warmupTime != INVALID_HANDLE) {
warmupTime = GetConVarFloat(s_warmupTime);
}
if (warmupTime > 0.0)
{
s_isWarmup = true;
if (CreateTimer(warmupTime, Timer_WarmupEnd, 0, TIMER_FLAG_NO_MAPCHANGE) == INVALID_HANDLE) {
s_isWarmup = false;
}
}
}
}

public Action Timer_Grace(Handle timer)
{
for (new i = 1; i <= MaxClients; i++)
{
if (IsClientInGame(i)) {
s_lastSwitch[i]++;
}
}
}

public Action Timer_WarmupEnd(Handle timer, any param)
{
s_isWarmup = false;
}

public EventRoundEnd(Handle event, char[] name, bool dontBroadcast)
{
if (((g_Game != Engine_CSGO && s_isWarmup == false) || GameRules_GetProp("m_bWarmupPeriod") != 1) && GetConVarInt(s_gameMode) == MODE_ROUND_BASED)
{
s_continousMode = false;
int winner = GetEventInt(event, "winner");
if (winner==CS_TEAM_T)
{
s_streak[CS_TEAM_T]++;
s_streak[CS_TEAM_CT] = 0;
}
if (winner==CS_TEAM_CT)
{
s_streak[CS_TEAM_CT]++;
s_streak[CS_TEAM_T] = 0;
}

float restartDelay = 1.0;

if (s_roundRestartDelay != INVALID_HANDLE)
{
restartDelay = GetConVarFloat(s_roundRestartDelay)-1.0;
if (restartDelay < 0.0) {
restartDelay = 0.0;
}
}

if (isPluginActive()) {
CreateTimer(restartDelay, Timer_Balance, winner, TIMER_FLAG_NO_MAPCHANGE);
}
}
}

public EventPlayerDeath(Handle event, const char[] name, bool dontBroadcast)
{
if (GameRules_GetProp("m_bWarmupPeriod") != 1 && GetConVarInt(s_gameMode) == MODE_CONTINOUS)
{
s_continousMode = true;
int victim = GetClientOfUserId(GetEventInt(event, "userid"));
int winner = getOpposingTeamOf(GetClientTeam(victim));
if (winner==CS_TEAM_T)
{
s_kills[CS_TEAM_T]++;
s_kills[CS_TEAM_CT]=(s_kills[CS_TEAM_CT]*2)/3;
}
if (winner==CS_TEAM_CT)
{
s_kills[CS_TEAM_CT]++;
s_kills[CS_TEAM_T]=(s_kills[CS_TEAM_T]*2)/3;
}

if (isPluginActive())
{
if (isValidPlayer(victim))
{
if ((GetTime() - s_lastBalanceTime) > 2 * 60)
{
#if defined DEBUG
LogMessage("triggering continous balance for team");
#endif

CreateTimer(0.1, Timer_Balance, getOpposingTeamOf(GetClientTeam(victim)), TIMER_FLAG_NO_MAPCHANGE);
}
}
}
}
}

public Action Timer_Balance(Handle timer, any winner)
{
refreshRanking();
#if defined DEBUG
LogMessage("score %d:%d, score weight %d:%d, team weight %d:%d, team members %d:%d, imbalance %d:%d", GetTeamScore(CS_TEAM_CT), GetTeamScore(CS_TEAM_T), s_streak[CS_TEAM_CT], s_streak[CS_TEAM_T], getTeamWeight(CS_TEAM_CT), getTeamWeight(CS_TEAM_T), s_teamCountCT, s_teamCountT, getImbalanceRating(CS_TEAM_CT), getImbalanceRating(CS_TEAM_T));
#endif

// balance team size
bool balanced = false;
int largerTeam = -1;
if (s_teamCountT > (s_teamCountCT+1)) {
largerTeam = CS_TEAM_T;
}
if (s_teamCountCT > (s_teamCountT +1)) {
largerTeam = CS_TEAM_CT;
}
if (largerTeam != -1)
{
balanceByMove(largerTeam, false);
balanced = true;
}

// balance team strengh
if ((s_teamCountCT+s_teamCountT)>=GetConVarInt(s _minPlayers))
{
if ((getImbalanceRating(CS_TEAM_CT)-getImbalanceRating(CS_TEAM_T)) >= getDampingFactor())
{
balanceTeam(CS_TEAM_CT, false);
balanced = true;
}
else if ((getImbalanceRating(CS_TEAM_T)-getImbalanceRating(CS_TEAM_CT)) >= getDampingFactor())
{
balanceTeam(CS_TEAM_T, false);
balanced = true;
}
}

if (balanced)
{
if (GetConVarInt(s_logLevel) != LOG_NEVER) {
PrintToChatAll("%T", "Teams have been balanced", LANG_SERVER);
}
#if defined DEBUG
int leadingTeamWeight = getTeamWeight(winner);
int inferiorTeamWeight = getTeamWeight(getOpposingTeamOf(winner));
LogMessage("debug: difference %d:%d (%d)", leadingTeamWeight, inferiorTeamWeight, inferiorTeamWeight - leadingTeamWeight);
#endif
}
else
{
if (GetConVarInt(s_logLevel) == LOG_ALWAYS) {
PrintToChatAll("%T", "No team balancing necessary", LANG_SERVER);
}
}
}

balanceTeam(leadingTeam, bool slay)
{
int leadingTeamWeight = getTeamWeight(leadingTeam);
int inferiorTeamWeight = getTeamWeight(getOpposingTeamOf(leadingTeam)) ;

int deltaRef = inferiorTeamWeight - leadingTeamWeight;
int result = deltaRef;

if (getTeamTableSize(leadingTeam) > getTeamTableSize(getOpposingTeamOf(leadingTea m))) {
result = balanceByMove(leadingTeam, slay);
}
else {
result = balanceBySwap(leadingTeam, true, slay);
}

// optional second stage
if (((s_teamCountCT+s_teamCountT) >= (3+getDampingFactor())) && ((result<0) || (result > (100 + (getDampingFactor()*10)))))
{
//LogMessage("balance result before stage2 from team balance difference %d to %d", deltaRef, result);
result = balanceBySwap(leadingTeam, false, slay);
}

//LogMessage("balanced from team balance difference %d to %d", deltaRef, result);

s_streak[leadingTeam] = s_streak[leadingTeam] / 2;
}

balanceByMove(leadingTeam, bool slay) {

int leadingTeamWeight = getTeamWeight(leadingTeam);
int inferiorTeamWeight = getTeamWeight(getOpposingTeamOf(leadingTeam)) ;

int deltaRef = inferiorTeamWeight - leadingTeamWeight;
int deltaBestGuess = deltaRef;

int bestGuess = -1;

for (new i=0;i<getTeamTableSize(leadingTeam);i++)
{
if (!isProtected(GetArrayCell(getTeamTable(leadi ngTeam) , i, 1)))
{
int ldscore = GetArrayCell(getTeamTable(leadingTeam), i, 0);
int deltaThis = (inferiorTeamWeight+ldscore) - (leadingTeamWeight-ldscore);
if (((deltaBestGuess < 0) && (deltaThis > deltaBestGuess)) ||
((deltaBestGuess > 0) && (deltaThis > 0) && (deltaThis<deltaBestGuess)))
{
bestGuess = i;
deltaBestGuess = deltaThis;
}
}
}

if (bestGuess<0)
{
if (s_continousMode)
{
LogMessage("move; no adequate target found in continous mode.");
return deltaRef;
}
else if (GetConVarInt(s_adminProt)!=ADMIN_PROT_FULL)
{
bestGuess = GetRandomInt(0, getTeamTableSize(leadingTeam)-1);
int ldscore=GetArrayCell(getTeamTable(leadingTeam ), bestGuess, 0);
deltaBestGuess = (inferiorTeamWeight + ldscore) - (leadingTeamWeight - ldscore);
//LogMessage("move; no adequate target found, using random target");
}
else
{
//LogMessage("move; no adequate target found, not using backup strategy in FULL ADMIN PROTECTION mode");
return deltaRef;
}
}

movePlayerToTeam(GetArrayCell(getTeamTable(le adingTeam) , bestGuess, 1), getOpposingTeamOf(leadingTeam), slay);
return deltaBestGuess;
}

balanceBySwap(leadingTeam, bool force, bool slay) {
int leadingTeamWeight = getTeamWeight(leadingTeam);
int inferiorTeamWeight = getTeamWeight(getOpposingTeamOf(leadingTeam)) ;

int deltaRef = inferiorTeamWeight - leadingTeamWeight;
int deltaBestGuess = deltaRef;

int bestGuessLT = -1;
int bestGuessIT = -1;

for (new i=0; i < getTeamTableSize(leadingTeam); i++)
{
int ldscore = GetArrayCell(getTeamTable(leadingTeam), i, 0);
for (new j=0; j < getTeamTableSize(getOpposingTeamOf(leadingTea m)); j++)
{
if ((!isProtected(GetArrayCell(getTeamTable(lead ingTeam) , i, 1))) && (!isProtected(GetArrayCell(getTeamTable(getOp posingTeamOf(leadingTeam)) , j, 1))))
{
int ifScore = GetArrayCell(getTeamTable(getOpposingTeamOf(l eadingTeam)), j, 0);
int deltaThis = (inferiorTeamWeight-ifScore+ldscore) - (leadingTeamWeight + ifScore - ldscore);
if (((deltaBestGuess < 0) && (deltaThis > deltaBestGuess)) ||
((deltaBestGuess > 0) && (deltaThis < deltaBestGuess) && (deltaThis > 0)))
{
bestGuessLT = i;
bestGuessIT = j;
deltaBestGuess = deltaThis;
}
}
}
}
if ((bestGuessLT < 0) || (bestGuessIT < 0))
{
if (s_continousMode)
{
LogMessage("swap; no adequate targets found in continous mode.");
return deltaRef;
}
else if (GetConVarInt(s_adminProt) == ADMIN_PROT_FULL)
{
//LogMessage("swap; no adequate targets found, not using backup strategy in FULL ADMIN PROTECTION mode");
return deltaRef;
}
else if (force)
{
bestGuessLT = 0;
bestGuessIT = getTeamTableSize(getOpposingTeamOf(leadingTea m)) - 1;
int ldscore = GetArrayCell(getTeamTable(leadingTeam), bestGuessLT, 0);
int ifScore = GetArrayCell(getTeamTable(getOpposingTeamOf(l eadingTeam)), bestGuessIT, 0);
deltaBestGuess = (inferiorTeamWeight - ifScore + ldscore) - (leadingTeamWeight + ifScore - ldscore);
//LogMessage("swap; no adequate targets found, using best and worst in force mode");
}
else
{
//LogMessage("swap; no adequate targets found, doing nothing when not forced");
return deltaRef;
}
}

int clientLT = GetArrayCell(getTeamTable(leadingTeam), bestGuessLT, 1);
int clientIT = GetArrayCell(getTeamTable(getOpposingTeamOf(l eadingTeam)), bestGuessIT, 1);
movePlayerToTeam(clientLT, getOpposingTeamOf(leadingTeam), slay);
movePlayerToTeam(clientIT, leadingTeam, slay);

return deltaBestGuess;
}

movePlayerToTeam(client, targetTeam, bool slay)
{
if (isValidPlayer(client))
{
int id; int score;
bool success = false;
for (new i=0; i < getTeamTableSize(getOpposingTeamOf(targetTeam )); i++)
{
id = GetArrayCell(getTeamTable(getOpposingTeamOf(t argetTeam)), i, 1);
if (id == client)
{
// move in player tables
score = GetArrayCell(getTeamTable(getOpposingTeamOf(t argetTeam)), i, 0);
SetArrayCell(getTeamTable(targetTeam), getTeamTableSize(targetTeam), score, 0);
SetArrayCell(getTeamTable(targetTeam), getTeamTableSize(targetTeam), id, 1);
setTeamTableSize(targetTeam, getTeamTableSize(targetTeam)+1);
SetArrayCell(getTeamTable(getOpposingTeamOf(t argetTeam)), i, 0, 0);
SetArrayCell(getTeamTable(getOpposingTeamOf(t argetTeam)), i, 0, 1);
setTeamTableSize(getOpposingTeamOf(targetTeam ), getTeamTableSize(getOpposingTeamOf(targetTeam ))-1);
SortADTArray(s_teamTableCT,Sort_Descending, Sort_Integer);
SortADTArray(s_teamTableT ,Sort_Descending, Sort_Integer);

// trigger team change
char name[20] = "";
GetClientName(client, name, 20);
//LogMessage("moving player %s to team %s", name, (targetTeam == CS_TEAM_T) ? "Team1" : "Team2" );

Handle pack = CreateDataPack();
WritePackCell(pack, client);
WritePackCell(pack, targetTeam);
WritePackCell(pack, (slay) ? 1:0);
PrintCenterText(client, "%T", "You have been moved", client);
CreateTimer(0.5, Timer_ChangeClientTeam, pack, TIMER_FLAG_NO_MAPCHANGE);
success=true;
s_lastBalanceTime = GetTime();
s_lastSwitch[client] = 0;
}
}
if (!success) {
//LogMessage("failed moving player %d to team %s (not in source list)", client, (targetTeam == CS_TEAM_T) ? "Team1" : "Team2" );
}
if (!validateTeamTables()) {
//LogMessage("failed internal validation after moving player %d to team %s", client, (targetTeam == CS_TEAM_T) ? "Team1" : "Team2" );
}
}
else {
//LogMessage("trying to move invalid player %d to team %s", client, (targetTeam == CS_TEAM_T) ? "Team1" : "Team2" );
}
}

bool isValidPlayer(client)
{
return (client > 0) && (client <= MaxClients) && IsClientInGame(client);
}

public Action Timer_ChangeClientTeam(Handle timer, any pack) {
ResetPack(pack);
int client = ReadPackCell(pack);
int team = ReadPackCell(pack);
bool slay = (ReadPackCell(pack) == 1) ? true : false;
CloseHandle(pack);
if (isValidPlayer(client) && (GetClientTeam(client) == getOpposingTeamOf(team)))
{
if (slay && IsPlayerAlive(client)) {
ForcePlayerSuicide(client);
}
if (s_isCstrike)
{
CS_SwitchTeam(client, team);
CS_UpdateClientModel(client);
}
else {
ChangeClientTeam(client, team);
}

PrintCenterText(client, "%T", "You have been moved", client);
}
else {
//LogMessage("failed on moving invalid player %d to team %s", client, (team == CS_TEAM_T) ? "Team1" : "Team2" );
}
}

getOpposingTeamOf(team)
{
return(team == CS_TEAM_T) ? CS_TEAM_CT : CS_TEAM_T;
}

refreshRanking()
{
s_continousMode = GetConVarInt(s_gameMode) == MODE_CONTINOUS;
s_teamCountCT = 0;
s_teamCountT = 0;
for ( new i = 1; i <= MaxClients; i++ )
{
if ( IsClientInGame(i) )
{
int team = GetClientTeam(i);
if (team == CS_TEAM_T)
{
SetArrayCell(s_teamTableT, s_teamCountT, getPlayerScore(i), 0);
SetArrayCell(s_teamTableT, s_teamCountT, i, 1);
s_teamCountT++;
}
else if (team == CS_TEAM_CT)
{
SetArrayCell(s_teamTableCT, s_teamCountCT, getPlayerScore(i), 0);
SetArrayCell(s_teamTableCT, s_teamCountCT, i, 1);
s_teamCountCT++;
}
}
}
// pad table with zeros and sort.
for ( new i = s_teamCountT; i < MAXPLAYERS; i++ )
{
SetArrayCell(s_teamTableT, i, 0, 0);
SetArrayCell(s_teamTableT, i, 0, 1);
}
for ( new j = s_teamCountCT; j < MAXPLAYERS; j++ )
{
SetArrayCell(s_teamTableCT, j, 0, 0);
SetArrayCell(s_teamTableCT, j, 0, 1);
}
SortADTArray(s_teamTableCT,Sort_Descending, Sort_Integer);
SortADTArray(s_teamTableT ,Sort_Descending, Sort_Integer);
validateTeamTables();
}


dumpTeamTable(team)
{
for (new i=0; i < getTeamTableSize(team); i++)
{
int c = GetArrayCell(getTeamTable(team), i, 1);
char name[20]= "<invalid>";
if (isValidPlayer(c)) {
GetClientName(c, name, 20);
}
//LogMessage(" %d, %d: id %d; name %s", team, c, GetArrayCell(getTeamTable(team) , i, 0), name);
}
}

bool validateTeamTables()
{
bool res1 = validateTeamTable(CS_TEAM_T);
bool res2 = validateTeamTable(CS_TEAM_CT);
return res1 && res2;
}

bool validateTeamTable(team)
{
Handle table = getTeamTable(team);
int tablesize = getTeamTableSize(team);
bool res = true;
for ( new i = 0; i < MAXPLAYERS; i++ )
{
int score = GetArrayCell(table,i,0);
int id = GetArrayCell(table,i,1);
if (i < tablesize && (id == 0 || id >= MaxClients))
{
res = false;
//LogMessage("validation error A at %d (%d,%d)", i, score, id);
}
if (i >= tablesize && (id != 0 || score != 0))
{
res=false;
//LogMessage("validation error B at %d (%d,%d)", i, score, id);
}
}
if (!res) {
dumpTeamTable(team);
}

return res;
}

bool isProtected(client)
{
if (!isValidPlayer(client))
{
//LogMessage("isProtected called with invalid client id %i", client);
dumpTeamTable(CS_TEAM_T);
dumpTeamTable(CS_TEAM_CT);
return true;
}

if (s_continousMode && IsPlayerAlive(client)) {
return true;
}

bool isAdmin = (GetUserFlagBits(client) & ADMFLAG_ROOT) != 0 || (GetUserFlagBits(client) & ADMFLAG_GENERIC) != 0;
if (GetConVarInt(s_adminProt) == ADMIN_PROT_FULL)
{
if (isAdmin) {
return true;
}
}
else if (GetConVarInt(s_adminProt) == ADMIN_PROT_MODERATE)
{
if (isAdmin && s_lastSwitch[client] < (s_minGracePeriod * 3))
{
if (s_lastSwitch[client] >= s_minGracePeriod) {
//LogMessage("applying extended grace period [%d] to admin %d", s_lastSwitch[client], client);
}
return true;
}
}

return s_lastSwitch[client] < s_minGracePeriod;
}


#define DEFAULT_SCORE 100

getPlayerScore(client)
{
int score = 50 + (10 * getDampingFactor());
if ( isValidPlayer(client) )
{
int kills = GetClientFrags(client);
int deaths = GetClientDeaths(client);
if (kills == 0) {
kills = 1;
}
if (deaths == 0) {
deaths=1;
}
int kdscore = DEFAULT_SCORE * kills / deaths;
int kds = 10 - (kills + deaths);
if (kds > 0) {
score = (score + (DEFAULT_SCORE * kds)) / (kds + 1);
}
score += kdscore;
}

return score;
}

getTeamWeight(team)
{
return getTeamWeightInt(getTeamTable(team), getTeamTableSize(team));
}
getTeamWeightInt(Handle scoreTable, size)
{
int score = 0;
for (new i=0; i < size; i++) {
score += GetArrayCell(scoreTable, i, 0);
}
return score;
}


Handle getTeamTable(team)
{
return (team == CS_TEAM_T) ? s_teamTableT : s_teamTableCT;
}

getTeamTableSize(team)
{
return (team == CS_TEAM_T) ? s_teamCountT : s_teamCountCT;
}

setTeamTableSize(team, size)
{
if (team == CS_TEAM_T) {
s_teamCountT=size;
}
else {
s_teamCountCT=size;
}
}

getImbalanceRating(team)
{
if (s_continousMode)
{
if (s_kills[team] == 0) {
return 0;
}
else {
int weightTeam = getTeamWeight(team);
int weightOpponent = getTeamWeight(getOpposingTeamOf(team));
if (weightOpponent == 0) {
weightOpponent = 1;
}
return s_kills[team] * weightTeam / weightOpponent;
}
}
else
{
if (s_streak[team] == 0) {
return 0;
}
else
{
int weightTeam = getTeamWeight(team);
int weightOpponent = getTeamWeight(getOpposingTeamOf(team));
if (weightOpponent == 0) {
weightOpponent=1;
}
return s_streak[team] * weightTeam / weightOpponent;
}
}
}

getDampingFactor()
{
return MIN_DAMPING + GetConVarInt(s_dampingFactor);
}


public Action consoleForceBalance(client, args)
{
refreshRanking();
if ((s_teamCountCT+s_teamCountT)>0)
{
char outbuf[256] = "";

if (s_teamCountT > (s_teamCountCT + 1))
{
balanceByMove(CS_TEAM_T , true);
Format(outbuf, 256, "%sMoving player to team %s. ", outbuf, (s_isCstrike) ? "CT" : "B");
}
if (s_teamCountCT > (s_teamCountT + 1))
{
balanceByMove(CS_TEAM_CT, true);
Format(outbuf, 256, "%sMoving player to team %s. ", outbuf, (s_isCstrike) ? "T" : "A");
}

int tTeamWeight = getTeamWeight(CS_TEAM_T);
int ctTeamWeight = getTeamWeight(CS_TEAM_CT);

if (tTeamWeight > (ctTeamWeight + (DEFAULT_SCORE / 2)))
{
balanceTeam(CS_TEAM_T, false);
Format(outbuf, 256, "%sStrenghened team %s from %d to %d. ", outbuf, (s_isCstrike) ? "CT" : "B", ctTeamWeight-tTeamWeight, getTeamWeight(CS_TEAM_CT) - getTeamWeight(CS_TEAM_T));
}
else if (ctTeamWeight > (tTeamWeight + (DEFAULT_SCORE / 2)))
{
balanceTeam(CS_TEAM_CT, false);
Format(outbuf, 256, "%sStrenghened team %d from %d to %d. ", outbuf, (s_isCstrike) ? "T" : "A", tTeamWeight-ctTeamWeight, getTeamWeight(CS_TEAM_T) - getTeamWeight(CS_TEAM_CT));
}
else {
Format(outbuf, 256, "%sTeams are sufficiently balanced.", outbuf);
}

PrintToConsole(client, "%s", outbuf);
}
else {
PrintToConsole(client, "%s", "No players -> no balance.");
}

return Plugin_Handled;
}

printScoreTable(Handle scoreTable, size, clientConsole)
{
for (new i=0; i < size; i++)
{
int points= GetArrayCell(scoreTable, i, 0);
int client= GetArrayCell(scoreTable, i, 1);
if (isValidPlayer(client))
{
char name[20] = "";
GetClientName(client, name, 20);
PrintToConsole(clientConsole,"%d: %s (%d)", points, name, s_lastSwitch[client]);
}
else {
PrintToConsole(clientConsole,"--- (id %d)", client);
}
}
}

public Action consoleDbgCmd(client, args)
{
refreshRanking();
PrintToConsole(client,"Team 1:");
printScoreTable(s_teamTableT , s_teamCountT, client );
PrintToConsole(client,"Team 2:");
printScoreTable(s_teamTableCT, s_teamCountCT, client);

PrintToConsole(client,"1 score %d, weight %d, score weight %d, members %d, imbalance rate %d", GetTeamScore(CS_TEAM_T ), getTeamWeight(CS_TEAM_T ), (s_continousMode) ? s_kills[CS_TEAM_T ] : s_streak[CS_TEAM_T ] , s_teamCountT , getImbalanceRating(CS_TEAM_T ));
PrintToConsole(client,"2 score %d, weight %d, score weight %d, members %d, imbalance rate %d", GetTeamScore(CS_TEAM_CT), getTeamWeight(CS_TEAM_CT), (s_continousMode) ? s_kills[CS_TEAM_CT ] : s_streak[CS_TEAM_CT ], s_teamCountCT, getImbalanceRating(CS_TEAM_CT));
return Plugin_Handled;
}

bool isPluginActive()
{
return ((GetConVarInt(s_activatePlugin) != 0) && GameRules_GetProp("m_bWarmupPeriod") != 1);
}
CrazySkull2k is offline
Cruze
Veteran Member
Join Date: May 2017
Old 01-07-2019 , 14:44   Re: [REQ] Help with [H] Balance
Reply With Quote #2

PHP Code:
sm_balance_log_level "0"
"Amount of logging (0=off, 1=on balance, 2=always)" 
__________________
Taking paid private requests! Contact me
Cruze is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 12:06.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode