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

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

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

Вложения

Последнее редактирование модератором:
Сообщения
162
Реакции
445
Помог
2 раз(а)
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,713
Реакции
2,993
Помог
59 раз(а)
Я видел более удобные скрипты, но сейчас не получается их найти
Код:
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 //================================//

Естественно, после его рукоделий в области бэкдоров - на его сайт заходить уже давно никто не рекомендует.
 
Последнее редактирование модератором:
Сообщения
2,810
Реакции
1,658
Помог
74 раз(а)
wopox1337, -game cstrike -port 27015 +maxplayers 21 +map de_dust2 -noipx -insecure -nomaster -console -pingbooster 2 +hostname %NAME%
:crazy:
 
Последнее редактирование модератором:

Garey

ninjaCow
Сообщения
411
Реакции
1,051
Помог
10 раз(а)
Алгоритм поиска цвета между заданных двух в промежутке от 0 до range в заданной точке value

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 и обратно:
 
Последнее редактирование модератором:

d3m37r4

111111
Сообщения
1,420
Реакции
1,162
Помог
10 раз(а)
Аналог 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
 
Последнее редактирование модератором:
Сообщения
2,144
Реакции
1,223
Помог
44 раз(а)
Аналог 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);
}
 
Последнее редактирование модератором:
Сообщения
198
Реакции
273
Помог
5 раз(а)
С помощью следующего метода можно легко парсить переданные через натив структуры и избежать излишнего дублирования кода (принцип 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);
 
Последнее редактирование:

d3m37r4

111111
Сообщения
1,420
Реакции
1,162
Помог
10 раз(а)
Minni, то, что там, с зависимостью от другого стока, не критично, но всё же.
 
Последнее редактирование модератором:
Сообщения
2,144
Реакции
1,223
Помог
44 раз(а)
d3m37r4, с той зависимостью куда лучше будет, чем плодить кучу стоков с изменением лишь одного параметра :)
 
Последнее редактирование модератором:
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Код:
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];
    }
}
 
Последнее редактирование модератором:
Сообщения
1,661
Реакции
1,486
Помог
24 раз(а)
Хоть бы в амхх подглядели на функцию get_time. Там пофикшено Mинута.
 
Последнее редактирование модератором:
Сообщения
162
Реакции
445
Помог
2 раз(а)
Часто бывает, когда админы серверов заменяют всю локализацию плагина на русский, что бы все сообщения выводились только на этом языке. После чего, файл локализации выглядит так:
[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");
}
 
Сообщения
198
Реакции
273
Помог
5 раз(а)
Не совсем относится к коду, но и темы такой не имеется. А создавать отдельную тему под это - слишком жирно. (с)

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

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

UPD: Это так же помогает в случае, когда необходимо отключить мод целиком. Все плагины с зависимостями засовываются в один файл (например plugins-ZombieMod.ini), для отключения достаточно поменять часть маски (например, добавить расширение "disabled").
 
Последнее редактирование:
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
не особо полезное, но для сокращения кода пойдет:
Код:
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))
 
Последнее редактирование модератором:
Сообщения
198
Реакции
273
Помог
5 раз(а)
Данный метод скопипастит ваш массив произвольный массив в другой массив (например тот, что был организован через enum).
Длину массива назначения можно не указывать (но это не точно) :3
Код:
stock arraycopy( any:into[], any:from[], len = sizeof into, bool:ignoretags = false, intotag = tagof into, intosize = sizeof into, intopos = 0, fromtag = tagof from, fromsize = sizeof from, frompos = 0) {
    if (!ignoretags && intotag != fromtag) {
        //So we know no elements were copied (we did not remove an element ie. returning -1)
        return 0;
    }
    
    new i;
    while (i < len) {
        if (intopos >= intosize || frompos >= fromsize) {
            break;
        }
        
        into[intopos++] = from[frompos++];
        i++;
    }
    
    return i;
}
 
Сообщения
2,713
Реакции
2,993
Помог
59 раз(а)
Аналог полезной функции из GameDLL. Позволяет выдавать оружие вместе с боеприпасом (bpammo).
Код:
stock GiveWeapon(id, ammo, szWeaponName[])
{
    rg_give_item(id, szWeaponName);
    new const WeaponIdType: pInfo = rg_get_weapon_info(szWeaponName, WI_ID);

    if(pInfo) {
        static ammoName[32];
        rg_get_weapon_info(pInfo, WI_AMMO_NAME, ammoName, charsmax(ammoName));

        if(ammo)
            rg_set_user_bpammo(id, pInfo, ammo);
    }
}
Использование:
GiveWeapon(pPlayer, 228, "weapon_deagle")
1539208271413.png
 
Сообщения
957
Реакции
1,184
Помог
52 раз(а)
wopox1337, я бы еще вынес вилку if (ammo) на уровень выше - нет смысла дергать инфу о оружии, если она не нужна
 
Последнее редактирование модератором:
Сообщения
90
Реакции
126
Помог
3 раз(а)
Аналоги DefaultDeploy и SendWeaponAnim с SDK
Код:
stock util_weapon_send_anim(const client, const anim) {
    set_pev(client, pev_weaponanim, anim)
    message_begin(MSG_ONE, SVC_WEAPONANIM, _, client)
    write_byte(anim)
    write_byte(pev(client, pev_body))
    message_end()
}

stock bool:util_weapon_default_deploy(const weapon, const player, const view_model[], const weapon_model[], const anim, const anim_ext[]) {
    if (!ExecuteHam(Ham_Item_CanDeploy, weapon)) {
        return false
    }

    set_pev(player, pev_viewmodel2, view_model)
    set_pev(player, pev_weaponmodel2, weapon_model)
    set_pdata_string(player, 387, anim_ext, -1, 20) // m_szShieldAnimExt

    util_weapon_send_anim(player, anim)

    set_pdata_float(player, 83, 0.75) // m_flNextAttack
    set_pdata_float(weapon, 48, 1.5, 4) // m_flTimeWeaponIdle, XO_WEAPON
    set_pdata_float(weapon, 79, 0.0, 4) // m_flLastFireTime, XO_WEAPON
    static Float:time
    global_get(glb_time, time)
    set_pdata_float(weapon, 76, time, 4) // m_flDecreaseShotsFired, XO_WEAPON

    const DEFAULT_FOV = 90
    set_pdata_int(player, 363, DEFAULT_FOV) // m_iFOV
    set_pev(player, pev_fov, DEFAULT_FOV)
    set_pdata_int(player, 109, DEFAULT_FOV) // m_iLastZoom
    set_pdata_int(player, 110, false) // m_iLastZoom

    return true
}
25 Окт 2018
Отсутствует разве что возможность пропустить отправку анимации для воспроизведения ее клиентским предсказанием
 

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

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