Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 8 из 8
  1. #1
    Аватар для Пельмень
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.12.2013
    Сообщений
    188
    Репутация:
    116 ±

    multiple groups for y_command

    Введение
    Этот Include доработка того, что хотел реализовать Y_Less в своих командах, а именно при объявлении самой команды указывать какая группа (созданная с помощью y_groups) сможет использовать эту команду.
    В одной псевдо-библиотеке под названием QWERTYUIOP начата реализация этой возможности, однако по дефолту такая команда не может быть глобальной, и эту команду сможет использовать только одна группа.
    Я просто доработал этот момент довольно банальным способом.

    Использование
    PHP код:
    #include <не знаю как вы его назовете>

    //Создание глобальной команды, доступной для всех игроков
    _@Y<>:command(playeridparams[], help)
    {
        
    #pragma unused params, help
        
    SendClientMessage (playerid0xFFFFFF"Приветик");
        return 
    1;
    }

    //Создание команды, доступной ОДНОЙ определенной группе
    _@Y<admins>:command(playeridparams[], help//Где admins это название группы (НЕ ПЕРЕМЕННОЙ СОДЕРЖАЩЕЙ ГРУППУ, А ИМЕННО НАЗВАНИЕ)
    {
        
    #pragma unused params, help
        
    SendClientMessage (playerid0xFFFFFF"Приветик");
        return 
    1;
    }

    //Создание команды, доступной НЕСКОЛЬКИМ группам
    _@Y<admins|helpers>:command(playeridparams[], help// Где | это делиметр между группами
    {
        
    #pragma unused params, help
        
    SendClientMessage (playerid0xFFFFFF"Приветик");
        return 
    1;

    Настройка
    Возможно изменить делиметр, которым вы будете отделять названия групп в команде
    Изначально имеет | для разделения названий групп
    PHP код:
    #define GROUP_DELIMETR         "|" 
    И также возможно изменить максимальное количество групп, которые вы указываете в команде
    Изначально имеет 5 допустимых групп для каждой команды
    PHP код:
    #define MAX_CMD_GROUPS      5 
    Также, чтобы не было различных вопросов, объясню кое что
    В y_groups максимальное количество созданных групп это 127
    Максимальное название для группы это 24 символа, поэтому не стоит задавать вопрос, откуда в коде взялось число 24 для названия группы

    Требования
    sscanf2
    y_groups & y_commands

    Исходный код
     ТУТ
    PHP код:
    #define GROUP_DELIMETR         "|"
    #define MAX_CMD_GROUPS      5

    #if !defined sscanf
        #error U need sscanf for that $hitttt
    #endif

    #if !defined _INC_y_groups
        #error U need use y_groups for that $hitttt
    #endif

    #if !defined _INC_y_commands
        #error U need use y_commands for that $hitttt
    #endif

    // YCMD.  Either:
    //  
    //  _@Y<group>:cmd(playerid, params[], help)
    //  
    // Or:
    //  
    //  _@Y:cmd(playerid, params[], help)
    //  
    #define _@Y%9:%0(%1) forward QWERTY@Y0:@yQ_%0();QWERTY@Y1:@yQ_%0(){return QWERTY@Y(#%0,#%9);}RC:%0(%1)

    /*----------------------------------------------------------------------------*-
     |                                                                            | 
     | And now come the support functions and macros to make the above code work. | 
     |                                                                            | 
    -*----------------------------------------------------------------------------*/
    // Strip any "<>" from around the group name.
    #define QWERTY@Y0:%0();QWERTY@Y1:%1(){%3(#%2,#<%9>);} QWERTY@Y0:%0();QWERTY@Y0:%1(){%3(#%2,#%9);}

    // Remove the group set function if there is no group set (leave the forward).
    #define QWERTY@Y1:%1(){%3(#%2,#%9);}

    stock QWERTY@Y0:QWERTY@Y(cmd[], group[])
    {
        
    //printf("QWERTY@Y called: %s %s", cmd, group);
        
    new id Command_GetID(cmd);
            
        if (!
    isnull(group))
        {
            new 
    _@dP strfind (groupGROUP_DELIMETRtrue);
            new 
    Group:_@gI INVALID_GROUP;
            if (
    _@dP == -1)
            {
                if (!(
    Group_IsValid (_@gI Group_GetID(group))))
                {
                    
    printf ("!!Error: invalid group(%s) from command %s[%i]..."groupcmdid);
                    return 
    QWERTY@Y0:1;
                }
                
    Group_SetCommand (_@gIidtrue);
                return 
    QWERTY@Y0:1;
            }
                if (
    group[_@dP 1] == EOS)
            {
                
    printf ("!Warning: incorrect group name(%s) from command %s[%i]. renamed."groupcmdid);
                
    group[_@dP] = EOS;
                if (!(
    Group_IsValid (_@gI Group_GetID(group))))
                {
                    
    printf ("!!Error: invalid group(%s) from command %s[%i]."groupcmdid);
                    return 
    QWERTY@Y0:1;
                }
                
    Group_SetCommand (_@gIidtrue);
                return 
    QWERTY@Y0:1;
            }
            static     
    _@DGN[MAX_CMD_GROUPS][24];
            
    sscanf (group"p<"GROUP_DELIMETR">a<s[24]>["#MAX_CMD_GROUPS"]", _@DGN);
            
    for (new _@it 0_@it MAX_CMD_GROUPS_@it++)
            {
                if (!
    _@DGN[_@it][0])
                    break;

                if (!(
    Group_IsValid (_@gI Group_GetID(_@DGN[_@it]))))
                {
                    
    printf ("!!Error: invalid group(%s) from command %s[%i]..."_@DGN[_@it], cmdid);
                    return 
    QWERTY@Y0:1;
                }
                
    Group_SetCommand (_@gIidtrue);
            }
        }
        else
        {
            
    Group_SetGlobalCommand(idtrue);
        }
        return 
    QWERTY@Y0:1;
    }

    stock QWERTY_TouchGroupCommands()
    {
        new
            
    idx,
            
    buffer;
        while ((
    idx AMX_GetPublicPointerPrefix(idxbuffer_A<@yQ_>)))
        {
            
    #emit PUSH.C     0
            #emit LCTRL      6
            #emit ADD.C      28
            #emit PUSH.pri
            #emit LOAD.S.pri buffer
            #emit SCTRL      6
        
    }
    }

    /*----------------------------------------------------------------------------*\
    Code VERY internal to y_groups!
    \*----------------------------------------------------------------------------*/

    static stock
        bool
    :QWERTY_gInit false;

    public 
    OnFilterScriptInit()
    {
        if (!
    QWERTY_gInit)
        {
            
    CallLocalFunction("QWERTY_OnFilterScriptInit""");
            
    QWERTY_TouchGroupCommands();
            
    QWERTY_gInit true;
        }
        return 
    QWERTY_gInit;
    }
    #if defined _ALS_OnFilterScriptInit
        #undef OnFilterScriptInit
    #else
        #define _ALS_OnFilterScriptInit
    #endif
    #define OnFilterScriptInit QWERTY_OnFilterScriptInit
    forward QWERTY_OnFilterScriptInit();

    public 
    OnGameModeInit()
    {
        if (!
    QWERTY_gInit)
        {
            
    CallLocalFunction("QWERTY_OnGameModeInit""");
            
    QWERTY_TouchGroupCommands();
            
    QWERTY_gInit true;
        }
        return 
    QWERTY_gInit;
    }
    #if defined _ALS_OnGameModeInit
        #undef OnGameModeInit
    #else
        #define _ALS_OnGameModeInit
    #endif
    #define OnGameModeInit QWERTY_OnGameModeInit
    forward QWERTY_OnGameModeInit();

    // Hook group initialisation so we know when a new group that might own a
    // command is created.  Of course, make sure this comes last always, so that we
    // know the command groups have been initialised.  TODO: This. 


    Авторы
    Изначально самой библиотеки QWERTYUIOP - Y_Less
    Доработал - Пельмень

  2. 2 пользователя(ей) сказали cпасибо:
    Osetin (06.01.2017) Seviel (05.01.2017)
  3. #2
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Работа хорошая.

    Однако в этом уже нет смысла, ведь есть библиотека SmartCMD, которая более функциональнее, а также имеет почти такой же синтаксис. Кроме того, нет зависимости от других библиотек, что делает библиотеку более лучше.

  4. #3
    Аватар для Пельмень
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.12.2013
    Сообщений
    188
    Репутация:
    116 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Работа хорошая.

    Однако в этом уже нет смысла, ведь есть библиотека SmartCMD, которая более функциональнее, а также имеет почти такой же синтаксис. Кроме того, нет зависимости от других библиотек, что делает библиотеку более лучше.
    Конечно, но если использовать YSI в общем, а не парочку инклюдов из него, тогда в этом будет смысл) Хотя в России никто не использует даже y_commands, что уже говорить про остальное...

  5. #4
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Пельмень Посмотреть сообщение
    Конечно, но если использовать YSI в общем, а не парочку инклюдов из него, тогда в этом будет смысл) Хотя в России никто не использует даже y_commands, что уже говорить про остальное...
    Да. Однако это имеет место быть и тут. Кстати, лучше бы опубликовал это на официальном форуме.

  6. #5
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    походу с JIT плагином будут проблемы у такого кмд движка, не так ли?
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  7. #6
    Аватар для Пельмень
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.12.2013
    Сообщений
    188
    Репутация:
    116 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    походу с JIT плагином будут проблемы у такого кмд движка, не так ли?
    Это не командный движок, это если можно так назвать "дополнение" для работы с y_cmd и y_groups, про JIT ничего не скажу, просто попробуй запустить мод с YSI вместе с JIT

  8. #7
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Я YSI не юзаю только потому что там рекурсия, тем более что вполне хватает оптимизации или удобного функционала который сейчас пишут на плагинах.
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  9. #8
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    походу с JIT плагином будут проблемы у такого кмд движка, не так ли?
    Да, вы действительно правы. Проблема происходит из-за динамического вызова (хака), который несовместим с плагином. Однако не так давно Y_less рапортовал об этом в баг-трекере плагина. Более того, он исправил данную проблему.

    В библиотеке YSI данная проблема уже исправлена.
    Последний раз редактировалось VVWVV; 06.01.2017 в 01:19.

 

 

Информация о теме

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

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •