Иконка ресурса

Someone

Участник
Сообщения
1,933
Реакции
1,653
  • Автор ресурса
  • #1
Пользователь Someone разместил новый ресурс:

Frag Limit - Установка лимита на кол-во убийств

Позволяет устанавливать лимит убийств.

Рекомендуемые настройки сервера:

C-подобный:
mp_maxrounds 1
mp_roundtime 30


Присутствует 3 режима отображения счета:
  • Показ в HUD
  • Показ в счетчике убийств с повышением счета (В начале 0 очков. 1 убийство = +1)
  • Показ в счетчике убийств с понижением счета (В начале N очков. 1 убийство = -1)


Присутствует конфиг по пути cfg/sourcemod/frag_limit.cfg....

Узнать больше об этом ресурсе...
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,542
Реакции
5,009
PHP:
int GetOppositeTeam(int iTeam)
{
    if(iTeam == 2)
    {
        if(g_bDisplayEnable && g_bMode)
        {
            if(g_bRoundMode)
            {
                SetTeamScore(3, GetTeamScore(3)-1);
            }
            else SetTeamScore(3, GetTeamScore(3)+1);
        }
        return 0;
    }
  
    if(iTeam == 3)
    {
        if(g_bDisplayEnable && g_bMode)
        {
            if(g_bRoundMode)
            {
                SetTeamScore(2, GetTeamScore(2)-1);
            }
            else SetTeamScore(2, GetTeamScore(2)+1);
        }
        return 1;
    }
    return -1;
}
можно упростить до
PHP:
int GetOppositeTeam(int iTeam)

{
    if(iTeam > 1 && g_bDisplayEnable && g_bMode)
    {
        static int team;
        team = 5 - iTeam;
        if(g_bRoundMode) SetTeamScore(team, GetTeamScore(team)-1);
        else SetTeamScore(team, GetTeamScore(team)+1);
    }
    return iTeam - 2;
}

Если кто-то гранату кинет и за секунду убьёт больше одного противник, то таймер Timer_Check_Frags может не закончить раунд, если фрагов у одной из команд (g_iFrags[]) станет больше, чем выставлено в лимите g_iLimit и бой продолжится, потому что у тебя == вместо >= в проверке.
А вообще эту проверку нужно было использовать в событии Event_PlayerDeath, а не в том таймере.

Функция SetHUDColor хороша: совершенно нет никаких проверок на ошибки в параметрах.
Если введут любые символы отличные от цифр то StringToInt тебе выдаст 0 (ноль). Если параметр окажется больше, чем 255, или меньше нуля, то у тебя скорее всего будет ошибка в логах, чем текст в панельке.

В функции SetHUDPosition точно так же нет проверок валидности параметров. Параметры положения на экране могут иметь значения только -1 для расположения по центру и от 0 до 1.

И ещё ты в CreateConVar не делаешь ограничение на величину задаваемого размера квара для булевых параметров и лимита убийств (его можно спокойно поставить равным или меньше нуля).
 
Последнее редактирование:

Someone

Участник
Сообщения
1,933
Реакции
1,653
  • Автор ресурса
  • #5
можно упростить до
PHP:
int GetOppositeTeam(int iTeam)

{
    if(iTeam > 1 && g_bDisplayEnable && g_bMode)
    {
        static int team = 5 - iTeam;
        if(g_bRoundMode) SetTeamScore(team, GetTeamScore(team)-1);
        else SetTeamScore(team, GetTeamScore(team)+1);
    }
    return iTeam - 2;
}

Да, в новой версии добавлю. Только там не static. (5-iTeam-iTeam-iTeam...)

Если кто-то гранату кинет и за секунду убьёт больше одного противник, то таймер Timer_Check_Frags может не закончить раунд, если фрагов у одной из команд (g_iFrags[]) станет больше, чем выставлено в лимите g_iLimit и бой продолжится, потому что у тебя == вместо >= в проверке.

Изначально >= стояло, но потом почему-то убрал, хм.

А вообще эту проверку нужно было использовать в событии Event_PlayerDeath, а не в том таймере.

Да, точно.

Функция SetHUDColor хороша: совершенно нет никаких проверок на ошибки в параметрах.
Если введут любые символы отличные от цифр то StringToInt тебе выдаст 0 (ноль). Если параметр окажется больше, чем 255, или меньше нуля, то у тебя скорее всего будет ошибка в логах, чем текст в панельке.

Сомневаюсь, что кто-то будет туда вводить буквы. К тому же 0 не страшен. А если значение перевалит за 255 и станет, к примеру, 295, то оно будет считаться как 40 (295-255). Аналогично и с отрицательными числами.

В функции SetHUDPosition точно так же нет проверок валидности параметров. Параметры положения на экране могут иметь значения только -1 для расположения по центру и от 0 до 1.

Ну администратор же не будет ставить неправильное значение. Зайдёт на сервер, будет перебирать подходящие варианты, разберется.

И ещё ты в CreateConVar не делаешь ограничение на величину задаваемого размера квара для булевых параметров и лимита убийств (его можно спокойно поставить равным или меньше нуля).

А смысл для булевых делать ? Для лимита понятно, сделаю.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,542
Реакции
5,009
Сомневаюсь, что кто-то будет туда вводить буквы.
Ну администратор же не будет ставить неправильное значение.
Какая наивность.
А во всех ошибках работы плагина будет виноват автор оного.
А смысл для булевых делать ?
ну поставят -100500, а плагин будет это видеть как true
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
  • Автор ресурса
  • #7
Какая наивность.
А во всех ошибках работы плагина будет виноват автор оного.

Ни разу не видел, чтобы кто-то об этом тут писал.

Впрочем, добавить это не трудно.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,542
Реакции
5,009
Да, в новой версии добавлю. Только там не static.
Это чтобы каждый раз не создавать переменную. Она будет существовать всё время работы плагина и просто при каждом выполнении функции будет менять значение.
А (5-iTeam-iTeam-iTeam...) было бы только если бы эта переменная имела название iTeam, насколько я понимаю SourcePawn.
Поставит -100500 = false
Поставит 100500 = true
В любом случае, если значение не будет равным 0 (ноль), то плагин будет это понимать как true.
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
  • Автор ресурса
  • #9
Это чтобы каждый раз не создавать переменную. Она будет существовать всё время работы плагина и просто при каждом выполнении фцнкции будет менять значение.
А (5-iTeam-iTeam-iTeam...) было бы только если бы эта переменная имела название iTeam, насколько я понимаю SourcePawn.
Если она static, то она не будет обновляться каждый раз при вызове функции. То есть создается 5, отнимается номер команды и так далее.
--- Добавлено позже ---
ЭВ любом случае, если значение не будет равным 0 (ноль), то плагин будет это понимать как true.
Да, перепроверил.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,542
Реакции
5,009
ок
просто попробуй вот этот плагин на локальном серваке (можно и не на локальном, но тебе нужно иметь возможность видеть его консольные сообщения через что-то):
PHP:
bool bEnabled;

Handle hTestTimer;

public void OnPluginStart()
{
    RegServerCmd("sm_test", Cmd_Test);
}

public Action Cmd_Test(int args)
{
    bEnabled = (!bEnabled);

    if(bEnabled)
    {
        if(hTestTimer == null) hTestTimer = CreateTimer(1.5, TestTimer, 123, TIMER_REPEAT);
    }
    else if(hTestTimer != null) KillTestTimer();

}

public Action TestTimer(Handle timer, any number)
{
    static int staticVariable;
    staticVariable = 100500 - number;
    int justVariable = 100500 - number;

    PrintToServer("Static: %i\nNot static: %i", staticVariable, justVariable);

    return Plugin_Continue;
}

void KillTestTimer()
{
    KillTimer(hTestTimer);
    hTestTimer = null;
}
Запуск и остановка отправки сообщений в консоль сервера командой sm_test
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
  • Автор ресурса
  • #11
ок
просто попробуй вот этот плагин на локальном серваке (можно и не на локальном, но тебе нужно иметь возможность видеть его консольные сообщения через что-то):

Ну, до того как ты исправил это:

PHP:
int GetOppositeTeam(int iTeam)
{
    if(iTeam > 1 && g_bDisplayEnable && g_bMode)
    {
        static int team = 5 - iTeam;
        if(g_bRoundMode) SetTeamScore(team, GetTeamScore(team)-1);
        else SetTeamScore(team, GetTeamScore(team)+1);
    }
    return iTeam - 2;
}

На это:

можно упростить до
PHP:
int GetOppositeTeam(int iTeam)

{
    if(iTeam > 1 && g_bDisplayEnable && g_bMode)
    {
        static int team;
        team = 5 - iTeam;
        if(g_bRoundMode) SetTeamScore(team, GetTeamScore(team)-1);
        else SetTeamScore(team, GetTeamScore(team)+1);
    }
    return iTeam - 2;
}

Мое сообщение имело смысл.

А с этим вопросов нет.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,542
Реакции
5,009
@Someone, до исправления плагин с этим кодом просто не скомпилировался бы.
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
  • Автор ресурса
  • #13
Пользователь Someone обновил ресурс Frag Limit новой записью:

Исправлено много ошибок и недочетов

Изменения/Исправления:

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

При включенном убывающем счете убийств число раундов не уходит в минус.

Большинству кваров добавлены максимальные и минимальные значения.

Узнать больше об этом обновлении...
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
  • Автор ресурса
  • #14

Someone

Участник
Сообщения
1,933
Реакции
1,653
  • Автор ресурса
  • #15

Grey83

не пишу плагины с весны 2022
Сообщения
8,542
Реакции
5,009
лол
PHP:
    if(g_bTeamKillEnable && GetClientTeam(iClient) == iTeamA)

    {
        GetOppositeTeam(iTeamA);
        return Plugin_Handled;
    }

    if(g_bSelfKillEnable && iClient == iAttacker)
    {
        GetOppositeTeam(iTeamA);
        return Plugin_Handled;
    }

    GetOppositeTeam(iTeamA);

    return Plugin_Continue;
равнозначно следующему коду
PHP:
    GetOppositeTeam(iTeamA);

    if((g_bTeamKillEnable && GetClientTeam(iClient) == iTeamA) || (g_bSelfKillEnable && iClient == iAttacker))
        return Plugin_Handled;

    return Plugin_Continue;
Ещё CS_TerminateRound(g_fRestartDelay, (iTeam == 2) ? CSRoundEnd_TerroristWin:CSRoundEnd_CTWin); можно поменять на CS_TerminateRound(g_fRestartDelay, view_as<CSRoundEndReason>(10 - iTeam));

В общем я бы переделал код вот так:
 

Вложения

  • Frag_Limit.sp
    7.8 КБ · Просмотры: 4
Последнее редактирование:

novichek

Участник
Сообщения
631
Реакции
21
Это одному надо набрать или командой фраги?
 

pentaxist

Участник
Сообщения
495
Реакции
91
@Someone, в конце карты счет сбрасывается и победу дают кт 1-0 а не по набитым фрагам. Можно это как то исправить?
 
Сверху Снизу