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

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

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

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

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

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

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

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

Сообщение nemec21 » 04 ноя 2023, 20:07

Код: Выделить всё
#include <amxmodx>

public client_putinserver(id) {
    if(is_utf8_name("%n", id))
        server_print("''' The check was successful");
 }

stock bool:is_utf8_name(szName[], any:...) {
    static szBuffer[191];
    vformat(szBuffer, charsmax(szBuffer), szName, 2);

    for(new i; i < MAX_NAME_LENGTH; i++) {
        szName[0]= szBuffer[i];

        if(!szName[0])
            break;

        else if (!(< szName[0] < 128))
            return false;
    }

    return true;
Аватара пользователя
nemec21
Скриптер
 
Сообщения: 835
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 216 раз.
Поблагодарили: 49 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

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

Сообщение nemec21 » 22 ноя 2023, 14:16

Код: Выделить всё
/*
* With this function, you can get a non-repeating random number
*
* @param iNumbers - Array of numbers
* @param iNonRepeatNum - He resulting number
*
* @return Will return true - if there was a coincidence, false - if there were no coincidencesNumber of cells written to buffer
*/

stock bool:non_repeatable_random(const iNumbers[], &iNonRepeatNum) {
    static
        iAction
,
        iBuffer[32],
        iSizeNumbers;

    if(!iSizeNumbers)
        iSizeNumbers = strlen(iNumbers)

    new
        bool
:bReplay,
        iRandomNum = iNumbers[random(iSizeNumbers)];

    for(new i; i <= iSizeNumbers; ++i) {
        if(iBuffer[i] == iRandomNum)
            bReplay = true;
    }

    if(!bReplay) {
        iNonRepeatNum = iBuffer[iAction] = iRandomNum;

        if(iAction++ == iSizeNumbers -1) {
            iAction = 0;
            arrayset(iBuffer, 0, iSizeNumbers);
        }

        return bReplay;
    }

    non_repeatable_random(iNumbers, iNonRepeatNum);
    return bReplay;
}

Не большой пример использования
Код: Выделить всё
#include <amxmodx>
#include <reapi>

public plugin_init() {
    register_plugin("Non Repeat Random Number", "rz 0.1", "(: [C][O][D][E] x");

    RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn", 1);
}

public CBasePlayer_Spawn(const id) {
    if(!is_user_alive(id))
        return;

    new
        iNumbers
[] = {4, 7, 19, 1, 2},
        iNonRepeatNum;

    non_repeatable_random(iNumbers, iNonRepeatNum);
    server_print("****** %i", iNonRepeatNum);
}

stock bool:non_repeatable_random(const iNumbers[], &iNonRepeatNum) {
    static
        iAction
,
        iBuffer[32],
        iSizeNumbers;

    if(!iSizeNumbers)
        iSizeNumbers = strlen(iNumbers)

    new
        bool
:bReplay,
        iRandomNum = iNumbers[random(iSizeNumbers)];

    for(new i; i <= iSizeNumbers; ++i) {
        if(iBuffer[i] == iRandomNum)
            bReplay = true;
    }

    if(!bReplay) {
        iNonRepeatNum = iBuffer[iAction] = iRandomNum;

        if(iAction++ == iSizeNumbers -1) {
            iAction = 0;
            arrayset(iBuffer, 0, iSizeNumbers);
        }

        return bReplay;
    }

    non_repeatable_random(iNumbers, iNonRepeatNum);
    return bReplay;
}
Аватара пользователя
nemec21
Скриптер
 
Сообщения: 835
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 216 раз.
Поблагодарили: 49 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

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

Сообщение nemec21 » 29 ноя 2023, 22:37

Получаем количество русских и английских букв из строки.
Пример:
*** RUS - 15, EN - 5

Код: Выделить всё
/*
* With this funktion we will get the number of Russian and English letters in the string
*
* @param szLine - The string being checked
* @param szBuffer - Array to write
* @param LenBuffer - Array size
*
* @return Will return true - Returns nothing
*/

stock get_count_letter(const szLine[], szBuffer[], const LenBuffer) {
    new
        
En,
        
Rus,
        
Len strlen(szLine);

    for(new 
iLen; ++i) {
        if(
'A' <= szLine[i] <= 'Z' || 'a' <= szLine[i] <= 'z') {
            ++
En;
            continue;
        }

        if(
szLine[i] > 'z')
            ++
Rus;
    }

    
Rus Rus/2;

    
formatex(szBufferLenBuffer"RUS - %i, EN - %i"RusEn);

Не большой пример использования
Код: Выделить всё
#include <amxmodx>

public plugin_init() {
    
register_plugin("Count letter""rz 0.1""(: [C][O][D][E] x");

    new 
szBuffer[191];
    
get_count_letter("(: [C][O][D][E] x это и есть Виталик"szBuffercharsmax(szBuffer));

    
server_print("**** %s"szBuffer);
}

stock get_count_letter(const szLine[], szBuffer[], const LenBuffer) {
    new
        
En,
        
Rus,
        
Len strlen(szLine);

    for(new 
iLen; ++i) {
        if(
'A' <= szLine[i] <= 'Z' || 'a' <= szLine[i] <= 'z') {
            ++
En;
            continue;
        }

        if(
szLine[i] > 'z')
            ++
Rus;
    }

    
Rus Rus/2;

    
formatex(szBufferLenBuffer"RUS - %i, EN - %i"RusEn);
Аватара пользователя
nemec21
Скриптер
 
Сообщения: 835
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 216 раз.
Поблагодарили: 49 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

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

Сообщение Mistrick » 02 дек 2023, 15:53

nemec21,
Код: Выделить всё
get_count_letter("{|}~仰仱仲仳仴仵件价仸仹仺任仼份仾仿", szBuffer, charsmax(szBuffer));

Код: Выделить всё
**** RUS - 26, EN - 0

Точно русские считает?
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2944
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1251 раз.
Языки программирования: PAWN
С/С++(few above zero)

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

Сообщение nemec21 » 02 дек 2023, 21:55

Подправим
Аватара пользователя
nemec21
Скриптер
 
Сообщения: 835
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 216 раз.
Поблагодарили: 49 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

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

Сообщение nemec21 » 05 апр 2024, 22:01

Изменяет игроку угол (BETTA) обзора.
Код: Выделить всё
#include <reapi>

/*
* Changes the player's viewing angle..
*
* @param pUser            The player's index.
* @param iValueAngle      Angle values.
*
* @return                 The angle has been changed (true), otherwise (false).
*/
public bool:UTIL_Angle(const pUser, const iValueAngle) {
    if(!is_user_alive(pUser) || 1 > iValueAngle > 180)
        return false;

    enum any: DATA {
        VALUE_BETTA,
        ALFA,
        BETTA
    
};

    new Float:fParameters[DATA +1];

    fParameters[VALUE_BETTA] = float(iValueAngle);
    get_entvar(pUser, var_v_angle, fParameters[ALFA]);

    if(fParameters[BETTA] > 0.0)
        fParameters[BETTA] -= fParameters[VALUE_BETTA];

    else fParameters[BETTA] += fParameters[VALUE_BETTA];

    set_entvar(pUser, var_v_angle, fParameters[ALFA]);
    set_entvar(pUser, var_angles, fParameters[ALFA]);
    set_entvar(pUser, var_fixangle, 1);

    return true;
Аватара пользователя
nemec21
Скриптер
 
Сообщения: 835
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 216 раз.
Поблагодарили: 49 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

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

Сообщение sb123 » 20 май 2024, 14:11

Names contain forbidden characters

new name[32]
get_user_name(id, name, 31)
if (!is_legal_name(name))

Код: Выделить всё
stock is_legal_name(name[])
{
    new ret = 1
    for 
(new i; i < 32; i++)
    {
        switch(name[i])
        {
            case '"', '\', '%', 9: // 9 -> tab
            {
                return 0
            }
            case 0:
            {
                break
            }
        }
    }
    return ret
}
Аватара пользователя
sb123
 
Сообщения: 4
Зарегистрирован: 18 ноя 2021, 19:55
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Языки программирования: Я ничего не знаю

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

Сообщение nemec21 » 20 май 2024, 22:03

sb123, ну тогда уж лучше так

Код: Выделить всё
stock bool:is_legal_name(const name[]) {
    for(new i; i < strlen(name); i++) {
        switch(name[i])  {
            case '"', '\', '%', 9: // 9 -> tab
                return false;
        }
    }

    return true;
}
Аватара пользователя
nemec21
Скриптер
 
Сообщения: 835
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 216 раз.
Поблагодарили: 49 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

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

Сообщение sb123 » 04 июн 2024, 19:00

// Duplicate name check
new name[32]
get_user_name(id, name, 31)
one_name(id, name, 31)

Код: Выделить всё
one_name(id, name[], len)
{
    new sample[32], s
    copy
(sample, 31, name)
    
    for 
(new i=0; i<33; i++)
    {
        if (s>0)
            formatex(sample, 31, "(%d)%s", s, name)
        
        if 
(!is_name_inuse(id, sample))
            break
        
        s
++
    }
    copy(name, len, sample)
}

is_name_inuse(id, const sample[])
{
    new name[32]
    for (new i=1; i<=get_maxplayers(); i++)
    {
        if (!is_user_connected(i)) continue
        if 
(id==i) continue
        
        get_user_name
(i, name, 31)
        if (strcmp(name, sample)==0)
            return 1
    
}
    
    return 0
}
Аватара пользователя
sb123
 
Сообщения: 4
Зарегистрирован: 18 ноя 2021, 19:55
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Языки программирования: Я ничего не знаю

Пред.

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

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

Сейчас этот форум просматривают: Google [Bot] и гости: 1