[MANUAL] Создание модулей

Тема в разделе "Другое", создана пользователем R1KO, 21 май 2015.

  1. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    Для написания модуля нам понадобится всё что нужно для написания любого другого плагина + библиотека випа (vip_core.inc). Взять её можно в архиве с ядром.

    Как пример будем писать модуль телепорта к игроку или куда смотрит прицел.

    Подключаем необходимые библиотеки:
    PHP:
    #pragma semicolon 1

    #include <sourcemod>
    #include <sdktools>
    #include <vip_core>

    Первым делом нужно зарегистрировать функцию:
    PHP:
    native VIP_RegisterFeature(const String:sFeatureName[],
                                    
    VIP_ValueType:            ValType                    VIP_NULL,
                                    
    VIP_FeatureType:        FeatureType                TOGGLABLE,
                                    
    ItemSelectCallback:    Item_select_callback    ItemSelectCallback:    INVALID_FUNCTION,
                                    
    ItemDisplayCallback:    Item_display_callback    ItemDisplayCallback:    INVALID_FUNCTION,
                                    
    ItemDrawCallback:        Item_draw_callback        ItemDrawCallback:        INVALID_FUNCTION);
    У нас есть 5 типов данных VIP-функций:
    PHP:
    enum VIP_ValueType
    {
        
    VIP_NULL    0,    // Нет данных
        
    INT,        // Целое число
        
    FLOAT,        // Число с запятой
        
    BOOL,        // 1/0
        
    STRING        // Строка
    }
    Поскольку в данном модуле мне нужно только разрешить/запретить использование логичнее всего было бы использовать BOOL, но я хочу позволить ограничивать количество телепортов за раунд, поэтому буду использовать INT, чтобы указывать количество раз.

    Типы VIP-функций
    PHP:
    enum VIP_FeatureType
    {
        
    TOGGLABLE 0,    // Вкл/Выкл в меню
        
    SELECTABLE,        // Только нажатие
        
    HIDE                // Скрытый
    }
    Поскольку телепорт не имеет смысла включать выключать, а нужно при нажатии в меню на него сразу выводить список игроков буду использовать тип SELECTABLE.
    И сразу создаем массив переменных для подсчета количества телепортаций.

    Изначально я предполагаю что если "Teleport" указано:
    0 - нет доступа
    > 0 - кол-во использований за раунд.
    -1 - безлимит

    И так регистрируем функцию:

    PHP:
    new g_iClientTeleports[MAXPLAYERS+1]; // Массив переменных для подсчета количества телепортаций

    #define VIP_TELEPORT        "Teleport" // Создаем константу, которая будет уникальным именем нашей функции.

    public VIP_OnVIPLoaded() // Событие когда ядро VIP-плагина загрузилось и готово к работе.
    {
        
    VIP_RegisterFeature(VIP_TELEPORTINTSELECTABLEOnSelectItemOnDisplayItemOnDrawItem);
        
    /*
        OnSelectItem - Функция будет вызыватся при нажатии на пункт
        OnDisplayItem - Функция будет вызыватся при отображении текста пункта
        OnDrawItem - Функция будет вызыватся при отображении стиля пункта
        */
    }
    Нужно чтобы при нажатии на пункт открывался список игроков:
    Помним что имя ф-и при нажатии OnSelectItem.
    Исходя из прототипа:

    PHP:
    funcenum ItemSelectCallback
    {
        
    Action:public(iClient, const String:sFeatureName[], VIP_ToggleState:OldStatus, &VIP_ToggleState:NewStatus), // Используется когда тип ф-и TOGGLABLE
        
    bool:public(iClient, const String:sFeatureName[]) // Используется когда тип ф-и SELECTABLE
    };
    Получаем:
    PHP:
    public bool:OnSelectItem(iClient, const String:sFeatureName[])
    {
        
    ShowTeleportMenu(iClient);
        
    // Если вернуть true игроку снова откроется VIP-меню, нам это не нужно.
        
    return false;
    }

    ShowTeleportMenu(iClient)
    {
        
    // Создаем меню с игроками
        
    new Handle:hMenu CreateMenu(MenuHandler_TeleportMenu);
        
    SetMenuTitle(hMenu"Телепорт");
        
    SetMenuExitBackButton(hMenutrue);

        
    AddMenuItem(hMenu"""На позицию прицела"); // Тут думаю всё ясно
        
    AddMenuItem(hMenu"""К игроку под прицелом");
      
        
    decl String:sUserId[12], String:sName[MAX_NAME_LENGTH], i;
        for (
    1<= MaxClients; ++i)
        {
            if (
    != iClient && IsClientInGame(i) && IsPlayerAlive(i) && GetClientName(isNamesizeof(sName)))
            {
                
    IntToString(GetClientUserId(i), sUserIdsizeof(sUserId));
                
    AddMenuItem(hMenusUserIdsName);
            }
        }
        
    DisplayMenu(hMenuiClientMENU_TIME_FOREVER);
    }

    public 
    MenuHandler_TeleportMenu(Handle:hMenuMenuAction:actioniClientItem)
    {
        switch(
    action)
        {
            case 
    MenuAction_EndCloseHandle(hMenu);
            case 
    MenuAction_Cancel:
            {
                if(
    Item == MenuCancel_ExitBack)
                {
                    
    // Если игрок нажал "Назад" открываем ему обратно VIP-меню
                    
    VIP_SendClientVIPMenu(iClient);
                }
            }
            case 
    MenuAction_Select:
            {
                switch(
    Item)
                {
                    case 
    0// Игрок выбрал 1-й пункт
                    
    {
                        
    decl Float:fPos[3];
                        
    GetAimPos(iClientfPos);
                        
    TeleportEntity(iClientfPosNULL_VECTORNULL_VECTOR);
                        
    g_iClientTeleports[iClient]++;
                    }
                    case 
    1// Игрок выбрал 2-й пункт
                    
    {
                        new 
    iTarget GetClientAimTarget(iClienttrue);
                        if (
    iTarget 0)
                        {
                            
    decl Float:fPos[3];
                            
    GetClientAbsOrigin(iTargetfPos);
                            
    TeleportEntity(iClientfPosNULL_VECTORNULL_VECTOR);
                            
    g_iClientTeleports[iClient]++;
                        }
                        else
                        {
                            
    VIP_PrintToChatClient(iClient"Наведите прицел на игрока!");
                            
    ShowTeleportMenu(iClient);
                        }
                    }
                    default: 
    // Игрок выбрал другого игрока
                    
    {
                        
    decl String:sUserID[16], iTarget;
                        
    GetMenuItem(hMenuItemsUserIDsizeof(sUserID));
                        
    iTarget GetClientOfUserId(StringToInt(sUserID));
                        if(
    iTarget != && IsPlayerAlive(iTarget))
                        {
                            
    decl Float:fPos[3];
                            
    GetClientAbsOrigin(iTargetfPos);
                            
    TeleportEntity(iClientfPosNULL_VECTORNULL_VECTOR);
                            
    g_iClientTeleports[iClient]++;
                        }
                        else
                        {
                            
    VIP_PrintToChatClient(iClient"Игрок больше недоступен!");
                        }
                    }
                }
                
    VIP_SendClientVIPMenu(iClient);
            }
        }
    }

    GetAimPos(iClientFloat:fPos[3])
    {
        
    decl Float:fAngles[3], Float:fDirection[3];

        
    GetClientEyeAngles(iClientfAngles);
        
    GetClientEyePosition(iClientfPos);

        
    TR_TraceRayFilter(fPosfAnglesMASK_SOLIDRayType_InfiniteFilterGetAimiClient);
        
    TR_GetEndPosition(fPos);

        
    GetVectorAngles(fPosfAngles);

        
    fAngles[0] = fAngles[2] = 0.0;
        
    fAngles[1] += 180.0;
        
    GetAngleVectors(fAnglesfDirectionNULL_VECTORNULL_VECTOR);
        
    fPos[0] = fPos[0] + fDirection[0] * 30.0;
        
    fPos[1] = fPos[1] + fDirection[1] * 30.0;
        
    fPos[2] += 15.0;
    }

    public 
    bool:FilterGetAim(iTraceEntiMaskany:iEntity)
    {
        return 
    iTraceEnt != iEntity;
    }
    Дальше я хочу чтобы отображении пункта показывалось сколько телепортаций осталось.
    Смотрим прототип функции:
    PHP:
    functag public bool:ItemDisplayCallback(iClient, const String:sFeatureName[], String:sDisplay[], maxlen);
    Помним что ф-я отображения текста пункта называлась OnDisplayItem

    PHP:
    public bool:OnDisplayItem(iClient, const String:sFeatureName[], String:sDisplay[], maxlen)
    {
        if(
    VIP_IsClientFeatureUse(iClientVIP_TELEPORT)) // Проверяем что функция включена у игрока
        
    {
            new 
    iTeleports VIP_GetClientFeatureInt(iClientVIP_TELEPORT);
            
    // VIP_GetClientFeatureInt(iClient, VIP_TELEPORT) - Получит количество доступных телепортов (То что в конфиге указано в "Teleport")
            
    if(iTeleports 0// Если кол-во телепортов ограничено
            
    {
                
    // Выводим кол-во оставшихся телепортов.
                
    Format(sDisplaymaxlen"%s [Осталось: %i]"sDisplayVIP_GetClientFeatureInt(iClientVIP_TELEPORT)-g_iClientTeleports[iClient]);
                
    // Если вернуть true то будет выводиться то что в sDisplay.
                
    return true;
            }
        }
        
    // А во всех остальных случаях нужно выводить без изменений

        
    return false;
    }
    Теперь я хочу чтобы когда у игрока не осталось доступных телепортов то пункт становился не активным (белым, его нельзя будет нажать)
    Согласно прототипу:
    PHP:
    functag public ItemDrawCallback(iClient, const String:sFeatureName[], style);
    Получаем:
    PHP:
    public OnDrawItem(iClient, const String:sFeatureName[], iStyle)
    {
        if(
    VIP_IsClientFeatureUse(iClientVIP_TELEPORT)) // Проверяем что функция включена у игрока
        
    {
            if(
    VIP_GetClientFeatureInt(iClientVIP_TELEPORT) >= g_iClientTeleports[iClient]) // Если кол-во телепортов ограничено и достигнут лимит
            
    {
                return 
    ITEMDRAW_DISABLED;
            }
        }

        return 
    iStyle;
    }
    Далее мелочи.
    Очищаем переменную при входе игрока:
    PHP:
    public OnClientConnected(iClient)
    {
        
    g_iClientTeleports[iClient] = 0;
    }
    Обнуляем кол-во телепортаций в начале раунда:
    PHP:
    public OnPluginStart()
    {
        
    HookEvent("round_start"Event_RoundStartEventHookMode_PostNoCopy);
    }

    public 
    Event_RoundStart(Handle:hEvent, const String:sEvName[], bool:bDontBroadcast)
    {
        for (new 
    1<= MaxClients; ++i)
        {
            
    g_iClientTeleports[i] = 0;
        }
    }
    Работоспособность я не проверял. Кто хочет - соберите, проверьте, отпишитесь.

    В дальнейшем прошу все вопросы связанные с созданием модулей задавать здесь.

    Ссылки на другие мануалы:
    Как привязать любой плагин к VIP плагину.
     

    Вложения:

    • vip_tp.sp
      Размер файла:
      5 КБ
      Просмотров:
      88
    Последнее редактирование: 25 ноя 2016
    CAH4E3, Филипп Фрай, trueattack и 6 другим нравится это.
  2. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    Re: Создание модулей

    Хотелось бы рассказать как привязать любой плагин к VIP плагину.
    Зачем это нужно? Ну например добавить VIP-игроку иммунитет от чего-то.

    И так, начнем. Подключаем библиотеку:

    PHP:
    #include <vip_core>
    Далее решаем хотим мы это сделать для всех VIP-игроков или же тем, кому выдан доступ.

    Если для всех то достаточно проверки:
    PHP:
    if(VIP_IsClientVIP(iClient))
    {
        
    // Это VIP-игрок
    }
    Если же только по доступу то:
    PHP:
    static const String:g_sFeature[] = "MyFunc"// Уникальное имя ф-и

    public VIP_OnVIPLoaded()
    {
        
    VIP_RegisterFeature(g_sFeatureBOOLHIDE);
        
    // Если пишем BOOL то в параметрах 1/0
        // HIDE значит что ф-я скрыта, она не будет показана у игрока в меню, её нельзя отключить и не нужно добавлять в перевод.
        // Если HIDE не писать то ф-ю можно будет вкл/выкл и нужно добавить фразу в перевод.
    }
    А дальше просто в нужном месте проверяем:
    PHP:
    if(VIP_IsClientVIP(iClient) && VIP_IsClientFeatureUse(iClientg_sFeature))
    {
        
    // Это VIP-игрок и он имеет доступ к ф-и.
    }
     
    Последнее редактирование: 17 авг 2016
    zaigrovas нравится это.
  3. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    Re: [DEV] Создание модулей

    Доработал API.
    Увидите ошибки/опечатки/недоработки/не понятное описание - сообщите об этом.
    Так же готов выслушать критику/предложения/пожелания.

    PHP:
    #if defined _vip_core_included
     #endinput
    #endif
    #define _vip_core_included

    /* Типы данных VIP-функций*/
    enum VIP_ValueType
    {
        
    VIP_NULL    0,    // Нет данных
        
    INT,
        
    FLOAT,
        
    BOOL,
        
    STRING
    }

    /* Статусы VIP-функций*/
    enum VIP_ToggleState
    {
        
    DISABLED 0,        // Выключено
        
    ENABLED,            // Включено
        
    NO_ACCESS            // Нет доступа
    }

    /* Типы VIP-функций*/
    enum VIP_FeatureType
    {
        
    TOGGLABLE 0,    // Вкл/Выкл в меню
        
    SELECTABLE,        // Только нажатие
        
    HIDE                // Скрытый
    }

    /*Типы авторизации*/
    enum VIP_AuthType
    {
        
    AUTH_STEAM 0,
        
    AUTH_IP,
        
    AUTH_NAME,
        
    AUTH_GROUP,
        
    AUTH_FLAGS
    }

    funcenum ItemSelectCallback
    {
        
    /**
         *    Вызывается когда VIP-игрок нажимает на пункт в меню (для типа TOGGLABLE).
         *    -
         * @param iClient            Индекс игрока.
         * @param sFeatureName        Уникальное имя ф-и.
         * @param OldStatus            Старое значение статуса.
         * @param NewStatus            Новое значение статуса.
         *    -
         * @return    Возврат Plugin_Stop или Plugin_Handled остановит переключение статуса. Возврат Plugin_Continue разрешит переключение статуса без изменений. Возврат Plugin_Changed разрешит переключение статуса на NewStatus.
        */
        
    Action:public(iClient, const String:sFeatureName[], VIP_ToggleState:OldStatus, &VIP_ToggleState:NewStatus),
        
        
    /**
         *    Вызывается когда VIP-игрок нажимает на пункт в меню (для типа SELECTABLE).
         *    -
         * @param iClient            Индекс игрока.
         * @param sFeatureName        Уникальное имя ф-и.
         *    -
         * @return    Возврат true снова откроет игроку VIP-меню.
        */
        
    bool:public(iClient, const String:sFeatureName[])
    };

    /**
     *    Вызывается когда VIP-игроку отображается пункт в меню.
     *    -
     * @param iClient            Индекс игрока.
     * @param sFeatureName        Уникальное имя ф-и.
     * @param sDisplay            Буфер.
     * @param iMaxLength        Размер буфера.
     *    -
     * @return    Если вернуть true то будет отображено то что в буфере (sDisplay). Если вернуть false то ничего не будет изменено.
    */
    functag public bool:ItemDisplayCallback(iClient, const String:sFeatureName[], String:sDisplay[], iMaxLength);

    /**
     *    Вызывается когда VIP-игроку отображается стиль пункта в меню.
     *    -
     * @param iClient            Индекс игрока.
     * @param sFeatureName        Уникальное имя ф-и.
     * @param iStyle            Стиль.
     *    -
     * @return    Нужно вернуть необходимый стиль.
    */
    functag public ItemDrawCallback(iClient, const String:sFeatureName[], iStyle);

    /**
     *    Вызывается когда спавнится.
     *    -
     * @param iClient            Индекс игрока.
     * @param iTeam                Команда игрока (2 - Т, 3- КТ).
     * @param bIsVIP            Имеет ли игрок VIP-статус.
     *    -
     * @noreturn
    */
    functag public HookClientSpawnCallback(iClientiTeambool:bIsVIP);

    /**
     *    Вызывается когда VIP-плагин загрузился.
     *    -
     * @noparams
     *    -
     * @noreturn
    */
    forward VIP_OnVIPLoaded();

    /**
     *    Вызывается когда игрок был загружен.
     *    -
     * @param iClient            Индекс игрока.
     *    -
     * @noreturn
    */
    forward VIP_OnVIPClientLoaded(iClient);

    /**
     *    Вызывается когда игрок лишается VIP-статуса.
     *    -
     * @param iClient            Индекс игрока.
     * @param sReason            Причина:
     *                                 "Expired" - Истек
     *                                 "Removed by Admin" - Удален админом
     *                                 "Removed by native" - Удален плагином.
     *                                 "Expired" - Истек
     *    -
    */
    forward VIP_OnVIPClientRemoved(iClient, const String:sReason[]);

    /**
     *    Запускает проверку игрока на наличие VIP прав.
     *    -
     * @param iClient            Индекс игрока.
     * @param bNotify            Известить ли игрока о результате проверки.
     *    -
     * @return    Возвращает true в случае если у игрока имеются VIP права, иначе false.
    */
    native bool:VIP_CheckClient(iClientbool:bNotify false);

    /**
     *    Получает наличие VIP прав у игрока.
     *    -
     * @param iClient            Индекс игрока.
     *    -
     * @return    Возвращает true в случае если у игрока имеются VIP права, иначе false.
    */
    native bool:VIP_IsClientVIP(iClient);

    /**
     *    Получает время окончания VIP-прав у игрока (unix).
     *    -
     * @param iClient            Индекс игрока.
     *    -
     * @return    Дата в unix формате, 0 если права навсегда, -1 если временный.
    */
    native VIP_GetClientAccessTime(iClient);

    /**
     *    Устанавливает время окончания VIP-прав у игрока (unix).
     *    -
     * @param iClient            Индекс игрока.
     * @param iTime                Дата в unix формате, 0 если права навсегда, -1 если временный.
     * @param bInDB                Изменять ли в базе данных.
     *    -
     * @return true в случае успеха, иначе false.
    */
    native bool:VIP_SetClientAccessTime(iClientiTimebool:bInDB);

    /**
     *    Получает VIP-группу игрока.
     *    -
     * @param iClient            Индекс игрока.
     * @param sGroup            Буфер, в который будет помещен результат.
     * @param iMaxLength        Размер буфера.
     *    -
     * @return true в случае успеха, иначе false.
    */
    native bool:VIP_GetClientVIPGroup(iClientString:sGroup[], iMaxLength);

    /**
     *    Устанавливает игроку VIP-группу.
     *    -
     * @param iClient            Индекс игрока.
     * @param sGroup            VIP-группа.
     * @param bInDBB            Изменять ли в базе данных.
     *    -
     * @return true в случае успеха, иначе false.
    */
    native bool:VIP_SetClientVIPGroup(iClient, const String:sGroup[], bool:bInDB);

    /**
     *    Получает тип авторизации VIP-игрока.
     *    -
     * @param iClient            Индекс игрока.
     *    -
     * @return    Значение класса VIP_AuthType.
    */
    native VIP_AuthType:VIP_GetClientAuthType(iClient);

    /**
     *    Получает Handle adt trie настроек VIP-игрока.
     *    -
     * @param iClient            Индекс игрока.
     *    -
     * @return    Handle adt trie.
    */
    native Handle:VIP_GetVIPClientTrie(iClient);

    /**
     *    Проверяет наличие VIP-группы.
     *    -
     * @param sGroup            Имя VIP-группы.
     *    -
     * @return true если группа существует, иначе false.
    */    
    native bool:VIP_IsValidVIPGroup(const String:sGroup[]);

    /**
     *    Выводит игроку сообщение в чат с приставкой (фраза в переводе "VIP_CHAT_PREFIX").
     *    -
     * @param iClient            Индекс игрока.
     * @param sMessage            Правила форматирования сообщение.
     * @param ...                Параметры форматирования.
     *    -
     * @noreturn
    */
    native VIP_PrintToChatClient(iClient, const String:sMessage[], any:...);

    /**
     *    Выводит всем игрокам сообщение в чат с приставкой (фраза в переводе "VIP_CHAT_PREFIX").
     *    -
     * @param sMessage            Правила форматирования сообщение.
     * @param ...                Параметры форматирования.
     *    -
     * @noreturn
    */
    native VIP_PrintToChatAll(const String:sMessage[], any:...);

    /**
     *    Записывает сообщение в лог.
     *    -
     * @param sMessage            Правила форматирования сообщение.
     * @param ...                Параметры форматирования.
     *    -
     * @noreturn
    */
    native VIP_LogMessage(const String:sMessage[], any:...);

    /**
     *    Регистрирует ф-ю возрождения игрока.
     *    -
     * @param OnClientSpawn        Обратный вызов.
     *    -
     * @noreturn
    */
    native VIP_HookClientSpawn(HookClientSpawnCallback:OnClientSpawn);

    /**
     *    Отправляет игроку VIP-меню.
     *    -
     * @param iClient            Индекс игрока.
     *    -
     * @noreturn
    */
    native VIP_SendClientVIPMenu(iClient);

    /**
     *    Выдает игроку VIP-права.
     *    -
     * @param iClient            Индекс игрока.
     * @param iTime                Время в секундах.
     * @param AuthType            Тип идентификации (см. VIP_AuthType).
     * @param sGroup            Имя VIP-группы.
     * @param bAddToDB            Добавлять ли в базу данных.
     *    -
     * @return true в случае успеха, иначе false.
    */
    native bool:VIP_SetClientVIP(iClientiTimeVIP_AuthType:AuthType AUTH_STEAM, const String:sGroup[] = ""bool:bAddToDB);

    /**
     *    Отнимает у игрока VIP-права.
     *    -
     * @param iClient            Индекс игрока.
     * @param bInDB                Удалять ли тз базы данных.
     * @param bNotify            Уведомление игрока (true - уведомить/false - не уведомлять).
     *    -
     * @return true в случае успеха, иначе false.
    */
    native bool:VIP_RemoveClientVIP(iClientbool:bInDBbool:bNotify);
        
    /**
     *    Добавляет новую VIP-функцию.
     *    -
     * @param sFeatureName            Уникальное имя ф-и.
     * @param ValType                Тип данных ф-и.
     * @param FeatureType            Тип ф-и.
     * @param Item_select_callback    Обратный вызов при смене статуса ф-и.
     * @param Item_display_callback    Обратный вызов при отображении пункта ф-и .
     * @param Item_draw_callback    Обратный вызов при отображении стиля пункта ф-и.
     *    -
     * @noreturn
    */
    native VIP_RegisterFeature(const String:sFeatureName[],
                                    
    VIP_ValueType:            ValType                    VIP_NULL,
                                    
    VIP_FeatureType:        FeatureType                TOGGLABLE,
                                    
    ItemSelectCallback:    Item_select_callback    ItemSelectCallback:    INVALID_FUNCTION,
                                    
    ItemDisplayCallback:    Item_display_callback    ItemDisplayCallback:    INVALID_FUNCTION,
                                    
    ItemDrawCallback:        Item_draw_callback        ItemDrawCallback:        INVALID_FUNCTION);

    /**
     *    Проверяет существование функции.
     *    -
     * @param sFeatureName            Уникальное имя ф-и.
     *    -
     * @return    Возвращает true в случае если функция существует, иначе false.
    */
    native bool:VIP_IsValidFeature(const String:sFeatureName[]);

    /**
     *    Удаляет VIP-функцию.
     *    -
     * @param sFeatureName            Уникальное имя ф-и.
     *    -
     * @noreturn
    */
    native VIP_UnregisterFeature(const String:sFeatureName[]);

    /**
     *    Возвращает статус VIP-функции у игрока.
     *    -
     * @param iClient            Индекс игрока.
     * @param sFeatureName        Уникальное имя ф-и.
     *    -
     * @return    Возвращает DISABLED если выключена, ENABLED если включена и NO_ACCESS если у игрока нет доступа.
    */
    native VIP_ToggleState:VIP_GetClientFeatureStatus(iClient, const String:sFeatureName[]);

    /**
     *    Устанавливает статус VIP-функции игроку.
     *    -
     * @param iClient            Индекс игрока.
     * @param sFeatureName        Уникальное имя ф-и.
     * @param Status            Статус VIP-функции.
     *    -
     * @return true в случае успеха, иначе false.
    */
    native bool:VIP_SetClientFeatureStatus(iClient, const String:sFeatureName[], VIP_ToggleState:Status);

    /**
     *    Возвращает статус VIP-функции у игрока.
     *    -
     * @param iClient            Индекс игрока.
     * @param sFeatureName        Уникальное имя ф-и.
     *    -
     * @return    Возвращает true если выключена, false если включена или если у игрока нет доступа.
    */
    native bool:VIP_IsClientFeatureUse(iClient, const String:sFeatureName[]);

    /**
     *    Получает целочисленное значение параметра VIP-функции у игрока.
     *    -
     * @param iClient            Индекс игрока.
     * @param sFeatureName        Уникальное имя ф-и.
     *    -
     * @return    Возвращает целочисленное значение параметра VIP-функции у игрока.
    */
    native VIP_GetClientFeatureInt(iClient, const String:sFeatureName[]);

    /**
     *    Получает дробное значение параметра VIP-функции у игрока.
     *    -
     * @param iClient            Индекс игрока.
     * @param sFeatureName        Уникальное имя ф-и.
     *    -
     * @return    Возвращает дробное значение параметра VIP-функции у игрока.
    */
    native Float:VIP_GetClientFeatureFloat(iClient, const String:sFeatureName[]);

    /**
     *    Получает логическое значение параметра VIP-функции у игрока.
     *    -
     * @param iClient            Индекс игрока.
     * @param sFeatureName        Уникальное имя ф-и.
     *    -
     * @return    Возвращает true или false.
    */
    native bool:VIP_GetClientFeatureBool(iClient, const String:sFeatureName[]);

    /**
     *    Получает строчное значение параметра VIP-функции у игрока.
     *    -
     * @param iClient            Индекс игрока.
     * @param sFeatureName        Уникальное имя ф-и.
     * @param sBuffer            Буфер, в который будет помещен результат.
     * @param iMaxLength        Размер буфера.
     *    -
     * @noreturn
    */
    native VIP_GetClientFeatureString(iClient, const String:sFeatureName[], String:sBuffer[], iMaxLength);

    /**
     *    Получает время в секундах в зависимости от sm_vip_time_mode.
     *    -
     * @param iTime                Время.
     *    -
     * @return    Возвращает количество секунд в зависимости от sm_vip_time_mode.
    */
    native VIP_TimeToSeconds(iTime);

    /**
     *    Получает время в зависимости от sm_vip_time_mode.
     *    -
     * @param iTime                Количество секунд.
     *    -
     * @return    Возвращает время в зависимости от sm_vip_time_mode.
    */
    native VIP_SecondsToTime(iTime);

    /**
     *    Переводит секунды в человекопонятный вид.
     *    -
     * @param sBuffer        Буфер, в который будет помещен результат.
     * @param iMaxLength    Размер буфера.
     * @param iTimeStamp    Кол-во секунд.
     * @param iClient        Индекс игрока или LANG_SERVER.
     *    -
     * @return true в случае успеха, иначе false.
    */
    native bool:VIP_GetTimeFromStamp(String:sBuffer[], iMaxLengthiTimeStampiClient LANG_SERVER);

    /**
     *    Добавляет к строке статус ф-и.
     *    -
     * @param sInput        Исходная строка.
     * @param sBuffer        Буфер, в который будет помещен результат.
     * @param iMaxLength    Размер буфера.
     * @param sFeatureName    Уникальное имя ф-и.
     * @param iClient        Индекс игрока.
     *    -
     * @return    Возвращает индекс игры (см. VIP_GameType).
    */
    native VIP_AddStringToggleStatus(const String:sInput[], String:sBuffer[], iMaxLength, const String:sFeatureName[], iClient);

    public 
    SharedPlugin:__pl_vip_core
    {
        
    name "vip_core",
        
    file "VIP_Core.smx",
    #if defined REQUIRE_PLUGIN
        
    required 1
    #else
        
    required 0
    #endif
    };
     

    Вложения:

    • vip_core.rar
      Размер файла:
      3,1 КБ
      Просмотров:
      41
    Последнее редактирование: 4 июл 2015
  4. T1MOXA

    T1MOXA

    Сообщения:
    469
    Симпатии:
    32
    Re: [DEV] Создание модулей

    Я нашел несколько ошибок в тексте, а именно:
    Поскольку в данном модуле мне нужно только разрешить/запретить использование логичнее всего было бы использовать BOOL, но я хочу позволить ограничАть количество телепортов за раунд то буду использовать INT, чтобы указывать количество раз.
    и
    И так регистрируем фукнцию исправь на функцию:
     
    Последнее редактирование: 7 июн 2015
    R1KO нравится это.
  5. Федор Шелипов

    Федор Шелипов

    Сообщения:
    3
    Симпатии:
    1
    Re: [DEV] Создание модулей

    Очень полезная инфа, Займусь создание собственных модулей. Автору большое спасибо!
     
  6. Napas

    Napas

    Сообщения:
    471
    Симпатии:
    38
    Re: [DEV] Создание модулей

    Кто может данный плагин собрать ?) А то у меня руки не с того места, чтобы даже собрать его.


    Все увидел исходник, сори)
     
  7. Napas

    Napas

    Сообщения:
    471
    Симпатии:
    38
    Re: [DEV] Создание модулей

    0 из 10, взял просто исходник R1KO :)

    Хм. вот все сделал, а строка "Телепорт" не доступна, в чём может быть проблема ? Что я забыл ?

    "Teleport" "1" // Прописал в конфиге

    "Teleport"
    {
    "ru" "Телепорт" // в переводе все тоже.
    }
     
  8. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    Re: [DEV] Создание модулей

    Видимо ты не понял задания.

    Это была глупая затея, никому это не интересно, всем нужно готовое.
     
  9. Саша Шеин

    Саша Шеин

    Сообщения:
    1.258
    Симпатии:
    191
    Re: [DEV] Создание модулей

    R1KO, я так понял исходник который приложен это и есть выволненое задание. А так я бы собрал :)
     
  10. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    Re: [DEV] Создание модулей

    Вы хоть читали что написано?
    Задание было: дописать к тому что есть возможность сохранять позицию и телепортироваться к ней позже. В личку мне написал только 1 человек и то просто ради интереса сделал.

    Короче забейте, это уже не важно.
     
  11. NiGaByte

    NiGaByte

    Сообщения:
    501
    Симпатии:
    84
    Re: [DEV] Создание модулей

    Не правда, все ждут стабильный релиз модуля, чтобы по 100 раз не переписывать плагины.

    Добавлено через 2 минуты
    Например я попробую написать простой модуль, главное чтобы было куда подсматривать, а то мне всё ещё пока сложно ориентироваться во всех операторах, и прочей ереси.
     
    Последнее редактирование: 4 июл 2015
  12. strikerz

    strikerz

    Сообщения:
    4
    Симпатии:
    0
    А есть модуль МУТА для випов???
     
  13. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    @strikerz, есть. нет времени выложить
     
  14. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.579
    Симпатии:
    1.989
    Что возвращает, если клиент не VIP вообще? 0 или ошибку?
    А время истечения VIP при этом где задаётся? Или он даёт только доступ, как таковой?
     
  15. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    Открой инк. Там написано.
    native VIP_GetClientAccessTime(iClient);
    Делается после проверки на випа


    native bool:VIP_SetClientVIPGroup(iClient, const String:sGroup[], bool:bInDB);
    Просто меняет группу вип игроку
     
  16. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    Уточню, там написано не "игроку", а "вип игроку"
    В теме инк не последний. Обновлю
     
  17. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.579
    Симпатии:
    1.989
    Временный - это и есть VIP-тест? В качестве единой сверки годится?
     
  18. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    @AlmazON, 1. это старый инк. новый щас прикреплю.
    2. Эта ф-я может применяться только к вип игроку, иначе - эррор.
    3. Тест вип является временным, ID у них всегда -1. Как получить ид я вчера вроде писал.