Русское сообщество по скриптингу

Сборник полезных функций

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Re: Сборник полезных функций

Сообщение Subb98 » 10 сен 2017, 18:26

Сток для записи логов с разделением файлов по дням и сохранением в отдельную директорию, например, addons/amxmodx/logs/custom_dir

Код: Выделить всё
stock logging(const message[], any:...) {
    static 
logsDir[64], file[sizeof logsDir 32], time[22], msg[512];

    if(!
logsDir[0]) {
        new 
len get_localinfo("amxx_logs"logsDircharsmax(logsDir));
        
formatex(logsDir[len], charsmax(logsDir) - len"/custom_dir");

        if(!
dir_exists(logsDir)) {
            
mkdir(logsDir);
        }
    }

    new 
pfile;

    
get_time("%Y%m%d"timecharsmax(time));
    
formatex(filecharsmax(file), "%s/%s.log"logsDirtime);
    
vformat(msgcharsmax(msg), message2);

    if((
pfile fopen(file"a"))) {
        
get_time("%d/%m/%Y - %H:%M:%S"timecharsmax(time));
        
fprintf(pfile"%s: %s^n"timemsg);
        
fclose(pfile);
    }
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: Сборник полезных функций

Сообщение Subb98 » 12 ноя 2017, 18:33

Код для плавного затемнения экрана игроку и такого же плавного возвращения яркости спустя определённое время. Автор кода - PRoSToTeM@

Код: Выделить всё
// Пример использования
MessageScreenFade(pTargetFADE_IN_TIMEFADE_HOLD_TIMEFADE_OUT_TIMEFADE_COLORFADE_ALPHA); 

Код: Выделить всё
// Сам код:
#define FADE_IN_TIME 2.0
#define FADE_HOLD_TIME 6.0
#define FADE_OUT_TIME 4.0
#define FADE_TIME (FADE_IN_TIME + FADE_HOLD_TIME + FADE_OUT_TIME)
#define FADE_COLOR 0, 0, 0 // цвет экрана игрока в RGB формате (по умолчанию 0, 0, 0)
#define FADE_ALPHA 255 // уровень непрозрачности экрана игрока (по умолчанию 255)
#define MESSAGE_SCREEN_FADE 98
#define FFADE_OUT 0x0001
#define FFADE_IN 0x0000

enum _:DATA_SCREENFADE_SIZE
{
    
Float:DSS_OutTime,
    
DSS_Red,
    
DSS_Green,
    
DSS_Blue,
    
DSS_Alpha
}

MessageScreenFade(const id, const Float:fInTime, const Float:fHoldTime, const Float:fOutTime, const iRed, const iGreen, const iBlue, const iAlpha)
{
    
message_begin(MSG_ONEMESSAGE_SCREEN_FADE_id);
    
write_short(min(floatround(fInTime 4096), 65535)); // в данном случае, short - это word, максимум ~16 секунд (без 1/4096)
    
write_short(65535);
    
write_short(FFADE_OUT);
    
write_byte(iRed);
    
write_byte(iGreen);
    
write_byte(iBlue);
    
write_byte(iAlpha);
    
message_end();
    new 
aData[DATA_SCREENFADE_SIZE];
    
aData[DSS_OutTime] = _:fOutTime;
    
aData[DSS_Red] = iRed;
    
aData[DSS_Green] = iGreen;
    
aData[DSS_Blue] = iBlue;
    
aData[DSS_Alpha] = iAlpha;
    
set_task(fInTime fHoldTime"MessageScreenFadeOut"idaDatasizeof aData);
}

public 
MessageScreenFadeOut(const aData[DATA_SCREENFADE_SIZE], const id)
{
    
message_begin(MSG_ONEMESSAGE_SCREEN_FADE_id);
    
write_short(min(floatround(aData[DSS_OutTime] * 4096), 65535)); // в данном случае, short - это word, максимум ~16 секунд (без 1/4096)
    
write_short(0);
    
write_short(FFADE_IN);
    
write_byte(aData[DSS_Red]);
    
write_byte(aData[DSS_Green]);
    
write_byte(aData[DSS_Blue]);
    
write_byte(aData[DSS_Alpha]);
    
message_end();
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: Сборник полезных функций

Сообщение RevCrew » 14 янв 2018, 15:10

Сортировка cell array в порядке

Код: Выделить всё

enum OrderType
{
    ORDER_ASC = 0,
    ORDER_DESC
}
sort_cell_array_by_order( Array: cellArray, OrderType:order = ORDER_ASC)
{
    new Data[1]; Data[0] = _:order;
    ArraySort(cellArray, "SortArrayOrder", Data, 1)
}
public SortArrayOrder(Array: array, item1, item2, const data[], data_size)
{
    new OrderType:order = OrderType: data[0];

    new item_value1 = ArrayGetCell(array, item1);
    new item_value2 = ArrayGetCell(array, item2);

    switch (order)
    {
        case ORDER_ASC:
        {
            if(item_value1 > item_value2)    return 1;
            else                return -1;
        }
        case ORDER_DESC:
        {
            if(item_value1 > item_value2)    return -1;
            else                return 1;
        }
    }

    return 0;
}
 


Пример с order desc:
Код: Выделить всё

case_items_to_order
( cellArray, .order = ORDER_DESC

Код: Выделить всё
[0] 1
[1] 4
[2] 2
[3] 3

Результат
Код: Выделить всё
[0] 4
[1] 3
[2] 2
[3] 1
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: Сборник полезных функций

Сообщение gamingEx » 18 окт 2018, 08:17

Код: Выделить всё
enum(+= 1)
{
    PRIMARY_WEAPON_SLOT = 1,
    PISTOL_SLOT,
    KNIFE_SLOT,
    GRENADE_SLOT,
    C4_SLOT,
}

#define lin_diff_weapon        4    //diff for linux server weapon
#define lin_diff_player        5    //diff for linux server player

#define m_pNext            42    //next weapon item
#define m_iId            43    //weapon id CSW_
#define    m_rgpPlayerItems    367    //owned player's weapon index

public Ham_StripWeaponInSlot(iPlayer, iSlotStrip)
{
    new iWpn = get_pdata_cbase(iPlayer, m_rgpPlayerItems + iSlotStrip, lin_diff_player)
    while(iWpn != FM_NULLENT)
    {
        ExecuteHamB(Ham_Weapon_RetireWeapon, iWpn)
        ExecuteHam(Ham_RemovePlayerItem, iPlayer, iWpn)
        ExecuteHam(Ham_Item_Kill, iWpn)
        set_pev(iPlayer, pev_weapons, pev(iPlayer, pev_weapons) & ~(1<<get_pdata_int(iWpn, m_iId ,lin_diff_weapon)))
        iWpn = get_pdata_cbase(iWpn, m_pNext, lin_diff_weapon)
    }

Author: Вы должны зарегистрироваться, чтобы видеть ссылки.
:dance2: :dance2: :dance2:
Аватара пользователя
gamingEx
 
Сообщения: 121
Зарегистрирован: 07 окт 2017, 20:48
Благодарил (а): 0 раз.
Поблагодарили: 19 раз.
Опыт программирования: Больше трех лет
Языки программирования: Swift, C++, PHP, Ruby, JS

Re: Сборник полезных функций

Сообщение gamingEx » 06 ноя 2018, 14:56

Это не кусок кода, но способ использования ArrayFindString для массивов. Натива задумывалась для динамических массивов содержащих только строки, но его можно использовать для поиска строки в динамических массивах содержащих массивы. Масло масленое, лучше покажу на примере.


Предположим у нас есть структура нашего массива, в котором три свойства — целочисленное, целочисленное и какая-то строка.

Код: Выделить всё
enum Props {
    TestProp,
    TestProp1,
    TestProp2[32]
}; 


И есть динамический массив.

Код: Выделить всё
new Array: g_pItems = ArrayCreate(Props); 


В котором, опять же предположим, есть куча записей и нам нужно найти одну запись по его свойству TestProp2. В том виде структуры (перечисления, если быть точнее, но давайте представим, что Pawn нормальный язык и будем называть это структурой), который есть у нас сейчас, натива ArrayFindString всегда будет возвращать -1, даже если искомая строка в одной из записей есть.
Но если мы поставим наше свойство TestProp2 выше всех остальных:

Код: Выделить всё
enum Props {
    TestProp2[32],
    TestProp,
    TestProp1
}; 


то поиск будет работать.
:dance2: :dance2: :dance2:
Аватара пользователя
gamingEx
 
Сообщения: 121
Зарегистрирован: 07 окт 2017, 20:48
Благодарил (а): 0 раз.
Поблагодарили: 19 раз.
Опыт программирования: Больше трех лет
Языки программирования: Swift, C++, PHP, Ruby, JS

Re: Сборник полезных функций

Сообщение RevCrew » 06 ноя 2018, 17:07

Форматирует в строку путь к какой-либо из доступных папок amxx с учетом названия плагина
Исх :
Код: Выделить всё
new const pluginName[] = "DiveBanX";
#define getDir(%0,%1,%2) get_localinfo(%0,%1,%2)

enum DirData {
    
DIR_CONFIG 0,
    
DIR_LOG,
    
DIR_DATA
}

stock dirTypeName[DirData][] = {
    
"amxx_configsdir",
    
"amxx_logs",
    
"amxx_datadir"
}
/* Return path of dirType with plugin_name. For Example: dirType=DIR_LOG, addons/amxmodx/logs/Plugin/
    @param DirData:dirType dir const
    @param out[] - result string
    @param len
    @param addToEnd[] - string that add in the end of path

    @return int
    
 */
stock getDirByTypeDirData:dirTypeout[], lenaddToEnd[], any:...) {
    
    new 
base[64], szMsg[64];

    
getDirdirTypeName[dirType],basecharsmax(base));
    
vformat(szMsgcharsmax(szMsg), addToEnd5);

    
formatex(outlen"%s/%s/"basepluginName);
    if ( !
dir_exists(out) ) mkdir(out);

    return 
formatex(outlen"%s/%s/%s"base,pluginNameszMsg);
}
/* Create path of dirType with plugin_name. For Example: dirType=DIR_LOG, addons/amxmodx/logs/Plugin/
    @param DirData:dirType - dir const

    @return bool
 */
stock bool:createDirByType(DirData:dirType) {
    new 
base[64];
    
getDirdirTypeName[dirType],basecharsmax(base));

    
formatex(basecharsmax(base), "%s/%s"base,pluginName)
    return 
dir_exists(base) ? true : !mkdir(base);



Применение:
Код: Выделить всё
#define CONFIG "config.cfg"
new execPath[64]
getDirByType(DirData:DIR_CONFIGexecPathcharsmax(execPath), CONFIG)

server_cmd("exec %s",execPath)
server_exec()

// result: exec addons/amxmodx/configs/plugin/config.cfg
 
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: Сборник полезных функций

Сообщение obey98 » 06 ноя 2018, 17:22

RevCrew,

// result: exec addons/amxmodx/configs/plugin/config.cfg

а почему самому бы не вписать в server_cmd тогда эту строчку?
Аватара пользователя
obey98
 
Сообщения: 52
Зарегистрирован: 16 июл 2014, 17:55
Благодарил (а): 42 раз.
Поблагодарили: 2 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

Re: Сборник полезных функций

Сообщение RevCrew » 06 ноя 2018, 19:28

obey98, это для lowiq
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: Сборник полезных функций

Сообщение gette » 31 янв 2020, 02:22

Жаль, что кончилось...
Аватара пользователя
gette
 
Сообщения: 4
Зарегистрирован: 30 янв 2020, 06:33
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года
Языки программирования: AMX-PAWN

Re: Сборник полезных функций

Сообщение Vaqtincha » 31 янв 2020, 12:15

gette, Все когда нибудь кончается. Даже мы с тобой и вся человечества могут исчезнуть бесследно в любой момент.
админгандонсоси
Аватара пользователя
Vaqtincha
 
Сообщения: 277
Зарегистрирован: 28 мар 2018, 15:05
Забанен
Благодарил (а): 8 раз.
Поблагодарили: 53 раз.

Пред.След.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14