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

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

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

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

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

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

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

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

Сообщение s1lent » 26 июл 2014, 15:07

запрет поднятия weaponbox, до следующего deploy оружия, потом оффсет уже обнуляется.

true - разрешить поднятие.
false - запретить поднятие.

Код: Выделить всё
 
const m_bUsesShield 2042// когда игрок укрывается щитом, эмулируем.
const m_iExtraOffsetPlayer 5;
 
stock pickUpItemStatus
(id,bool:b) {
        set_pdata_bool(id,m_bUsesShield,!b); //offset +20 m_iExtraOffsetPlayer * 4
}


вполне удобно для мелких операций, когда нужно запретить поднятие weaponbox на некоторое время.
по поводу побочных эффектов, не замечал.
Аватара пользователя
s1lent
Скриптер
 
Сообщения: 123
Зарегистрирован: 11 июл 2011, 20:02
Откуда: Северск
Благодарил (а): 32 раз.
Поблагодарили: 110 раз.

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

Сообщение CC | Game » 14 авг 2014, 09:51

функция копирывания файлов! :-)

Код: Выделить всё
//SOURCE[] - цель (../file.txt)
//SOURCE[] - куда (../cstrike/file.txt)
//error[] - строка для ошибки
//ERRORLEN[] - длина строки
//REPLACE_TARGET - заменять содержимое(если файл SOURSE существует)
 
 
stock bool
:file_copy(SOURCE[], TARGET[], error[], const ERRORLEN, const bool:REPLACE_TARGET false) {
        if (!file_exists(SOURCE)) {
                format(errorERRORLEN"File copy error: Source ^"%s^" doesn't exist!"SOURCE)
                return false
        
}
        if (!REPLACE_TARGET && file_exists(TARGET)) {
                format(errorERRORLEN"File copy error: Target ^"%s^" exists!"TARGET)
                return false
        
}
         
        
new source fopen(SOURCE"rb")
        if (!source) {
                format(errorERRORLEN"File copy error: Opening source ^"%s^" failed!"SOURCE)
                return false
        
}
       
        
new target fopen(TARGET"wb")
        if (!target) {
                format(errorERRORLEN"File copy error: Opening target ^"%s^" failed!"TARGET)
                fclose(source)
                return false
        
}
       
        
for (new buffereof feof(source); !eof; !eof && fputc(targetbuffer)) {
                buffer fgetc(source)
                eof feof(source)
        }
        fclose(source)
        fclose(target)
       
        
return true
Аватара пользователя
CC | Game
 
Сообщения: 21
Зарегистрирован: 11 авг 2014, 14:09
Благодарил (а): 12 раз.
Поблагодарили: 1 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

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

Сообщение PRoSToTeM@ » 14 авг 2014, 10:44

CC | Game, по байту считывать? :crazy:
Лучше считывать где-то килобайту.
Аватара пользователя
PRoSToTeM@
Скриптер
 
Сообщения: 2498
Зарегистрирован: 26 мар 2010, 00:12
Благодарил (а): 438 раз.
Поблагодарили: 1125 раз.

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

Сообщение Chuvi » 14 авг 2014, 11:05

CC | Game, эм...
Вы должны зарегистрироваться, чтобы видеть ссылки.

Ну, и в слегка поправленном варианте
Код: Выделить всё
public  CopyFile(ReadFile[],WriteToFile[])
{
        if(!file_exists (ReadFile))
        {
                return 0
        
}
       
        
new Buffer[1024]
        new FilePosition
        
new R_File=fopen(ReadFile,"rb")
                if(!R_File)
                        return 0
        
new W_File=fopen(WriteToFile,"wb")
                if(!W_File)
                {
                        fclose(R_File)
                        return 0
                
}
        new FileSize=file_size(ReadFile)
        do
                
                        FilePosition=ftell(R_File)
                        fseek(W_File,FilePositionSEEK_SET)//Не помню зачем это надо, но помню что без этого что-то иногда криво работало)
                        
                        
if(FileSize-FilePosition<sizeof(Buffer))
                        {
                                fread_blocks (R_File,Buffer,FileSize-FilePosition,BLOCK_BYTE)
                                fwrite_blocks(W_File,Buffer,FileSize-FilePosition,BLOCK_BYTE)
                        }
                        else
                        {
                                fread_blocks (R_File,Buffer,sizeof(Buffer),BLOCK_BYTE)
                                fwrite_blocks(W_File,Buffer,sizeof(Buffer),BLOCK_BYTE)
                        }
                }
        while(!feof(R_File))
        fclose(R_File)
        fclose(W_File)
        return file_size(WriteToFile//Возвращать 1/0 было бы скучно. Размер нового файла более информативен. (если его размер не 0 <^_^>)
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

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

Сообщение CC | Game » 14 авг 2014, 22:20

я б не нашел :-D но все равно спасибо, буду юзать этот вариант
Аватара пользователя
CC | Game
 
Сообщения: 21
Зарегистрирован: 11 авг 2014, 14:09
Благодарил (а): 12 раз.
Поблагодарили: 1 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

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

Сообщение Asmodai » 14 авг 2014, 22:25

Chuvi, а почему не fread? Он же вроде возвращает, сколько прочитал.
Аватара пользователя
Asmodai
Адмирал
 
Сообщения: 466
Зарегистрирован: 24 фев 2011, 20:48
Благодарил (а): 0 раз.
Поблагодарили: 393 раз.
Языки программирования: Counter-Strike 1.6

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

Сообщение Subb98 » 23 апр 2016, 18:13

Шаблон меню из игроков в старой системе:

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

#pragma semicolon 1

new const MENU_ID[] = "_players_menu";

const MAX_PLAYERS = 32;
const PLAYERS_PER_PAGE = 8;

new g_Position[MAX_PLAYERS + 1], g_Players[MAX_PLAYERS + 1][32], g_UserId[MAX_PLAYERS + 1][MAX_PLAYERS 1];

public plugin_init() {
    register_clcmd("players_menu", "CmdPlayersMenu");
    register_menucmd(register_menuid(MENU_ID), 1023, "HandleMenu");
}

public CmdPlayersMenu(const id) {
    if(get_user_flags(id) & ADMIN_BAN) {
        return ShowMenu(id, g_Position[id] = 0);
    }
    console_print(id, "У Вас нет доступа к этой команде");
    return PLUGIN_HANDLED;
}

ShowMenu(const id, Pos) {
    if(Pos < 0) {
        return PLUGIN_CONTINUE;
    }
    new PlayersNum, Start, End, PagesNum, Len, Menu[512], i, Name[32], b, Keys = MENU_KEY_0;
    get_players(g_Players[id], PlayersNum, "ch");
    if((Start = Pos * PLAYERS_PER_PAGE) >= PlayersNum) {
        Start = Pos = g_Position[id] = 0;
    }
    if((End = Start + PLAYERS_PER_PAGE) > PlayersNum) {
        End = PlayersNum;
    }
    if((PagesNum = PlayersNum / PLAYERS_PER_PAGE + (PlayersNum % PLAYERS_PER_PAGE ? 1 : 0)) == 1) {
        Len = copy(Menu, charsmax(Menu), "\yВыберите игрока^n^n");
    } else {
        Len = formatex(Menu, charsmax(Menu), "\yВыберите игрока \d(%d/%d)^n^n", Pos + 1, PagesNum);
    }
    while(Start < End) {
        i = g_Players[id][Start++];
        g_UserId[id][i] = get_user_userid(i);
        get_user_name(i, Name, charsmax(Name));
        if(!= id && get_user_flags(i) & ADMIN_IMMUNITY) {
            Len += formatex(Menu[Len], charsmax(Menu) - Len, "\d%d. %s^n", ++b, Name);
        } else {
            Keys |= (1<<b);
            Len += formatex(Menu[Len], charsmax(Menu) - Len, "\y%d. \w%s%s^n", ++b, Name, i == id ? " \r*" : "");
        }
    }
    if(End < PlayersNum) {
        Keys |= MENU_KEY_9;
        formatex(Menu[Len], charsmax(Menu) - Len, "^n\y9. \wДалее^n\y0. \w%s", Pos ? "Назад" : "Выход");
    } else {
        formatex(Menu[Len], charsmax(Menu) - Len, "^n\y0. \w%s", Pos ? "Назад" : "Выход");
    }
    return show_menu(id, Keys, Menu, -1, MENU_ID);
}

public HandleMenu(const id, const Key) {
    switch(Key) {
        case 8: {
            ShowMenu(id, ++g_Position[id]);
        }
        case 9: {
            ShowMenu(id, --g_Position[id]);
        }
        default: {
            new Target = g_Players[id][g_Position[id] * PLAYERS_PER_PAGE + Key];
            if(get_user_userid(Target) == g_UserId[id][Target]) {
                new Name[32];
                get_user_name(Target, Name, charsmax(Name));
                client_print(id, print_chat, "Вы выбрали игрока: %s", Name);
            } else {
                client_print(id, print_chat, "Выбранный Вами игрок отключился от сервера");
            }
        }
    }

Предусмотрена проверка на иммунитет (при формировании меню), а также (в обработчике), проверка на соответствие выбранного игрока тому, для которого выполняется действие (по userid).
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

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

Сообщение RevCrew » 04 май 2016, 23:24

Удаляет первый комментарий из строки вне кавычек

пример
Код: Выделить всё
"Example Composition (Hud+Chat)"; Имя композиции

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

"Example Composition (Hud+Chat)"


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

stock delete_comment
string[])
{
    static const 
BASE_COMMENT [] = { '#'';''/''\\' };
    static const 
QUOTES '\"';
    new 
boolin_quotes false;
    
    new 
len strlen(string);
    for (new 
ileni++)
    {
        if( 
string[i] == QUOTES)
            
in_quotes = !in_quotes;
        
        if(
in_quotes)
            continue;
        
        for (new 
jsizeof(BASE_COMMENT); j++)
        {
            if(
string[i] == BASE_COMMENT[j])
            {
                
string[i] = '\0';
                break;
            }
        }
    }
    
}
 
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

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

Сообщение Fedcomp » 05 май 2016, 05:39

Код: Выделить всё
//Integer
stock InArray( const iValue , const iArray[] , const iArraySize )
{
    for ( new i = 0 ; i <  iArraySize ; i++ )
        if ( iValue == iArray[i] )
            return 1;

    return 0;
}

//String
stock InStringArray( const szValue[] , const szArray[][] , const iArraySize )
{
    for ( new i = 0 ; i < iArraySize ; i++ )
        if ( equali( szValue , szArray[i] ) )
            return 1;
    
    return 0
;
}


Источник: Вы должны зарегистрироваться, чтобы видеть ссылки. ... post834805
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 813 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

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

Сообщение Fedcomp » 06 май 2016, 21:52

Код: Выделить всё
stock is_admins_online(){
  for(new i = 0; i < 33; i++)
    if(is_user_admin(i))
      return true
  return false
}

Если оно выглядит глупо, но работает, то это не глупо.
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 813 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Пред.След.

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

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

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