Инструкция по созданию модулей для 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. Это мне подходит
|
|
| |
|