#include <sourcemod>
#define CSS_TEAM_SPECTATOR 1
#define CSS_TEAM_T 2
#define CSS_TEAM_CT 3
new ts, cts;
new Float:Ratio = 3.6;
public OnPluginStart()
{
HookEvent("round_start", Event_RoundStart);
HookEvent("round_end", Event_RoundEnd);
}
public Action:Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
ts = 0; cts = 0;
for (new i = 1; i <= MaxClients; i++)
{
if (IsClientInGame(i) && IsPlayerAlive(i))
{
if(GetClientTeam(i) == CSS_TEAM_T)
{
ts++;
}
if(GetClientTeam(i) == CSS_TEAM_CT)
{
cts++;
}
}
}
CheckBalance();
return Plugin_Continue;
}
public CheckBalance()
{
if(cts < (ts / Ratio))
{
return false;
}
else
{
new target = GetRandomClient(false, false, CSS_TEAM_CT);
if (target != -1)
{
ChangeClientTeam(target, CSS_TEAM_T);
PrintToChatAll("\x03%N \x01был перемещен за команду Заключенных из-за дисбаланса", target);
}
}
return true;
}
public Action:Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
ts = 0; cts = 0;
}
// World-Source.Ru
GetRandomClient(bool:no_bot = true, bool:alive = false, team = 0)
{
new num = 0, players[MaxClients];
for (new i = 1; i <= MaxClients; i++)
{
if (!IsClientInGame(i) || (no_bot && IsFakeClient(i)))
{
continue;
}
if ((alive && !IsPlayerAlive(i)) || (0 < team < 4 && GetClientTeam(i) != team))
{
continue;
}
players[num++] = i;
}
if (num > 0) return players[GetRandomInt(0, num - 1)];
return -1;
}
Я проверял CS_SwitchTeam и работает плохо.ChangeClientTeam - если не ошибаюсь, ты же и говорил, что с таким перебросом этот игрок будет умирать... Не знаю, устроит ли ilga80 такое.
В плагине из 1 поста, по утверждению автора последнего, весьма хорошо работает данная команда. Если что - возьми и глянь, как там устроена)
ОффтопОчень уж за мудрено, видать потому и хорошо.
#include <sourcemod>
#include <sdktools_functions>
#include <cstrike>
#define CSS_TEAM_SPECTATOR 1
#define CSS_TEAM_T 2
#define CSS_TEAM_CT 3
new Float:Ratio = 3.6;
public OnPluginStart()
{
HookEvent("round_end", Event_RoundEnd);
}
public Action:Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
CheckBalance();
}
public CheckBalance()
{
new ts = GetTeamClientCount(CSS_TEAM_T);
new cts = GetTeamClientCount(CSS_TEAM_CT);
if(cts < RoundFloat((ts / Ratio)))
{
return false;
}
else
{
new target = GetRandomClient(false, false, CSS_TEAM_CT);
if (target != -1)
{
CS_SwitchTeam(target, CS_TEAM_T);
PrintToChatAll("\x03%N \x01был перемещен за команду Заключенных из-за дисбаланса", target);
}
}
return true;
}
// World-Source.Ru
GetRandomClient(bool:no_bot = true, bool:alive = false, team = 0)
{
new num = 0, players[MaxClients];
for (new i = 1; i <= MaxClients; i++)
{
if (!IsClientInGame(i) || (no_bot && IsFakeClient(i)))
{
continue;
}
if ((alive && !IsPlayerAlive(i)) || (0 < team < 4 && GetClientTeam(i) != team))
{
continue;
}
players[num++] = i;
}
if (num > 0) return players[GetRandomInt(0, num - 1)];
return -1;
}
Лучше, но что-то с условиями баланса не так - перемещает по 1 КТ каждый раунд... Все в Т оказались. Невыполнение скрипта при балансе 1 КТ = 3 Т (1 к 3) нужно.
Можешь редактировать, как хочешь. Делал под себя.legend1998, new Float:Ratio = 3.6; почему? может 2.75 ?
Я про Float:Ratio = 2.75;Насчёт округления не в курсе... А не до 4 тогда? Ибо 3.6 ближе к 4, но не 3.
Странно.legend1998, Вроде думал все нормально, но 2кт-6т и почему он перекидывает. Получается 1кт-7т это нереально!
Да не может быть такого... Можно попробовать убрать проверку на "жив игрок или нет".AlmazON, 1ый значит у кого фрагов больше. Кто 1ый в списке по TAB