Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Инструкция по созданию модулей для VIP
_wS_ Дата: Воскресенье, 23.09.2018, 19:05:16 | Сообщение # 1
Инструкция по созданию модулей для VIP

Последний vip.inc лежит в этом архиве.
.smx обязательно должен быть в plugins/ws_vip или plugins/disabled/ws_vip (сюда он перемещается при сервер/vip откл и потом при вкл возвращается в plugins/ws_vip)
Для начала советую посмотреть на модуль VIP [Speed], там есть много комментариев/объяснений.

Примеры VIP_ITEM_TOGGLE

- В группе значение не указано: VIP [Anti Team Flash]
- Значение указано: VIP [Quick Defuse]
- Несколько функций с значением и без: VIP [Damage]

Примеры VIP_ITEM_SELECT

- VIP [Teleport]
- VIP [Skin Color]

Как узнать является ли игрок VIP игроком?

Вы уверены что вам нужно узнать именно это?
Не всё так просто, т.к. доступ к функции может быть у любого не-бот игрока, и неважно VIP он или нет:

Код
// Получаем флаги игрока
new flags = VIP_GetFlags(client);

if (!flags)
{
    // Не авторизован
}

if (flags & VCF_VIPMENUACCESS)
{
    // Неизвестно есть ли VIP группа у игрока или нет, но у него есть доступ к какой-то функции в !vip меню.
    // Это может быть любой игрок.
}

if (flags & VCF_VIPBYFLAG)
{
    // Неизвестно есть ли VIP группа у игрока или нет, но у него есть доступ к какой-то функции в !vip меню по флагу.
    // Это может быть любой игрок.
}

if (flags & VCF_VIP)
{
    // Игрок находится в какой-то VIP группе (значит это VIP игрок).
    // Или он в cfg/vip/vips.txt, или SQL базе, или получил бесплатный VIP в определённое время, или кто-то использовал на игроке:
    // native bool:VIP_SetTemporaryGroup(client, const String:group[]);
}

if (flags & VCF_VIPFREE)
{
    // Игрок находится в какой-то VIP группе (значит это VIP игрок).
    // Но доступ он получил через функцию "Бесплатный VIP в определенное время".
    // Он не добавляется в базу и потеряет все права после выхода с сервера.
}

if (flags & VCF_VIPTEMPORARY)
{
    // Игрок находится в какой-то VIP группе (значит это VIP игрок).
    // Но доступ он получил через cfg/vip/vips.txt, функцию "Бесплатный VIP в определенное время", или VIP_SetTemporaryGroup.
    // Он не добавляется в базу и потеряет все права после выхода с сервера.
}

if (flags & VCF_VIPPAUSE)
{
    // Игрок воспользовался функцией в !vip меню "Отключить всё (перезаход = вкл)".
    // После этого все функции были отключены для него, все переменные и флаги стерты, и установлен лишь один флаг VCF_VIPPAUSE.
    // Данной функцией могут воспользоваться лишь игроки, которые находятся в VIP группе, или у которых доступ был по флагам.
}

if (flags & VCF_HOLIDAY)
{
    // Игрок находится в отпуске, а брать отпуск может лишь VIP игрок с временными правами (он есть в SQL базе).
    // Он не считается VIP игроком в текущий момент.
}

if (flags & VCF_VIPTEST)
{
    // Игрок находится в какой-то VIP группе (значит это VIP игрок).
    // Но доступ он получил через функцию "протестировать VIP" (sm_viptest).
}

Если вам нужно узнать есть ли у VIP группы игрока доступ к функции, то:

decl String:group[GROUP_LENGTH];
if (VIP_GetGroupName(client, group, sizeof(group)) && VIP_GetGroupItemValue(group, ItemName, "", 0))
{
    // Это VIP игрок и у его VIP группы есть доступ к ItemName
}

Преобразовать ItemID в ItemName можно так:

decl String:ItemName[ITEM_NAME_LENGTH];
if (VIP_GetItemName (ItemID, ItemName, sizeof(ItemName)))
{
    // Удалось
}

Узнать есть у игрока доступ к ItemID можно так:

if (VIP_HaveAccessToItem(client, ItemID))
{
    // Доступ есть
}

А если нужно еще узнать выдан ли этот доступ по флагу:

new bool:bAccessByFlag;
if (VIP_HaveAccessToItem(client, ItemID, bAccessByFlag))
{
    // Доступ есть. Если bAccessByFlag true, то по флагу.
}

Если нужно получить список всех функций, доступных игроку, и узнать по флагу ли они выданы, то используйте:

decl Handle:hAr, index;
if ((index = VIP_GetClientItemList(client, hAr)))
{
    decl info[2], String:ItemName[ITEM_NAME_LENGTH];
    while (--index > -1)
    {
        GetArrayArray(hAr, index, info, sizeof(info));
        ItemName[0] = 0;
        VIP_GetItemName(info[0], ItemName, sizeof(String:ItemName));
        PrintToChat(client, "Есть доступ к ItemID %d (%s) (по флагу: %s)", info[0], ItemName, info[1] ? "да" : "нет");
    }
    CloseHandle(hAr); // Не забудьте закрыть.
}
 
_wS_ Дата: Понедельник, 30.11.2020, 20:31:18 | Сообщение # 2
Добавить в sql базу VIP игрока (дать vip).
Если он уже в базе, можно изменить группу и продлить время.

Код
bool:GiveVip
(
    target,
    vip_min,
    const String:vip_group[],
    bool:need_change_group = false,
    bool:need_extend_time = true,
    admin = 0
)
{
    new flags = VIP_GetFlags(target);
    if (!(flags & VCF_AUTHORIZED))  {
        if (admin) {
            PrintToChat(admin, "%N не авторизован%s", target, (flags & VCF_VIPPAUSE) ? " (должен перезайти)" : "");
        }
        return false;
    }
    
    decl String:steamid[32];
    if (!GetClientAuthId(target, AuthIdType:AuthId_Steam2, steamid, sizeof(steamid))) {
        if (admin) {
            PrintToChat(admin, "GetClientAuthId error");
        }
        return false;
    }
    
    // -2 = нет VIP прав
    // -1 = вечный VIP доступ
    // x  = оставшиеся секунды VIP доступа
    new const access_sec = VIP_GetSeconds(target);
    
    // Если у игрока нет vip прав или они временные (VIP_SetTemporaryGroup) (vip права не прописаны в базе)
    if (access_sec == -2 || (flags & VCF_VIPTEMPORARY))
    {
        ServerCommand("sm_vipadd \"%s\" %d \"%s\"", steamid, vip_min, vip_group);
        return true;
    }
    
    // Это VIP игрок и права прописаны в базе
    
    // Если у игрока вечный доступ
    if (access_sec == -1) {
        return need_change_group ? change_group(target, vip_group, steamid) : false;
    }
    
    // Осталось access_sec секунд доступа
    
    new const bool:group_changed = need_change_group && change_group(target, vip_group, steamid);

    if (need_extend_time ) {
        ServerCommand("sm_viptime + %d \"%s\"", vip_min, steamid);
    }
    
    return (group_changed || need_extend_time);
}

bool:change_group(target, const String:vip_group[], const String:steamid[])
{
    decl String:cur_gr[GROUP_LENGTH];
    if (VIP_GetGroupName(target, cur_gr, sizeof(cur_gr)) && strcmp(cur_gr, vip_group, true))
    {
        // Если группа не равна текущей, перемещаем в новую:
        ServerCommand("sm_vipgroupset \"%s\" \"%s\"", steamid, vip_group);
        return true;
    }
    return false;
}

Понимаю что не хватает нативов/есть лишние и тд, поэтому в следующих обновлениях постараюсь улучшить.

Гости не могут скачивать файлы
 
Nekromio312 Дата: Понедельник, 06.12.2021, 19:43:43 | Сообщение # 3
Сообщений: 2
Репутация: 0 [ +/- ]
Цитата _wS_ ()
Понимаю что не хватает нативов/есть лишние и тд, поэтому в следующих обновлениях постараюсь улучшить.

Приветствую, подскажите пожалуйста. Сделал модуль с последнем инклюдом, вип на сервере "VIP" (3.3.3) by wS [World-Source.Ru] , но дело в том, что при смене карты идёт ошибка
Код
[SM] Unable to load plugin "vipws_check.smx": Could not find required plugin "vip"

Я так понимаю, что плагин стартует раньше ядра? Подскажите пожалуйста решение, смотрел другие модули, там вроде не используется никаких задержек при старте.
 
_wS_ Дата: Понедельник, 06.12.2021, 19:59:05 | Сообщение # 4
Цитата Nekromio312 ()
Я так понимаю, что плагин стартует раньше ядра?

Да, поэтому .smx файл должен быть в plugins/ws_vip или plugins/disabled/ws_vip. Hueco Mundo ext перемещает модули, когда всё готово. В следующей версии такого не будет, модули будут включаться сразу же, из любых папок, даже если VIP ещё не включен, но пока так.
 
Nekromio312 Дата: Понедельник, 06.12.2021, 20:04:48 | Сообщение # 5
Сообщений: 2
Репутация: 0 [ +/- ]
Цитата _wS_ ()
Да, поэтому .smx файл должен быть в plugins/ws_vip или plugins/disabled/ws_vip. Hueco Mundo ext перемещает модули, когда всё готово. В следующей версии такого не будет, модули будут включаться сразу же, из любых папок, даже если VIP ещё не включен, но пока так.

Спасибо
 
Dangerous707 Дата: Пятница, 11.03.2022, 14:19:59 | Сообщение # 6
Сообщений: 66
Репутация: -1 [ +/- ]
Не понимаю.. может, туплю. Мне нужно в любой момент из стороннего плагина и без кэша, без
Код
VIP_NotifyItemStatusChanged
, достоверно узнать, включена у игрока функция в меню или отключена. Например, chat.
Как понимаю,
Код
VIP_GetCurrentItemValue
даст не конкретно тот результат, что мне нужен

Добавлено (11.03.2022, 16:13:44)
---------------------------------------------
Отмена, VIP_GetCurrentItemValue при выключенной функции возвращает false. Это мне подходит

 
  • Страница 1 из 1
  • 1
Поиск: