Написание плагинов

Mr_panica

XenForo one 💖
Сообщения
921
Реакции
435
Не понял.
Для создания квадрата со сторонами не обязательно параллельными осям карты?

Что ты вообще хочешь сделать?

Возможно не правильно выразился.

Нужно нарисовать 2D квадрат на полу, куда смотрит курсор игрока (это центр квадрата).
Ну и потом по запросу определять что игрок находится в нём или нет.
1683112791209.png
1683112873683.png
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Исправил, ошибка обновилась на:
5/03/2023 - 13:26:01: [SM] Exception reported: Invalid timer handle 966066f (error 3)
L 05/03/2023 - 13:26:01: [SM] Blaming: Shop_Random_Number_1_1.smx
L 05/03/2023 - 13:26:01: [SM] Call stack trace:
L 05/03/2023 - 13:26:01: [SM] [0] KillTimer
L 05/03/2023 - 13:26:01: [SM] [1] Line 138, D:\Desktop\��� ����������\1.11 scripting\Shop_Random_Number_1_1.sp::KillTimerEx
L 05/03/2023 - 13:26:01: [SM] [2] Line 219, D:\Desktop\��� ����������\1.11 scripting\Shop_Random_Number_1_1.sp::Say
Код:
Action KillTimerEx(Handle hTimer)
{
    if(hTimer != INVALID_HANDLE)
    {
        KillTimer(hTimer);
        hTimer = INVALID_HANDLE;
    }
}

public void OnConfigsExecuted()
{
    CreateTimer(g_Cvar_fInterval, Timer_Task, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action Timer_Task(Handle hTimer)
{
    BuildPath(Path_SM, LogPath, sizeof(LogPath), "logs/SHOP_Number_Random.log");

    int k = 0;
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && GetClientTeam(i) > 1) k++;

    if (k >= g_Cvar_iNumberPlayer)
    {
        g_iRandom = GetRandomInt(g_Cvar_iNumbersMin, g_Cvar_iNumbersMax);
        CPrintToChatAll("%t {red}Я загадал число от {green}%d {red}до {green}%d{red}, отгадай его и получи {green}%d кредитов", "Tag", g_Cvar_iNumbersMin, g_Cvar_iNumbersMax, g_Cvar_iCredits);

        KillTimerEx(g_hAnswerWaitTimer);
        g_hAnswerWaitTimer = CreateTimer(g_Cvar_fAnswerTime, Timer_Answer);
        g_iPosition = 0;
    }

    for(int i = 1; i <= MaxClients; ++i)
    {
        iLimitCount[i] = g_Cvar_iCountLimit;
    }

    CreateTimer(g_Cvar_fInterval, Timer_Task, _, TIMER_FLAG_NO_MAPCHANGE);
    return Plugin_Stop;
}

public Action Timer_Answer(Handle hTimer)
{
    CPrintToChatAll("%t Ожидание ответа окончено", "Tag");
    g_hAnswerWaitTimer = INVALID_HANDLE;

    return Plugin_Stop;
}

public Action Say(int iClient, const char[] command, int iArgs)
{
    if(g_hAnswerWaitTimer != INVALID_HANDLE && iClient && iClient <= MaxClients)
    {
        char text[16], yourtext[16];
        GetCmdArg(1, text, sizeof(text));
  
        FormatEx(yourtext, sizeof(yourtext), "%d", g_iRandom);
 
        if(IsCharNumeric(text[0]) || text[0] == '-')
        {
            if(StrEqual(text, yourtext, true) && iLimitCount[iClient] > 0)
            {
                ++g_iPosition;
                Shop_GiveClientCredits(iClient, g_Cvar_iCredits);
                CPrintToChatAll("%t {green}%N {red} угадал число и получил {green}%d{red} кредитов{default}!", "Tag", iClient, g_Cvar_iCredits);
          
                if(g_iPosition >= g_Cvar_iNumberPrizes)
                {
                    KillTimerEx(g_hAnswerWaitTimer);
                }
            }

            else
            {
                if(iLimitCount[iClient] > 0)
                {
                    --iLimitCount[iClient];
                    CPrintToChat(iClient, "%t {red}К сожалению это неправильный ответ{default}!", "Tag");

                    if (iLimitCount[iClient] < g_Cvar_iCountLimit)
                    {
                        CPrintToChat(iClient, "%t {red}У тебя осталось попыток: {green}%d{default}", "Tag", iLimitCount[iClient]);
                    }
                    else
                    {
                        CPrintToChat(iClient, "%t {red}У тебя осталось попыток: {green}%d{default}", "Tag", iLimitCount[iClient]-1);
                    }
                    if (iLimitCount[iClient] == 0)
                    {
                        CPrintToChat(iClient, "%t {red}Попытки закончились{default} ({green}лимит: {red}%d попытки{default})", "Tag", g_Cvar_iCountLimit);
                    }
                }
            }
        }
    }
 
    return Plugin_Continue;
}
Строки с ошибкой выделил
C-подобный:
if(hTimer != INVALID_HANDLE)
{
    KillTimer(hTimer);
    hTimer = INVALID_HANDLE;
}
------->
C-подобный:
if(hTimer != null)
{
    delete hTimer;
    hTimer = null;
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
Нужно нарисовать 2D квадрат на полу, куда смотрит курсор игрока (это центр квадрата).
Ну и потом по запросу определять что игрок находится в нём или нет.
Сохранить позицию (при этом рисуется квадрат видимый скольким людям?), а потом по команде определять находится ли внутри него кто-то?
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
C-подобный:
if(hTimer != INVALID_HANDLE)
{
    KillTimer(hTimer);
    hTimer = INVALID_HANDLE;
}
------->
C-подобный:
if(hTimer != null)
{
    delete hTimer;
    hTimer = null;
}
Все-таки ошибка осталась
L 05/03/2023 - 17:55:19: [SM] Exception reported: Handle 9f406a2 is invalid (error 3)
L 05/03/2023 - 17:55:19: [SM] Blaming: Shop_Random_Number_1_1.smx
L 05/03/2023 - 17:55:19: [SM] Call stack trace:
L 05/03/2023 - 17:55:19: [SM] [0] CloseHandle
L 05/03/2023 - 17:55:19: [SM] [1] Line 127, D:\Desktop\Для компиляции\1.11 scripting\Shop_Random_Number_1_1.sp::KillTimerEx
L 05/03/2023 - 17:55:19: [SM] [2] Line 196, D:\Desktop\Для компиляции\1.11 scripting\Shop_Random_Number_1_1.sp::Say
Код:
Action KillTimerEx(Handle hTimer)
{
    if(hTimer != null)
    {
        delete hTimer;
        hTimer = null;
    }
}

public void OnConfigsExecuted()
{
    CreateTimer(g_Cvar_fInterval, Timer_Task, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action Timer_Task(Handle hTimer)
{
    BuildPath(Path_SM, LogPath, sizeof(LogPath), "logs/SHOP_Number_Random.log");

    int k = 0;
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && GetClientTeam(i) > 1) k++;

    if (k >= g_Cvar_iNumberPlayer)
    {
        g_iRandom = GetRandomInt(g_Cvar_iNumbersMin, g_Cvar_iNumbersMax);
        CPrintToChatAll("%t {red}Я загадал число от {green}%d {red}до {green}%d{red}, отгадай его и получи {green}%d кредитов", "Tag", g_Cvar_iNumbersMin, g_Cvar_iNumbersMax, g_Cvar_iCredits);

        KillTimerEx(g_hAnswerWaitTimer);
        g_hAnswerWaitTimer = CreateTimer(g_Cvar_fAnswerTime, Timer_Answer);
        g_iPosition = 0;
    }

    for(int i = 1; i <= MaxClients; ++i)
    {
        iLimitCount[i] = g_Cvar_iCountLimit;
    }

    CreateTimer(g_Cvar_fInterval, Timer_Task, _, TIMER_FLAG_NO_MAPCHANGE);
    return Plugin_Stop;
}

public Action Timer_Answer(Handle hTimer)
{
    CPrintToChatAll("%t Ожидание ответа окончено", "Tag");
    g_hAnswerWaitTimer = INVALID_HANDLE;

    return Plugin_Stop;
}


public Action Say(int iClient, const char[] command, int iArgs)
{
    if(g_hAnswerWaitTimer != INVALID_HANDLE && iClient && iClient <= MaxClients)
    {
        char text[16], yourtext[16];
        GetCmdArg(1, text, sizeof(text));
        
        FormatEx(yourtext, sizeof(yourtext), "%d", g_iRandom);
    
        if(IsCharNumeric(text[0]) || text[0] == '-')
        {
            if(StrEqual(text, yourtext, true) && iLimitCount[iClient] > 0)
            {
                ++g_iPosition;
                Shop_GiveClientCredits(iClient, g_Cvar_iCredits);
                CPrintToChatAll("%t {green}%N {red} угадал число и получил {green}%d{red} кредитов{default}!", "Tag", iClient, g_Cvar_iCredits);
                
                if(g_iPosition >= g_Cvar_iNumberPrizes)
                {
                    KillTimerEx(g_hAnswerWaitTimer);
                }
            }

            else
            {
                if(iLimitCount[iClient] > 1)
                {
                    --iLimitCount[iClient];
                    CPrintToChat(iClient, "%t {red}К сожалению это неправильный ответ{default}!", "Tag");

                    if (iLimitCount[iClient] < g_Cvar_iCountLimit)
                    {
                        CPrintToChat(iClient, "%t {red}У тебя осталось попыток: {green}%d{default}", "Tag", iLimitCount[iClient]);
                    }
                    
                    else
                    {
                        CPrintToChat(iClient, "%t {red}У тебя осталось попыток: {green}%d{default}", "Tag", iLimitCount[iClient]-1);
                    }
                }
                
                if (iLimitCount[iClient] == 0)
                {
                    --iLimitCount[iClient];
                    CPrintToChat(iClient, "%t {red}К сожалению это неправильный ответ{default}!", "Tag");
                    CPrintToChat(iClient, "%t {red}Попытки закончились{default} ({green}лимит: {red}%d попытки{default})", "Tag", g_Cvar_iCountLimit);
                }
            }
        }
    }
    
    return Plugin_Continue;
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@7pElllHuK, попробуй так:
C-подобный:
public void OnConfigsExecuted()
{
    CreateTimer(g_Cvar_fInterval, Timer_Task, _, TIMER_FLAG_NO_MAPCHANGE);
}

void KillTimerEx(Handle hTimer)
{
    if(hTimer)
    {
        CloseHandle(hTimer);
        hTimer = null;
    }
}

public Action Timer_Task(Handle hTimer)
{
    if(!LogPath[0]) BuildPath(Path_SM, LogPath, sizeof(LogPath), "logs/SHOP_Number_Random.log");

    int k = 0;
    for(int i = 1; i <= MaxClients; i++)
        if(IsClientInGame(i) && GetClientTeam(i) > 1 && ++k >= g_Cvar_iNumberPlayer)
            break;

    if (k >= g_Cvar_iNumberPlayer)
    {
        g_iRandom = GetRandomInt(g_Cvar_iNumbersMin, g_Cvar_iNumbersMax);
        CPrintToChatAll("%t {red}Я загадал число от {green}%d {red}до {green}%d{red}, отгадай его и получи {green}%d кредитов", "Tag", g_Cvar_iNumbersMin, g_Cvar_iNumbersMax, g_Cvar_iCredits);

        if(g_hAnswerWaitTimer) CloseHandle(g_hAnswerWaitTimer);
        g_hAnswerWaitTimer = CreateTimer(g_Cvar_fAnswerTime, Timer_Answer);

        g_iPosition = 0;
        if(g_Cvar_Logs == 1) LogToFileEx(LogPath, "Создано число: %d", g_iRandom);
    }

    for(int i = 1; i <= MaxClients; ++i) iLimitCount[i] = g_Cvar_iCountLimit;

    CreateTimer(g_Cvar_fInterval, Timer_Task, _, TIMER_FLAG_NO_MAPCHANGE);
    return Plugin_Stop;
}

public Action Timer_Answer(Handle hTimer)
{
    g_hAnswerWaitTimer = null;

    CPrintToChatAll("%t", "Tag", "Waiting for a response is over");
    if(g_Cvar_Logs == 1) LogToFileEx(LogPath, "Ожидание ответа окончено");

    return Plugin_Stop;
}

public Action Say(int iClient, const char[] command, int iArgs)
{
    if(g_hAnswerWaitTimer && iClient && iClient <= MaxClients)
    {
        char text[16], yourtext[16];
        GetCmdArg(1, text, sizeof(text));

        if((IsCharNumeric(text[0]) || text[0] == '-') && iLimitCount[iClient] > 0)
        {
            FormatEx(yourtext, sizeof(yourtext), "%d", g_iRandom);
            if(!strcmp(text, yourtext, true))
            {
                g_iPosition++;
                Shop_GiveClientCredits(iClient, g_Cvar_iCredits);
                CPrintToChatAll("%t {green}%N {red} угадал число и получил {green}%d{red} кредитов{default}!", "Tag", iClient, g_Cvar_iCredits);

                if(g_iPosition >= g_Cvar_iNumberPrizes) KillTimerEx(g_hAnswerWaitTimer);
            }
            else
            {
                iLimitCount[iClient]--;
                CPrintToChat(iClient, "%t {red}К сожалению это неправильный ответ{default}!", "Tag");

                if(iLimitCount[iClient] < g_Cvar_iCountLimit)
                {
                    CPrintToChat(iClient, "%t {red}У тебя осталось попыток: {green}%d{default}", "Tag", iLimitCount[iClient]);
                }
                else
                {
                    CPrintToChat(iClient, "%t {red}У тебя осталось попыток: {green}%d{default}", "Tag", iLimitCount[iClient]-1);
                }

                if(!iLimitCount[iClient])
                {
                    CPrintToChat(iClient, "%t {red}Попытки закончились{default} ({green}лимит: {red}%d попытки{default})", "Tag", g_Cvar_iCountLimit);
                }
            }
        }
    }

    return Plugin_Continue;
}
Сообщения автоматически склеены:

Exception reported: Translation string formatted incorrectly - missing at least 3 parameters (arg 4)
у тебя м/б просто кривой файл перевода
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
@7pElllHuK, попробуй так:
C-подобный:
public void OnConfigsExecuted()
{
    CreateTimer(g_Cvar_fInterval, Timer_Task, _, TIMER_FLAG_NO_MAPCHANGE);
}

void KillTimerEx(Handle hTimer)
{
    if(hTimer)
    {
        CloseHandle(hTimer);
        hTimer = null;
    }
}

public Action Timer_Task(Handle hTimer)
{
    if(!LogPath[0]) BuildPath(Path_SM, LogPath, sizeof(LogPath), "logs/SHOP_Number_Random.log");

    int k = 0;
    for(int i = 1; i <= MaxClients; i++)
        if(IsClientInGame(i) && GetClientTeam(i) > 1 && ++k >= g_Cvar_iNumberPlayer)
            break;

    if (k >= g_Cvar_iNumberPlayer)
    {
        g_iRandom = GetRandomInt(g_Cvar_iNumbersMin, g_Cvar_iNumbersMax);
        CPrintToChatAll("%t {red}Я загадал число от {green}%d {red}до {green}%d{red}, отгадай его и получи {green}%d кредитов", "Tag", g_Cvar_iNumbersMin, g_Cvar_iNumbersMax, g_Cvar_iCredits);

        if(g_hAnswerWaitTimer) CloseHandle(g_hAnswerWaitTimer);
        g_hAnswerWaitTimer = CreateTimer(g_Cvar_fAnswerTime, Timer_Answer);

        g_iPosition = 0;
        if(g_Cvar_Logs == 1) LogToFileEx(LogPath, "Создано число: %d", g_iRandom);
    }

    for(int i = 1; i <= MaxClients; ++i) iLimitCount[i] = g_Cvar_iCountLimit;

    CreateTimer(g_Cvar_fInterval, Timer_Task, _, TIMER_FLAG_NO_MAPCHANGE);
    return Plugin_Stop;
}

public Action Timer_Answer(Handle hTimer)
{
    g_hAnswerWaitTimer = null;

    CPrintToChatAll("%t", "Tag", "Waiting for a response is over");
    if(g_Cvar_Logs == 1) LogToFileEx(LogPath, "Ожидание ответа окончено");

    return Plugin_Stop;
}

public Action Say(int iClient, const char[] command, int iArgs)
{
    if(g_hAnswerWaitTimer && iClient && iClient <= MaxClients)
    {
        char text[16], yourtext[16];
        GetCmdArg(1, text, sizeof(text));

        if((IsCharNumeric(text[0]) || text[0] == '-') && iLimitCount[iClient] > 0)
        {
            FormatEx(yourtext, sizeof(yourtext), "%d", g_iRandom);
            if(!strcmp(text, yourtext, true))
            {
                g_iPosition++;
                Shop_GiveClientCredits(iClient, g_Cvar_iCredits);
                CPrintToChatAll("%t {green}%N {red} угадал число и получил {green}%d{red} кредитов{default}!", "Tag", iClient, g_Cvar_iCredits);

                if(g_iPosition >= g_Cvar_iNumberPrizes) KillTimerEx(g_hAnswerWaitTimer);
            }
            else
            {
                iLimitCount[iClient]--;
                CPrintToChat(iClient, "%t {red}К сожалению это неправильный ответ{default}!", "Tag");

                if(iLimitCount[iClient] < g_Cvar_iCountLimit)
                {
                    CPrintToChat(iClient, "%t {red}У тебя осталось попыток: {green}%d{default}", "Tag", iLimitCount[iClient]);
                }
                else
                {
                    CPrintToChat(iClient, "%t {red}У тебя осталось попыток: {green}%d{default}", "Tag", iLimitCount[iClient]-1);
                }

                if(!iLimitCount[iClient])
                {
                    CPrintToChat(iClient, "%t {red}Попытки закончились{default} ({green}лимит: {red}%d попытки{default})", "Tag", g_Cvar_iCountLimit);
                }
            }
        }
    }

    return Plugin_Continue;
}
Сообщения автоматически склеены:


у тебя м/б просто кривой файл перевода
Не помогло,
L 05/03/2023 - 18:23:17: [SM] Exception reported: Handle 92706a2 is invalid (error 1)
L 05/03/2023 - 18:23:17: [SM] Blaming: Shop_Random_Number_1_1.smx
L 05/03/2023 - 18:23:17: [SM] Call stack trace:
L 05/03/2023 - 18:23:17: [SM] [0] CloseHandle
L 05/03/2023 - 18:23:17: [SM] [1] Line 132, D:\Desktop\��� ����������\1.11 scripting\Shop_Random_Number_1_1.sp::KillTimerEx
L 05/03/2023 - 18:23:17: [SM] [2] Line 188, D:\Desktop\��� ����������\1.11 scripting\Shop_Random_Number_1_1.sp::Say
Строки с ошибкой те же что и были
Сообщения автоматически склеены:

у тебя м/б просто кривой файл перевода
Это уже исправил
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@7pElllHuK, дай весь код плагина или ссыль на сообщение с исходником.

@Mr_panica, вот этот код будет рисовать квадрат в горизонтальной плоскости вокруг точки куда смотрит игрок (чужие квадраты игрок видеть не будет):
 

Вложения

  • beam_square.sp
    2 КБ · Просмотры: 8

7pElllHuK

Участник
Сообщения
1,416
Реакции
465

Вложения

  • Shop_Random_Number_1_1.sp
    7.3 КБ · Просмотры: 4

Mr_panica

XenForo one 💖
Сообщения
921
Реакции
435
@Mr_panica, вот этот код будет рисовать квадрат в горизонтальной плоскости вокруг точки куда смотрит игрок (чужие квадраты игрок видеть не будет):

Премного благодарен, чуть позже проверю у себя.
 

DarkerZ

Участник
Сообщения
394
Реакции
175
попробуй
C-подобный:
KillTimerEx(g_hAnswerWaitTimer);
->
C-подобный:
delete g_hAnswerWaitTimer;
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@Mr_panica, плагин по команде админа sm_set_point создаёт квадрат в точке куда он смотрит (если квадрат уже существует, то имеющийся перемещается).
В конце раунда квадрат убирается (если это не нужно, то можно просто убрать код отвечающий за отлов события round_end).
Одновременно может существовать только один квадрат (админы могут мешать друг-другу).

Командой sm_check_point производится проверка находится ли в квадрате кто-то. Если кто-то там есть, то об этом выводится сообщение в чат.
Если до вызова этой команды квадрат не был создан, то в чат админу выводится предупреждение об этом.

Размер стороны квадрата задаётся в строке 10, цвет границ - на строке 11.
 

Вложения

  • sm_square.sp
    3.2 КБ · Просмотры: 9

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979

Вложения

  • Shop_Random_Number 1.1_fix.sp
    6.7 КБ · Просмотры: 6

Mr_panica

XenForo one 💖
Сообщения
921
Реакции
435
@Mr_panica, плагин по команде админа sm_set_point создаёт квадрат в точке куда он смотрит (если квадрат уже существует, то имеющийся перемещается).
В конце раунда квадрат убирается (если это не нужно, то можно просто убрать код отвечающий за отлов события round_end).
Одновременно может существовать только один квадрат (админы могут мешать друг-другу).

Командой sm_check_point производится проверка находится ли в квадрате кто-то. Если кто-то там есть, то об этом выводится сообщение в чат.
Если до вызова этой команды квадрат не был создан, то в чат админу выводится предупреждение об этом.

Размер стороны квадрата задаётся в строке 10, цвет границ - на строке 11.
Хмм, не работает, если сделать небольшой дебаг в функции ShowSquare(), то выводит что все четыре точки имеют одну координату (не нулевую)
1683132277128.png


C-подобный:
void ShowSquare()
{
    SendBeam(fCorners[0], fCorners[1]);
    SendBeam(fCorners[1], fCorners[2]);
    SendBeam(fCorners[2], fCorners[3]);
    SendBeam(fCorners[3], fCorners[0]);

    PrintToChatAll("%f %f %f %f", fCorners[0],fCorners[1],fCorners[2],fCorners[3]);
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@Mr_panica, попробуй в строке 70 убрать знак -: чтобы получилось min[0] = min[1] = fOffset;
C-подобный:
public Action Cmd_Set(int client, int args)
{
    if(client)
    {
        float pos[3], vec[3];
        GetClientEyePosition(client, pos);
        GetClientEyeAngles(client, vec);

        Handle trace = TR_TraceRayFilterEx(pos, vec, MASK_SHOT, RayType_Infinite, FilterPlayer);
        if(TR_DidHit(trace))
        {
            TR_GetEndPosition(pos, trace);

            vec[0] = vec[1] = fOffset, vec[2] = 0.0;
            SubtractVectors(pos, vec, fCorners[0]);
            AddVectors(pos, vec, fCorners[2]);

            fCorners[1] = fCorners[0];
            fCorners[1][0] = fCorners[2][0];

            fCorners[3] = fCorners[0];
            fCorners[3][1] = fCorners[2][1];

            bSaved = true;
            ShowSquare();
            CreateTimer(1.0, Timer_Square);
        }

        CloseHandle(trace);
    }

    return Plugin_Handled;
}
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Ошибок нет, работает правильно, но не выводит почему-то текст о том что ожидание ответов окончено
Блок что не работает:
public Action Timer_Answer(Handle timer)
{
    g_hAnswerWaitTimer = null;

    CPrintToChatAll("%t Ожидание ответов окончено", "Tag");

    return Plugin_Stop;
}
 

Mr_panica

XenForo one 💖
Сообщения
921
Реакции
435
@Mr_panica, попробуй в строке 70 убрать знак -: чтобы получилось min[0] = min[1] = fOffset;
Да, всё отлично сработало, функция проверки игроков в квадрате тоже.
Правда, я так понял, что нет ограничений по высоте при проверке, но вроде не страшно.

1683133767294.png
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@7pElllHuK, значения кваров shop_number_interval и shop_number_answer_time какие хоть у тебя в cfg/sourcemod/shop/Shop_Number_Random.cfg?
Сообщения автоматически склеены:

нет ограничений по высоте при проверке
Так и есть.
Можно задать и ограничения по высоте, если сильно нужно.
 
Сверху Снизу