Модуль плагина [Levels Ranks] Module - VIP for TOP 3.0

Выдача VIP статуса игроку который находится в позиции топа

  1. SlavON

    SlavON

    Сообщения:
    1.089
    Симпатии:
    162
    @Designed, перезапустить конфиг можно без перезапуска сервера?
     
  2. Designed

    Designed Твой антибиотик

    Сообщения:
    168
    Симпатии:
    68
    Да, в консоль sm plugins reload "Название плагина.smx" (Если в папке plugins)
     
  3. SlavON

    SlavON

    Сообщения:
    1.089
    Симпатии:
    162
    @Designed, будет фикс плагина на работу двух видов топа?
     
  4. Snake

    Snake

    Сообщения:
    112
    Симпатии:
    28
    Тоже писал автору по этому поводу, сказал позже. Ещё предлагаю чтобы была возможность выбрать вип, если игрок занял два разных топа.
     
  5. sniper45301

    sniper45301

    Сообщения:
    48
    Симпатии:
    6
    Поддержка vip от ws будет? было бы не плохо!
     
  6. Fanarrium

    Fanarrium

    Сообщения:
    203
    Симпатии:
    19
    Сделайте поддержку от Ws пожалуйста! А то эта ленивая Ж скоро скатиться в эпоху забытых скриптеров со своими приватными хреноплагинами.
    #if defined _wS_vip_included
    #endinput
    #endif
    #define _wS_vip_included
    // Инструкция по созданию модулей:
    // Инструкция по созданию модулей для VIP - Форум
    #define STEAMID_LENGTH 32
    #define GROUP_LENGTH 40
    #define ITEM_NAME_LENGTH 40 // ItemName 'speed'
    #define ITEM_INFO_LENGTH 100 // ItemValue '0.5'
    #define DESCRIPTION_LENGTH 320 // public bool:VIP_Description
    #define PLAY_SELECT_SOUND(%0) ClientCommand(%0, "playgamesound buttons/button14.wav")
    #define PLAY_EXIT_SOUND(%0) ClientCommand(%0, "playgamesound buttons/combine_button7.wav")
    #define PLAY_EXIT_BACK_SOUND(%0) ClientCommand(%0, "playgamesound buttons/combine_button7.wav")
    #define PLAY_WARNING_SOUND(%0) ClientCommand(%0, "playgamesound resource/warning.wav")
    //
    // Используется в 'public VipGiveAction:VIP_GiveAccess'
    #define CURRENT_ACCESS_NO 0 // У игрока нет фактического доступа к функции (возможно это авто-выдача доступа по флагу -> settings.txt -> "_ACCESS_BY_FLAG")
    #define CURRENT_ACCESS_YES 1 // Фактический доступ есть
    #define CURRENT_ACCESS_YES_GROUP 2 // Фактический доступ есть + это VIP игрок и у его VIP группы тоже есть доступ
    enum VipGiveAction
    {
    VGA_Continue = 0, // Разрешить/продолжить нормальное выполнение
    VGA_Stop, // Запретить (без причины)
    VGA_ValueNotSpecified, // Запретить (значение не указано)
    VGA_BadValue, // Запретить (значение указано неверно)
    VGA_SameValue, // Запретить (значение равно тому, что сейчас у игрока)
    VGA_AlreadyEnabled, // Запретить (функция уже включена)
    VGA_Paused // Запретить (игрок отключил функцию и мы не хотим принудительно её включать) - в некоторых случаях, чтобы это обойти, нужно указать любое [ItemValue].
    };
    //
    enum VIP_EVENT
    {
    VE_Authorized = 0, // public CallBack(client, const String:steamid[], bool:vip);
    VE_Spawn, // public CallBack(client, team);
    VE_Added, // public CallBack(client, const String:steamid[], const String:group[], min, const String:admin[]);
    VE_Removed, // public CallBack(client, const String:steamid[], const String:reason[]); "time is up", "server", "wS, STEAM_0:0:xxxxxxx"
    VE_GroupChanged, // public CallBack(client, const String:steamid[], const String:OldGroup[], const String:NewGroup[]);
    VE_KeyActivated, // public CallBack(client, const String:steamid[], const String:key[], const String:group[], min, const String:cmd[], bool:TimeChanged, bool:GroupChanged);
    VE_Sql, // public CallBack(Handle:hSQL); - INVALID_HANDLE = соединение разорвано, иначе восстановлено.
    VE_FreeTime, // public CallBack(bool:started); - бесплатный VIP в определённое время суток
    VE_FreeGive, // public Action:CallBack(client); - игрок получает бесплатный VIP (Plugin_Stop или Plugin_Handled = запретить)
    VE_HolidayPre, // public Action:CallBack(client, &min); - игрок берёт отпуск (если min укажете < 1, будет изменено на 1)
    VE_HolidayPost, // public CallBack(client, min); - взял отпуск
    VE_HolidayEnd, // public CallBack(client, sec); - отпуск завершён/отменён (sec = сколько секунд он длился)
    VE_ItemStatusChanged, // public CallBack(client, const String:ItemName[], bool:enabled, const String:ItemValue[]); - enabled true = функция включена/изменена (выбрал другой скин например), false = отключена. ItemValue = установленное значение (TrimString уже сделано).
    VE_ModuleLoaded, // public bool:CallBack(ItemID, const String:ItemName[]); - VIP зарегистрировал модуль (VIP_RegisterItem). return false = принудительно ставится флаг VIP_ITEM_MAPDISABLED). return true = если нет флага VIP_ITEM_MAPDISABLED, то функция сразу же включается у всех игроков, у которых есть доступ.
    VE_ModuleUnloaded // public CallBack(ItemID, const String:ItemName[]); - Модуль выгружен (VIP_UnRegisterItem или unload/краш)
    };
    native VIP_HookEvent(VIP_EVENT:event, Function:CallBack);
    //
    /**
    * Если функция была отключена/включена/изменена, то можно (в конце, после всех действий) отправить уведомление для VE_ItemStatusChanged.
    * ItemValue полезен при bool:enabled true, чтобы могли узнать установленное игроку значение.
    * Например, админ сменил игроку скорость на 0.3, вот в ItemValue мы и передадим "0.3".
    * После отправки уведомления, VE_ItemStatusChanged будет вызван через 0.1 сек.
    **/
    native VIP_NotifyItemStatusChanged(client, const String:ItemName[], bool:enabled, const String:ItemValue[] = "", ItemValueSize = 0);
    //
    #define VCF_AUTHORIZED (1 << 0) // Проверки доступа завершены (авторизован) 'if (VIP_GetFlags(client) & VCF_AUTHORIZED)'
    #define VCF_VIP (1 << 1) // VIP игрок находится в SQL базе или он VCF_VIPFREE/VCF_VIPTEMPORARY.
    #define VCF_VIPFREE (1 << 2) // VIP права выданы функцией 'бесплатный VIP в определенное время' (VE_FreeTime, VE_FreeGive) (вместе с этим флагом игроку ставится и VCF_VIPTEMPORARY)
    #define VCF_VIPTEMPORARY (1 << 3) // VIP права выданы функцией VIP_SetTemporaryGroup (возможно игрок прописан в vips.txt)
    #define VCF_VIPPAUSE (1 << 4) // Игрок воспользовался функцией "Отключить всё (перезаход = вкл)", при этом у него забирается флаг VCF_AUTHORIZED.
    #define VCF_CHATHOOK (1 << 5) // Игрок (скорее всего админ) должен ввести какое-то значение в чат и сообщение будет заблокировано.
    #define VCF_MENUAUTOOPEN (1 << 6) // Меню отправляется игроку снова и снова (TIMER_REPEAT), пока он его не покинет.
    #define VCF_SAVECACHE (1 << 7) // Личные настройки игрока (cfg/vip/cache/) должны быть сохранены при выходе.
    #define VCF_HOLIDAY (1 << 8) // В отпуске (при этом у него есть флаг VCF_AUTHORIZED).
    #define VCF_VIPTEST (1 << 9) // VIP права получены через функцию sm_viptest
    #define VCF_VIPBYFLAG (1 << 10) // Есть функции, доступ к которым был получен по флагу.
    #define VCF_VIPMENUACCESS (1 << 11) // Есть ли доступ к какой-либо функции. Если есть, то она доступна игроку в !vip меню (неважно VIP он или нет).
    native VIP_GetFlags(client);
    //
    #define VIP_ITEM_TOGGLE (1 << 0) // Игрок может вкл/откл функцию. Вызываются VIP_GiveAccess/VIP_TakeAccess
    #define VIP_ITEM_SELECT (1 << 1) // При нажатии вызывается VIP_MenuSelect (полезно, если нужно показать игроку своё меню)
    #define VIP_ITEM_DISABLED (1 << 2) // Это ITEMDRAW_DISABLED - белая некликабельная опция
    #define VIP_ITEM_MAPDISABLED (1 << 3) // Функция отключена на текущей карте (но админ может включить её любому игроку)
    #define VIP_ITEM_HIDDEN (1 << 4) // Опция скрыта (не отображается в !vip меню)
    native VIP_GetItemFlags(ItemID);
    /**
    * Если указать VIP_ITEM_TOGGLE:
    * Функция будет вкл/откл на первой странице !vip меню или на странице с описанием функции.
    * Описание добавляется с помощью public bool:VIP_Description и vip_modules_description.phrases.txt
    * Когда игрок включает функцию, то вызывается VIP_GiveAccess и в кэш записывается "ItemName" "1".
    * Отключает: вызывается VIP_TakeAccess и "ItemName" удаляется из кэша.
    *
    * Возвращает уникальный ItemID от 1 и выше (0 = ошибка).
    **/
    native VIP_RegisterItem(const String:ItemName[], VIP_ITEM_FLAGS);
    /**
    * Удалить функцию из !vip меню.
    * Для каждого VIP_RegisterItem можно сделать VIP_UnRegisterItem.
    * Но VIP теперь видит выгрузку/перезагрузку/краш плагинов и он сам всё удалит.
    * Это может быть полезно только если нужно удалить функцию во время работы плагина, а не перед его отключением.
    **/
    native VIP_UnRegisterItem(const String:ItemName[]);
    /**
    * Плагин, который сделал VIP_RegisterItem, может использовать следующие необязательные функции.
    * Более подробно в уроке: Инструкция по созданию модулей для VIP - Форум
    *
    * public VipGiveAction:VIP_GiveAccess(client, ItemID, String:ItemValue[ITEM_INFO_LENGTH], bool:bCallAfterAdminAction, CURRENT_ACCESS, Handle:kv)
    * {
    * }
    *
    * public VIP_TakeAccess(client, ItemID, bool:bToggledByClient)
    * {
    * }
    *
    * public VIP_MenuSelect(client, ItemID)
    * {
    * }
    *
    * public bool:VIP_CurrentItemValue(client, ItemID, String:ItemValue[], ItemValueSize)
    * {
    * }
    *
    * public bool:VIP_Description(client, ItemID, String:ItemValue[ITEM_INFO_LENGTH], String:description[], description_size)
    * {
    * Это только для VIP_ITEM_TOGGLE функций.
    * Можно добавить описание функции и она будет вкл/откл не на главной странице !vip меню, а на странице с описанием.
    * Если используете перевод, то добавьте его в vip_modules_description.phrases.txt
    * }
    **/
    native VIP_GetServerType(); // 1 = csgo, 2 = css, 3 = css v34
    native VIP_GetSeconds(client); // -2 = нет VIP прав, -1 = вечный VIP доступ, x = оставшиеся секунды VIP доступа
    native VIP_ShowMenu(client, bool:bSmallDelay = false); // Если bSmallDelay true, то меню будет показано через 0.1 сек.
    native VIP_GetItemID(const String:ItemName[]);
    /**
    * Можно использовать на любом игроке (неважно есть у него VIP или нет), т.к. функция может быть выдана любому не-бот игроку.
    * Например, игроку добавлена скорость 0.5 (в группе это прописывается так -> 'speed : 0.5')
    * Чтобы узнать текущее значение скорости игрока (а оно может меняться в любой момент админом/sm_vipsetitemstatus/сам включил/отключил), то делаем так:
    *
    * decl String:ItemValue[16]; // Зачем использовать ITEM_INFO_LENGTH, если мы знаем что значение состоит из нескольких символов.
    * if (VIP_GetCurrentItemValue(client, "speed", ItemValue, sizeof(ItemValue)))
    * PrintToServer("Текущая скорость: '%s'", ItemValue);
    * else
    * PrintToServer("Или модуль не реализовал функцию 'VIP_CurrentItemValue', или вернул false.");
    *
    * Чтобы это сработало, модуль должен добавить публичную функцию и реализовать её:
    * public bool:VIP_CurrentItemValue(client, ItemID, String:ItemValue[], ItemValueSize);
    * Смотрите модуль speed или инструкцию (Инструкция по созданию модулей для VIP - Форум) чтобы узнать больше.
    *
    * Ещё текущее значение можно узнать с помощью VE_ItemStatusChanged, но только если модуль реализовал 'VIP_NotifyItemStatusChanged'.
    **/
    native bool:VIP_GetCurrentItemValue(client, const String:ItemName[], String:ItemValue[], ItemValueSize);
    native bool:VIP_GetItemName (ItemID, String:buffer[], maxlength = ITEM_NAME_LENGTH);
    native bool:VIP_GetGroupName(client, String:buffer[], maxlength = GROUP_LENGTH);
    native bool:VIP_GetGroupItemValue(const String:group[], const String:ItemName[], String:buffer[], maxlength = ITEM_INFO_LENGTH); // true = у группы есть доступ к ItemName
    native bool:VIP_IsValidGroup(const String:group[]);
    native bool:VIP_IsVipFreeTime();
    /**
    * Возвращает timestamp, когда игрок брал отпуск в последний раз.
    * 0 = еще не брал отпуск
    **/
    native VIP_GetLastHolidayTime(client);
    /**
    * Возвращает Handle:kv (KeyValues) с личными настройками игрока (перед возвращением делается KvRewind).
    * Можно использовать на ЛЮБЫХ игроках.
    * Даже если у игрока нет KV файла, это вернёт пустую KeyValues группу "settings" {}
    * INVALID_HANDLE = игрок не авторизован или какая-то другая ошибка.
    **/
    native Handle:VIP_GetClientCache(client);
    /**
    * Сохранить личные настройки игрока в cfg/vip/cache.
    * Можно использовать на ЛЮБЫХ игроках.
    * Пригодится, если вы делали VIP_GetClientCache и что-то изменили в KV, или просто не хотите ждать, пока игрок выйдет с сервера.
    * Старайтесь сохранять KV лишь тех игроков, у которых есть доступ. Чем меньше файлов, тем лучше.
    * immediately - если true, то прямо сейчас, false - в момент выхода с сервера.
    **/
    native VIP_SaveClientCache(client, bool:immediately);
    /**
    * Есть ли у игрока (неважно VIP он или нет) доступ к функции.
    * Доступ к функциям может в любой момент меняться через управление модулями в админке или VIP_SetItemStatus/sm_vipsetitemstatus.
    * Чтобы узнать выдан ли этот доступ по флагу:
    * new bool:bAccessByFlag;
    * if (VIP_HaveAccessToItem(client, ItemID, bAccessByFlag))
    * PrintToServer("Доступ есть (по флагу: %s)", bAccessByFlag ? "да" : "нет");
    **/
    native bool:VIP_HaveAccessToItem(client, ItemID, &bool:bAccessByFlag = false);
    /**
    * Возвращает количество функций, доступных игроку (размер hAr), или 0, если нет доступа ни к одной функции.
    *
    * 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); // Не забудьте закрыть.
    * }
    **/
    native VIP_GetClientItemList(client, &Handle:hArray);
    /**
    * Это работает так же, как и RCON команда:
    * sm_vipsetitemstatus <ItemName/all> <1=on|0=off> [UserID] [ItemValue]
    * Если ItemID < 1, то это "all", т.е. действие на всех функциях, а не на одной.
    **/
    native VIP_SetItemStatus(ItemID, bool:enabled, client = 0, const String:ItemValue[] = "");
    /**
    * Если нет связи с MYSQL/SQLite, вернёт INVALID_HANDLE.
    * Таблицы/поля есть в VIP теме (VIP v3.3.3 - Форум)
    **/
    native Handle:VIP_GetSqlHandle();
    /**
    * new Handle:hArray = INVALID_HANDLE;
    * VIP_GetItemList(hArray);
    * if (hArray != INVALID_HANDLE)
    * {
    * new index = GetArraySize(hArray);
    * if (index > 0)
    * {
    * decl String:ItemName[ITEM_NAME_LENGTH];
    * while (--index > -1)
    * {
    * GetArrayString(hArray, index, ItemName, ITEM_NAME_LENGTH);
    * PrintToServer(ItemName);
    * }
    * }
    * CloseHandle(hArray); // Не забудьте закрыть
    * }
    **/
    native VIP_GetItemList (&Handle:hArray); // список созданных модулями функций
    native VIP_GetGroupList(&Handle:hArray); // список созданных групп
    /**
    * Если в вашем плагине есть меню, можно следить чтобы игрок не слишком часто его использовал.
    * Время настраивается в vip.cfg (vip_menu_flood "0.1")
    **/
    native bool:VIP_MenuFlood(client, bool:bWarningSound = true);
    /**
    * Можно использовать лишь на авторизованных не-VIP игроках.
    * В SQL базу игрок не добавляется.
    * Устанавливает игроку указанную VIP группу и игрок становится VIP игроком.
    * Время устанавливается в 0 (доступ навсегда). После выхода с сервера, доступ пропадает.
    * Если игрок не был в VIP группе, доступ будет выдан, сработает VIP_EVENT_ADDED и функция вернёт true.
    * Если игрок уже во временной VIP группе и group с ней не совпадает, доступ будет изменён, сработает VIP_EVENT_GROUPCHANGED и функция вернёт true.
    **/
    native bool:VIP_SetTemporaryGroup(client, const String:group[]);
    /**
    * Отнять VIP доступ, который был выдан с помощью VIP_SetTemporaryGroup.
    * Если вернёт true, то доступ был отобран и сработал VIP_EVENT_REMOVED с reason "VIP_UnSetTemporaryGroup".
    * Не нужно использовать в OnClientDisconnect, т.к. это сделает сам VIP плагин (VIP_EVENT_REMOVED вызван не будет).
    **/
    native bool:VIP_UnSetTemporaryGroup(client);
    public SharedPlugin:__pl_vip =
    {
    name = "vip",
    file = "vip.smx",
    #if defined REQUIRE_PLUGIN
    required = 1,
    #else
    required = 0,
    #endif
    };
    #if !defined REQUIRE_PLUGIN
    public __pl_vip_SetNTVOptional()
    {
    MarkNativeAsOptional("VIP_HookEvent");
    MarkNativeAsOptional("VIP_NotifyItemStatusChanged");
    MarkNativeAsOptional("VIP_GetCurrentItemValue");
    MarkNativeAsOptional("VIP_GetFlags");
    MarkNativeAsOptional("VIP_GetItemFlags");
    MarkNativeAsOptional("VIP_RegisterItem");
    MarkNativeAsOptional("VIP_UnRegisterItem");
    MarkNativeAsOptional("VIP_GetServerType");
    MarkNativeAsOptional("VIP_GetSeconds");
    MarkNativeAsOptional("VIP_ShowMenu");
    MarkNativeAsOptional("VIP_GetItemID");
    MarkNativeAsOptional("VIP_GetItemName");
    MarkNativeAsOptional("VIP_GetGroupName");
    MarkNativeAsOptional("VIP_GetGroupItemValue");
    MarkNativeAsOptional("VIP_IsValidGroup");
    MarkNativeAsOptional("VIP_IsVipFreeTime");
    MarkNativeAsOptional("VIP_GetClientCache");
    MarkNativeAsOptional("VIP_SaveClientCache");
    MarkNativeAsOptional("VIP_HaveAccessToItem");
    MarkNativeAsOptional("VIP_GetClientItemList");
    MarkNativeAsOptional("VIP_SetItemStatus");
    MarkNativeAsOptional("VIP_GetSqlHandle");
    MarkNativeAsOptional("VIP_GetItemList");
    MarkNativeAsOptional("VIP_GetGroupList");
    MarkNativeAsOptional("VIP_MenuFlood");
    MarkNativeAsOptional("VIP_SetTemporaryGroup");
    MarkNativeAsOptional("VIP_UnSetTemporaryGroup");
    MarkNativeAsOptional("VIP_GetLastHolidayTime");
    }
    #endif
     
    sniper45301 нравится это.
  7. Designed

    Designed Твой антибиотик

    Сообщения:
    168
    Симпатии:
    68
    @sniper45301, @Fanarrium, пишите об ошибках в личку (желательно discord) . Оставил один режим работы модуля.
     

    Вложения:

  8. Mafiozzz

    Mafiozzz

    Сообщения:
    22
    Симпатии:
    2
    У меня такая проблема с плагином.. в общем есть на сервере VIP сроком на 30 дней (кто займет топ я сделал получает группу viptest на 14 дней), как только игрок в VIP на 30 дней доходит до топ 3, то у него плагин меняет группу на viptest и делает VIP на 14 дней. это лаг какой то? или так задумано было?
     
  9. Designed

    Designed Твой антибиотик

    Сообщения:
    168
    Симпатии:
    68
    в ближайшее время выложу фикс
     
    Mafiozzz нравится это.
  10. Mafiozzz

    Mafiozzz

    Сообщения:
    22
    Симпатии:
    2
    Спасибо..жду с нетерпением :)
     
  11. Designed

    Designed Твой антибиотик

    Сообщения:
    168
    Симпатии:
    68
    kilroy нравится это.
  12. sniper45301

    sniper45301

    Сообщения:
    48
    Симпатии:
    6
    Errors:
    levels_ranks/lr_module_top_vip.smx ([LR] Module - VIP for TOP (wS)): Could not find required plugin "vip"
     
    DismoraL нравится это.
  13. Palonez

    Palonez

    Сообщения:
    93
    Симпатии:
    11
    тоже самое
     
  14. Designed

    Designed Твой антибиотик

    Сообщения:
    168
    Симпатии:
    68
    По ошибке залил не тот архив, как появится возможность перезалью.
     
  15. Designed

    Designed Твой антибиотик

    Сообщения:
    168
    Симпатии:
    68
  16. sniper45301

    sniper45301

    Сообщения:
    48
    Симпатии:
    6
  17. Designed

    Designed Твой антибиотик

    Сообщения:
    168
    Симпатии:
    68
    @sniper45301, переместите .smx файл в plugins/ws_vip
     
  18. Arestonelle

    Arestonelle Учусь на чужих ошибках

    Сообщения:
    91
    Симпатии:
    11
    @Designed появится ли функция, что бы покупные VIP'ы не учитывались плагином? А-то грустно получается, если топ3 держит 3 покупных випа, а ты не хочешь ставить больше 3-х первых позиций.
     
  19. Designed

    Designed Твой антибиотик

    Сообщения:
    168
    Симпатии:
    68
    На данный момент нет в планах , сейчас в планах фиксить существующие баги.
     
  20. DismoraL

    DismoraL

    Сообщения:
    145
    Симпатии:
    27
    К сожалению на версии 2.1 игроки пожаловались что VIP просто не работает. Ошибок в логах я не нашёл, пустота.
    Пришлось вернуться на 2.0 - там жалоб подобных не появлялось. Как ставлю 2.0 - всё работает идеально.