> > > >

Склад полезного кода [GoldSrc]

Сообщения
56
Рейтинг
8
#41
Код для запуска hlds сервера в консольном режиме, с сворачиванием дочернего окна на Windows.
SCSS:
START /HIGH  hlds.exe -game cstrike +port 27016 +map de_dust2 +maxplayers 32 -noipx -console
P.S: кто видел лучше варианты - делитесь. Я видел более удобные скрипты, но сейчас не получается их найти...
Может быть эти?
+ создания батника
+ слежка за подениями сервера
+ разные мелочи

для мини проги "Старт сервер" нужен Microsoft Visual C++
 

Вложения

 
Сообщения
29
Рейтинг
74
#42
C++:
/*
*    Возвращает адрес переменной.
*/
stock get_var_address(...)
{
    assert numargs() == 1;

    #emit LOAD.S.pri    0xC // First argument.
    #emit RETN

    return 0;
}

/*
*    Пишет в память AMX по указанному адресу.
*/
stock write_amx_memory(iAddress, iValue)
{
    #emit LOAD.S.pri    iValue
    #emit SREF.S.pri    iAddress
    #emit RETN

    return 0;
}
Пример, где может быть полезно, в плагине Money Rewards
 
  2
Сообщения
1.577
GitHub
wopox1337
Рейтинг
1052
#43
Я видел более удобные скрипты, но сейчас не получается их найти
Код:
REM //================================//
REM // Название: ANTI FALL SYSTEM
REM // Версия: 1.5.5
REM // Автор : MastaMan
REM // Источник: amx-server.blogspot.com
REM //================================//
@ECHO OFF
CLS
REM ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
REM Настройки.
REM ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
REM ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
REM     Название сервера
REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SET NAME=MastaCS...

REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
REM     ПАРАМЕТРЫ ЗАПУСКА СЕРВЕРА
REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SET STARTPARAM=sv_lan 1 -game cstrike -port 27015 +maxplayers 21 +map de_dust2 -noipx -insecure -nomaster -console -pingbooster 2 +hostname %NAME%

REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
REM     Включение копирайтов (0-отключить, 1-включить) (по-умолчанию: 1)
REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SET COPYRIGHT=1

REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
REM     Язык консоли (RU, EN) (по-умолчанию: RU)
REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SET LANG=RU

REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
REM     Установите параметр для отображения времени (0-ничего, 1- только время, 2- время и дата (по-умолчанию: 2))
REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SET STYLETIME=2

REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
REM     Выбирите цвет для сообщений при запуске (COLORSTART)(по умолчанию: 1) и цвет для ошибок (COLORERROR)(по умолчанию: 2)  (1 - Зеленый, 2 - Красный, 3 - Синий, 4 - Лиловый, 5 - Жёлтый, 6 - Белый)
REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SET COLORSTART=1

SET COLORERROR=2

REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
REM    Показвать путь откуда был запущен сервер (0- нет 1-да) (по умолчанию: 1)
REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SET PATHWAY=1

REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
REM     Оставлять цвет ошибок всегда, или на время запуска сервера после ошибки (0-оставлять всегда, 1-только во время ошибки) (по-умолчанию: 1)
REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SET DYNAMICCOLOR=1

REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
REM     Подтверждение на восстановление сервера после ошибки (Необходимо нажать любую клавишу для продолжения) (по умолчанию: 0)
REM ------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SET CONFIRM=0

REM ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
REM ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
REM Локализация.
REM ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

IF "%LANG%"=="RU" (
SET MM_SERVERNAME=Запуск выделенного сервера
SET MM_PATHWAY=Расположение сервера
SET MM_CREATEDIRLOG=Создание файла логов.

SET MM_STARMSG=Запуск выделенного сервера
SET MM_STARTMSG_ABOUT=Данная система позволит запускать сервер, после падения.

SET MM_CONFIRM_KEY=Нажмите любую клавишу для запуска сервера!

SET MM_RUNMSG_OK=Запуск сервера.
SET MM_RUNMSG_CRASH=ВНИМАНИЕ: производится восстановления сервера после серьезной ошибки!
SET MM_RUNMSG_UP=Подождите пару минут, идет восстановление сервера...
)

IF "%LANG%"=="EN" (
SET MM_SERVERNAME=Starting dedicated server
SET MM_PATHWAY=Server location
SET MM_CREATEDIRLOG=Created log file.

SET MM_STARMSG=Run dedicated server
SET MM_STARTMSG_ABOUT=This system will run the server, after the crash.

SET MM_CONFIRM_KEY=Press any key for run server!

SET MM_RUNMSG_OK=Run the server.
SET MM_RUNMSG_CRASH=WARNING: begin restore the server from a serious error!
SET MM_RUNMSG_UP=Wait a minute, is restoring the server...
)
REM ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
REM ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
REM Начало.
REM ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

REM // Заголовок окна
TITLE  %MM_SERVERNAME% %NAME%

REM // Определение цветов
SET GREEN=COLOR 0a
SET RED=COLOR 0c
SET BLUE=COLOR 09
SET PINK=COLOR 0d
SET YELLOW=COLOR 0E
SET WHITE=COLOR 0F

REM // Определение цветов для стартового сообщения
IF "%COLORSTART%"=="1"  SET COLORSTART=%GREEN%
IF "%COLORSTARt%"=="2"  SET COLORSTART=%RED%
IF "%COLORSTART%"=="3"  SET COLORSTART=%BLUE%
IF "%COLORSTART%"=="4"  SET COLORSTART=%PINK%
IF "%COLORSTART%"=="5"  SET COLORSTART=%YELLOW%
IF "%COLORSTART%"=="6"  SET COLORSTART=%WHITE%

REM // Определение цветов для сообщения ошибки
IF "%COLORERROR%"=="1"  SET COLORERROR=%GREEN%
IF "%COLORERROR%"=="2"  SET COLORERROR=%RED%
IF "%COLORERROR%"=="3"  SET COLORERROR=%BLUE%
IF "%COLORERROR%"=="4"  SET COLORERROR=%PINK%
IF "%COLORERROR%"=="5"  SET COLORERROR=%YELLOW%
IF "%COLORERROR%"=="6"  SET COLORERROR=%WHITE%


REM // Показывать путь к серверу
IF "%PATHWAY%"=="1" (ECHO %MM_PATHWAY%: %CD%
ECHO ====================================
ECHO.)

REM // Создание папки логов                                                        
IF NOT EXIST RUNLOG (
ECHO ------------------------------------
ECHO %MM_CREATEDIRLOG%
ECHO ------------------------------------
ECHO.
MKDIR RUNLOG)

REM // Тип времени
IF "%STYLETIME%"=="0" SET SHOWTIME=
IF "%STYLETIME%"=="1" SET SHOWTIME=%TIME:~0,-3%
IF "%STYLETIME%"=="2" SET SHOWTIME=%TIME:~0,-3% / %DATE:~3%

REM // Запись в лог начальной строки
ECHO ====================================================>>RUNLOG/%DATE%.txt  
ECHO %DATE% ^> Start new session %TIME:~0,-3% >>RUNLOG/%DATE%.txt
ECHO ====================================================>>RUNLOG/%DATE%.txt  


REM ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
REM ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
REM Основная программа.
REM ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


REM // Вступительные сообщения
ECHO %MM_STARMSG% %NAME%
ECHO.
ECHO ====================================
ECHO %MM_STARTMSG_ABOUT%
ECHO.

IF "%LANG%"=="RU" (
REM // Копирайты автора
IF "%COPYRIGHT%"=="1" ECHO Сайт поддержки: amx-server.blogspot.com
IF "%COPYRIGHT%"=="1" ECHO.
IF "%COPYRIGHT%"=="1" ECHO Автор: MastaMan
ECHO ====================================
IF "%COPYRIGHT%"=="1" ECHO.
)

IF "%LANG%"=="EN" (
REM // Копирайты автора
IF "%COPYRIGHT%"=="1" ECHO Support site: amx-server.blogspot.com
IF "%COPYRIGHT%"=="1" ECHO.
IF "%COPYRIGHT%"=="1" ECHO Autor: MastaMan
ECHO ====================================
IF "%COPYRIGHT%"=="1" ECHO.
)


REM //  Цвет текста консоли при старте
ECHO ------------------------------------
ECHO.
ECHO %SHOWTIME% ^>^>^> %MM_RUNMSG_OK%

REM // Цвет для ошибок постоянный
IF "%DYNAMICCOLOR%"=="0" (%COLORSTART%)

REM // Сюда будет сделан переход при падении сервера
:RUNSERVER

REM // Цвет для ошибок меняется
IF "%DYNAMICCOLOR%"=="1" (%COLORSTART%)

REM // ЗАПУСК СЕРВЕРА
START/HIGH/MIN/WAIT  hlds.exe + %STARTPARAM%

REM // Цвет консоли при ошибке
%COLORERROR%

REM // Сообщение об ошибке
ECHO.
ECHO ------------------------------------
ECHO.
ECHO %SHOWTIME% ^> %MM_RUNMSG_CRASH%
ECHO ------------------------------------

REM // Запись ошибки в лог
ECHO %SHOWTIME% ^> Server has been crashed>>RUNLOG/%DATE%.txt

REM // Задержка в пару секунд
PING 127.0.0.1 -n 3 > nul

REM // Подтверждение на перезапуск
IF "%CONFIRM%"=="1" (
ECHO %MM_CONFIRM_KEY%
PAUSE >nul)

REM // Тип времени
IF "%STYLETIME%"=="0" SET SHOWTIME=
IF "%STYLETIME%"=="1" SET SHOWTIME=%TIME:~0,-3%
IF "%STYLETIME%"=="2" SET SHOWTIME=%TIME:~0,-3% / %DATE:~3%

REM // Сообщение о перезапуске
ECHO ------------------------------------
ECHO.
ECHO %SHOWTIME% ^>^>^> %MM_RUNMSG_UP%

REM // Переход  на запуск сервера если произошла ошибка
GOTO RUNSERVER

REM //================================//
REM // Название: ANTI FALL SYSTEM
REM // Версия: 1.5.5
REM // Автор : MastaMan
REM // Источник: amx-server.blogspot.com
REM //================================//

Естественно, после его рукоделий в области бэкдоров - на его сайт заходить уже давно никто не рекомендует.
 
 
Сообщения
127
Рейтинг
247
#45
C-like:
stock color_gradient(Float:c1[3], Float:c2[3], Float:value, Float:range, Float:result[3])
{
   new Float:p = floatmin(value, range)/range;
   for(new i = 0; i < 3; i++)
    result[i] = (1.0-p) * c1[i] + p * c2[i];
}
Алгоритм поиска цвета между заданных двух в промежутке от 0 до range в заданной точке value
Демонстрация с итерацией от 0 до range и обратно:
 
  8
Сообщения
218
Рейтинг
169
#46
Аналог native cs_get_user_buyzone(index) - проверка нахождения игрока в зоне закупки:
Код:
stock bool:rg_get_user_buyzone(const pIndex)
{
    new iSignals[UnifiedSignals];

    get_member(pIndex, m_signals, iSignals);

    return bool:(SignalState:iSignals[US_State] & SIGNAL_BUY);
}
Аналог Float:cs_get_user_lastactivity(index) - проверка последней активности игрока:
#define rg_get_user_lastactivity(%0) Float:get_member(%0, m_fLastMovement)
За пример использования мембера m_fLastMovement спасибо fantom
 
Последнее редактирование модератором:
  4
Сообщения
1.251
Рейтинг
675
#47
Аналог native cs_get_user_buyzone(index) - проверка нахождения игрока в зоне закупки:
Код:
stock bool:rg_get_user_buyzone(const pIndex)
{
    new iSignals[UnifiedSignals];

    get_member(pIndex), m_signals, iSignals);

    return bool:(SignalState:iSignals[US_State] & SIGNAL_BUY);
}
Это уже было тут: https://dev-cs.ru/threads/222/#post-2173

Код:
/* Returns in bitwise (see enum SignalState) form if the user is in a specific map zone. */
stock SignalState:rg_get_user_mapzones(const player) {
    new iSignals[UnifiedSignals];
    get_member(player, m_signals, iSignals);
    return SignalState:iSignals[US_State];
}

stock bool:rg_user_in_buyzone(const player) {
    return bool:(rg_get_user_mapzones(player) & SIGNAL_BUY);
}
 
 
Сообщения
153
GitHub
denvolj
Рейтинг
161
#48
С помощью следующего метода можно легко парсить переданные через натив структуры и избежать излишнего дублирования кода (принцип DRY).

Предположим, мы разрабатываем плагин, в котором есть следующая структура:
Код:
enum _:UserStruct {
        us_nickname[32], // Имя пользователя
        us_steam[32],    // SteamID
        us_ip[22],       // IP адрес
        us_password[32], // Пароль
        us_accessflags,  // Флаги доступа игрока
        us_kills,        // Фраги
        us_deaths        // Смерти
}
А так же такая строчка: register_native("auth_register_user", "native__register_user");

Для чтения параметров, внутри нашего натива, достаточно всего пары строк:
Код:
public native__register_user(pluginID, args) {
        new user[UserStruct];
      
        // Парсим аргументы натива
        parse_native_arguments(args, user);
      
        /* Ваш код */
}
Вся магия происходит внутри этого метода:
Код:
// Метод для парсинга структуры по парам ключ-значение
/*
* args - количество аргументов для разбора
* user[UserStruct] - структура, в которую будем заливать данные
* param - с какого параметра начинать разбор
*/
parse_native_arguments(args, user[UserStruct], param = 0) {
        static property;
      
        do {
                property = get_param_byref(++param);
              
                // Тут мы и определяем каким образом будем считывать данные
                switch(property) {
                        case UserStruct: get_array(++param, user, UserStruct-1);
                        case us_nickname: get_string(++param, user[us_nickname], charsmax(user[us_nickname]));
                        case us_steam: get_string(++param, user[us_steam], charsmax(user[us_steam]));
                        case us_ip: get_string(++param, user[us_ip], charsmax(user[us_ip]));
                        case us_password: get_string(++param, user[us_password], charsmax(user[us_password]));
                        case us_kills, us_deaths: user[property] = get_param_byref(param);
                }
        } while (param <= args);
        return;
}
Код:
auth_register_user(
        us_nickname, "Boec[SpecOPs]",
        us_steam, "STEAM_BOT",
        us_password, "1020useboecspecops",
        us_kills, 5,
        us_deaths, 100500
);
auth_register_user(UserStruct, user);
 
Последнее редактирование:
  4
Сообщения
218
Рейтинг
169
#49
Minni, то, что там, с зависимостью от другого стока, не критично, но всё же.
 
 
Сообщения
1.251
Рейтинг
675
#50
d3m37r4, с той зависимостью куда лучше будет, чем плодить кучу стоков с изменением лишь одного параметра :)
 
 
Сообщения
43
Рейтинг
45
#51
81x08, уже есть по дефолту, называется explode_string. Но это немного другое. Мне нужен был не распарсенный массив, а последовательное получение из строки следующий "аргумент".
14 Июн 2018
вы чё сума сошли, я изначально писал про сурс, а не голдсрс, верните обратно сообщение
 
Последнее редактирование модератором:
 
Сообщения
780
Рейтинг
702
#52
Код:
stock parseTime(const value[]) {
    new t, k;
    for (new i; value[i] != EOS; i++) {
        switch (value[i]) {
            case '0'..'9': {
                t = (t * 10) + (value[i] - '0');
            }

            case 'i': {
                k += t * 60;
                t = 0;
            }

            case 'h': {
                k += t * 3600;
                t = 0;
            }

            case 'd': {
                k += t * 86400;
                t = 0;
            }

            case 'm': {
                k += t * 2592000;
                t = 0;
            }

            case 'y': {
                k += t * 31104000;
                t = 0;
            }

            default: {
                break;
            }
        }
    }

    return k + t;
}

Примеры использования
Код:
parseTime("1"); // 1 second
parseTime("1i"); // 1 minute
parseTime("1d"); // 1 day
parseTime("1m"); // 1 month
parseTime("1y"); // 1 year
parseTime("1y2m4d5i");
parseTime("1y2m4d5i6");
16 Июн 2018
Код:
stock parseHEXColor(const value[])
{
    new result[3];
    if (value[0] != '#' && strlen(value) != 7) {
        return result;
    }

    result[0] = parse16bit(value[1], value[2]);
    result[1] = parse16bit(value[3], value[4]);
    result[2] = parse16bit(value[5], value[6]);

    return result;
}

stock parse16bit(ch1, ch2)
{
    return parseHex(ch1) * 16 + parseHex(ch2);
}

stock parseHex(const ch)
{
    switch (ch) {
        case '0'..'9': {
            return ch - '0';
        }

        case 'a'..'f': {
            return 10 + ch - 'a';
        }

        case 'A'..'F': {
            return 10 + ch - 'A';
        }
    }

    return 0;
}

Примеры использования
Код:
new colors[3];
colors = test(""); // 0 0 0
colors = test("test"); // 0 0 0
colors = test("#000000"); // 0 0 0
colors = test("#ffffff"); // 255 255 255
colors = test("#FFFFFF"); // 255 255 255
colors = test("#1c1c1c"); // 28 28 28
16 Июн 2018
Код:
stock mktime(hour = -1, minute = -1, second = -1, month = -1, day = -1, year = -1) {
    new const daysInMonth[] = {
        31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
    };

    if (hour == -1 || minute == -1 || second == -1) {
        new curHour, curMinute, curSecond;
        time(curHour, curMinute, curSecond);
        if (hour == -1) {
            hour = curHour;
        }
        if (minute == -1) {
            minute = curMinute;
        }
        if (second == -1) {
            second = curSecond;
        }
    }

    if (month == -1 || day == -1 || year == -1) {
        new curYear, curMonth, curDay;
        date(curYear, curMonth, curDay);
        if (month == -1) {
            month = curMonth;
        }
        if (day == -1) {
            day = curDay;
        }
        if (year == -1) {
            year = curYear;
        }
    }

    hour = clamp(hour, 0, 23);
    minute = clamp(minute, 0, 59);
    second = clamp(second, 0, 59);
    month = clamp(month, 1, 12);
    year = clamp(year, 1970, 2038);
    if (month == 2) {
        day = clamp(day, 1, (year % 4) == 0 ? 29 : 28);
    } else {
        day = clamp(day, 1, daysInMonth[month - 1]);
    }

    year -= 1970;
    new result = 0;
    result += year * 31536000;
    result += year / 4 * 86400;

    for (new i = 0; i < month - 1; i++) {
        result += daysInMonth[i] * 86400;
    }
    result += day * 86400;
    result += hour * 3600;
    result += minute * 60;
    result += second;

    return result;
}
16 Июн 2018
Код:
stock reverseString(string[]) {
    for (new i = 0, len = strlen(string) - 1; i < len; i++, len--) {
        string[i] ^= string[len];
        string[len] ^= string[i];
        string[i] ^= string[len];
    }
}
 
  7
Сообщения
43
Рейтинг
45
#53
Хоть бы в амхх подглядели на функцию get_time. Там пофикшено Mинута.
 
  1
Сообщения
29
Рейтинг
74
#54
Часто бывает, когда админы серверов заменяют всю локализацию плагина на русский, что бы все сообщения выводились только на этом языке. После чего, файл локализации выглядит так:
[en]
HELLO = Привет
WORLD = Мир

[ru]
HELLO = Привет
WORLD = Мир
Есть более красивый вариант, заставить плагин выводить сообщения, только на нужном админе языке:

1. Регистрируем квар языка:
C++:
new g_pcvLanguage;

public plugin_init()
{
    /*
    *   Язык. Возможные значения:
    *   "server" - язык сервера (amx_language).
    *   "player" - язык игрока (setinfo "lang").
    *   Конкретный язык в формате ISO 639-1 ("en", "ru").
    */
    g_pcvLanguage = register_cvar("plugin_lang", "ru");
}
2. Добавляем функцию получения языка из квара:
Код:
get_language(iPlayer, szLang[8] = "")
{
    get_pcvar_string(g_pcvLanguage, szLang, charsmax(szLang));

    if (equali(szLang, "player"))
    {
        szLang[0] = iPlayer == 0 ? LANG_PLAYER : iPlayer;
        szLang[1] = EOS;
    }
    else if (equali(szLang, "server"))
    {
        szLang[0] = LANG_SERVER;
        szLang[1] = EOS;
    }

    return szLang;
}
Вот собственно и все =) Можно пользоваться.
C++:
some_func()
{
    client_print(0, print_chat, "%L", get_language(0), "HELLO_WORLD");

    new szLang[8];
    get_language(iPlayer, szLang);

    client_print(iPlayer, print_chat, "%L", szLang, "HELLO");
    client_print(iPlayer, print_chat, "%L", szLang, "WORLD");
}
 
  4
Сообщения
153
GitHub
denvolj
Рейтинг
161
#55
Не совсем относится к коду, но и темы такой не имеется. А создавать отдельную тему под это - слишком жирно. (с)

У amxmodx есть интересная фича - он грузит не просто plugins.ini, но и plugins-*.ini. Это значит, что он подгрузит плагины, например, из списка с именем: plugins-auth.ini.
Стоит учесть, что порядок подгрузки таких файлов идёт по алфавиту.
Так-же, подгрузчик плагинов понимает относительный путь до .amxx, и, например, спокойно увидев строчку auth/simple_rbac.amxx - подгрузит этот плагин по пути amxmodx/plugins/auth/simple_rbac.amxx.

В общем, если вы держите сервер с дофигалиардом разносортных плагинов - их можно объединить в такие вот "пачки".
ИМХО: мне такая организация не раз помогала быстро отыскать не работающий плагин.

UPD: Это так же помогает в случае, когда необходимо отключить мод целиком. Все плагины с зависимостями засовываются в один файл (например plugins-ZombieMod.ini), для отключения достаточно поменять часть маски (например, добавить расширение "disabled").
 
Последнее редактирование:
Сообщения
166
Рейтинг
177
#56
не особо полезное, но для сокращения кода пойдет:
Код:
stock rg_give_item_ex(id, weapon[], GiveType:type = GT_APPEND, ammount = 0)
{
    rg_give_item(id, weapon, type);
    if(ammount) rg_set_user_bpammo(id, rg_get_weapon_info(weapon, WI_ID), ammount);
}
Код:
rg_give_item_ex(id, "weapon_hegrenade"); // выдать 1 HE гранату
rg_give_item_ex(id, "weapon_flashbang", .ammount = 2); // Выдать 2 флешки
rg_give_item_ex(id, "weapon_deagle", GT_REPLACE, 35); // выдать дигл с заменой другого пистолета + 35 патронов в запас
7 Июл 2018
Код для генерации строки с набором случайных букв.
switch(random_num(3))
->
switch(random(3))
 
  4
> > > >