Как зачастую балансируют силы? Перекидывают сильного за слабых, а дальше уже как пойдет.
Но если посмотреть через призму владельца паблика - то там командной игры как таковой нет. Каждый сам за себя.
Попробовал найти иной подход к балансировке сил и наткнулся на старый плагин от Conor McLeod написанный в лохматые годы.
Взял оттуда идею, наработки и сделал легковесный плагин, который балансирует силы игроков индивидуально.
Работает предельно просто: вычисляет сильных путем подсчета фрагов/смертей на текущей карте и автоматически корректирует их урон по слабым и наоборот. Тем самым предотвращает доминирование опытных игроков над середнячками и новичками, сохраняя интерес к игре у всех сторон.
Ядро плагина - это динамическое вычисление разницы сил и гибкость настроек.
Проверялся в полевых условиях, было сделано много корректировок и калибровок. Добавлены квары на игнорирование AWP (что бы не было вопросов "яжпопал! почему блять не сдох"), разницы в счете для активации балансировки урона и другие переменные. Можно сделать работу мягкой, что бы не было явного вмешательства. Или же можно ввести жесткий контроль над "задротами". Все зависит от ваших предпочтений и потребностей.
Любые предложения и замечания приветствуются.
Но если посмотреть через призму владельца паблика - то там командной игры как таковой нет. Каждый сам за себя.
Попробовал найти иной подход к балансировке сил и наткнулся на старый плагин от Conor McLeod написанный в лохматые годы.
Взял оттуда идею, наработки и сделал легковесный плагин, который балансирует силы игроков индивидуально.
Работает предельно просто: вычисляет сильных путем подсчета фрагов/смертей на текущей карте и автоматически корректирует их урон по слабым и наоборот. Тем самым предотвращает доминирование опытных игроков над середнячками и новичками, сохраняя интерес к игре у всех сторон.
Ядро плагина - это динамическое вычисление разницы сил и гибкость настроек.
Проверялся в полевых условиях, было сделано много корректировок и калибровок. Добавлены квары на игнорирование AWP (что бы не было вопросов "яжпопал! почему блять не сдох"), разницы в счете для активации балансировки урона и другие переменные. Можно сделать работу мягкой, что бы не было явного вмешательства. Или же можно ввести жесткий контроль над "задротами". Все зависит от ваших предпочтений и потребностей.
Любые предложения и замечания приветствуются.
Код:
//credits: ConnorMcLeod
#include <amxmodx>
#include <hamsandwich>
#include <cstrike>
#include <reapi>
#define MAX_PLAYERS 32
new g_pExcludeAwp, g_pMaxFactor, g_pMinFactor, g_pMinDiff, g_pMaxDiff, g_pMinBalanceDiff;
new g_iFrags[MAX_PLAYERS + 1];
new g_iDeaths[MAX_PLAYERS + 1];
public plugin_init()
{
register_plugin("Antiroxx", "1.0", "RMZ");
g_pExcludeAwp = create_cvar("antiroxx_exclude_awp", "1", FCVAR_NONE, "1 = не корректировать урон AWP, 0 = корректировать");
g_pMaxFactor = create_cvar("antiroxx_max_factor", "1.1", FCVAR_NONE, "Максимальный множитель урона слабых по сильным");
g_pMinFactor = create_cvar("antiroxx_min_factor", "0.85", FCVAR_NONE, "Минимальный множитель урона сильных по слабым");
g_pMinDiff = create_cvar("antiroxx_min_diff", "-18", FCVAR_NONE, "Мин разница фрагов-смертей для корректировки слабых");
g_pMaxDiff = create_cvar("antiroxx_max_diff", "18", FCVAR_NONE, "Макс разница фрагов-смертей для корректировки сильных");
g_pMinBalanceDiff = create_cvar("antiroxx_min_balance_diff", "3", FCVAR_NONE, "Минимальная разница фрагов-смертей для запуска балансировки");
AutoExecConfig(true, "antiroxx");
RegisterHam(Ham_TraceAttack, "player", "OnPlayer_TraceAttack", false);
RegisterHam(Ham_Killed, "player", "OnPlayer_Killed", true);
}
public client_connect(id)
{
g_iFrags[id] = 0;
g_iDeaths[id] = 0;
}
public client_disconnected(id)
{
g_iFrags[id] = 0;
g_iDeaths[id] = 0;
}
public OnPlayer_Killed(victim, killer, shouldgib)
{
if (victim == killer || !is_user_connected(victim))
return;
g_iDeaths[victim]++;
if (is_user_connected(killer) && victim != killer)
g_iFrags[killer]++;
}
Float:GetDamageFactor(id, attacker)
{
if (id == attacker || !is_user_connected(id) || !is_user_connected(attacker))
return 1.0;
new diff_victim = g_iFrags[id] - g_iDeaths[id];
new diff_attacker = g_iFrags[attacker] - g_iDeaths[attacker];
new diff = diff_attacker - diff_victim;
new min_diff = get_pcvar_num(g_pMinDiff);
new max_diff = get_pcvar_num(g_pMaxDiff);
new min_balance = get_pcvar_num(g_pMinBalanceDiff);
new Float:max_fact = get_pcvar_float(g_pMaxFactor);
new Float:min_fact = get_pcvar_float(g_pMinFactor);
if (diff < min_diff) diff = min_diff;
if (diff > max_diff) diff = max_diff;
if (abs(diff) < min_balance)
return 1.0;
new Float:factor;
if (diff > 0)
{
factor = 1.0 + (float(diff) / float(max_diff)) * (min_fact - 1.0);
if (factor < min_fact) factor = min_fact;
if (factor > 1.0) factor = 1.0;
}
else
{
factor = 1.0 + (float(diff) / float(min_diff)) * (max_fact - 1.0);
if (factor > max_fact) factor = max_fact;
if (factor < 1.0) factor = 1.0;
}
return factor;
}
public OnPlayer_TraceAttack(id, attacker, Float:damage, Float:dir[3], ptr, damagebits)
{
if (!is_user_connected(id) || !is_user_connected(attacker) || id == attacker)
return HAM_IGNORED;
if (!(damagebits & (1<<1)))
return HAM_IGNORED;
if (cs_get_user_team(id) == cs_get_user_team(attacker))
return HAM_IGNORED;
if (get_pcvar_num(g_pExcludeAwp) && get_user_weapon(attacker) == CSW_AWP)
return HAM_IGNORED;
new Float:factor = GetDamageFactor(id, attacker);
SetHamParamFloat(3, damage * factor);
return HAM_HANDLED;
}
Вложения
-
3.6 KB Просмотры: 2