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