Иной подход к балансировке сил

Сообщения
60
Реакции
4
Помог
1 раз(а)
Как зачастую балансируют силы? Перекидывают сильного за слабых, а дальше уже как пойдет.
Но если посмотреть через призму владельца паблика - то там командной игры как таковой нет. Каждый сам за себя.

Попробовал найти иной подход к балансировке сил и наткнулся на старый плагин от 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;
}
 

Вложения

Сообщения
376
Реакции
107
Помог
2 раз(а)
RAMA21,
Перекидывают сильного за слабых, а дальше уже как пойдет.
Эмм... нет. Давно делают самый слабый на самого сильного по скиллу на текущей карте.

Лучше продумай дополнительные нюансы, такие как вип, иммунитет
 
Сообщения
60
Реакции
4
Помог
1 раз(а)
вопросы будут всегда с таким плагином, кому то может и зайдет, но уменьшать урон - такое себе.
можно не трогать сильных и помогать только слабым, плавно увеличивая урон если их дела идут все хуже и хуже. в этом и гибкость плагина.
RAMA21,

Эмм... нет. Давно делают самый слабый на самого сильного по скиллу на текущей карте.

Лучше продумай дополнительные нюансы, такие как вип, иммунитет
не очень понял первый абзац, можно конкретнее
Вчера в 21:27
внесу ясность в принцип работы. корректировка урона происходит плавно.
например у слабого счет 0:2 = корректировки не будет, так как "antiroxx_min_balance_diff" равен "3" - значит пока разница в счете не достигнет 3-х фрагов плагин не вмешивается; счет 0:3 = начинается помощь минимальная; 2:8 = уже урон заметно выше и так до предельных значений "antiroxx_max_factor" и "antiroxx_min_diff".
Проще говоря, корректировка происходит постепенно, исходя из положения конкретного игрока индивидуально. Или же можно все выкрутить на более резкие изменения, что бы даже при разнице в 2 фрага происходили существенные корректировки. В общем тут кто как хочет так и может крутить этот балансер. Можно только ослаблять сильных, или только усиливать слабых, или же делать все вместе. Каждый найдет свой подход.
 

Garey

ninjaCow
Сообщения
452
Реакции
1,112
Помог
11 раз(а)
Сомнительно, если слабый игрок не попадает то он и с большим уроном не попадет.

На "современных" пабликах заметил что в топах всегда какой-нибудь донатер с 200 хп, уроном таким что убивает с 2ух пуль, двойным прыжком и т.д.

Если сервер и игроки нормальные то сильные игроки обычно сами стараются заходить так чтобы не нарушить баланс.
 
Сообщения
60
Реакции
4
Помог
1 раз(а)
Garey, из категории не буди лихо пока оно тихо. И суждение довольно утрированное о современных пабликах. Периодически прохожусь по ним, такого не видел. Повезло получается?
Паблик - это место где могут столкнуться чел с буковкой "h" против того, кто только скачал игру и решил поиграть после огромной паузы. И этот балансер попытка дать шанс второму. А попадет или не попадет это уже за пределами наших полномочий.

Учитывая что идея взята из плагина 00х годов, тема давняя, и по моему личному скромному опыту, актуальная и по сей день.
 
Сообщения
572
Реакции
104
Помог
6 раз(а)
RAMA21, исходя, что это для паблик серверов, не стоит учитывать фраги/смерть в TAB'e, т.к. один плагин reset score сломают всю логику твоего плагина. Лучше же брать данные из статистики =)
 
Сообщения
91
Реакции
21
Если сервер и игроки нормальные то сильные игроки обычно сами стараются заходить так чтобы не нарушить баланс.
I want to believe... Навряд найдёте такой сервер в этой игре.
А попадет или не попадет это уже за пределами наших полномочий.
Ну я бы так универсально не говорил. За всегда можно ракам прикрутить доводку с серверной стороны))).
 
Сообщения
60
Реакции
4
Помог
1 раз(а)
WILL_BE, пробовал такой вариант. Человек не робот, вчера игра шла, сегодня не прет и + плагин против тебя.
Пусть сбрасывает, все вернется к норме.

Задумка плагина не трубить на весь сервер что работает балансер, а просто поставить его и латентными методами помогать новичкам или тем у кого "плохой день".

С теоретической точки зрения сложно оценить такую вещь. На практике балансер показал себя с положительной стороны.
 
Сообщения
572
Реакции
104
Помог
6 раз(а)
RAMA21, моё личное мнение, что плагин выходит за рамки "нормы", я б на месте игрока, у которого "урезали" урон - вышел бы с сервера и забыл его как страшный сон =) Давно всем привычный балансер по скиллу - куда гуманнее и не нарушает "игру" всякими урезами и т.п.
 
Сообщения
91
Реакции
21
я б на месте игрока, у которого "урезали" урон - вышел бы с сервера и забыл его как страшный сон =)
Кстати да, я бы тоже так сделал. Ровно и как если бы узнал, что у донатеров повышенный урон, просто за то, что они занесли бабла.
 
Сообщения
60
Реакции
4
Помог
1 раз(а)
WILL_BE, ну дак не урезай, а просто прибавляй слабому) я же выше писал об этом :scratch_one-s_head:
теория на теории)) ок, может с дивана виднее
 
Сообщения
572
Реакции
104
Помог
6 раз(а)
RAMA21, не знаю про какой ты «диван» говоришь, но я лишь рассмотрел ситуацию как игрок =)
 
Сообщения
60
Реакции
4
Помог
1 раз(а)
Думаю отдельно следует отметить:
Если сильный стреляется с сильным - никакой корректировки не будет. Все будет стандартно.
Если слабый против слабого - то же самое. Плагин не вмешивается.

То есть плагин на лету определяет кто кому наносит урон и моментально корректирует его, в зависимости от настроек.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу