Контакты/сообщить об ошибке Поиск

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

  • Страница 1 из 1
  • 1
Форум » SourceMod >> CS:Source >> CSGO » Уроки/Статьи/Функции/Задачи » Инструкция по созданию модулей для VIP (Как создавать VIP модули)
Инструкция по созданию модулей для 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 < 1)
{
    // Странно, наверно не успел авторизоваться (sql запрос повис или просто еще не выполнился).
}

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, GROUP_LENGTH) && VIP_GetGroupItemValue(group, ItemName, "", 1))
{
    // Это VIP игрок и у его VIP группы есть доступ к ItemName
}

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

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

Узнать есть у игрока доступ к 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, ITEM_NAME_LENGTH);
        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;
}

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

Прикрепления: GiveVip.txt(2.2 Kb)


Сообщение отредактировал _wS_ - Понедельник, 30.11.2020, 20:35:25
 
Форум » SourceMod >> CS:Source >> CSGO » Уроки/Статьи/Функции/Задачи » Инструкция по созданию модулей для VIP (Как создавать VIP модули)
  • Страница 1 из 1
  • 1
Поиск: