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

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #1
Небольшое содержание:
  • Как написать модуль - описано в этом посте.
  • Как прикрутить любой плагин к VIP - [MANUAL] Создание модулей
  • Если есть хоть малейшая вероятность того что модуль будет выгружен/загружен/перезагружен во время работы сервера (например, при смене карты), а лучше вообще обязательно сделать пункт 1 из статьи VIP-Core/update.md at master-dev · R1KO/VIP-Core · GitHub

Для написания модуля нам понадобится всё что нужно для написания любого другого плагина + библиотека випа (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_TELEPORT, INT, SELECTABLE, OnSelectItem, OnDisplayItem, OnDrawItem);
    /*
    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(hMenu, true);

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

public MenuHandler_TeleportMenu(Handle:hMenu, MenuAction:action, iClient, Item)
{
    switch(action)
    {
        case MenuAction_End: CloseHandle(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(iClient, fPos);
                    TeleportEntity(iClient, fPos, NULL_VECTOR, NULL_VECTOR);
                    g_iClientTeleports[iClient]++;
                }
                case 1: // Игрок выбрал 2-й пункт
                {
                    new iTarget = GetClientAimTarget(iClient, true);
                    if (iTarget > 0)
                    {
                        decl Float:fPos[3];
                        GetClientAbsOrigin(iTarget, fPos);
                        TeleportEntity(iClient, fPos, NULL_VECTOR, NULL_VECTOR);
                        g_iClientTeleports[iClient]++;
                    }
                    else
                    {
                        VIP_PrintToChatClient(iClient, "Наведите прицел на игрока!");
                        ShowTeleportMenu(iClient);
                    }
                }
                default: // Игрок выбрал другого игрока
                {
                    decl String:sUserID[16], iTarget;
                    GetMenuItem(hMenu, Item, sUserID, sizeof(sUserID));
                    iTarget = GetClientOfUserId(StringToInt(sUserID));
                    if(iTarget != 0 && IsPlayerAlive(iTarget))
                    {
                        decl Float:fPos[3];
                        GetClientAbsOrigin(iTarget, fPos);
                        TeleportEntity(iClient, fPos, NULL_VECTOR, NULL_VECTOR);
                        g_iClientTeleports[iClient]++;
                    }
                    else
                    {
                        VIP_PrintToChatClient(iClient, "Игрок больше недоступен!");
                    }
                }
            }
            VIP_SendClientVIPMenu(iClient);
        }
    }
}

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

    GetClientEyeAngles(iClient, fAngles);
    GetClientEyePosition(iClient, fPos);

    TR_TraceRayFilter(fPos, fAngles, MASK_SOLID, RayType_Infinite, FilterGetAim, iClient);
    TR_GetEndPosition(fPos);

    GetVectorAngles(fPos, fAngles);

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

public bool:FilterGetAim(iTraceEnt, iMask, any: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(iClient, VIP_TELEPORT)) // Проверяем что функция включена у игрока
    {
        new iTeleports = VIP_GetClientFeatureInt(iClient, VIP_TELEPORT);
        // VIP_GetClientFeatureInt(iClient, VIP_TELEPORT) - Получит количество доступных телепортов (То что в конфиге указано в "Teleport")
        if(iTeleports > 0) // Если кол-во телепортов ограничено
        {
            // Выводим кол-во оставшихся телепортов.
            Format(sDisplay, maxlen, "%s [Осталось: %i]", sDisplay, VIP_GetClientFeatureInt(iClient, VIP_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(iClient, VIP_TELEPORT)) // Проверяем что функция включена у игрока
    {
        if(VIP_GetClientFeatureInt(iClient, VIP_TELEPORT) >= g_iClientTeleports[iClient]) // Если кол-во телепортов ограничено и достигнут лимит
        {
            return ITEMDRAW_DISABLED;
        }
    }

    return iStyle;
}

Далее мелочи.
Очищаем переменную при входе игрока:
PHP:
public OnClientConnected(iClient)
{
    g_iClientTeleports[iClient] = 0;
}

Обнуляем кол-во телепортаций в начале раунда:
PHP:
public OnPluginStart()
{
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
}

public Event_RoundStart(Handle:hEvent, const String:sEvName[], bool:bDontBroadcast)
{
    for (new i = 1; i <= MaxClients; ++i)
    {
        g_iClientTeleports[i] = 0;
    }
}

Работоспособность я не проверял. Кто хочет - соберите, проверьте, отпишитесь.

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

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

Вложения

  • vip_tp.sp
    5 КБ · Просмотры: 222
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
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_sFeature, BOOL, HIDE);
    // Если пишем BOOL то в параметрах 1/0
    // HIDE значит что ф-я скрыта, она не будет показана у игрока в меню, её нельзя отключить и не нужно добавлять в перевод.
    // Если HIDE не писать то ф-ю можно будет вкл/выкл и нужно добавить фразу в перевод.
}

А дальше просто в нужном месте проверяем:
PHP:
if(VIP_IsClientVIP(iClient) && VIP_IsClientFeatureUse(iClient, g_sFeature))
{
    // Это VIP-игрок и он имеет доступ к ф-и.
}
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #3
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(iClient, iTeam, bool: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(iClient, bool: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(iClient, iTime, bool:bInDB);

/**
 *	Получает VIP-группу игрока.
 *	-
 * @param iClient			Индекс игрока.
 * @param sGroup			Буфер, в который будет помещен результат.
 * @param iMaxLength		Размер буфера.
 *	-
 * @return true в случае успеха, иначе false.
*/
native bool:VIP_GetClientVIPGroup(iClient, String: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(iClient, iTime, VIP_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(iClient, bool:bInDB, bool: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[], iMaxLength, iTimeStamp, iClient = 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 КБ · Просмотры: 99
Последнее редактирование:

T1MOXA

Участник
Сообщения
567
Реакции
83
Re: [DEV] Создание модулей

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

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

Участник
Сообщения
3
Реакции
1
Re: [DEV] Создание модулей

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

Napas

Участник
Сообщения
832
Реакции
667
Re: [DEV] Создание модулей

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


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

Napas

Участник
Сообщения
832
Реакции
667
Re: [DEV] Создание модулей

Оффтоп

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

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

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

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

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #8
Re: [DEV] Создание модулей

0 из 10, взял просто исходник R1KO :)
Видимо ты не понял задания.

Оффтоп

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

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
Re: [DEV] Создание модулей

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

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #10
Re: [DEV] Создание модулей

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

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

NiGaByte

Re: [DEV] Создание модулей

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

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

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
native VIP_GetClientAccessTime(iClient);
Что возвращает, если клиент не VIP вообще? 0 или ошибку?
native bool:VIP_SetClientVIPGroup(iClient, const String:sGroup[], bool:bInDB);
А время истечения VIP при этом где задаётся? Или он даёт только доступ, как таковой?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #15
Что возвращает, если клиент не VIP вообще? 0 или ошибку?А время истечения VIP при этом где задаётся? Или он даёт только доступ, как таковой?
Открой инк. Там написано.
native VIP_GetClientAccessTime(iClient);
Делается после проверки на випа


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

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #16

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #18
@AlmazON, 1. это старый инк. новый щас прикреплю.
2. Эта ф-я может применяться только к вип игроку, иначе - эррор.
3. Тест вип является временным, ID у них всегда -1. Как получить ид я вчера вроде писал.
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #19
Если есть хоть малейшая вероятность того что модуль будет выгружен/загружен/перезагружен во время работы сервера (например, при смене карты), а лучше вообще обязательно сделать пункт 1 из статьи VIP-Core/update.md at master-dev · R1KO/VIP-Core · GitHub
 

paksergdey2014

Участник
Сообщения
3
Реакции
0
Сделай модуль Бесконечные патроны !
В VIP не хватает его )))
А так все найс нравится очень !:beach:
 
Сверху Снизу