From 88abcd89d46df811910cf5aa250bbb8a8db6816e Mon Sep 17 00:00:00 2001 From: R1KO Date: Tue, 11 Jun 2019 12:27:52 +0300 Subject: [PATCH 01/99] fix phrase --- .gitignore | 1 + addons/sourcemod/translations/vip_core.phrases.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 1d74e21..81cca17 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .vscode/ +*.smx diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index ef13113..9114b3e 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -186,6 +186,7 @@ } "LOG_ADMIN_SET_EXPIRATION" { + "#format" "{1:L},{2:s},{3:s}" "en" "Admin {1} has set {2} VIP's duration to {3}" "fi" "Admin {1} on asettanut VIP-pelaajalle {2} VIP keston tilalle {3}" "de" "Admin {1} {2}s VIP-Dauer um {3} eingestellt" From d44f44d6054b64382fb7bb999cd7529281cc9944 Mon Sep 17 00:00:00 2001 From: R1KO Date: Tue, 11 Jun 2019 12:28:03 +0300 Subject: [PATCH 02/99] fix api features --- addons/sourcemod/scripting/VIP_Core.sp | 2 +- .../sourcemod/scripting/include/vip_core.inc | 5 +- addons/sourcemod/scripting/vip/API.sp | 215 +++++++----------- addons/sourcemod/scripting/vip/Features.sp | 6 + addons/sourcemod/scripting/vip/VipMenu.sp | 6 - 5 files changed, 97 insertions(+), 137 deletions(-) diff --git a/addons/sourcemod/scripting/VIP_Core.sp b/addons/sourcemod/scripting/VIP_Core.sp index 0ee428e..67baa68 100644 --- a/addons/sourcemod/scripting/VIP_Core.sp +++ b/addons/sourcemod/scripting/VIP_Core.sp @@ -6,7 +6,7 @@ #include #include -#define VIP_VERSION "3.0 R" +#define VIP_VERSION "3.1 DEV" #define DEBUG_MODE 0 // Режим отладки diff --git a/addons/sourcemod/scripting/include/vip_core.inc b/addons/sourcemod/scripting/include/vip_core.inc index b65d6b4..892c329 100644 --- a/addons/sourcemod/scripting/include/vip_core.inc +++ b/addons/sourcemod/scripting/include/vip_core.inc @@ -419,9 +419,10 @@ native void VIP_RegisterFeature(const char[] szFeature, * - * @param szFeature Уникальное имя ф-и. * - - * @noreturn + * @return true - VIP-функция существовала и была удалена. + * false - VIP-функция не существовала. */ -native void VIP_UnregisterFeature(const char[] szFeature); +native bool VIP_UnregisterFeature(const char[] szFeature); /** * Удаляет все VIP-функции зарегистрированные плагином (вызывать в OnPluginEnd()). diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index b410ab9..6a0185c 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -780,11 +780,10 @@ public int Native_RegisterFeature(Handle hPlugin, int iNumParams) CreateForward_OnFeatureRegistered(szFeature); DebugMessage("Feature \"%s\" registered", szFeature) + return 0; } - else - { - ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" already defined/Функция \"%s\" уже существует", szFeature, szFeature); - } + + return ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" already defined/Функция \"%s\" уже существует", szFeature, szFeature); } public int Native_UnregisterFeature(Handle hPlugin, int iNumParams) @@ -792,148 +791,108 @@ public int Native_UnregisterFeature(Handle hPlugin, int iNumParams) char szFeature[FEATURE_NAME_LENGTH]; GetNativeString(1, SZF(szFeature)); - if (IsValidFeature(szFeature)) + if (!IsValidFeature(szFeature)) { - ArrayList hArray; - if (GLOBAL_TRIE.GetValue(szFeature, hArray) && view_as(hArray.Get(FEATURES_PLUGIN)) == hPlugin) - { - VIP_FeatureType eType = view_as(hArray.Get(FEATURES_ITEM_TYPE)); - if (eType == TOGGLABLE) - { - delete view_as(hArray.Get(FEATURES_COOKIE)); - } - - if (eType != HIDE) - { - DataPack hDataPack = view_as(hArray.Get(FEATURES_MENU_CALLBACKS)); - delete hDataPack; - } - - delete hArray; - - GLOBAL_TRIE.Remove(szFeature); - - int i = g_hFeaturesArray.FindString(szFeature); - if (i != -1) - { - g_hFeaturesArray.Erase(i); - } - - if (eType != HIDE) - { - char szItemInfo[FEATURE_NAME_LENGTH]; - int iSize; - iSize = (g_hVIPMenu).ItemCount; - for (i = 0; i < iSize; ++i) - { - g_hVIPMenu.GetItem(i, SZF(szItemInfo)); - if (!strcmp(szItemInfo, szFeature, true)) - { - g_hVIPMenu.RemoveItem(i); - break; - } - } - - if (g_hVIPMenu.ItemCount == 0) - { - g_hVIPMenu.AddItem("NO_FEATURES", "NO_FEATURES", ITEMDRAW_DISABLED); - } - } - - for (i = 1; i <= MaxClients; ++i) - { - if (IsClientInGame(i)) - { - if (g_iClientInfo[i] & IS_VIP) - { - g_hFeatures[i].Remove(szFeature); - g_hFeatureStatus[i].Remove(szFeature); - } - } - } - } - - CreateForward_OnFeatureUnregistered(szFeature); - DebugMessage("Feature \"%s\" unregistered", szFeature) + return 0; } - else + + int i = g_hFeaturesArray.FindString(szFeature); + if (i != -1) { - ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid/Функция \"%s\" не существует", szFeature, szFeature); + g_hFeaturesArray.Erase(i); } + + UnregisterFeature(szFeature); + + // ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid/Функция \"%s\" не существует", szFeature, szFeature); + + return 0; } public int Native_UnregisterMe(Handle hPlugin, int iNumParams) { DebugMessage("FeaturesArraySize: %d", g_hFeaturesArray.Length) - if (g_hFeaturesArray.Length > 0) + if (!g_hFeaturesArray.Length) { - char szFeature[FEATURE_NAME_LENGTH]; - ArrayList hArray; - VIP_FeatureType eType; - int i, j; + return 0; + } + + char szFeature[FEATURE_NAME_LENGTH]; + + for (int i = 0, iSize = g_hFeaturesArray.Length; i < iSize; ++i) + { + g_hFeaturesArray.GetString(i, SZF(szFeature)); + g_hFeaturesArray.Erase(i); + --i; + --iSize; + + UnregisterFeature(szFeature, hPlugin); + } + + return 0; +} - for (i = 0; i < g_hFeaturesArray.Length; ++i) +void UnregisterFeature(const char[] szFeature, Handle hPlugin = null) +{ + ArrayList hArray; + VIP_FeatureType eType = TOGGLABLE; + + if (GLOBAL_TRIE.GetValue(szFeature, hArray)) + { + if (hPlugin && hPlugin != view_as(hArray.Get(FEATURES_PLUGIN))) { - g_hFeaturesArray.GetString(i, SZF(szFeature)); + return; + } - if (GLOBAL_TRIE.GetValue(szFeature, hArray)) - { - eType = view_as(hArray.Get(FEATURES_ITEM_TYPE)); - if (eType == TOGGLABLE) - { - delete view_as(hArray.Get(FEATURES_COOKIE)); - } - - if (eType != HIDE) - { - delete view_as(hArray.Get(FEATURES_MENU_CALLBACKS)); - } - - delete hArray; - - GLOBAL_TRIE.Remove(szFeature); - - g_hFeaturesArray.Erase(i); - --i; + GLOBAL_TRIE.Remove(szFeature); - if (eType != HIDE) - { - char szItemInfo[FEATURE_NAME_LENGTH]; - int iSize; - iSize = (g_hVIPMenu).ItemCount; - for (j = 0; j < iSize; ++j) - { - g_hVIPMenu.GetItem(j, SZF(szItemInfo)); - if (strcmp(szItemInfo, szFeature, true) == 0) - { - g_hVIPMenu.RemoveItem(j); - break; - } - } - - if (g_hVIPMenu.ItemCount == 0) - { - g_hVIPMenu.AddItem("NO_FEATURES", "NO_FEATURES", ITEMDRAW_DISABLED); - } - } - - for (j = 1; j <= MaxClients; ++j) - { - if (IsClientInGame(j)) - { - if (g_iClientInfo[j] & IS_VIP) - { - g_hFeatures[j].Remove(szFeature); - g_hFeatureStatus[j].Remove(szFeature); - } - } - } + eType = view_as(hArray.Get(FEATURES_ITEM_TYPE)); + if (eType == TOGGLABLE) + { + delete view_as(hArray.Get(FEATURES_COOKIE)); + } + + if (eType != HIDE) + { + delete view_as(hArray.Get(FEATURES_MENU_CALLBACKS)); + } + + delete hArray; + } + + int i; + + if (eType != HIDE) + { + char szItemInfo[FEATURE_NAME_LENGTH]; + int iSize = g_hVIPMenu.ItemCount; + for (i = 0; i < iSize; ++i) + { + g_hVIPMenu.GetItem(i, SZF(szItemInfo)); + if (strcmp(szItemInfo, szFeature, true) == 0) + { + g_hVIPMenu.RemoveItem(i); + break; } + } + + if (iSize-1 == 0) + { + g_hVIPMenu.AddItem("NO_FEATURES", "NO_FEATURES", ITEMDRAW_DISABLED); + } + } - CreateForward_OnFeatureUnregistered(szFeature); - DebugMessage("Feature \"%s\" unregistered", szFeature) + for (i = MaxClients; i != 0; --i) + { + if (g_iClientInfo[i] & IS_VIP && IsClientInGame(i)) + { + g_hFeatures[i].Remove(szFeature); + g_hFeatureStatus[i].Remove(szFeature); } } + + DebugMessage("Feature \"%s\" unregistered", szFeature) + CreateForward_OnFeatureUnregistered(szFeature); } public int Native_IsValidFeature(Handle hPlugin, int iNumParams) diff --git a/addons/sourcemod/scripting/vip/Features.sp b/addons/sourcemod/scripting/vip/Features.sp index c3c6b9f..a152449 100644 --- a/addons/sourcemod/scripting/vip/Features.sp +++ b/addons/sourcemod/scripting/vip/Features.sp @@ -1,4 +1,10 @@ +bool IsValidFeature(const char[] szFeature) +{ + DebugMessage("IsValidFeature:: FindStringInArray -> %i", g_hFeaturesArray.FindString(szFeature)) + return (g_hFeaturesArray.FindString(szFeature) != -1); +} + void Features_TurnOffAll(int iClient) { DebugMessage("Features_TurnOffAll %N (%i)", iClient, iClient) diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index 0e1efe9..58b9f98 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -319,12 +319,6 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti return 0; } -bool IsValidFeature(const char[] szFeature) -{ - DebugMessage("IsValidFeature:: FindStringInArray -> %i", g_hFeaturesArray.FindString(szFeature)) - return (g_hFeaturesArray.FindString(szFeature) != -1); -} - bool OnVipMenuFlood(int iClient) { static float fLastTime[MAXPLAYERS + 1]; From ae684c1f10af4ad3a50d667d150f760e2a9ff6b7 Mon Sep 17 00:00:00 2001 From: R1KO Date: Tue, 11 Jun 2019 12:31:47 +0300 Subject: [PATCH 03/99] fix inc --- addons/sourcemod/scripting/include/vip_core.inc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/sourcemod/scripting/include/vip_core.inc b/addons/sourcemod/scripting/include/vip_core.inc index 892c329..158f8a8 100644 --- a/addons/sourcemod/scripting/include/vip_core.inc +++ b/addons/sourcemod/scripting/include/vip_core.inc @@ -419,8 +419,7 @@ native void VIP_RegisterFeature(const char[] szFeature, * - * @param szFeature Уникальное имя ф-и. * - - * @return true - VIP-функция существовала и была удалена. - * false - VIP-функция не существовала. + * @noreturn */ native bool VIP_UnregisterFeature(const char[] szFeature); From abf1077a7f9887c49a329c89d8ca7fa785508cfd Mon Sep 17 00:00:00 2001 From: R1KO Date: Wed, 18 Sep 2019 10:28:35 +0000 Subject: [PATCH 04/99] Fix lang error --- addons/sourcemod/scripting/vip/AdminMenu.sp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/vip/AdminMenu.sp b/addons/sourcemod/scripting/vip/AdminMenu.sp index bca5ae0..84afb26 100644 --- a/addons/sourcemod/scripting/vip/AdminMenu.sp +++ b/addons/sourcemod/scripting/vip/AdminMenu.sp @@ -302,7 +302,7 @@ void ShowTimeMenu(int iClient) if (iMenuType != TIME_SET && szTime[0] == '0') continue; - hKv.GetString(szClientLang, SZF(szBuffer), "LangError"); + hKv.GetString(szClientLang, SZF(szBuffer)); if (!szBuffer[0]) { hKv.GetString(szServerLang, SZF(szBuffer), "LangError"); From 2f368890eac5f884dbe7e99b460e95ad45aa1e4c Mon Sep 17 00:00:00 2001 From: R1KO Date: Wed, 18 Sep 2019 10:39:40 +0000 Subject: [PATCH 05/99] Add sort_menu.ini --- addons/sourcemod/data/vip/cfg/sort_menu.ini | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 addons/sourcemod/data/vip/cfg/sort_menu.ini diff --git a/addons/sourcemod/data/vip/cfg/sort_menu.ini b/addons/sourcemod/data/vip/cfg/sort_menu.ini new file mode 100644 index 0000000..e69de29 From a347fd5db1b76e71ecbfab7296fcb976c9373f8c Mon Sep 17 00:00:00 2001 From: R1KO Date: Wed, 18 Sep 2019 10:40:11 +0000 Subject: [PATCH 06/99] Add times.ini --- addons/sourcemod/data/vip/cfg/times.ini | 38 +++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 addons/sourcemod/data/vip/cfg/times.ini diff --git a/addons/sourcemod/data/vip/cfg/times.ini b/addons/sourcemod/data/vip/cfg/times.ini new file mode 100644 index 0000000..1750c83 --- /dev/null +++ b/addons/sourcemod/data/vip/cfg/times.ini @@ -0,0 +1,38 @@ +"TIMES" +{ + "0" // Время в секундах + { + "ru" "Навсегда" // Отображение в меню + "en" "Permanent" // Отображение в меню + } + + "3600" // Время в секундах + { + "ru" "1 Час" // Отображение в меню + "en" "1 Hour" // Отображение в меню + } + + "86400" // Время в секундах + { + "ru" "1 Сутки" // Отображение в меню + "en" "1 Day" // Отображение в меню + } + + "604800" // Время в секундах + { + "ru" "1 Неделя" // Отображение в меню + "en" "1 Week" // Отображение в меню + } + + "2592000" // Время в секундах + { + "ru" "1 Месяц" // Отображение в меню + "en" "1 Month" // Отображение в меню + } + + "15552000" // Время в секундах + { + "ru" "6 Месяцев" // Отображение в меню + "en" "6 Months" // Отображение в меню + } +} \ No newline at end of file From e0321a69fa94bd19b421a211725da12936f37d99 Mon Sep 17 00:00:00 2001 From: R1KO Date: Wed, 18 Sep 2019 10:40:39 +0000 Subject: [PATCH 07/99] Add groups.ini --- addons/sourcemod/data/vip/cfg/groups.ini | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 addons/sourcemod/data/vip/cfg/groups.ini diff --git a/addons/sourcemod/data/vip/cfg/groups.ini b/addons/sourcemod/data/vip/cfg/groups.ini new file mode 100644 index 0000000..f5f3b22 --- /dev/null +++ b/addons/sourcemod/data/vip/cfg/groups.ini @@ -0,0 +1,14 @@ +"VIP_GROUPS" +{ + "vip1" + { + // Параметры + + } + + "vip2" + { + // Параметры + + } +} \ No newline at end of file From c028d9342a33b0016f22afa6b3c59d4dcd5778e6 Mon Sep 17 00:00:00 2001 From: R1KO Date: Wed, 18 Sep 2019 10:41:05 +0000 Subject: [PATCH 08/99] Update groups.ini --- addons/sourcemod/data/vip/cfg/groups.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/data/vip/cfg/groups.ini b/addons/sourcemod/data/vip/cfg/groups.ini index f5f3b22..06ce800 100644 --- a/addons/sourcemod/data/vip/cfg/groups.ini +++ b/addons/sourcemod/data/vip/cfg/groups.ini @@ -1,12 +1,12 @@ "VIP_GROUPS" { - "vip1" + "vip1" // Имя группы { // Параметры } - "vip2" + "vip2" // Имя группы { // Параметры From 801968154e2c755a95c6f2d32ff60da0b664e9e3 Mon Sep 17 00:00:00 2001 From: R1KO Date: Tue, 24 Sep 2019 12:53:08 +0000 Subject: [PATCH 09/99] fix native "VIP_OnShowClientInfo" --- addons/sourcemod/scripting/vip/API.sp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 6a0185c..ca89d47 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -1,4 +1,3 @@ - static Handle g_hGlobalForward_OnVIPLoaded; static Handle g_hGlobalForward_OnClientPreLoad; static Handle g_hGlobalForward_OnClientLoaded; @@ -93,19 +92,19 @@ void CreateForward_OnPlayerSpawn(int iClient, int iTeam) Call_Finish(); } -bool CreateForward_OnShowClientInfo(int iClient, const char[] szEvent, const char[] szType, KeyValues hKeyValues) +Action CreateForward_OnShowClientInfo(int iClient, const char[] szEvent, const char[] szType, KeyValues hKeyValues) { DBG_API("CreateForward_OnShowClientInfo(%N (%d), '%s', '%s')", iClient, iClient, szEvent, szType) - bool bResult = true; + Action eResult = true; Call_StartForward(g_hGlobalForward_OnShowClientInfo); Call_PushCell(iClient); Call_PushString(szEvent); Call_PushString(szType); Call_PushCell(hKeyValues); - Call_Finish(bResult); - DBG_API("CreateForward_OnShowClientInfo = %b", bResult) + Call_Finish(eResult); + DBG_API("CreateForward_OnShowClientInfo = %d", eResult) - return bResult; + return eResult; } VIP_ToggleState CreateForward_OnFeatureToggle(int iClient, const char[] szFeature, VIP_ToggleState eOldStatus, VIP_ToggleState eNewStatus) From 7fe04744499530bec5a161eaecafb6c2375ee9bc Mon Sep 17 00:00:00 2001 From: R1KO Date: Thu, 17 Oct 2019 16:34:23 +0000 Subject: [PATCH 10/99] Update vip_core.inc --- addons/sourcemod/scripting/include/vip_core.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/scripting/include/vip_core.inc b/addons/sourcemod/scripting/include/vip_core.inc index 158f8a8..ff078e9 100644 --- a/addons/sourcemod/scripting/include/vip_core.inc +++ b/addons/sourcemod/scripting/include/vip_core.inc @@ -188,7 +188,7 @@ forward void VIP_OnVIPClientLoaded(int iClient); * Вызывается когда игрок получает VIP-статус. * - * @param iClient Индекс игрока. - * @param iAdmin Индекс админа (0 - сервер). + * @param iAdmin Индекс админа (0 - сервер, -1 - плагин). * - * @noreturn */ @@ -202,7 +202,7 @@ forward void VIP_OnVIPClientAdded(int iClient, int iAdmin); * "Expired" - Истек; * "Removed by Admin" - Удален админом; * "Removed by native" - Удален нативом. - * @param iAdmin Индекс админа (0 - сервер). + * @param iAdmin Индекс админа (0 - сервер, -1 - плагин). * - * @noreturn */ From 9ee6326d9c79de1ceb6d3694ad7f9f6085a5626e Mon Sep 17 00:00:00 2001 From: R1KO Date: Thu, 17 Oct 2019 16:38:34 +0000 Subject: [PATCH 11/99] Update API.sp --- addons/sourcemod/scripting/vip/API.sp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index ca89d47..f092e48 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -63,7 +63,7 @@ void CreateForward_OnVIPClientLoaded(int iClient) Call_Finish(); } -void CreateForward_OnVIPClientAdded(int iClient, int iAdmin = 0) +void CreateForward_OnVIPClientAdded(int iClient, int iAdmin = OWNER_SERVER) { DBG_API("CreateForward_OnVIPClientAdded(%N (%d), %d)", iClient, iClient, iAdmin) Call_StartForward(g_hGlobalForward_OnVIPClientAdded); @@ -72,7 +72,7 @@ void CreateForward_OnVIPClientAdded(int iClient, int iAdmin = 0) Call_Finish(); } -void CreateForward_OnVIPClientRemoved(int iClient, const char[] sReason, int iAdmin = 0) +void CreateForward_OnVIPClientRemoved(int iClient, const char[] sReason, int iAdmin = OWNER_SERVER) { DBG_API("CreateForward_OnVIPClientRemoved(%N (%d), %d, '%s')", iClient, iClient, iAdmin, sReason) Call_StartForward(g_hGlobalForward_OnVIPClientRemoved); @@ -562,7 +562,7 @@ public int Native_SetClientVIP(Handle hPlugin, int iNumParams) char szGroup[64]; GetNativeString(4, SZF(szGroup)); - return API_GiveClientVIP(hPlugin, REASON_PLUGIN, iClient, iTime, szGroup, bAddToDB); + return API_GiveClientVIP(hPlugin, OWNER_PLUGIN, iClient, iTime, szGroup, bAddToDB); } int API_GiveClientVIP(Handle hPlugin, @@ -676,7 +676,7 @@ int API_RemoveClientVIP(Handle hPlugin, int iClientID; if (g_hFeatures[iClient].GetValue(KEY_CID, iClientID) && iClientID != -1) { - DB_RemoveClientFromID(REASON_PLUGIN, iClient, _, true, _, _, szPluginName); + DB_RemoveClientFromID(OWNER_PLUGIN, iClient, _, true, _, _, szPluginName); } } @@ -1221,7 +1221,7 @@ public int Native_GetTimeFromStamp(Handle hPlugin, int iNumParams) if (iTimeStamp > 0) { int iClient = GetNativeCell(4); - if (iClient == 0 || CheckValidClient(iClient, false)) + if (iClient == LANG_SERVER || CheckValidClient(iClient, false)) { char szBuffer[64]; UTIL_GetTimeFromStamp(SZF(szBuffer), iTimeStamp, iClient); From e5d50c1deb3da5fbe5aaf31ec3ec9f2e97ddd121 Mon Sep 17 00:00:00 2001 From: R1KO Date: Thu, 17 Oct 2019 16:38:57 +0000 Subject: [PATCH 12/99] Update Global.sp --- addons/sourcemod/scripting/vip/Global.sp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/sourcemod/scripting/vip/Global.sp b/addons/sourcemod/scripting/vip/Global.sp index 32a7000..83a6e34 100644 --- a/addons/sourcemod/scripting/vip/Global.sp +++ b/addons/sourcemod/scripting/vip/Global.sp @@ -35,6 +35,10 @@ #define REASON_EXPIRED -3 #define REASON_OUTDATED -4 + +#define OWNER_SERVER 0 +#define OWNER_PLUGIN -1 + char KEY_CID[] = "Core->ClientID"; char KEY_EXPIRES[] = "Core->Expires"; char KEY_GROUP[] = "Core->Group"; From 8b142af649d36ce63d29d8c4bec01f99e25a2f34 Mon Sep 17 00:00:00 2001 From: R1KO Date: Thu, 17 Oct 2019 16:41:04 +0000 Subject: [PATCH 13/99] Update UTIL.sp --- addons/sourcemod/scripting/vip/UTIL.sp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/addons/sourcemod/scripting/vip/UTIL.sp b/addons/sourcemod/scripting/vip/UTIL.sp index d7878b3..7bdfee8 100644 --- a/addons/sourcemod/scripting/vip/UTIL.sp +++ b/addons/sourcemod/scripting/vip/UTIL.sp @@ -1,5 +1,4 @@ - int GET_UID(int iClient) { return iClient > 0 ? UID(iClient):iClient; @@ -36,7 +35,7 @@ stock int UTIL_ReplaceChars(char[] szBuffer, int InChar, int OutChar) if (szBuffer[i] == InChar) { szBuffer[i] = OutChar; - iNum++; + ++iNum; } } @@ -48,13 +47,10 @@ bool UTIL_StrCmpEx(const char[] szString1, const char[] szString2) int iLen = strlen(szString1); if (iLen != strlen(szString2)) { - // i don't see any reason, why we should compare strings, - // if length is different because this fact means: they - // different too. return false; } - for (int i = 0; i < iLen; i++) + for (int i = 0; i < iLen; ++i) { if (szString1[i] != szString2[i]) { @@ -256,7 +252,7 @@ void UTIL_ReloadVIPPlayers(int iClient, bool bNotify) } } /* -void UTIL_REM_VIP_PLAYER(int iClient = 0, int iTarget = 0, int iAccID = 0, int iClientID, const char[] szReason) +void UTIL_REM_VIP_PLAYER(int iClient = OWNER_SERVER, int iTarget = 0, int iAccID = 0, int iClientID, const char[] szReason) { if (g_CVAR_bLogsEnable) { @@ -297,7 +293,7 @@ void UTIL_Reply(int iClient, const char[] szMsg, any ...) } } -void UTIL_ADD_VIP_PLAYER(int iAdmin = 0, +void UTIL_ADD_VIP_PLAYER(int iAdmin = OWNER_SERVER, int iTarget = 0, int iAccID = 0, int iDuration, @@ -338,11 +334,11 @@ void UTIL_ADD_VIP_PLAYER(int iAdmin = 0, switch(iAdmin) { - case REASON_PLUGIN: + case OWNER_PLUGIN: { FormatEx(SZF(szAdmin), "%T %s", "BY_PLUGIN", LANG_SERVER, szByWho); } - case 0: + case OWNER_SERVER: { FormatEx(SZF(szAdmin), "%T", "BY_SERVER", LANG_SERVER); } From 63be9e4a8ddeec60a93056c6e2872e2ba6309981 Mon Sep 17 00:00:00 2001 From: R1KO Date: Tue, 29 Oct 2019 09:00:03 +0000 Subject: [PATCH 14/99] Add VIP_BuildModulesPath func --- addons/sourcemod/scripting/include/vip_core.inc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/addons/sourcemod/scripting/include/vip_core.inc b/addons/sourcemod/scripting/include/vip_core.inc index ff078e9..044b921 100644 --- a/addons/sourcemod/scripting/include/vip_core.inc +++ b/addons/sourcemod/scripting/include/vip_core.inc @@ -632,6 +632,20 @@ native bool VIP_GetTimeFromStamp(char[] szBuffer, int iMaxLength, int iTimeStamp */ native void VIP_AddStringToggleStatus(const char[] szInput, char[] szBuffer, int iMaxLength, const char[] szFeature, int iClient); +/** + * Формирует путь к файлу с настройками модуля. + * - + * @param szBuffer Буфер, в который будет помещен результат. + * @param iMaxLength Размер буфера. + * @param szFileName Имя файла. + * - + * @noreturn +*/ +stock void VIP_BuildModulesPath(char[] szBuffer, int iMaxLen, const char[] szFileName) +{ + BuildPath(Path_SM, szBuffer, iMaxLen, "data/vip/modules/%s", szFileName); +} + public SharedPlugin __pl_vip_core= { name = "vip_core", From 215ef54780fdf3fcd346ee7f38bdf504b8130b67 Mon Sep 17 00:00:00 2001 From: R1KO Date: Tue, 7 Jan 2020 22:30:17 +0000 Subject: [PATCH 15/99] Update CMD.sp --- addons/sourcemod/scripting/vip/CMD.sp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/sourcemod/scripting/vip/CMD.sp b/addons/sourcemod/scripting/vip/CMD.sp index 171dedb..6df2f35 100644 --- a/addons/sourcemod/scripting/vip/CMD.sp +++ b/addons/sourcemod/scripting/vip/CMD.sp @@ -1,4 +1,3 @@ - void CMD_Setup() { RegConsoleCmd("sm_refresh_vips", ReloadVIPPlayers_CMD); @@ -58,7 +57,7 @@ public Action ReloadVIPCfg_CMD(int iClient, int iArgs) ReadConfigs(); UTIL_ReloadVIPPlayers(iClient, false); - UTIL_Reply(iClient, "[VIP] %t", "VIP_CFG_REFRESHED"); + UTIL_Reply(iClient, "%t", "VIP_CFG_REFRESHED"); return Plugin_Handled; } From 0c4612e3331b162d69f533935e158afda4e47a0a Mon Sep 17 00:00:00 2001 From: R1KO Date: Sat, 2 Jan 2021 14:18:55 +0200 Subject: [PATCH 16/99] issue 70 (fix VIP_SetClientVIPGroup) --- addons/sourcemod/scripting/include/vip_core.inc | 2 +- addons/sourcemod/scripting/vip/API.sp | 4 ++++ addons/sourcemod/scripting/vip/Clients.sp | 10 ++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/include/vip_core.inc b/addons/sourcemod/scripting/include/vip_core.inc index e35690d..d58cfac 100644 --- a/addons/sourcemod/scripting/include/vip_core.inc +++ b/addons/sourcemod/scripting/include/vip_core.inc @@ -661,6 +661,7 @@ public void __pl_vip_core_SetNTVOptional() MarkNativeAsOptional("VIP_GetDatabaseType"); MarkNativeAsOptional("VIP_RegisterFeature"); MarkNativeAsOptional("VIP_UnregisterFeature"); + MarkNativeAsOptional("VIP_UnregisterMe"); MarkNativeAsOptional("VIP_IsValidFeature"); MarkNativeAsOptional("VIP_GetFeatureType"); MarkNativeAsOptional("VIP_GetFeatureValueType"); @@ -694,7 +695,6 @@ public void __pl_vip_core_SetNTVOptional() MarkNativeAsOptional("VIP_GetTimeFromStamp"); MarkNativeAsOptional("VIP_AddStringToggleStatus"); MarkNativeAsOptional("VIP_GiveClientVIP"); - MarkNativeAsOptional("VIP_UnregisterMe"); MarkNativeAsOptional("VIP_GiveClientFeature"); MarkNativeAsOptional("VIP_RemoveClientFeature"); } diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 34c4c14..dc458cb 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -431,6 +431,10 @@ public int Native_SetClientVIPGroup(Handle hPlugin, int iNumParams) } } } + else + { + Clients_LoadVIPFeatures(iClient); + } return true; } diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index 754cf71..95ad292 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -303,6 +303,16 @@ void Clients_LoadVIPFeatures(int iClient) Clients_OnVIPClientLoaded(iClient); } +void Clients_LoadGroupFeatures(int iClient, const char[] szGroup) +{ + char szFeature[FEATURE_NAME_LENGTH]; + for (int i = 0; i < iFeatures; ++i) + { + g_hFeaturesArray.GetString(i, SZF(szFeature)); + Clients_LoadFeature(iClient, szFeature); + } +} + void Clients_LoadVIPFeature(int iClient, const char[] szFeature) { DebugMessage("LoadVIPFeature %N", iClient) From 802d6ff8d88649de00904620a96cd64da83159b0 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sat, 2 Jan 2021 14:34:47 +0200 Subject: [PATCH 17/99] refactoring api errors & fix issue 65 --- addons/sourcemod/scripting/vip/API.sp | 225 +++++++++++----------- addons/sourcemod/scripting/vip/VipMenu.sp | 2 +- 2 files changed, 115 insertions(+), 112 deletions(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index dc458cb..88dee0a 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -401,50 +401,49 @@ public int Native_GetClientVIPGroup(Handle hPlugin, int iNumParams) public int Native_SetClientVIPGroup(Handle hPlugin, int iNumParams) { int iClient = GetNativeCell(1); - if (CheckValidClient(iClient)) + if (!CheckValidClient(iClient)) { - char szGroup[64]; - GetNativeString(2, SZF(szGroup)); - if (UTIL_CheckValidVIPGroup(szGroup)) + return 0; + } + char szGroup[64]; + GetNativeString(2, SZF(szGroup)); + if (!UTIL_CheckValidVIPGroup(szGroup)) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Invalid group (%s)", szGroup);; + } + + if (!g_hFeatures[iClient].SetString(KEY_GROUP, szGroup)) + { + return 0; + } + if (view_as(GetNativeCell(3))) + { + int iClientID; + if (g_hFeatures[iClient].GetValue(KEY_CID, iClientID) && iClientID != -1) { - if (g_hFeatures[iClient].SetString(KEY_GROUP, szGroup)) + char szQuery[256]; + FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `group` = '%s' WHERE `account_id` = %d%s;", szGroup, iClientID, g_szSID); + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_ChangeClientSettings, szQuery, UID(iClient)); + + if (g_CVAR_bLogsEnable) { - if (view_as(GetNativeCell(3))) - { - int iClientID; - if (g_hFeatures[iClient].GetValue(KEY_CID, iClientID) && iClientID != -1) - { - char szQuery[256]; - FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `group` = '%s' WHERE `account_id` = %d%s;", szGroup, iClientID, g_szSID); - DBG_SQL_Query(szQuery) - g_hDatabase.Query(SQL_Callback_ChangeClientSettings, szQuery, UID(iClient)); - - if (g_CVAR_bLogsEnable) - { - char szName[MNL], szAdmin[128], szPluginName[128], szOldGroup[64]; - GetClientName(iClient, SZF(szName)); - GetPluginInfo(hPlugin, PlInfo_Name, SZF(szPluginName)); - FormatEx(SZF(szAdmin), "%T %s", "BY_PLUGIN", LANG_SERVER, szPluginName); - g_hFeatures[iClient].GetString(KEY_GROUP, SZF(szOldGroup)); - g_hFeatures[iClient].GetValue(KEY_CID, iClientID); - LogToFile(g_szLogFile, "%T", "LOG_CHANGE_GROUP", LANG_SERVER, szName, iClientID, szOldGroup, szGroup, szAdmin); - } - } - } - else - { - Clients_LoadVIPFeatures(iClient); - } - - return true; + char szName[MNL], szAdmin[128], szPluginName[128], szOldGroup[64]; + GetClientName(iClient, SZF(szName)); + GetPluginInfo(hPlugin, PlInfo_Name, SZF(szPluginName)); + FormatEx(SZF(szAdmin), "%T %s", "BY_PLUGIN", LANG_SERVER, szPluginName); + g_hFeatures[iClient].GetString(KEY_GROUP, SZF(szOldGroup)); + g_hFeatures[iClient].GetValue(KEY_CID, iClientID); + LogToFile(g_szLogFile, "%T", "LOG_CHANGE_GROUP", LANG_SERVER, szName, iClientID, szOldGroup, szGroup, szAdmin); } } - else - { - ThrowNativeError(SP_ERROR_NATIVE, "Invalid group/Некорректная VIP-группа (%s)", szGroup); - } } - return false; + else + { + Clients_LoadVIPFeatures(iClient); + } + + return 1; } public int Native_GetClientAccessTime(Handle hPlugin, int iNumParams) @@ -471,8 +470,7 @@ public int Native_SetClientAccessTime(Handle hPlugin, int iNumParams) if (iTime < 0 || (iTime != 0 && iTime < GetTime())) { - ThrowNativeError(SP_ERROR_NATIVE, "Invalid time/Некорректное время (%i)", iTime); - return false; + return ThrowNativeError(SP_ERROR_NATIVE, "Invalid time (%i)", iTime); } if (g_hFeatures[iClient].SetValue(KEY_EXPIRES, iTime)) @@ -594,17 +592,17 @@ int API_GiveClientVIP(Handle hPlugin, } else { - return ThrowNativeError(SP_ERROR_NATIVE, "The player %L is already a VIP/Игрок %L уже является VIP-игроком", iClient, iClient); + return ThrowNativeError(SP_ERROR_NATIVE, "The player %L is already a VIP", iClient, iClient); } } if (!UTIL_CheckValidVIPGroup(szGroup)) { - return ThrowNativeError(SP_ERROR_NATIVE, "Invalid VIP-group/Некорректная VIP-группа (%s)", szGroup); + return ThrowNativeError(SP_ERROR_NATIVE, "Invalid VIP-group (%s)", szGroup); } if (iTime < 0) { - return ThrowNativeError(SP_ERROR_NATIVE, "Invalid time/Некорректное время (%d)", iTime); + return ThrowNativeError(SP_ERROR_NATIVE, "Invalid time (%d)", iTime); } if (bAddToDB) @@ -733,65 +731,70 @@ public int Native_RegisterFeature(Handle hPlugin, int iNumParams) DebugMessage("Register feature \"%s\" (%s)", szFeature, sPluginName) #endif - if (IsValidFeature(szFeature) == false) + if (IsValidFeature(szFeature)) { - if (g_hFeaturesArray.Length == 0) - { - g_hVIPMenu.RemoveItem(0); - } + return ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" already defined", szFeature); + } + if (g_hFeaturesArray.Length == 0) + { + g_hVIPMenu.RemoveItem(0); + } - g_hFeaturesArray.PushString(szFeature); - DebugMessage("PushArrayString -> %i", g_hFeaturesArray.FindString(szFeature)) + g_hFeaturesArray.PushString(szFeature); + DebugMessage("PushArrayString -> %i", g_hFeaturesArray.FindString(szFeature)) - VIP_FeatureType eType = view_as(GetNativeCell(3)); - DebugMessage("FeatureType -> %i", eType) + VIP_FeatureType eType = view_as(GetNativeCell(3)); + DebugMessage("FeatureType -> %i", eType) - ArrayList hArray = new ArrayList(); - GLOBAL_TRIE.SetValue(szFeature, hArray); - - hArray.Push(hPlugin); - hArray.Push(GetNativeCell(2)); - hArray.Push(eType); + ArrayList hArray = new ArrayList(); + GLOBAL_TRIE.SetValue(szFeature, hArray); + + hArray.Push(hPlugin); + hArray.Push(GetNativeCell(2)); + hArray.Push(eType); - if (eType != HIDE) + if (eType != HIDE) + { + Handle hCookie = null; + if (eType == TOGGLABLE || (eType == SELECTABLE && iNumParams > 7 && GetNativeCell(8))) { - Handle hCookie = null; - if (eType == TOGGLABLE || (eType == SELECTABLE && iNumParams > 7 && GetNativeCell(8))) - { - hCookie = RegClientCookie(szFeature, szFeature, CookieAccess_Private); - } - - hArray.Push(hCookie); + hCookie = RegClientCookie(szFeature, szFeature, CookieAccess_Private); + } - DataPack hDataPack = new DataPack(); - hDataPack.WriteFunction(GetNativeCell(4)); - hDataPack.WriteFunction(GetNativeCell(5)); - hDataPack.WriteFunction(GetNativeCell(6)); - hArray.Push(hDataPack); + Function fCallback = GetNativeCell(4); + if (eType == SELECTABLE && fCallback == INVALID_FUNCTION) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Undefined callback for SELECTABLE feature \"%s\"", szFeature); + } - if(eType == TOGGLABLE) - { - hArray.Push(iNumParams > 6 ? GetNativeCell(7):NO_ACCESS); - } + hArray.Push(hCookie); - AddFeatureToVIPMenu(szFeature); - } + DataPack hDataPack = new DataPack(); + hDataPack.WriteFunction(fCallback); + hDataPack.WriteFunction(GetNativeCell(5)); + hDataPack.WriteFunction(GetNativeCell(6)); + hArray.Push(hDataPack); - for (int iClient = 1; iClient <= MaxClients; ++iClient) + if(eType == TOGGLABLE) { - if (IsClientInGame(iClient) && g_iClientInfo[iClient] & IS_VIP) - { - Clients_LoadVIPFeaturesPre(iClient, szFeature); - } + hArray.Push(iNumParams > 6 ? GetNativeCell(7):NO_ACCESS); } - CreateForward_OnFeatureRegistered(szFeature); - DebugMessage("Feature \"%s\" registered", szFeature) + AddFeatureToVIPMenu(szFeature); } - else + + for (int iClient = 1; iClient <= MaxClients; ++iClient) { - ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" already defined/Функция \"%s\" уже существует", szFeature, szFeature); + if (IsClientInGame(iClient) && g_iClientInfo[iClient] & IS_VIP) + { + Clients_LoadVIPFeaturesPre(iClient, szFeature); + } } + + CreateForward_OnFeatureRegistered(szFeature); + DebugMessage("Feature \"%s\" registered", szFeature) + + return 1; } public int Native_UnregisterFeature(Handle hPlugin, int iNumParams) @@ -799,24 +802,24 @@ public int Native_UnregisterFeature(Handle hPlugin, int iNumParams) char szFeature[FEATURE_NAME_LENGTH]; GetNativeString(1, SZF(szFeature)); - if (IsValidFeature(szFeature)) + if (!IsValidFeature(szFeature)) { - ArrayList hArray; - if (GLOBAL_TRIE.GetValue(szFeature, hArray)/* && view_as(hArray.Get(FEATURES_PLUGIN)) == hPlugin*/) - { - UnregisterFeature(szFeature, hArray); - - int i = g_hFeaturesArray.FindString(szFeature); - if (i != -1) - { - g_hFeaturesArray.Erase(i); - } - } + return ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid", szFeature); } - else + + ArrayList hArray; + if (GLOBAL_TRIE.GetValue(szFeature, hArray)) { - ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid/Функция \"%s\" не существует", szFeature, szFeature); + UnregisterFeature(szFeature, hArray); + + int i = g_hFeaturesArray.FindString(szFeature); + if (i != -1) + { + g_hFeaturesArray.Erase(i); + } } + + return 1; } public int Native_UnregisterMe(Handle hPlugin, int iNumParams) @@ -846,6 +849,8 @@ public int Native_UnregisterMe(Handle hPlugin, int iNumParams) } } } + + return 1; } void UnregisterFeature(const char[] szFeature, ArrayList hArray) @@ -895,6 +900,8 @@ void UnregisterFeature(const char[] szFeature, ArrayList hArray) CreateForward_OnFeatureUnregistered(szFeature); DebugMessage("Feature \"%s\" unregistered", szFeature) + + return 1; } public int Native_IsValidFeature(Handle hPlugin, int iNumParams) @@ -916,7 +923,7 @@ public int Native_GetFeatureType(Handle hPlugin, int iNumParams) return hArray.Get(FEATURES_ITEM_TYPE); } - return ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid/Функция \"%s\" не существует", szFeature, szFeature); + return ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid", szFeature); } public int Native_GetFeatureValueType(Handle hPlugin, int iNumParams) @@ -930,7 +937,7 @@ public int Native_GetFeatureValueType(Handle hPlugin, int iNumParams) return hArray.Get(FEATURES_VALUE_TYPE); } - return ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid/Функция \"%s\" не существует", szFeature, szFeature); + return ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid", szFeature); } public int Native_FillArrayByFeatures(Handle hPlugin, int iNumParams) @@ -1100,8 +1107,7 @@ public int Native_GiveClientFeature(Handle hPlugin, int iNumParams) ArrayList hArray; if (!IsValidFeature(szFeature) || !GLOBAL_TRIE.GetValue(szFeature, hArray)) { - ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid/Функция \"%s\" не существует", szFeature, szFeature); - return 0; + return ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid", szFeature); } char szValue[256]; @@ -1165,8 +1171,7 @@ public int Native_RemoveClientFeature(Handle hPlugin, int iNumParams) ArrayList hArray; if (!IsValidFeature(szFeature) || !GLOBAL_TRIE.GetValue(szFeature, hArray)) { - ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid/Функция \"%s\" не существует", szFeature, szFeature); - return 0; + return ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid", szFeature); } VIP_ToggleState eToggleState = Features_GetStatus(iClient, szFeature); @@ -1242,7 +1247,7 @@ public int Native_AddStringToggleStatus(Handle hPlugin, int iNumParams) GetNativeString(4, SZF(szFeature)); if (!IsValidFeature(szFeature)) { - return ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid/Функция \"%s\" не существует", szFeature, szFeature); + return ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid", szFeature); } int iClient = GetNativeCell(5); @@ -1262,13 +1267,11 @@ bool CheckValidClient(const int &iClient, bool bCheckVIP = true) { if (iClient < 1 || iClient > MaxClients) { - ThrowNativeError(SP_ERROR_NATIVE, "Invalid client index/Некорректный индекс игрока (%i)", iClient); - return false; + return ThrowNativeError(SP_ERROR_NATIVE, "Invalid client index (%i)", iClient); } if (IsClientInGame(iClient) == false) { - ThrowNativeError(SP_ERROR_NATIVE, "Client %i is not connected/Игрок %i не подключен", iClient, iClient); - return false; + return ThrowNativeError(SP_ERROR_NATIVE, "Client %i is not connected", iClient); } if (bCheckVIP) { diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index 0e1efe9..b90dad7 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -306,7 +306,7 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti hMenu.DisplayAt(iClient, hMenu.Selection, MENU_TIME_FOREVER); return 0; } - + g_hFeatures[iClient].SetValue(KEY_MENUITEM, hMenu.Selection); if (Function_OnItemSelect(hPlugin, fCallback, iClient, szItemInfo)) { From d08eabfb75ce78d3c5311da02d6f62ceea11e7e0 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sat, 2 Jan 2021 14:36:49 +0200 Subject: [PATCH 18/99] fix issue 68 --- addons/sourcemod/scripting/vip/API.sp | 56 +++++++++++++-------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 88dee0a..02483cb 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -1164,43 +1164,43 @@ public int Native_GiveClientFeature(Handle hPlugin, int iNumParams) public int Native_RemoveClientFeature(Handle hPlugin, int iNumParams) { int iClient = GetNativeCell(1); - if (CheckValidClient(iClient)) + if (!CheckValidClient(iClient)) { - char szFeature[64]; - GetNativeString(1, SZF(szFeature)); - ArrayList hArray; - if (!IsValidFeature(szFeature) || !GLOBAL_TRIE.GetValue(szFeature, hArray)) - { - return ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid", szFeature); - } + return 0; + } - VIP_ToggleState eToggleState = Features_GetStatus(iClient, szFeature); + char szFeature[64]; + GetNativeString(2, SZF(szFeature)); + ArrayList hArray; + if (!IsValidFeature(szFeature) || !GLOBAL_TRIE.GetValue(szFeature, hArray)) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid", szFeature); + } - g_hFeatures[iClient].Remove(szFeature); - g_hFeatureStatus[iClient].Remove(szFeature); + VIP_ToggleState eToggleState = Features_GetStatus(iClient, szFeature); - if (!g_hFeatures[iClient].Size) - { - ResetClient(iClient); - } + g_hFeatures[iClient].Remove(szFeature); + g_hFeatureStatus[iClient].Remove(szFeature); - if (eToggleState != NO_ACCESS && view_as(hArray.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) - { - DataPack hDataPack = view_as(hArray.Get(FEATURES_MENU_CALLBACKS)); - hDataPack.Position = ITEM_SELECT; - Function fCallback = hDataPack.ReadFunction(); + if (!g_hFeatures[iClient].Size) + { + ResetClient(iClient); + } - if (fCallback != INVALID_FUNCTION) - { - Function_OnItemToggle(view_as(hArray.Get(FEATURES_PLUGIN)), fCallback, iClient, szFeature, eToggleState, NO_ACCESS); - } - CreateForward_OnFeatureToggle(iClient, szFeature, eToggleState, NO_ACCESS); - } + if (eToggleState != NO_ACCESS && view_as(hArray.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) + { + DataPack hDataPack = view_as(hArray.Get(FEATURES_MENU_CALLBACKS)); + hDataPack.Position = ITEM_SELECT; + Function fCallback = hDataPack.ReadFunction(); - return 1; + if (fCallback != INVALID_FUNCTION) + { + Function_OnItemToggle(view_as(hArray.Get(FEATURES_PLUGIN)), fCallback, iClient, szFeature, eToggleState, NO_ACCESS); + } + CreateForward_OnFeatureToggle(iClient, szFeature, eToggleState, NO_ACCESS); } - return 0; + return 1; } public int Native_GetDatabase(Handle hPlugin, int iNumParams) From abf6f67f7ea284b362a6e0635738223b297298ea Mon Sep 17 00:00:00 2001 From: R1KO Date: Sat, 2 Jan 2021 14:38:16 +0200 Subject: [PATCH 19/99] fix issue 46 --- addons/sourcemod/scripting/vip/API.sp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 02483cb..25dd01b 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -1124,7 +1124,7 @@ public int Native_GiveClientFeature(Handle hPlugin, int iNumParams) { case BOOL: { - g_hFeatures[iClient].SetValue(szFeature, view_as(StringToInt(szValue))); + g_hFeatures[iClient].SetValue(szFeature, !!StringToInt(szValue)); } case INT: { From 727848ad7e61d07c797be204cfdedd1598db5315 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sat, 2 Jan 2021 14:41:19 +0200 Subject: [PATCH 20/99] fix issue 40 --- addons/sourcemod/scripting/vip/Global.sp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/sourcemod/scripting/vip/Global.sp b/addons/sourcemod/scripting/vip/Global.sp index 32a7000..069430d 100644 --- a/addons/sourcemod/scripting/vip/Global.sp +++ b/addons/sourcemod/scripting/vip/Global.sp @@ -31,9 +31,9 @@ #define IS_MySQL (1<<1) #define IS_LOADING (1<<2) -#define REASON_PLUGIN -2 -#define REASON_EXPIRED -3 -#define REASON_OUTDATED -4 +#define REASON_PLUGIN -1 +#define REASON_EXPIRED -2 +#define REASON_OUTDATED -3 char KEY_CID[] = "Core->ClientID"; char KEY_EXPIRES[] = "Core->Expires"; From a93ef49e2520e608517c45ad3d422205446a921b Mon Sep 17 00:00:00 2001 From: R1KO Date: Sat, 2 Jan 2021 14:47:29 +0200 Subject: [PATCH 21/99] fix compile on sm 1.10 --- addons/sourcemod/scripting/vip/API.sp | 10 +++++----- addons/sourcemod/scripting/vip/Clients.sp | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 25dd01b..90333bd 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -409,7 +409,7 @@ public int Native_SetClientVIPGroup(Handle hPlugin, int iNumParams) GetNativeString(2, SZF(szGroup)); if (!UTIL_CheckValidVIPGroup(szGroup)) { - return ThrowNativeError(SP_ERROR_NATIVE, "Invalid group (%s)", szGroup);; + return ThrowNativeError(SP_ERROR_NATIVE, "Invalid group (%s)", szGroup); } if (!g_hFeatures[iClient].SetString(KEY_GROUP, szGroup)) @@ -900,8 +900,6 @@ void UnregisterFeature(const char[] szFeature, ArrayList hArray) CreateForward_OnFeatureUnregistered(szFeature); DebugMessage("Feature \"%s\" unregistered", szFeature) - - return 1; } public int Native_IsValidFeature(Handle hPlugin, int iNumParams) @@ -1267,11 +1265,13 @@ bool CheckValidClient(const int &iClient, bool bCheckVIP = true) { if (iClient < 1 || iClient > MaxClients) { - return ThrowNativeError(SP_ERROR_NATIVE, "Invalid client index (%i)", iClient); + ThrowNativeError(SP_ERROR_NATIVE, "Invalid client index (%i)", iClient); + return false; } if (IsClientInGame(iClient) == false) { - return ThrowNativeError(SP_ERROR_NATIVE, "Client %i is not connected", iClient); + ThrowNativeError(SP_ERROR_NATIVE, "Client %i is not connected", iClient); + return false; } if (bCheckVIP) { diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index 95ad292..4731845 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -303,7 +303,7 @@ void Clients_LoadVIPFeatures(int iClient) Clients_OnVIPClientLoaded(iClient); } -void Clients_LoadGroupFeatures(int iClient, const char[] szGroup) +stock void Clients_LoadGroupFeatures(int iClient, const char[] szGroup) { char szFeature[FEATURE_NAME_LENGTH]; for (int i = 0; i < iFeatures; ++i) From 342dfe8944f8e6014f5160e78f20991a375278e0 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sat, 2 Jan 2021 15:20:44 +0200 Subject: [PATCH 22/99] fix .inc style --- addons/sourcemod/scripting/include/vip_core.inc | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/addons/sourcemod/scripting/include/vip_core.inc b/addons/sourcemod/scripting/include/vip_core.inc index db25ef1..ead756c 100644 --- a/addons/sourcemod/scripting/include/vip_core.inc +++ b/addons/sourcemod/scripting/include/vip_core.inc @@ -159,7 +159,6 @@ forward void VIP_OnFeatureUnregistered(const char[] szFeature); * * @param iClient Индекс игрока. * - * @return true - продолжить. * false - не выполнять проверку. */ @@ -199,7 +198,7 @@ forward void VIP_OnClientDisconnect(int iClient, bool bIsVIP); * * @param iClient Индекс игрока. * @param iAdmin Индекс админа (0 - сервер, -1 - плагин). - * - + * * @noreturn */ forward void VIP_OnVIPClientAdded(int iClient, int iAdmin = -1); @@ -213,7 +212,7 @@ forward void VIP_OnVIPClientAdded(int iClient, int iAdmin = -1); * "Removed by Admin" - Удален админом; * "Removed by native" - Удален нативом. * @param iAdmin Индекс админа (0 - сервер, -1 - плагин). - * - + * * @noreturn */ forward void VIP_OnVIPClientRemoved(int iClient, const char[] szReason, int iAdmin = -1); @@ -428,7 +427,7 @@ native void VIP_RegisterFeature(const char[] szFeature, * Удаляет VIP-функцию. * * @param szFeature Уникальное имя ф-и. - * - + * * @noreturn */ native void VIP_UnregisterFeature(const char[] szFeature); @@ -644,11 +643,11 @@ native void VIP_AddStringToggleStatus(const char[] szInput, char[] szBuffer, int /** * Формирует путь к файлу с настройками модуля. - * - + * * @param szBuffer Буфер, в который будет помещен результат. * @param iMaxLength Размер буфера. * @param szFileName Имя файла. - * - + * * @noreturn */ stock void VIP_BuildModulesPath(char[] szBuffer, int iMaxLen, const char[] szFileName) From 3f53affb85b79fb25c5bc75b97b0038531e1ab39 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sat, 2 Jan 2021 15:23:55 +0200 Subject: [PATCH 23/99] fix end files --- addons/sourcemod/data/vip/cfg/groups.ini | 2 +- addons/sourcemod/data/vip/cfg/times.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/data/vip/cfg/groups.ini b/addons/sourcemod/data/vip/cfg/groups.ini index 06ce800..f5b3a89 100644 --- a/addons/sourcemod/data/vip/cfg/groups.ini +++ b/addons/sourcemod/data/vip/cfg/groups.ini @@ -11,4 +11,4 @@ // Параметры } -} \ No newline at end of file +} diff --git a/addons/sourcemod/data/vip/cfg/times.ini b/addons/sourcemod/data/vip/cfg/times.ini index 1750c83..53ba111 100644 --- a/addons/sourcemod/data/vip/cfg/times.ini +++ b/addons/sourcemod/data/vip/cfg/times.ini @@ -35,4 +35,4 @@ "ru" "6 Месяцев" // Отображение в меню "en" "6 Months" // Отображение в меню } -} \ No newline at end of file +} From cd7a76fa0a4263a0dd1025468ec439f311e976a6 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sat, 2 Jan 2021 15:25:02 +0200 Subject: [PATCH 24/99] fix inc forwards --- addons/sourcemod/scripting/include/vip_core.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/scripting/include/vip_core.inc b/addons/sourcemod/scripting/include/vip_core.inc index ead756c..233f118 100644 --- a/addons/sourcemod/scripting/include/vip_core.inc +++ b/addons/sourcemod/scripting/include/vip_core.inc @@ -201,7 +201,7 @@ forward void VIP_OnClientDisconnect(int iClient, bool bIsVIP); * * @noreturn */ -forward void VIP_OnVIPClientAdded(int iClient, int iAdmin = -1); +forward void VIP_OnVIPClientAdded(int iClient, int iAdmin); /** * Вызывается когда игрок лишается VIP-статуса. @@ -215,7 +215,7 @@ forward void VIP_OnVIPClientAdded(int iClient, int iAdmin = -1); * * @noreturn */ -forward void VIP_OnVIPClientRemoved(int iClient, const char[] szReason, int iAdmin = -1); +forward void VIP_OnVIPClientRemoved(int iClient, const char[] szReason, int iAdmin); /** * Запускает проверку игрока на наличие VIP прав. From 01f54c32ccbedea8122442db786e7bfda4254e18 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sat, 2 Jan 2021 15:41:14 +0200 Subject: [PATCH 25/99] refactor VIP Menu --- addons/sourcemod/scripting/VIP_Core.sp | 4 + addons/sourcemod/scripting/vip/Global.sp | 1 + addons/sourcemod/scripting/vip/VipMenu.sp | 186 ++++++++++------------ 3 files changed, 89 insertions(+), 102 deletions(-) diff --git a/addons/sourcemod/scripting/VIP_Core.sp b/addons/sourcemod/scripting/VIP_Core.sp index b4e620f..2971112 100644 --- a/addons/sourcemod/scripting/VIP_Core.sp +++ b/addons/sourcemod/scripting/VIP_Core.sp @@ -86,6 +86,10 @@ public void OnPluginStart() ITEM_DRAW = hDataPack.Position; delete hDataPack; + + g_bIsTranslationPhraseExistsAvailable = (CanTestFeatures() && + GetFeatureStatus(FeatureType_Native, "TranslationPhraseExists") == FeatureStatus_Available); + ReadConfigs(); VIPMenu_Setup(); diff --git a/addons/sourcemod/scripting/vip/Global.sp b/addons/sourcemod/scripting/vip/Global.sp index 94425ed..527f9bd 100644 --- a/addons/sourcemod/scripting/vip/Global.sp +++ b/addons/sourcemod/scripting/vip/Global.sp @@ -122,6 +122,7 @@ bool g_CVAR_bDefaultStatus; bool g_CVAR_bLogsEnable; EngineVersion g_EngineVersion; +bool g_bIsTranslationPhraseExistsAvailable; char g_szSID[64]; diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index e72d28e..eecf330 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -8,30 +8,29 @@ void VIPMenu_Setup() void AddFeatureToVIPMenu(const char[] szFeature) { DebugMessage("AddFeatureToVIPMenu: %s", szFeature) - if (g_hSortArray != null) - { - ResortFeaturesArray(); - - g_hVIPMenu.RemoveAllItems(); - - int i, iSize; - char szItemInfo[128]; - ArrayList hArray; - iSize = g_hFeaturesArray.Length; - for (i = 0; i < iSize; ++i) - { - g_hFeaturesArray.GetString(i, SZF(szItemInfo)); - if (GLOBAL_TRIE.GetValue(szItemInfo, hArray) && view_as(hArray.Get(FEATURES_ITEM_TYPE)) != HIDE) - { - DebugMessage("AddMenuItem: %s", szItemInfo) - g_hVIPMenu.AddItem(szItemInfo, szItemInfo); - } - } - } - else + if (g_hSortArray == null) { DebugMessage("AddMenuItem") g_hVIPMenu.AddItem(szFeature, szFeature); + return; + } + + ResortFeaturesArray(); + + g_hVIPMenu.RemoveAllItems(); + + int i, iSize; + char szMenuFeature[FEATURE_NAME_LENGTH]; + ArrayList hArray; + iSize = g_hFeaturesArray.Length; + for (i = 0; i < iSize; ++i) + { + g_hFeaturesArray.GetString(i, SZF(szMenuFeature)); + if (GLOBAL_TRIE.GetValue(szMenuFeature, hArray) && view_as(hArray.Get(FEATURES_ITEM_TYPE)) != HIDE) + { + DebugMessage("AddMenuItem: %s", szMenuFeature) + g_hVIPMenu.AddItem(szMenuFeature, szMenuFeature); + } } } @@ -39,7 +38,7 @@ void ResortFeaturesArray() { DebugMessage("ResortFeaturesArray\n \n ") - if ((g_hFeaturesArray).Length < 2) + if (g_hFeaturesArray.Length < 2) { return; } @@ -53,12 +52,12 @@ void ResortFeaturesArray() #endif*/ x = 0; - char szItemInfo[128]; + char szFeature[128]; for (i = 0; i < iSize; ++i) { - g_hSortArray.GetString(i, SZF(szItemInfo)); - DebugMessage("GetSortArrayString: %s (i: %i, x: %i)", szItemInfo, i, x) - index = g_hFeaturesArray.FindString(szItemInfo); + g_hSortArray.GetString(i, SZF(szFeature)); + DebugMessage("GetSortArrayString: %s (i: %i, x: %i)", szFeature, i, x) + index = g_hFeaturesArray.FindString(szFeature); DebugMessage("FindStringInGlobalArray: index: %i", index) if (index != -1) { @@ -84,11 +83,11 @@ stock void PrintArray(ArrayList &hArray) iSize = hArray.Length; if (iSize) { - char szItemInfo[128]; + char szFeature[128]; for (i = 0; i < iSize; ++i) { - hArray.GetString(i, SZF(szItemInfo)); - DebugMessage("%i: %s", i, szItemInfo) + hArray.GetString(i, SZF(szFeature)); + DebugMessage("%i: %s", i, szFeature) } } } @@ -96,34 +95,20 @@ stock void PrintArray(ArrayList &hArray) */ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOption) { - if(action == MenuAction_Display || + if((action == MenuAction_Display || action == MenuAction_DisplayItem || action == MenuAction_DrawItem || - action == MenuAction_Select) - { - if(!(g_iClientInfo[iClient] & IS_VIP) || !g_hFeatures[iClient]) + action == MenuAction_Select) && + (!(g_iClientInfo[iClient] & IS_VIP) || !g_hFeatures[iClient])) { - return 0; - } + return 0; } - static char szItemInfo[FEATURE_NAME_LENGTH]; - ArrayList hBuffer; - Function fCallback; - Handle hPlugin; - /* - switch (action) - { - case MenuAction_Display, MenuAction_DrawItem, MenuAction_DisplayItem, MenuAction_Select: - { - if (!(g_iClientInfo[iClient] & IS_VIP)) - { - (g_hVIPMenu).Cancel(); - DisplayClientInfo(iClient, "expired_info"); - return 0; - } - } - } - */ + + static char szFeature[FEATURE_NAME_LENGTH]; + static ArrayList hBuffer; + static Function fCallback; + static Handle hPlugin; + switch (action) { case MenuAction_Cancel: @@ -150,8 +135,6 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti } else { - // FakeClientCommand(iClient, "menuselect 0"); - // DisplayClientInfo(iClient, "expired_info"); Clients_ExpiredClient(iClient); return 0; } @@ -167,13 +150,13 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti case MenuAction_DrawItem: { int iStyle; - g_hVIPMenu.GetItem(iOption, SZF(szItemInfo), iStyle); + g_hVIPMenu.GetItem(iOption, SZF(szFeature), iStyle); - DebugMessage("MenuAction_DrawItem: Client: %i, Feature: %s, iStyle: %i", iClient, szItemInfo, iStyle) + DebugMessage("MenuAction_DrawItem: Client: %i, Feature: %s, iStyle: %i", iClient, szFeature, iStyle) - if (GLOBAL_TRIE.GetValue(szItemInfo, hBuffer)) + if (GLOBAL_TRIE.GetValue(szFeature, hBuffer)) { - if (view_as(hBuffer.Get(FEATURES_VALUE_TYPE)) != VIP_NULL && Features_GetStatus(iClient, szItemInfo) == NO_ACCESS) + if (view_as(hBuffer.Get(FEATURES_VALUE_TYPE)) != VIP_NULL && Features_GetStatus(iClient, szFeature) == NO_ACCESS) { iStyle = g_CVAR_bHideNoAccessItems ? ITEMDRAW_RAWLINE:ITEMDRAW_DISABLED; DebugMessage("NO_ACCESS -> iStyle: %i", iStyle) @@ -187,7 +170,7 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti hPlugin = view_as(hBuffer.Get(FEATURES_PLUGIN)); Call_StartFunction(hPlugin, fCallback); Call_PushCell(iClient); - Call_PushString(szItemInfo); + Call_PushString(szFeature); Call_PushCell(iStyle); Call_Finish(iStyle); DebugMessage("Function_Draw -> iStyle: %i", iStyle) @@ -201,13 +184,18 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti case MenuAction_DisplayItem: { - g_hVIPMenu.GetItem(iOption, SZF(szItemInfo)); - - DebugMessage("MenuAction_DisplayItem: Client: %i, Feature: %s", iClient, szItemInfo) + g_hVIPMenu.GetItem(iOption, SZF(szFeature)); + DebugMessage("MenuAction_DisplayItem: Client: %i, Feature: %s", iClient, szFeature) + char szDisplay[128]; - - if (GLOBAL_TRIE.GetValue(szItemInfo, hBuffer)) + if (strcmp(szFeature, "NO_FEATURES") == 0) + { + FormatEx(SZF(szDisplay), "%T", "NO_FEATURES", iClient); + return RedrawMenuItem(szDisplay); + } + + if (GLOBAL_TRIE.GetValue(szFeature, hBuffer)) { DataPack hDataPack = view_as(hBuffer.Get(FEATURES_MENU_CALLBACKS)); hDataPack.Position = ITEM_DISPLAY; @@ -216,11 +204,10 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti { hPlugin = view_as(hBuffer.Get(FEATURES_PLUGIN)); - szDisplay[0] = 0; bool bResult; Call_StartFunction(hPlugin, fCallback); Call_PushCell(iClient); - Call_PushString(szItemInfo); + Call_PushString(szFeature); Call_PushStringEx(SZF(szDisplay), SM_PARAM_STRING_UTF8 | SM_PARAM_STRING_COPY, SM_PARAM_COPYBACK); Call_PushCell(sizeof(szDisplay)); Call_Finish(bResult); @@ -232,49 +219,34 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti return RedrawMenuItem(szDisplay); } } - - if (view_as(hBuffer.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) + + static char szFeatureName[128]; + if(IsTranslationPhraseExists(szFeature)) { - if(CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "TranslationPhraseExists") == FeatureStatus_Available) - { - if(!TranslationPhraseExists(szItemInfo)) - { - FormatEx(SZF(szDisplay), "%s [%T]", szItemInfo, g_szToggleStatus[view_as(Features_GetStatus(iClient, szItemInfo))], iClient); - return RedrawMenuItem(szDisplay); - } - } - FormatEx(SZF(szDisplay), "%T [%T]", szItemInfo, iClient, g_szToggleStatus[view_as(Features_GetStatus(iClient, szItemInfo))], iClient); - return RedrawMenuItem(szDisplay); + FormatEx(SZF(szFeatureName), "%T", szFeature, iClient); } - - if(CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "TranslationPhraseExists") == FeatureStatus_Available) + else { - if(!TranslationPhraseExists(szItemInfo)) - { - strcopy(SZF(szDisplay), szItemInfo); - return RedrawMenuItem(szDisplay); - } + strcopy(SZF(szFeatureName), szFeature); + } + + if (view_as(hBuffer.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) + { + FormatEx(SZF(szDisplay), "%s [%T]", szFeatureName, g_szToggleStatus[view_as(Features_GetStatus(iClient, szFeature))], iClient); } - FormatEx(SZF(szDisplay), "%T", szItemInfo, iClient); return RedrawMenuItem(szDisplay); } - if (strcmp(szItemInfo, "NO_FEATURES") == 0) - { - FormatEx(SZF(szItemInfo), "%T", "NO_FEATURES", iClient); - } - - return RedrawMenuItem(szItemInfo); } case MenuAction_Select: { - g_hVIPMenu.GetItem(iOption, SZF(szItemInfo)); + g_hVIPMenu.GetItem(iOption, SZF(szFeature)); - if (GLOBAL_TRIE.GetValue(szItemInfo, hBuffer)) + if (GLOBAL_TRIE.GetValue(szFeature, hBuffer)) { PlaySound(iClient, ITEM_TOGGLE_SOUND); - DebugMessage("MenuAction_Select: Client: %i, Feature: %s", iClient, szItemInfo) + DebugMessage("MenuAction_Select: Client: %i, Feature: %s", iClient, szFeature) DataPack hDataPack = view_as(hBuffer.Get(FEATURES_MENU_CALLBACKS)); hDataPack.Position = ITEM_SELECT; @@ -285,19 +257,19 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti char szBuffer[4]; VIP_ToggleState eOldStatus, eNewStatus; - eOldStatus = Features_GetStatus(iClient, szItemInfo); + eOldStatus = Features_GetStatus(iClient, szFeature); eNewStatus = (eOldStatus == ENABLED) ? DISABLED:ENABLED; if (fCallback != INVALID_FUNCTION) { - eNewStatus = Function_OnItemToggle(hPlugin, fCallback, iClient, szItemInfo, eOldStatus, eNewStatus); + eNewStatus = Function_OnItemToggle(hPlugin, fCallback, iClient, szFeature, eOldStatus, eNewStatus); } if (eNewStatus != eOldStatus) { - eNewStatus = CreateForward_OnFeatureToggle(iClient, szItemInfo, eOldStatus, eNewStatus); + eNewStatus = CreateForward_OnFeatureToggle(iClient, szFeature, eOldStatus, eNewStatus); if (eNewStatus != eOldStatus) { - Features_SetStatus(iClient, szItemInfo, eNewStatus); + Features_SetStatus(iClient, szFeature, eNewStatus); IntToString(view_as(eNewStatus), SZF(szBuffer)); SetClientCookie(iClient, view_as(GetArrayCell(hBuffer, FEATURES_COOKIE)), szBuffer); } @@ -308,7 +280,7 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti } g_hFeatures[iClient].SetValue(KEY_MENUITEM, hMenu.Selection); - if (Function_OnItemSelect(hPlugin, fCallback, iClient, szItemInfo)) + if (Function_OnItemSelect(hPlugin, fCallback, iClient, szFeature)) { hMenu.DisplayAt(iClient, hMenu.Selection, MENU_TIME_FOREVER); } @@ -329,4 +301,14 @@ bool OnVipMenuFlood(int iClient) fLastTime[iClient] = fSec; } return false; -} \ No newline at end of file +} + +bool IsTranslationPhraseExists(const char[] szPhrase) +{ + if (g_bIsTranslationPhraseExistsAvailable) + { + return TranslationPhraseExists(szPhrase); + } + + return true; +} \ No newline at end of file From c9694cf20ab4a81b69e6813f53f30c55c8cbf815 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sat, 2 Jan 2021 15:46:11 +0200 Subject: [PATCH 26/99] fix codestyle --- addons/sourcemod/data/vip/cfg/times.ini | 30 +++++++++++------------ addons/sourcemod/scripting/vip/VipMenu.sp | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/sourcemod/data/vip/cfg/times.ini b/addons/sourcemod/data/vip/cfg/times.ini index 53ba111..bae4f80 100644 --- a/addons/sourcemod/data/vip/cfg/times.ini +++ b/addons/sourcemod/data/vip/cfg/times.ini @@ -6,33 +6,33 @@ "en" "Permanent" // Отображение в меню } - "3600" // Время в секундах + "3600" { - "ru" "1 Час" // Отображение в меню - "en" "1 Hour" // Отображение в меню + "ru" "1 Час" + "en" "1 Hour" } - "86400" // Время в секундах + "86400" { - "ru" "1 Сутки" // Отображение в меню - "en" "1 Day" // Отображение в меню + "ru" "1 Сутки" + "en" "1 Day" } - "604800" // Время в секундах + "604800" { - "ru" "1 Неделя" // Отображение в меню - "en" "1 Week" // Отображение в меню + "ru" "1 Неделя" + "en" "1 Week" } - "2592000" // Время в секундах + "2592000" { - "ru" "1 Месяц" // Отображение в меню - "en" "1 Month" // Отображение в меню + "ru" "1 Месяц" + "en" "1 Month" } - "15552000" // Время в секундах + "15552000" { - "ru" "6 Месяцев" // Отображение в меню - "en" "6 Months" // Отображение в меню + "ru" "6 Месяцев" + "en" "6 Months" } } diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index eecf330..d828e21 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -311,4 +311,4 @@ bool IsTranslationPhraseExists(const char[] szPhrase) } return true; -} \ No newline at end of file +} From 7b67cea254c1606debce8f6a4ef93d8d103e3af4 Mon Sep 17 00:00:00 2001 From: diller110 Date: Mon, 25 Jan 2021 23:11:56 +0400 Subject: [PATCH 27/99] Remove whitespaces Extra spaces near #define will crash SPCode (https://github.com/Hexer10/SPCode) --- addons/sourcemod/scripting/VIP_Core.sp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/sourcemod/scripting/VIP_Core.sp b/addons/sourcemod/scripting/VIP_Core.sp index 2971112..1a137ac 100644 --- a/addons/sourcemod/scripting/VIP_Core.sp +++ b/addons/sourcemod/scripting/VIP_Core.sp @@ -18,11 +18,11 @@ #define USE_MORE_SERVERS 1 // Включить/Отключить режим при котором если ID сервера у игрока 0 - то VIP будет работать на всех серверах -//#define CHARSET "utf8mb4" -//#define COLLATION "utf8mb4_unicode_ci" +//#define CHARSET "utf8mb4" +//#define COLLATION "utf8mb4_unicode_ci" -#define CHARSET "utf8" -#define COLLATION "utf8_unicode_ci" +#define CHARSET "utf8" +#define COLLATION "utf8_unicode_ci" #if USE_ADMINMENU 1 #undef REQUIRE_PLUGIN From 33bae05f8aec38cba0bf033c1de3c92e279c28be Mon Sep 17 00:00:00 2001 From: diller110 Date: Mon, 25 Jan 2021 23:12:11 +0400 Subject: [PATCH 28/99] Fix empty items in menu --- addons/sourcemod/scripting/vip/VipMenu.sp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index d828e21..aab3b2d 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -233,9 +233,10 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti if (view_as(hBuffer.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) { FormatEx(SZF(szDisplay), "%s [%T]", szFeatureName, g_szToggleStatus[view_as(Features_GetStatus(iClient, szFeature))], iClient); + return RedrawMenuItem(szDisplay); + } else { + return RedrawMenuItem(szFeatureName); } - - return RedrawMenuItem(szDisplay); } } From 8e7f36be614fea77499127df0b20cb54e8d59c63 Mon Sep 17 00:00:00 2001 From: diller110 Date: Tue, 26 Jan 2021 21:09:00 +0400 Subject: [PATCH 29/99] Change charset uft8 -> utf8mb4 --- addons/sourcemod/scripting/VIP_Core.sp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/sourcemod/scripting/VIP_Core.sp b/addons/sourcemod/scripting/VIP_Core.sp index 1a137ac..46b7d79 100644 --- a/addons/sourcemod/scripting/VIP_Core.sp +++ b/addons/sourcemod/scripting/VIP_Core.sp @@ -18,11 +18,11 @@ #define USE_MORE_SERVERS 1 // Включить/Отключить режим при котором если ID сервера у игрока 0 - то VIP будет работать на всех серверах -//#define CHARSET "utf8mb4" -//#define COLLATION "utf8mb4_unicode_ci" +#define CHARSET "utf8mb4" +#define COLLATION "utf8mb4_unicode_ci" -#define CHARSET "utf8" -#define COLLATION "utf8_unicode_ci" +//#define CHARSET "utf8" +//#define COLLATION "utf8_unicode_ci" #if USE_ADMINMENU 1 #undef REQUIRE_PLUGIN From b5ffe5ef0df8239c694a404decae6dd505b0ff1f Mon Sep 17 00:00:00 2001 From: diller110 Date: Tue, 26 Jan 2021 21:12:40 +0400 Subject: [PATCH 30/99] Removed unnecessary variable --- addons/sourcemod/scripting/vip/VipMenu.sp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index aab3b2d..d513c7e 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -188,7 +188,7 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti DebugMessage("MenuAction_DisplayItem: Client: %i, Feature: %s", iClient, szFeature) - char szDisplay[128]; + static char szDisplay[128]; if (strcmp(szFeature, "NO_FEATURES") == 0) { FormatEx(SZF(szDisplay), "%T", "NO_FEATURES", iClient); @@ -220,23 +220,21 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti } } - static char szFeatureName[128]; if(IsTranslationPhraseExists(szFeature)) { - FormatEx(SZF(szFeatureName), "%T", szFeature, iClient); + FormatEx(SZF(szDisplay), "%T", szFeature, iClient); } else { - strcopy(SZF(szFeatureName), szFeature); + strcopy(SZF(szDisplay), szFeature); } if (view_as(hBuffer.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) { - FormatEx(SZF(szDisplay), "%s [%T]", szFeatureName, g_szToggleStatus[view_as(Features_GetStatus(iClient, szFeature))], iClient); - return RedrawMenuItem(szDisplay); - } else { - return RedrawMenuItem(szFeatureName); + FormatEx(SZF(szDisplay), "%s [%T]", szDisplay, g_szToggleStatus[view_as(Features_GetStatus(iClient, szFeature))], iClient); } + + return RedrawMenuItem(szDisplay); } } From a5890084bf4d9e673878ea6e56e953f0359d78c7 Mon Sep 17 00:00:00 2001 From: diller110 Date: Wed, 27 Jan 2021 01:25:48 +0400 Subject: [PATCH 31/99] Fix: FormatEx --- addons/sourcemod/scripting/vip/VipMenu.sp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index d513c7e..a0e3770 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -231,7 +231,7 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti if (view_as(hBuffer.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) { - FormatEx(SZF(szDisplay), "%s [%T]", szDisplay, g_szToggleStatus[view_as(Features_GetStatus(iClient, szFeature))], iClient); + Format(SZF(szDisplay), "%s [%T]", szDisplay, g_szToggleStatus[view_as(Features_GetStatus(iClient, szFeature))], iClient); } return RedrawMenuItem(szDisplay); From 88c564a2fc2793a66859254b1eb9f0a62b6dcf2e Mon Sep 17 00:00:00 2001 From: R1KO Date: Fri, 29 Jan 2021 20:42:08 +0200 Subject: [PATCH 32/99] fix compile in sm 1.9 --- addons/sourcemod/scripting/vip/Clients.sp | 23 ++++------- addons/sourcemod/scripting/vip/Features.sp | 45 +++++++++++----------- 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index 4731845..67dfb69 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -281,16 +281,16 @@ void Clients_LoadVIPFeatures(int iClient) { DebugMessage("LoadVIPFeatures %N", iClient) - int iFeatures = g_hFeaturesArray.Length; - DebugMessage("FeaturesArraySize: %d", iFeatures) - if (iFeatures > 0) + int iFeaturesCount = g_hFeaturesArray.Length; + DebugMessage("FeaturesArraySize: %d", iFeaturesCount) + if (iFeaturesCount > 0) { char szFeature[FEATURE_NAME_LENGTH]; g_hFeatures[iClient].GetString(KEY_GROUP, SZF(szFeature)); if (UTIL_CheckValidVIPGroup(szFeature)) { - for (int i = 0; i < iFeatures; ++i) + for (int i = 0; i < iFeaturesCount; ++i) { g_hFeaturesArray.GetString(i, SZF(szFeature)); Clients_LoadFeature(iClient, szFeature); @@ -303,23 +303,14 @@ void Clients_LoadVIPFeatures(int iClient) Clients_OnVIPClientLoaded(iClient); } -stock void Clients_LoadGroupFeatures(int iClient, const char[] szGroup) -{ - char szFeature[FEATURE_NAME_LENGTH]; - for (int i = 0; i < iFeatures; ++i) - { - g_hFeaturesArray.GetString(i, SZF(szFeature)); - Clients_LoadFeature(iClient, szFeature); - } -} void Clients_LoadVIPFeature(int iClient, const char[] szFeature) { DebugMessage("LoadVIPFeature %N", iClient) - int iFeatures = g_hFeaturesArray.Length; - DebugMessage("FeaturesArraySize: %d", iFeatures) - if (iFeatures > 0) + int iFeaturesCount = g_hFeaturesArray.Length; + DebugMessage("FeaturesArraySize: %d", iFeaturesCount) + if (iFeaturesCount > 0) { char szGroup[FEATURE_NAME_LENGTH]; diff --git a/addons/sourcemod/scripting/vip/Features.sp b/addons/sourcemod/scripting/vip/Features.sp index a152449..d177dd5 100644 --- a/addons/sourcemod/scripting/vip/Features.sp +++ b/addons/sourcemod/scripting/vip/Features.sp @@ -8,30 +8,31 @@ bool IsValidFeature(const char[] szFeature) void Features_TurnOffAll(int iClient) { DebugMessage("Features_TurnOffAll %N (%i)", iClient, iClient) - int iFeatures = g_hFeaturesArray.Length; - if(iFeatures != 0) + int iFeaturesCount = g_hFeaturesArray.Length; + if(!iFeaturesCount) { - char szFeature[FEATURE_NAME_LENGTH]; - VIP_ToggleState eOldStatus; - Function Function_Toggle; - ArrayList hArray; - DataPack hDataPack; + return; + } + char szFeature[FEATURE_NAME_LENGTH]; + VIP_ToggleState eOldStatus; + Function Function_Toggle; + ArrayList hArray; + DataPack hDataPack; - for(int i = 0; i < iFeatures; ++i) + for(int i = 0; i < iFeaturesCount; ++i) + { + g_hFeaturesArray.GetString(i, SZF(szFeature)); + if(GLOBAL_TRIE.GetValue(szFeature, hArray)) { - g_hFeaturesArray.GetString(i, SZF(szFeature)); - if(GLOBAL_TRIE.GetValue(szFeature, hArray)) + if(view_as(hArray.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) { - if(view_as(hArray.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) + eOldStatus = Features_GetStatus(iClient, szFeature); + hDataPack = view_as(hArray.Get(FEATURES_MENU_CALLBACKS)); + hDataPack.Position = ITEM_SELECT; + Function_Toggle = hDataPack.ReadFunction(); + if(Function_Toggle != INVALID_FUNCTION) { - eOldStatus = Features_GetStatus(iClient, szFeature); - hDataPack = view_as(hArray.Get(FEATURES_MENU_CALLBACKS)); - hDataPack.Position = ITEM_SELECT; - Function_Toggle = hDataPack.ReadFunction(); - if(Function_Toggle != INVALID_FUNCTION) - { - Function_OnItemToggle(view_as(hArray.Get(FEATURES_PLUGIN)), Function_Toggle, iClient, szFeature, eOldStatus, NO_ACCESS); - } + Function_OnItemToggle(view_as(hArray.Get(FEATURES_PLUGIN)), Function_Toggle, iClient, szFeature, eOldStatus, NO_ACCESS); } } } @@ -42,8 +43,8 @@ void Features_TurnOnAll(int iClient) { DebugMessage("Features_TurnOnAll %N (%i)", iClient, iClient) - int iFeatures = g_hFeaturesArray.Length; - if(iFeatures != 0) + int iFeaturesCount = g_hFeaturesArray.Length; + if(iFeaturesCount != 0) { char szFeature[FEATURE_NAME_LENGTH]; VIP_ToggleState eNewStatus; @@ -51,7 +52,7 @@ void Features_TurnOnAll(int iClient) ArrayList hArray; DataPack hDataPack; - for(int i = 0; i < iFeatures; ++i) + for(int i = 0; i < iFeaturesCount; ++i) { GetArrayString(g_hFeaturesArray, i, SZF(szFeature)); if(GetTrieValue(GLOBAL_TRIE, szFeature, hArray)) From c5d972f6c724634a53131948ba1955efbfa71514 Mon Sep 17 00:00:00 2001 From: R1KO Date: Mon, 8 Mar 2021 17:51:13 +0200 Subject: [PATCH 33/99] fix translate --- .../sourcemod/scripting/vip/adminmenu/List.sp | 6 ++++-- .../translations/vip_core.phrases.txt | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/scripting/vip/adminmenu/List.sp b/addons/sourcemod/scripting/vip/adminmenu/List.sp index c6b84c1..473c22e 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/List.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/List.sp @@ -12,9 +12,11 @@ void ShowVipPlayersListMenu(int iClient) hMenu.SetTitle("%T:\n ", "MENU_LIST_VIP", iClient); hMenu.ExitBackButton = true; - hMenu.AddItem("search", "Найти игрока\n "); + FormatEx(SZF(szName), "%T\n ", "FIND_PLAYER"); + hMenu.AddItem("search", szName); - hMenu.AddItem("show_all", "Показать всех\n "); + FormatEx(SZF(szName), "%T\n ", "SHOW_ALL"); + hMenu.AddItem("show_all", szName); szUserID[0] = 0; for (i = 1; i <= MaxClients; ++i) diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index dd96035..90be73b 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -368,6 +368,27 @@ "ru" "Список VIP-игроков" "ua" "Список VIP-гравців" } + + "FIND_PLAYER" + { + "en" "Find a player" + "fi" "Etsi pelaaja" + "de" "Finde einen Spieler" + "pt" "Encontre um jogador" + "pt_p" "Encontre um jogador" + "ru" "Найти игрока" + "ua" "Знайти гравця" + } + "SHOW_ALL" + { + "en" "Show all" + "fi" "Näytä kaikki" + "de" "Zeige alles" + "pt" "Mostre tudo" + "pt_p" "Mostre tudo" + "ru" "Показать всех" + "ua" "Показати всіх" + } "MENU_SEARCH" { "#format" "{1:s},{2:d}" From 0a6277f0685654ad0af10680b197c23dfd2317ba Mon Sep 17 00:00:00 2001 From: R1KO Date: Mon, 8 Mar 2021 20:35:26 +0200 Subject: [PATCH 34/99] fix errors --- addons/sourcemod/scripting/vip/adminmenu/List.sp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/scripting/vip/adminmenu/List.sp b/addons/sourcemod/scripting/vip/adminmenu/List.sp index 473c22e..10d5f00 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/List.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/List.sp @@ -12,10 +12,10 @@ void ShowVipPlayersListMenu(int iClient) hMenu.SetTitle("%T:\n ", "MENU_LIST_VIP", iClient); hMenu.ExitBackButton = true; - FormatEx(SZF(szName), "%T\n ", "FIND_PLAYER"); + FormatEx(SZF(szName), "%T\n ", "FIND_PLAYER", iClient); hMenu.AddItem("search", szName); - FormatEx(SZF(szName), "%T\n ", "SHOW_ALL"); + FormatEx(SZF(szName), "%T\n ", "SHOW_ALL", iClient); hMenu.AddItem("show_all", szName); szUserID[0] = 0; From cae4745e3562bc5855269ac477ac0483bf875a1f Mon Sep 17 00:00:00 2001 From: crashzk Date: Mon, 8 Mar 2021 16:10:28 -0300 Subject: [PATCH 35/99] Update vip_core.phrases.txt --- .../translations/vip_core.phrases.txt | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index 90be73b..54d04cb 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -117,7 +117,7 @@ "en" "Add VIP-Player" "fi" "Lisätä VIP-pelaaja" "de" "VIP-Spieler hinzufügen" - "pt" "Adicionar VIP" + "pt" "Adicionar VIP do Player" "pt_p" "Adicionar VIP" "ru" "Добавить VIP-игрока" "ua" "Додати VIP-гравця" @@ -165,7 +165,7 @@ "en" "Edit VIP-Player" "fi" "Muokaa VIP-pelaaja" "de" "VIP-Spieler ändern" - "pt" "Editar Player VIP" + "pt" "Editar VIP do Player" "pt_p" "Editar VIP" "ru" "Редактировать VIP-игрока" "ua" "Редагувати VIP-гравця" @@ -228,7 +228,8 @@ "en" "{1}'s VIP was extended for {2}" "fi" "VIP-pelaajan kesto pidenetään {1} tilalle {2}" "de" "VIP des {1} war verlängt für {2}" - "pt_p" "{1}'s VIP foi extendido por {2}" + "pt" "VIP de {1} foi estendido para {2}" + "pt_p" "{1}'s VIP foi estendido por {2}" "ru" "Продлен срок VIP-игроку {1} на {2}" "ua" "Продовжено термін VIP-гравцю {1} на {2}" } @@ -238,7 +239,7 @@ "en" "Admin {1} has extented {2}'s VIP for {3}" "fi" "Admin {1} Pidensi keston VIP-pelaajalle {2} tilalle {3}" "de" "Admin {1} hat verlängt VIP des {2} für {3}" - "pt" "Administrador {1} extendeu o VIP de {2} por {3}" + "pt" "Administrador {1} estendeu o VIP de {2} por {3}" "pt_p" "Admin {1} extendeu o VIP de {2}'s por {3}" "ru" "Админ {1} продлил срок VIP-игроку {2} на {3}" "ua" "Адмін {1} продовжив термін VIP для гравця {2} на {3}" @@ -248,6 +249,7 @@ "en" "Unable to extend this player's VIP" "fi" "Et voi pidentää aikaa VIP-pelaajalle" "de" "Fehler beim VIP des Spielers Fortsetzung" + "pt" "Incapaz de estender o VIP deste player" "pt_p" "Não é possível prolongar o VIP deste jogador" "ru" "Нельзя продлить длительность этому VIP-игроку" "ua" "Неможливо продовжити VIP цього гравця" @@ -329,6 +331,7 @@ { "#format" "{1:s},{2:d},{3:s},{4:s},{5:s}" "en" "VIP-Player {1} (ID: {2}, Group: {3}) changed the group to {4} {5}" + "pt" "VIP Player {1} (ID: {2}, Grupo: {3}) mudou o grupo para {4} {5}" "ru" "VIP-Игроку {1} (ID: {2}, Группа: {3}) изменена группа на {4} {5}" } "MENU_DEL_VIP" @@ -356,6 +359,7 @@ { "#format" "{1:s},{2:d},{3:s},{4:s}" "en" "VIP-Player {1} (ID: {2}, Group: {3}) removed {4}" + "pt" "VIP Player {1} (ID: {2}, Grupo: {3}) removido {4}" "ru" "VIP-Игрок {1} (ID: {2}, Группа: {3}) удален {4}" } "MENU_LIST_VIP" @@ -368,13 +372,12 @@ "ru" "Список VIP-игроков" "ua" "Список VIP-гравців" } - "FIND_PLAYER" { "en" "Find a player" "fi" "Etsi pelaaja" "de" "Finde einen Spieler" - "pt" "Encontre um jogador" + "pt" "Encontre um player" "pt_p" "Encontre um jogador" "ru" "Найти игрока" "ua" "Знайти гравця" @@ -384,7 +387,7 @@ "en" "Show all" "fi" "Näytä kaikki" "de" "Zeige alles" - "pt" "Mostre tudo" + "pt" "Mostre todos players" "pt_p" "Mostre tudo" "ru" "Показать всех" "ua" "Показати всіх" @@ -460,6 +463,7 @@ "en" "No players available!" "fi" "Ei ole pelaajia saatavilla!" "de" "Es gibt keine ferfügbare Spieler!" + "pt" "Nenhum player disponível!" "pt_p" "Sem jogadores disponíveis" "ru" "Нет доступных игроков!" "ua" "Немає доступних гравців!" @@ -469,6 +473,7 @@ "en" "Couldn't load player!" "fi" "Ei voitu ladata pelaajaa!" "de" "Fehler beim Laden der Spieler!" + "pt" "Não foi possível carregar o player!" "pt_p" "Falha a carregar jogador!" "ru" "Не удалось загрузить игрока!" "ua" "Не вдалося завантажити гравця!" From 7704ccbefd1414efd7037f5a8d180d17a3b786ed Mon Sep 17 00:00:00 2001 From: crashzk Date: Mon, 8 Mar 2021 16:18:28 -0300 Subject: [PATCH 36/99] =?UTF-8?q?Update=20Portugu=C3=AAs-BR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addons/sourcemod/data/vip/cfg/groups.ini | 8 ++--- addons/sourcemod/data/vip/cfg/info.ini | 41 ++++++++++++++++++++---- addons/sourcemod/data/vip/cfg/times.ini | 12 +++++-- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/addons/sourcemod/data/vip/cfg/groups.ini b/addons/sourcemod/data/vip/cfg/groups.ini index f5b3a89..5778098 100644 --- a/addons/sourcemod/data/vip/cfg/groups.ini +++ b/addons/sourcemod/data/vip/cfg/groups.ini @@ -1,14 +1,12 @@ "VIP_GROUPS" { - "vip1" // Имя группы + "vip1" // Group name { - // Параметры - + // Options (VIP Core Modules) } - "vip2" // Имя группы + "vip2" { - // Параметры } } diff --git a/addons/sourcemod/data/vip/cfg/info.ini b/addons/sourcemod/data/vip/cfg/info.ini index 37dd724..cb3adee 100644 --- a/addons/sourcemod/data/vip/cfg/info.ini +++ b/addons/sourcemod/data/vip/cfg/info.ini @@ -2,8 +2,8 @@ { "connect_info_time" // Сообщение для VIP-игрока при входе на сервер (когда вип на время) { - // {NAME} - Ник игрока - // {GROUP} - Группа игрока + // {NAME} - Ник игрока + // {GROUP} - Группа игрока // {TIMELEFT} - Через сколько истекает VIP-статус // {EXPIRES} - Когда истекает VIP-статус @@ -11,10 +11,11 @@ { "ru" "{DEFAULT}Здравствуйте, {GREEN}{NAME}{DEFAULT}! Вы являетесь {LIGHTGREEN}VIP-игроком{DEFAULT}. Ваш VIP статус истекает {GREEN}{EXPIRES}" "en" "{DEFAULT}Hello, {GREEN}{NAME}{DEFAULT}! You have {LIGHTGREEN}VIP features {DEFAULT}for {GREEN}{EXPIRES}" + "pt" "{DEFAULT}Hello, {GREEN}{NAME}{DEFAULT}! You have {LIGHTGREEN}VIP features {DEFAULT}for {GREEN}{EXPIRES}" } "menu" // Сообщение в меню { - "time" "30" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) + "time" "12" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) "ru" { // Пукнты меню @@ -32,6 +33,15 @@ "item" "Expires: {EXPIRES}" "item" "Expires in: {TIMELEFT}" } + "pt" + { + "item" "You have a VIP-status" + "item" "SPACER" + "item" "Nick: {NAME}" + "item" "Group: {GROUP}" + "item" "Expires: {EXPIRES}" + "item" "Expires in: {TIMELEFT}" + } } } "connect_info_perm" // Сообщение для VIP-игрока при входе на сервер (когда вип навсегда) @@ -43,6 +53,7 @@ { "ru" "{DEFAULT}Здравствуйте, {GREEN}{NAME}{DEFAULT}! Вы являетесь {LIGHTGREEN}VIP-игроком{DEFAULT}." "en" "{DEFAULT}Hello, {GREEN}{NAME}{DEFAULT}! You have {LIGHTGREEN}VIP features{DEFAULT}." + "pt" "{DEFAULT}Hello, {GREEN}{NAME}{DEFAULT}! You have {LIGHTGREEN}VIP features{DEFAULT}." } "menu" // Сообщение в меню { @@ -58,13 +69,18 @@ "item" "You have a VIP-status" "item" "Group: {GROUP}" } + "pt" + { + "item" "You have a VIP-status" + "item" "Group: {GROUP}" + } } } "no_access_info" // Сообщение об остутствии VIP-статуса { "menu" // Сообщение в меню { - "time" "30" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) + "time" "12" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) "ru" { // Пукнты меню @@ -78,19 +94,26 @@ "item" "To purchase VIP-status" "item" "contact the administrator" } + "pt" + { + "item" "You do not have access to this menu !!!" + "item" "To purchase VIP-status" + "item" "contact the administrator" + } } "url" // Ссылка, которую нужно открыть { "ru" "http://mysite.ru/vip/no_access.php?lang=ru" "en" "http://mysite.ru/vip/no_access.php?lang=en" + "pt" "http://mysite.ru/vip/no_access.php?lang=pt" } } "expired_info" // Сообщение об истечении VIP-статуса { "menu" // Сообщение в меню { - "time" "30" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) + "time" "12" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) "ru" { // Пукнты меню @@ -104,6 +127,12 @@ "item" "To re-purchase VIP-status" "item" "contact the administrator" } + "pt" + { + "item" "Your VIP-status has expired." + "item" "To re-purchase VIP-status" + "item" "contact the administrator" + } } } -} \ No newline at end of file +} diff --git a/addons/sourcemod/data/vip/cfg/times.ini b/addons/sourcemod/data/vip/cfg/times.ini index bae4f80..3541983 100644 --- a/addons/sourcemod/data/vip/cfg/times.ini +++ b/addons/sourcemod/data/vip/cfg/times.ini @@ -1,38 +1,44 @@ "TIMES" { - "0" // Время в секундах + "0" // Time in seconds { - "ru" "Навсегда" // Отображение в меню - "en" "Permanent" // Отображение в меню + "ru" "Навсегда" // Display in the menu + "en" "Permanent" + "pt" "Permanente" } "3600" { "ru" "1 Час" "en" "1 Hour" + "pt" "1 Hora" } "86400" { "ru" "1 Сутки" "en" "1 Day" + "pt" "1 Dia" } "604800" { "ru" "1 Неделя" "en" "1 Week" + "pt" "1 Semana" } "2592000" { "ru" "1 Месяц" "en" "1 Month" + "pt" "1 Mês" } "15552000" { "ru" "6 Месяцев" "en" "6 Months" + "pt" "6 Mês" } } From ecd5d67a547edbb80d54cd95da3986f2f79a961f Mon Sep 17 00:00:00 2001 From: crashzk Date: Mon, 8 Mar 2021 16:21:05 -0300 Subject: [PATCH 37/99] Update info.ini --- addons/sourcemod/data/vip/cfg/info.ini | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/addons/sourcemod/data/vip/cfg/info.ini b/addons/sourcemod/data/vip/cfg/info.ini index cb3adee..758ee90 100644 --- a/addons/sourcemod/data/vip/cfg/info.ini +++ b/addons/sourcemod/data/vip/cfg/info.ini @@ -21,6 +21,7 @@ // Пукнты меню "item" "Вы имеете VIP-статус" "item" "SPACER" + "item" "Ник: {NAME}" "item" "Группа: {GROUP}" "item" "Истекает: {EXPIRES}" "item" "Истекает через: {TIMELEFT}" @@ -29,18 +30,19 @@ { "item" "You have a VIP-status" "item" "SPACER" + "item" "Nick: {NAME}" "item" "Group: {GROUP}" "item" "Expires: {EXPIRES}" "item" "Expires in: {TIMELEFT}" } "pt" { - "item" "You have a VIP-status" + "item" "Você tem um status VIP" "item" "SPACER" "item" "Nick: {NAME}" - "item" "Group: {GROUP}" - "item" "Expires: {EXPIRES}" - "item" "Expires in: {TIMELEFT}" + "item" "Grupo: {GROUP}" + "item" "Expira: {EXPIRES}" + "item" "Expira em: {TIMELEFT}" } } } @@ -71,8 +73,8 @@ } "pt" { - "item" "You have a VIP-status" - "item" "Group: {GROUP}" + "item" "Você tem um status VIP" + "item" "Grupo: {GROUP}" } } } From 9f8e8c8127e1d834b7495d6f3bb4faf30ed3ceb4 Mon Sep 17 00:00:00 2001 From: crashzk Date: Tue, 9 Mar 2021 13:03:16 -0300 Subject: [PATCH 38/99] Update info.ini --- addons/sourcemod/data/vip/cfg/info.ini | 32 +++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/sourcemod/data/vip/cfg/info.ini b/addons/sourcemod/data/vip/cfg/info.ini index 758ee90..4866851 100644 --- a/addons/sourcemod/data/vip/cfg/info.ini +++ b/addons/sourcemod/data/vip/cfg/info.ini @@ -11,7 +11,7 @@ { "ru" "{DEFAULT}Здравствуйте, {GREEN}{NAME}{DEFAULT}! Вы являетесь {LIGHTGREEN}VIP-игроком{DEFAULT}. Ваш VIP статус истекает {GREEN}{EXPIRES}" "en" "{DEFAULT}Hello, {GREEN}{NAME}{DEFAULT}! You have {LIGHTGREEN}VIP features {DEFAULT}for {GREEN}{EXPIRES}" - "pt" "{DEFAULT}Hello, {GREEN}{NAME}{DEFAULT}! You have {LIGHTGREEN}VIP features {DEFAULT}for {GREEN}{EXPIRES}" + "pt" "{DEFAULT}Olá, {GREEN}{NAME}{DEFAULT}! Você tem {LIGHTGREEN}status VIP {DEFAULT}para {GREEN}{EXPIRES}" } "menu" // Сообщение в меню { @@ -55,7 +55,7 @@ { "ru" "{DEFAULT}Здравствуйте, {GREEN}{NAME}{DEFAULT}! Вы являетесь {LIGHTGREEN}VIP-игроком{DEFAULT}." "en" "{DEFAULT}Hello, {GREEN}{NAME}{DEFAULT}! You have {LIGHTGREEN}VIP features{DEFAULT}." - "pt" "{DEFAULT}Hello, {GREEN}{NAME}{DEFAULT}! You have {LIGHTGREEN}VIP features{DEFAULT}." + "pt" "{DEFAULT}Olá, {GREEN}{NAME}{DEFAULT}! Você tem {LIGHTGREEN}status VIP{DEFAULT}." } "menu" // Сообщение в меню { @@ -86,21 +86,21 @@ "ru" { // Пукнты меню - "item" "У вас нет доступа к этому меню !!!" + "item" "У вас нет доступа к этому меню" "item" "Чтобы приобрести VIP-статус" - "item" "обратитесь к администратору" + "item" "Oбратитесь к администратору" } "en" { - "item" "You do not have access to this menu !!!" + "item" "You do not have access to this menu" "item" "To purchase VIP-status" - "item" "contact the administrator" + "item" "Contact the administrator" } "pt" { - "item" "You do not have access to this menu !!!" - "item" "To purchase VIP-status" - "item" "contact the administrator" + "item" "Você não tem acesso a este menu" + "item" "Para adquirir status VIP" + "item" "Contate o administrador" } } @@ -119,21 +119,21 @@ "ru" { // Пукнты меню - "item" "Срок вашего VIP-статуса истек." + "item" "Срок вашего VIP-статуса истек" "item" "Чтобы вновь приобрести VIP-статус" - "item" "обратитесь к администратору" + "item" "Oбратитесь к администратору" } "en" { - "item" "Your VIP-status has expired." + "item" "Your VIP-status has expired" "item" "To re-purchase VIP-status" - "item" "contact the administrator" + "item" "Contact the administrator" } "pt" { - "item" "Your VIP-status has expired." - "item" "To re-purchase VIP-status" - "item" "contact the administrator" + "item" "Seu status VIP venceu" + "item" "Para comprar novamente o status VIP" + "item" "Contate o administrador" } } } From 34df85c7ad58825b97069b69acbfd009b6224db9 Mon Sep 17 00:00:00 2001 From: crashzk Date: Tue, 9 Mar 2021 13:06:10 -0300 Subject: [PATCH 39/99] Update Translations --- addons/sourcemod/data/vip/cfg/info.ini | 2 +- addons/sourcemod/translations/vip_core.phrases.txt | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/sourcemod/data/vip/cfg/info.ini b/addons/sourcemod/data/vip/cfg/info.ini index 4866851..f958cd8 100644 --- a/addons/sourcemod/data/vip/cfg/info.ini +++ b/addons/sourcemod/data/vip/cfg/info.ini @@ -131,7 +131,7 @@ } "pt" { - "item" "Seu status VIP venceu" + "item" "Seu status VIP expirou" "item" "Para comprar novamente o status VIP" "item" "Contate o administrador" } diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index 54d04cb..8e34e20 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -331,7 +331,7 @@ { "#format" "{1:s},{2:d},{3:s},{4:s},{5:s}" "en" "VIP-Player {1} (ID: {2}, Group: {3}) changed the group to {4} {5}" - "pt" "VIP Player {1} (ID: {2}, Grupo: {3}) mudou o grupo para {4} {5}" + "pt" "VIP do Player {1} (ID: {2}, Grupo: {3}) mudou o grupo para {4} {5}" "ru" "VIP-Игроку {1} (ID: {2}, Группа: {3}) изменена группа на {4} {5}" } "MENU_DEL_VIP" @@ -359,7 +359,7 @@ { "#format" "{1:s},{2:d},{3:s},{4:s}" "en" "VIP-Player {1} (ID: {2}, Group: {3}) removed {4}" - "pt" "VIP Player {1} (ID: {2}, Grupo: {3}) removido {4}" + "pt" "VIP do Player {1} (ID: {2}, Grupo: {3}) removido {4}" "ru" "VIP-Игрок {1} (ID: {2}, Группа: {3}) удален {4}" } "MENU_LIST_VIP" @@ -405,7 +405,7 @@ "en" "Information:\n \nName:\n{1}\nSteamID:\n{2}\nGroup:\n{3}\nExpires:\n{4}" "fi" "Tiedotus:\n \nNimi:\n{1}\nSteamID:\n{2}\nRyhmä:\n{3}\nErääntyy:\n{4}" "de" "Accountinformationen:\n \nDer Name:\n{1}\nSteamID:\n{2}\nDie Gruppe:\n{3}\nLäuft ab:\n{4}" - "pt" "Informação:\n \nNome:\n{1}\nSteamID:\n{2}\nGrupo:\n{3}\nExpira:\n{4}" + "pt" "Informação:\n \nNick:\n{1}\nSteamID:\n{2}\nGrupo:\n{3}\nExpira:\n{4}" "pt_p" "Informação:\n \nNome:\n{1}\nSteamID:\n{2}\nGrupo:\n{3}\nExpira:\n{4}" "ru" "Информация:\n \nИмя:\n{1}\nSteamID:\n{2}\nГруппа:\n{3}\nИстекает:\n{4}" "ua" "Інформація:\n \nІм'я:\n{1}\nSteamID:\n{2}\nГрупа:\n{3}\nЗакінчується:\n{4}" @@ -624,7 +624,7 @@ "en" "Enter the chat Name/SteamID\n and press" "fi" "Kirjoita chattiin Nimi/SteamID\nja paina" "de" "Gehen Sie in den Chat Der Name/Nach SteamID" - "pt" "Digite Nome/SteamID\nno chat e confirme" + "pt" "Digite Nick/SteamID\nno chat e confirme" "pt_p" "Introduz no chat Nome/SteamID\ne confirmar" "ru" "Введите в чат Имя/SteamId\nи нажмите" "ua" "Введіть в чат Ім'я/SteamId\nі натисніть" From 7fe4ba557c026729a76a1ba1805adea24a12a87d Mon Sep 17 00:00:00 2001 From: crashzk Date: Tue, 9 Mar 2021 13:07:44 -0300 Subject: [PATCH 40/99] Update vip_core.phrases.txt --- addons/sourcemod/translations/vip_core.phrases.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index 8e34e20..baad758 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -147,7 +147,7 @@ { "#format" "{1:s},{2:d},{3:s},{4:s},{5:s},{6:s}" "en" "VIP-Player {1} (ID: {2}, Duration: {3}, Expires: {4}, Group: {5}) added {6}" - "pt" "Player VIP {1} (ID: {2}, Duração: {3}, Expira: {4}, Grupo: {5}) adicionado {6}" + "pt" "VIP do Player {1} (ID: {2}, Duração: {3}, Expira: {4}, Grupo: {5}) adicionado {6}" "ru" "VIP-Игрок {1} (ID: {2}, Длительность: {3}, Истекает: {4}, Группа: {5}) добавлен {6}" } "ADMIN_VIP_ADD_FAILED" From 55fc8592b24cccbdafb589f70dc42a7f04cc04a6 Mon Sep 17 00:00:00 2001 From: crashzk Date: Tue, 9 Mar 2021 13:09:11 -0300 Subject: [PATCH 41/99] Update vip_core.phrases.txt --- addons/sourcemod/translations/vip_core.phrases.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index baad758..9b41405 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -523,7 +523,7 @@ "en" "Reload VIP Settings" "fi" "Päivitetty VIP asetukset" "de" "VIP neu starten" - "pt" "Recarregar Configurações VIP" + "pt" "Recarregar Configurações do VIP" "pt_p" "Recarregar as configurações VIP" "ru" "Перезагрузить настройки VIP" "ua" "Перезавантажити налаштування VIP" @@ -533,7 +533,7 @@ "en" "VIP-settings has been reloaded!" "fi" "VIP-asetukset on käynnistetty uudelleen!" "de" "VIP-Einstellungen neu gestartet wurden!" - "pt" "As definições VIP foram atualizadas!" + "pt" "As configurações do VIP foram atualizadas!" "pt_p" "As definições VIP foram actualizadas!" "ru" "Настройки VIP перезагружены!" "ua" "Налаштування VIP були перезавантажені!" From 092fdf93dd7af8d93c5580901b1866e21b5e3855 Mon Sep 17 00:00:00 2001 From: freakexeuLow <32603929+freakexeuLow@users.noreply.github.com> Date: Sun, 11 Apr 2021 14:45:21 +0200 Subject: [PATCH 42/99] another update i hope is done now, errors were fixed --- .../translations/vip_core.phrases.txt | 165 ++++++++++-------- 1 file changed, 92 insertions(+), 73 deletions(-) diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index 03f198d..556571d 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -12,13 +12,13 @@ } "VIP_MENU_TITLE" { - "en" "| VIP MENU |" - "fi" "| VIP VALIKKO |" - "de" "| VIP MENÜ |" + "en" "|VIP MENU|" + "fi" "|VIP VALIKKO|" + "de" "|VIP MENÜ|" "pt" "| MENU VIP |" - "pt_p" "| MENU VIP |" - "ru" "| VIP МЕНЮ |" - "ua" "| VIP МЕНЮ |" + "pt_p" "|MENU VIP|" + "ru" "|VIP МЕНЮ|" + "ua" "|VIP МЕНЮ|" } "EXPIRES_IN" { @@ -35,7 +35,7 @@ { "en" "Disabled" "fi" "Pois Käytöstä" - "de" "Aus" + "de" "Deaktiviert" "pt" "Desativado" "pt_p" "Desativado" "ru" "Выключено" @@ -45,7 +45,7 @@ { "en" "Enabled" "fi" "Käytössä" - "de" "Ein" + "de" "Aktivieren" "pt" "Ativado" "pt_p" "Ativado" "ru" "Включено" @@ -67,7 +67,7 @@ "fi" "Ei saatavilla ominaisuuksia!" "de" "Es gibt keine Privilegien!" "pt" "Sem recursos disponíveis!" - "pt_p" "Sem recursos disponíveis!" + "pt_p" "Sem recursos disponíveis" "ru" "Нет доступных привилегий!" "ua" "Немає доступних функцій!" } @@ -75,7 +75,7 @@ { "en" "You do not have permission to access this command!" "fi" "Sinulla ei ole lupaa käyttää tätä komentoa!" - "de" "Sie haben kein Zugriff auf diesen Command!" + "de" "Sie haben kein Zugriff auf diesen Befehl!" "pt" "Você não tem permissão para acessar este comando!" "pt_p" "Não tens permissão para aceder a este comando!" "ru" "У вас нет прав для доступа к этой команде!" @@ -83,9 +83,9 @@ } "NO_VIP_PLAYERS_ONLINE" { - "en" "No VIP-Players online" + "en" "No VIP-players online" "fi" "Ei ole VIP-Pelaajia onlinessä" - "de" "Da sind keine VIP-Spieler dreizeit online" + "de" "Derzeit sind keine VIP-Spieler online" "pt" "Nenhum VIP Online" "pt_p" "Nenhum VIP Online" "ru" "Нет VIP-игроков онлайн" @@ -96,17 +96,17 @@ "#format" "{1:L}" "en" "{1}'s VIP has expired, removing player..." "fi" "{1} VIP oikeudet ovat päättyneet, poistetaan pelaajaa..." - "de" "VIP des {1} hat abgelaufen, Spieler wird entfernt..." + "de" "VIP von {1} ist abgelaufen, Spieler wird entfernt..." "pt" "VIP do {1} expirou, removendo o player..." - "pt_p" "{1} o teu VIP expirou, a remover jogador..." + "pt_p" "{1} o teu VIP expirou, a remover jogador.." "ru" "Права VIP-игрока {1} истекли, удаление игрока..." "ua" "Термін дії VIP гравця {1} закінчився, видалення гравця..." } "VIP_ADMIN_MENU_TITLE" { - "en" "Manage VIP System" + "en" "Manage VIP system" "fi" "Hallinta VIP" - "de" "VIP Administrieren" + "de" "VIP-System verwalten" "pt" "Gerenciar Sistema VIP" "pt_p" "Gerir Sistema VIP" "ru" "Администрирование VIP" @@ -114,7 +114,7 @@ } "MENU_ADD_VIP" { - "en" "Add VIP-Player" + "en" "Add VIP-player" "fi" "Lisätä VIP-pelaaja" "de" "VIP-Spieler hinzufügen" "pt" "Adicionar VIP" @@ -135,7 +135,7 @@ "ADMIN_VIP_ADD_SUCCESS" { "#format" "{1:s},{2:d}" - "en" "VIP-Player {1} ({2}, ID: {3}) successfully added!" + "en" "VIP-player {1} ({2}, ID: {3}) successfully added!" "fi" "VIP-Pelaaja {1} ({2}, ID: {3}) onnistuneesti lisätty!" "de" "VIP-Spieler {1} ({2}, ID: {3}) erfolgreich hinzugefügt!" "pt" "VIP adicionado {1} ({2}, ID: {3}) com sucesso!" @@ -143,13 +143,16 @@ "ru" "{DEFAULT}VIP-Игрок {GREEN}{1} {DEFAULT}(ID: {GREEN}{2}{DEFAULT}) успешно добавлен!" "ua" "{DEFAULT}VIP-Гравець {GREEN}{1} {DEFAULT}(ID: {GREEN}{2}{DEFAULT}) успішно доданий!" } + "LOG_VIP_ADDED" { "#format" "{1:s},{2:d},{3:s},{4:s},{5:s},{6:s}" "en" "VIP-Player {1} (ID: {2}, Duration: {3}, Expires: {4}, Group: {5}) added {6}" + "de" "VIP-Spieler {1} (ID: {2}, Laufzeit: {3}, Läuft ab: {4}, Gruppe: {5}) Hinzugefügt {6}" "pt" "Player VIP {1} (ID: {2}, Duração: {3}, Expira: {4}, Grupo: {5}) adicionado {6}" "ru" "VIP-Игрок {1} (ID: {2}, Длительность: {3}, Истекает: {4}, Группа: {5}) добавлен {6}" } + "ADMIN_VIP_ADD_FAILED" { "en" "Failed to add VIP-ID!" @@ -160,9 +163,10 @@ "ru" "Ошибка добавления VIP-игрока!" "ua" "Помилка створення VIP-гравця!" } + "MENU_EDIT_VIP" { - "en" "Edit VIP-Player" + "en" "Edit VIP-player" "fi" "Muokaa VIP-pelaaja" "de" "VIP-Spieler ändern" "pt" "Editar Player VIP" @@ -172,21 +176,21 @@ } "MENU_EDIT_TIME" { - "en" "Edit Time" + "en" "Edit time" "fi" "Muokaa aikaa" "de" "Zeit ändern" "pt" "Editar Tempo" - "pt_p" "Editar Tempo" + "pt_p" "Editar tempo" "ru" "Изменить срок" "ua" "Змінити термін" } "MENU_TIME_SET" { - "en" "Set Period" + "en" "Set period" "fi" "Aseta ajanjaksoa" "de" "Frist festlegen" "pt" "Definir Período" - "pt_p" "Definir Período" + "pt_p" "Definir período" "ru" "Установить срок" "ua" "Встановити термін" } @@ -195,7 +199,7 @@ "#format" "{1:s},{2:s}" "en" "The player {1} set the duration of VIP-status to {2}" "fi" "Pelaajalle {1} on asetettu VIP-statuksen kesto {2}" - "de" "Geben Sie in den Chat die Name, SteamID oder die IP-Adresse" + "de" "Der Spieler {1} hat die Dauer des VIP-Status auf {2} gesetzt" "pt" "Player {1} definiu a duração do VIP como {2}" "pt_p" "O jogador {1} definiu a duração de VIP para {2}" "ru" "Игроку {1} установлена длительность VIP-статуса до {2}" @@ -205,19 +209,19 @@ { "en" "Admin {1} has set {2} VIP's duration to {3}" "fi" "Admin {1} on asettanut VIP-pelaajalle {2} VIP keston tilalle {3}" - "de" "Admin {1} {2}s VIP-Dauer um {3} eingestellt" + "de" "Admin {1} hat {2} VIPs Dauer auf {3} eingestellt" "pt" "Administrador {1} definiu a duração de VIP {2} para {3}" - "pt_p" "Admin {1} definiu a duração de VIP {2} para {3}" + "pt_p" "O Admin {1} definiu a duração de VIP {2} para {3}" "ru" "Админ {1} установил длительность VIP-статуса игроку {2} до {3}" "ua" "Адмін {1} встановив тривалість VIP гравцю {2} до {3}" } "MENU_TIME_ADD" { - "en" "Add Time" + "en" "Add time" "fi" "Lisää aikaa" - "de" "Zeiten verlängern" + "de" "Zeit hinzufügen" "pt" "Adicionar Tempo" - "pt_p" "Adicionar Tempo" + "pt_p" "Adicionar tempo" "ru" "Добавить время" "ua" "Додати час" } @@ -226,7 +230,8 @@ "#format" "{1:s},{2:s}" "en" "{1}'s VIP was extended for {2}" "fi" "VIP-pelaajan kesto pidenetään {1} tilalle {2}" - "de" "VIP des {1} war verlängt für {2}" + "de" "{1} VIP wurde verlängert für {2}" + "pt" "{1}'s VIP foi extendido por {2}" "pt_p" "{1}'s VIP foi extendido por {2}" "ru" "Продлен срок VIP-игроку {1} на {2}" "ua" "Продовжено термін VIP-гравцю {1} на {2}" @@ -236,7 +241,7 @@ "#format" "{1:L},{2:s},{3:s}" "en" "Admin {1} has extented {2}'s VIP for {3}" "fi" "Admin {1} Pidensi keston VIP-pelaajalle {2} tilalle {3}" - "de" "Admin {1} hat verlängt VIP des {2} für {3}" + "de" "Admin {1} verlängert das VIP von {2} für {3}" "pt" "Administrador {1} extendeu o VIP de {2} por {3}" "pt_p" "Admin {1} extendeu o VIP de {2}'s por {3}" "ru" "Админ {1} продлил срок VIP-игроку {2} на {3}" @@ -246,18 +251,18 @@ { "en" "Unable to extend this player's VIP" "fi" "Et voi pidentää aikaa VIP-pelaajalle" - "de" "Fehler beim VIP des Spielers Fortsetzung" + "de" "VIP dieses Spielers kann nicht verlängert werden" "pt_p" "Não é possível prolongar o VIP deste jogador" "ru" "Нельзя продлить длительность этому VIP-игроку" "ua" "Неможливо продовжити VIP цього гравця" } "MENU_TIME_TAKE" { - "en" "Reduce Time" + "en" "Reduce time" "fi" "Vähennä aikaa" - "de" "Zeiten verkürzen" + "de" "Zeit verkürzen" "pt" "Reduzir Tempo" - "pt_p" "Reduzir Tempo" + "pt_p" "Reduzir período" "ru" "Отнять время" "ua" "Скоротити термін" } @@ -265,7 +270,7 @@ { "en" "Unable to reduce this player's VIP" "fi" "Et voi vähentää aikaa tältä VIP-pelaajalta" - "de" "Fehler beim VIP des Spielers Verkürzung" + "de" "VIP dieses Spielers kann nicht reduziert werden" "pt" "Não é possível reduzir o VIP deste player" "pt_p" "Não é possível reduzir o VIP deste jogador" "ru" "Нельзя отнять время у этого VIP-игрока" @@ -276,7 +281,7 @@ "#format" "{1:s},{2:s}" "en" "{1}'s VIP was reduces for {2}" "fi" "Vähenetty aikaa VIP-pelaajalle {1} tilalle {2}" - "de" "VIP des {1} war verkürzt für {2}" + "de" "VIP des {1} wurde verkürzt für {2}" "pt" "VIP de {1} foi reduzido para {2}" "pt_p" "{1}'s VIP foi reduzido para {2}" "ru" "Сокращен срок VIP-игроку {1} на {2}" @@ -287,7 +292,7 @@ "#format" "{1:L},{2:s},{3:s}" "en" "Admin {1} has reduced {2}'s VIP for {3}" "fi" "Admin {1} Vähensi aikaa VIP-pelaajalle {2} tilalle {3}" - "de" "Админ {1} hat verkürzt VIP des {2} für {3}" + "de" "Admin {1} reduziert VIP {2} für {3}" "pt" "Administrador {1} reduziu o VIP de {2} para {3}" "pt_p" "O Admin {1} reduziu o VIP de {2} para {3}" "ru" "Админ {1} сократил срок VIP-игроку {2} на {3}" @@ -295,7 +300,7 @@ } "MENU_EDIT_GROUP" { - "en" "Edit VIP-Group" + "en" "Edit VIP-group" "fi" "Muuta VIP-Ryhmää" "de" "VIP-Gruppe ändern" "pt" "Editar Grupo VIP" @@ -318,7 +323,7 @@ "#format" "{1:s},{2:s}" "en" "{1}'s VIP-group was changed to {2}" "fi" "Ryhmä VIP-pelaajalle {1} vaihdettu tilalle {2}" - "de" "VIP-Gruppe des {1} war geändert auf {2}" + "de" "VIP-Gruppe {1} wurde geändert auf {2}" "pt" "Grupo VIP de {1} foi alterado para {2}" "pt_p" "{1}'s Grupo VIP alterado para {2}" "ru" "Группа VIP-игроку {1} изменена на {2}" @@ -328,6 +333,7 @@ { "#format" "{1:s},{2:d},{3:s},{4:s},{5:s}" "en" "VIP-Player {1} (ID: {2}, Group: {3}) changed the group to {4} {5}" + "de" "VIP-Spieler {1} (ID: {2}, Gruppe: {3}) änderte die Gruppe auf {4} {5}" "ru" "VIP-Игроку {1} (ID: {2}, Группа: {3}) изменена группа на {4} {5}" } "MENU_DEL_VIP" @@ -345,23 +351,25 @@ "#format" "{1:s},{2:i}" "en" "VIP-player {1} (ID: {2}) was successfully removed" "fi" "VIP-Pelaaja {1} (ID: {2}) on onnistuneesti poistettu" - "de" "VIP-Spieler {1} (ID: {2}) war erfolgreich gelöscht" + "de" "VIP-Spieler {1} (ID: {2}) wurde erfolgreich gelöscht" "pt" "VIP do player {1} (ID: {2}) foi removido com sucesso" "pt_p" "O VIP do jogador {1} (ID: {2}) foi removido com sucesso" "ru" "VIP-игрок {1} (ID: {2}) успешно удален" "ua" "VIP-гравець {1} (ID: {2}) успішно видалений" } + "LOG_VIP_DELETED" { "#format" "{1:s},{2:d},{3:s},{4:s}" "en" "VIP-Player {1} (ID: {2}, Group: {3}) removed {4}" + "de" "VIP-Spieler {1} (ID: {2}, Gruppe: {3}) entfernt {4}" "ru" "VIP-Игрок {1} (ID: {2}, Группа: {3}) удален {4}" } "MENU_LIST_VIP" { "en" "List VIP-players" "fi" "Lista VIP-Pelaajista" - "de" "Liste der Spieler" + "de" "VIP Spieler Liste" "pt" "Lista de Players VIP" "pt_p" "Listar VIP's" "ru" "Список VIP-игроков" @@ -371,6 +379,7 @@ { "#format" "{1:s},{2:d}" "en" "On request: {1}\nFound: {2} players" + "de" "Auf Anfrage: {1}\nGefunden: {2} Spieler" "ru" "По запросу: {1}\nНайдено: {2} игроков" "ua" "За запитом: {1}\nЗнайдено: {2} гравців" } @@ -379,8 +388,7 @@ "#format" "{1:s},{2:s},{3:s},{4:s}" "en" "Information:\n \nName:\n{1}\nSteamID:\n{2}\nGroup:\n{3}\nExpires:\n{4}" "fi" "Tiedotus:\n \nNimi:\n{1}\nSteamID:\n{2}\nRyhmä:\n{3}\nErääntyy:\n{4}" - "de" "Accountinformationen:\n \nDer Name:\n{1}\nSteamID:\n{2}\nDie Gruppe:\n{3}\nLäuft ab:\n{4}" - "pt" "Informação:\n \nNome:\n{1}\nSteamID:\n{2}\nGrupo:\n{3}\nExpira:\n{4}" + "de" "Accountinformationen:\n \nName:\n{1}\nSteamID:\n{2}\nGruppe:\n{3}\nLäuft ab:\n{4}" "pt_p" "Informação:\n \nNome:\n{1}\nSteamID:\n{2}\nGrupo:\n{3}\nExpira:\n{4}" "ru" "Информация:\n \nИмя:\n{1}\nSteamID:\n{2}\nГруппа:\n{3}\nИстекает:\n{4}" "ua" "Інформація:\n \nІм'я:\n{1}\nSteamID:\n{2}\nГрупа:\n{3}\nЗакінчується:\n{4}" @@ -388,6 +396,7 @@ "TEMPORARY" { "en" "Temporary" + "de" "Temporär" "pt" "Temporário" "ru" "Временный" "ua" "Тимчасовий" @@ -396,7 +405,7 @@ { "en" "Information" "fi" "Tiedotus" - "de" "Information" + "de" "Informationen" "pt" "Informação" "pt_p" "Informação" "ru" "Информация" @@ -426,7 +435,7 @@ { "en" "ERROR" "fi" "Virhe" - "de" "ERROR" + "de" "FEHLER" "pt" "ERRO" "pt_p" "ERRO" "ru" "Произошла ошибка" @@ -437,7 +446,7 @@ { "en" "No players available!" "fi" "Ei ole pelaajia saatavilla!" - "de" "Es gibt keine ferfügbare Spieler!" + "de" "Keine Spieler vorhanden!" "pt_p" "Sem jogadores disponíveis" "ru" "Нет доступных игроков!" "ua" "Немає доступних гравців!" @@ -446,28 +455,28 @@ { "en" "Couldn't load player!" "fi" "Ei voitu ladata pelaajaa!" - "de" "Fehler beim Laden der Spieler!" + "de" "Konnte Spieler nicht laden!" "pt_p" "Falha a carregar jogador!" "ru" "Не удалось загрузить игрока!" "ua" "Не вдалося завантажити гравця!" } "VIP_PLAYERS" { - "en" "VIP Players" - "fi" "VIP Pelaajat" - "de" "VIP Spieler" + "en" "VIP-players" + "fi" "VIP-Pelaajat" + "de" "VIP-Spieler" "pt" "Players VIP" "pt_p" "VIP's" - "ru" "VIP игроки" - "ua" "VIP гравці" + "ru" "VIP-игроки" + "ua" "VIP-гравці" } "NO_GROUPS_AVAILABLE" { "en" "No groups available!" "fi" "Ei ole ryhmiä saatavilla!" - "de" "Es gibt keine Gruppen!" + "de" "Keine Gruppen verfügbar!" "pt" "Sem grupos disponíveis!" - "pt_p" "Sem grupos disponíveis!" + "pt_p" "Sem grupos disponíveis" "ru" "Нет доступных групп!" "ua" "Немає доступних груп!" } @@ -475,7 +484,7 @@ { "en" "Reload VIP-players" "fi" "Ladata uudelleen VIP-pelaajat" - "de" "VIP-Spieler neu starten" + "de" "VIP-Spieler neu laden" "pt" "Recarregar Players com VIP" "pt_p" "Recarregar Jogadores VIP" "ru" "Перезагрузить VIP-игроков" @@ -485,17 +494,17 @@ { "en" "VIP-cache has been refreshed!" "fi" "Luettelo VIP-pelaajille on käynnistetty uudelleen!" - "de" "Liste der VIP-Spieler neu gestartet wurde!" + "de" "VIP-Cache wurde aktualisiert!" "pt" "Cache dos VIPS foi atualizado!" - "pt_p" "A cache dos VIP's foi actualizada!" + "pt_p" "A cache dos VIP's foi actualizada" "ru" "Список VIP-игроков перезагружен!" "ua" "Кеш VIP було оновлено!" } "ADMIN_MENU_RELOAD_VIP_CFG" { - "en" "Reload VIP Settings" + "en" "Reload the VIP settings" "fi" "Päivitetty VIP asetukset" - "de" "VIP neu starten" + "de" "VIP-Einstellungen neu laden" "pt" "Recarregar Configurações VIP" "pt_p" "Recarregar as configurações VIP" "ru" "Перезагрузить настройки VIP" @@ -505,39 +514,49 @@ { "en" "VIP-settings has been reloaded!" "fi" "VIP-asetukset on käynnistetty uudelleen!" - "de" "VIP-Einstellungen neu gestartet wurden!" + "de" "Die VIP-Einstellungen wurden neu geladen!" "pt" "As definições VIP foram atualizadas!" - "pt_p" "As definições VIP foram actualizadas!" + "pt_p" "As definições VIP foram actualizadas" "ru" "Настройки VIP перезагружены!" "ua" "Налаштування VIP були перезавантажені!" } + "BY_ADMIN" { "en" "by admin" + "de" "von admin" "pt" "por administrador" "ru" "админом" } + "BY_SERVER" { "en" "by server" + "en" "von Server" "pt" "por servidor" "ru" "сервером" } + "BY_PLUGIN" { "en" "by plugin" + "de" "durch Plugin" "pt" "por plugin" "ru" "плагином" } + "REASON_EXPIRED" { "en" "Expired" + "de" "Abgelaufen" "pt" "Expirado" "ru" "Истек срок" } + "REASON_INACTIVITY" { "en" "For inactivity" + "de" "Für Inaktivität" "pt" "Por inatividade" "ru" "По неактивности" } @@ -555,7 +574,7 @@ { "en" "None" "fi" "Ei Mitään" - "de" "Kein(e)" + "de" "Keine" "pt" "Nenhum" "pt_p" "Nenhum" "ru" "Нет" @@ -565,7 +584,7 @@ { "en" "Never" "fi" "Ei koskaan" - "de" "Nie" + "de" "Niemals" "pt" "Nunca" "pt_p" "Nunca" "ru" "Никогда" @@ -594,11 +613,11 @@ } "ENTER_AUTH" { - "en" "Enter the chat Name/SteamID\n and press" + "en" "Enter the chat Name/SteamID\nand press" "fi" "Kirjoita chattiin Nimi/SteamID\nja paina" - "de" "Gehen Sie in den Chat Der Name/Nach SteamID" + "de" "Gehen Sie in den Chat den Namen/SteamID\nund drücken Sie" "pt" "Digite Nome/SteamID\nno chat e confirme" - "pt_p" "Introduz no chat Nome/SteamID\ne confirmar" + "pt_p" "Introduz no chat Nome/SteamID\nand Confirmar" "ru" "Введите в чат Имя/SteamId\nи нажмите" "ua" "Введіть в чат Ім'я/SteamId\nі натисніть" } @@ -616,7 +635,7 @@ { "en" "Incorrect time" "fi" "Virhellinen aika" - "de" "Falsches Zeit" + "de" "Falsche Zeit" "pt" "Período incorrecto" "pt_p" "Período incorrecto" "ru" "Некорректное время" @@ -636,7 +655,7 @@ { "en" "Incorrect usage" "fi" "virheellinen käyttö" - "de" "Falscheingabe" + "de" "Falsche Eingabe" "pt" "Uso incorreto" "pt_p" "Uso incorreto" "ru" "Неверное использование" @@ -657,7 +676,7 @@ { "en" "This player already has VIP!" "fi" "Tämä pelaaja on jo VIP!" - "de" "Dieser Spieler schon hat VIP-Zugriff!" + "de" "Dieser Spieler hat schon VIP-Zugriff!" "pt" "Este player já tem VIP!" "pt_p" "Este jogador já tem VIP!" "ru" "Игрок уже является VIP-игроком!" @@ -667,7 +686,7 @@ { "en" "Specified admin-group does not exist!" "fi" "Määritelty admin-ryhmä ei ole olemassa!" - "de" "Diese admin-Guppe existiert nicht!" + "de" "Diese Admin-Gruppe existiert nicht!" "pt" "Grupo de administração especificado não existe!" "pt_p" "O grupo-admin especificado não existe!" "ru" "Указанная админ-группа не существует!" @@ -677,7 +696,7 @@ { "en" "Specified VIP-group does not exist!" "fi" "Määritelty VIP-ryhmä ei ole olemassa!" - "de" "Diese VIP-Guppe existiert nicht!" + "de" "Diese VIP-Gruppe existiert nicht!" "pt" "Grupo VIP especificado não existe!" "pt_p" "O grupo VIP especificado não existe!" "ru" "Указанная VIP-группа не существует!" @@ -689,7 +708,7 @@ "fi" "v." "de" "j." "pt" "a." - "pt_p" "a." + "pt_p" "ano." "ru" "г." "es" "a." "ua" "р." From 1a752846f6072129d21c16c55de6e2d8392db62f Mon Sep 17 00:00:00 2001 From: freakexeuLow <32603929+freakexeuLow@users.noreply.github.com> Date: Sun, 11 Apr 2021 14:52:23 +0200 Subject: [PATCH 43/99] Update vip_core.phrases.txt --- addons/sourcemod/translations/vip_core.phrases.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index 556571d..fd7b218 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -15,7 +15,7 @@ "en" "|VIP MENU|" "fi" "|VIP VALIKKO|" "de" "|VIP MENÜ|" - "pt" "| MENU VIP |" + "pt" "|MENU VIP|" "pt_p" "|MENU VIP|" "ru" "|VIP МЕНЮ|" "ua" "|VIP МЕНЮ|" @@ -148,7 +148,7 @@ { "#format" "{1:s},{2:d},{3:s},{4:s},{5:s},{6:s}" "en" "VIP-Player {1} (ID: {2}, Duration: {3}, Expires: {4}, Group: {5}) added {6}" - "de" "VIP-Spieler {1} (ID: {2}, Laufzeit: {3}, Läuft ab: {4}, Gruppe: {5}) Hinzugefügt {6}" + "de" "VIP-Spieler {1} (ID: {2}, Laufzeit: {3}, Läuft ab: {4}, Gruppe: {5}) Hinzugefügt {6}" "pt" "Player VIP {1} (ID: {2}, Duração: {3}, Expira: {4}, Grupo: {5}) adicionado {6}" "ru" "VIP-Игрок {1} (ID: {2}, Длительность: {3}, Истекает: {4}, Группа: {5}) добавлен {6}" } From 1a13530a2cc7bd76bc03ccec0b5bfb0210b2b558 Mon Sep 17 00:00:00 2001 From: freakexeuLow <32603929+freakexeuLow@users.noreply.github.com> Date: Sun, 11 Apr 2021 14:53:43 +0200 Subject: [PATCH 44/99] Update vip_core.phrases.txt --- addons/sourcemod/translations/vip_core.phrases.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index fd7b218..9808a5c 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -211,7 +211,7 @@ "fi" "Admin {1} on asettanut VIP-pelaajalle {2} VIP keston tilalle {3}" "de" "Admin {1} hat {2} VIPs Dauer auf {3} eingestellt" "pt" "Administrador {1} definiu a duração de VIP {2} para {3}" - "pt_p" "O Admin {1} definiu a duração de VIP {2} para {3}" + "pt_p" "Admin {1} definiu a duração de VIP {2} para {3}" "ru" "Админ {1} установил длительность VIP-статуса игроку {2} до {3}" "ua" "Адмін {1} встановив тривалість VIP гравцю {2} до {3}" } From 7261cec883be7f19539bd1d97605b16b28e2d383 Mon Sep 17 00:00:00 2001 From: crashzk Date: Sat, 17 Apr 2021 12:43:45 -0300 Subject: [PATCH 45/99] Fix Minors Data --- addons/sourcemod/data/vip/cfg/groups.ini | 4 ++-- addons/sourcemod/data/vip/cfg/times.ini | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/sourcemod/data/vip/cfg/groups.ini b/addons/sourcemod/data/vip/cfg/groups.ini index 5778098..5f20d1a 100644 --- a/addons/sourcemod/data/vip/cfg/groups.ini +++ b/addons/sourcemod/data/vip/cfg/groups.ini @@ -1,8 +1,8 @@ "VIP_GROUPS" { - "vip1" // Group name + "vip1" // Имя группы | Group name { - // Options (VIP Core Modules) + // Опции (основные VIP-модули) | Options (VIP Core Modules) } "vip2" diff --git a/addons/sourcemod/data/vip/cfg/times.ini b/addons/sourcemod/data/vip/cfg/times.ini index 3541983..33074e4 100644 --- a/addons/sourcemod/data/vip/cfg/times.ini +++ b/addons/sourcemod/data/vip/cfg/times.ini @@ -1,8 +1,8 @@ "TIMES" { - "0" // Time in seconds + "0" // Время в секундах | Time in seconds { - "ru" "Навсегда" // Display in the menu + "ru" "Навсегда" // Отображение в меню | Display in the menu "en" "Permanent" "pt" "Permanente" } From 792fea78f102935bb0e19ee90e7bf68cc0dcdd5f Mon Sep 17 00:00:00 2001 From: crashzk Date: Sat, 17 Apr 2021 12:48:03 -0300 Subject: [PATCH 46/99] Update vip_core.phrases.txt --- addons/sourcemod/translations/vip_core.phrases.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index 9b41405..5d405fc 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -651,9 +651,9 @@ } "FIND_THE_ID_FAIL" { - "en" "Synax: sm_delvip " + "en" "Synax: sm_delvip " "fi" "Käyttö: sm_delvip " - "de" "Synax: sm_delvip " + "de" "Synax: sm_delvip " "pt" "Sintaxe: sm_delvip " "pt_p" "Sintaxe: sm_delvip " "ru" "Используйте: sm_delvip <идентификатор>" From a1f5268f2fc90eca576069279b6857d1f195b9c8 Mon Sep 17 00:00:00 2001 From: crashzk Date: Sat, 17 Apr 2021 13:06:34 -0300 Subject: [PATCH 47/99] Update vip_core.phrases.txt --- .../translations/vip_core.phrases.txt | 94 ++++++++++--------- 1 file changed, 52 insertions(+), 42 deletions(-) diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index 5d405fc..9d53479 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -35,7 +35,7 @@ { "en" "Disabled" "fi" "Pois Käytöstä" - "de" "Aus" + "de" "Deaktiviert" "pt" "Desativado" "pt_p" "Desativado" "ru" "Выключено" @@ -45,7 +45,7 @@ { "en" "Enabled" "fi" "Käytössä" - "de" "Ein" + "de" "Aktivieren" "pt" "Ativado" "pt_p" "Ativado" "ru" "Включено" @@ -75,7 +75,7 @@ { "en" "You do not have permission to access this command!" "fi" "Sinulla ei ole lupaa käyttää tätä komentoa!" - "de" "Sie haben kein Zugriff auf diesen Command!" + "de" "Sie haben kein Zugriff auf diesen Befehl!" "pt" "Você não tem permissão para acessar este comando!" "pt_p" "Não tens permissão para aceder a este comando!" "ru" "У вас нет прав для доступа к этой команде!" @@ -85,7 +85,7 @@ { "en" "No VIP-Players online" "fi" "Ei ole VIP-Pelaajia onlinessä" - "de" "Da sind keine VIP-Spieler dreizeit online" + "de" "Derzeit sind keine VIP-Spieler online" "pt" "Nenhum VIP Online" "pt_p" "Nenhum VIP Online" "ru" "Нет VIP-игроков онлайн" @@ -96,7 +96,7 @@ "#format" "{1:L}" "en" "{1}'s VIP has expired, removing player..." "fi" "{1} VIP oikeudet ovat päättyneet, poistetaan pelaajaa..." - "de" "VIP des {1} hat abgelaufen, Spieler wird entfernt..." + "de" "VIP von {1} ist abgelaufen, Spieler wird entfernt..." "pt" "VIP do {1} expirou, removendo o player..." "pt_p" "{1} o teu VIP expirou, a remover jogador..." "ru" "Права VIP-игрока {1} истекли, удаление игрока..." @@ -106,7 +106,7 @@ { "en" "Manage VIP System" "fi" "Hallinta VIP" - "de" "VIP Administrieren" + "de" "VIP-System Verwalten" "pt" "Gerenciar Sistema VIP" "pt_p" "Gerir Sistema VIP" "ru" "Администрирование VIP" @@ -147,6 +147,7 @@ { "#format" "{1:s},{2:d},{3:s},{4:s},{5:s},{6:s}" "en" "VIP-Player {1} (ID: {2}, Duration: {3}, Expires: {4}, Group: {5}) added {6}" + "de" "VIP-Spieler {1} (ID: {2}, Laufzeit: {3}, Läuft ab: {4}, Gruppe: {5}) Hinzugefügt {6}" "pt" "VIP do Player {1} (ID: {2}, Duração: {3}, Expira: {4}, Grupo: {5}) adicionado {6}" "ru" "VIP-Игрок {1} (ID: {2}, Длительность: {3}, Истекает: {4}, Группа: {5}) добавлен {6}" } @@ -195,7 +196,7 @@ "#format" "{1:s},{2:s}" "en" "The player {1} set the duration of VIP-status to {2}" "fi" "Pelaajalle {1} on asetettu VIP-statuksen kesto {2}" - "de" "Geben Sie in den Chat die Name, SteamID oder die IP-Adresse" + "de" "Der Spieler {1} hat die Dauer des VIP-Status auf {2} gesetzt" "pt" "Player {1} definiu a duração do VIP como {2}" "pt_p" "O jogador {1} definiu a duração de VIP para {2}" "ru" "Игроку {1} установлена длительность VIP-статуса до {2}" @@ -206,7 +207,7 @@ "#format" "{1:L},{2:s},{3:s}" "en" "Admin {1} has set {2} VIP's duration to {3}" "fi" "Admin {1} on asettanut VIP-pelaajalle {2} VIP keston tilalle {3}" - "de" "Admin {1} {2}s VIP-Dauer um {3} eingestellt" + "de" "Admin {1} hat {2} VIPs Dauer auf {3} eingestellt" "pt" "Administrador {1} definiu a duração de VIP {2} para {3}" "pt_p" "Admin {1} definiu a duração de VIP {2} para {3}" "ru" "Админ {1} установил длительность VIP-статуса игроку {2} до {3}" @@ -227,9 +228,9 @@ "#format" "{1:s},{2:s}" "en" "{1}'s VIP was extended for {2}" "fi" "VIP-pelaajan kesto pidenetään {1} tilalle {2}" - "de" "VIP des {1} war verlängt für {2}" + "de" "{1} VIP wurde verlängert für {2}" "pt" "VIP de {1} foi estendido para {2}" - "pt_p" "{1}'s VIP foi estendido por {2}" + "pt_p" "{1}'s VIP foi extendido por {2}" "ru" "Продлен срок VIP-игроку {1} на {2}" "ua" "Продовжено термін VIP-гравцю {1} на {2}" } @@ -238,7 +239,7 @@ "#format" "{1:L},{2:s},{3:s}" "en" "Admin {1} has extented {2}'s VIP for {3}" "fi" "Admin {1} Pidensi keston VIP-pelaajalle {2} tilalle {3}" - "de" "Admin {1} hat verlängt VIP des {2} für {3}" + "de" "Admin {1} verlängert das VIP von {2} für {3}" "pt" "Administrador {1} estendeu o VIP de {2} por {3}" "pt_p" "Admin {1} extendeu o VIP de {2}'s por {3}" "ru" "Админ {1} продлил срок VIP-игроку {2} на {3}" @@ -248,7 +249,7 @@ { "en" "Unable to extend this player's VIP" "fi" "Et voi pidentää aikaa VIP-pelaajalle" - "de" "Fehler beim VIP des Spielers Fortsetzung" + "de" "VIP dieses Spielers kann nicht verlängert werden" "pt" "Incapaz de estender o VIP deste player" "pt_p" "Não é possível prolongar o VIP deste jogador" "ru" "Нельзя продлить длительность этому VIP-игроку" @@ -256,11 +257,11 @@ } "MENU_TIME_TAKE" { - "en" "Reduce Time" + "en" "Reduce time" "fi" "Vähennä aikaa" - "de" "Zeiten verkürzen" + "de" "Zeit verkürzen" "pt" "Reduzir Tempo" - "pt_p" "Reduzir Tempo" + "pt_p" "Reduzir período" "ru" "Отнять время" "ua" "Скоротити термін" } @@ -268,7 +269,7 @@ { "en" "Unable to reduce this player's VIP" "fi" "Et voi vähentää aikaa tältä VIP-pelaajalta" - "de" "Fehler beim VIP des Spielers Verkürzung" + "de" "VIP dieses Spielers kann nicht reduziert werden" "pt" "Não é possível reduzir o VIP deste player" "pt_p" "Não é possível reduzir o VIP deste jogador" "ru" "Нельзя отнять время у этого VIP-игрока" @@ -279,7 +280,7 @@ "#format" "{1:s},{2:s}" "en" "{1}'s VIP was reduces for {2}" "fi" "Vähenetty aikaa VIP-pelaajalle {1} tilalle {2}" - "de" "VIP des {1} war verkürzt für {2}" + "de" "VIP des {1} wurde verkürzt für {2}" "pt" "VIP de {1} foi reduzido para {2}" "pt_p" "{1}'s VIP foi reduzido para {2}" "ru" "Сокращен срок VIP-игроку {1} на {2}" @@ -290,7 +291,7 @@ "#format" "{1:L},{2:s},{3:s}" "en" "Admin {1} has reduced {2}'s VIP for {3}" "fi" "Admin {1} Vähensi aikaa VIP-pelaajalle {2} tilalle {3}" - "de" "Админ {1} hat verkürzt VIP des {2} für {3}" + "de" "Admin {1} reduziert VIP {2} für {3}" "pt" "Administrador {1} reduziu o VIP de {2} para {3}" "pt_p" "O Admin {1} reduziu o VIP de {2} para {3}" "ru" "Админ {1} сократил срок VIP-игроку {2} на {3}" @@ -321,7 +322,7 @@ "#format" "{1:s},{2:s}" "en" "{1}'s VIP-group was changed to {2}" "fi" "Ryhmä VIP-pelaajalle {1} vaihdettu tilalle {2}" - "de" "VIP-Gruppe des {1} war geändert auf {2}" + "de" "VIP-Gruppe {1} wurde geändert auf {2}" "pt" "Grupo VIP de {1} foi alterado para {2}" "pt_p" "{1}'s Grupo VIP alterado para {2}" "ru" "Группа VIP-игроку {1} изменена на {2}" @@ -331,6 +332,7 @@ { "#format" "{1:s},{2:d},{3:s},{4:s},{5:s}" "en" "VIP-Player {1} (ID: {2}, Group: {3}) changed the group to {4} {5}" + "de" "VIP-Spieler {1} (ID: {2}, Gruppe: {3}) änderte die Gruppe auf {4} {5}" "pt" "VIP do Player {1} (ID: {2}, Grupo: {3}) mudou o grupo para {4} {5}" "ru" "VIP-Игроку {1} (ID: {2}, Группа: {3}) изменена группа на {4} {5}" } @@ -349,7 +351,7 @@ "#format" "{1:s},{2:i}" "en" "VIP-player {1} (ID: {2}) was successfully removed" "fi" "VIP-Pelaaja {1} (ID: {2}) on onnistuneesti poistettu" - "de" "VIP-Spieler {1} (ID: {2}) war erfolgreich gelöscht" + "de" "VIP-Spieler {1} (ID: {2}) wurde erfolgreich gelöscht" "pt" "VIP do player {1} (ID: {2}) foi removido com sucesso" "pt_p" "O VIP do jogador {1} (ID: {2}) foi removido com sucesso" "ru" "VIP-игрок {1} (ID: {2}) успешно удален" @@ -359,6 +361,7 @@ { "#format" "{1:s},{2:d},{3:s},{4:s}" "en" "VIP-Player {1} (ID: {2}, Group: {3}) removed {4}" + "de" "VIP-Spieler {1} (ID: {2}, Gruppe: {3}) entfernt {4}" "pt" "VIP do Player {1} (ID: {2}, Grupo: {3}) removido {4}" "ru" "VIP-Игрок {1} (ID: {2}, Группа: {3}) удален {4}" } @@ -366,7 +369,7 @@ { "en" "List VIP-players" "fi" "Lista VIP-Pelaajista" - "de" "Liste der Spieler" + "de" "VIP Spieler Liste" "pt" "Lista de Players VIP" "pt_p" "Listar VIP's" "ru" "Список VIP-игроков" @@ -396,6 +399,7 @@ { "#format" "{1:s},{2:d}" "en" "On request: {1}\nFound: {2} players" + "de" "Auf Anfrage: {1}\nGefunden: {2} Spieler" "ru" "По запросу: {1}\nНайдено: {2} игроков" "ua" "За запитом: {1}\nЗнайдено: {2} гравців" } @@ -404,7 +408,7 @@ "#format" "{1:s},{2:s},{3:s},{4:s}" "en" "Information:\n \nName:\n{1}\nSteamID:\n{2}\nGroup:\n{3}\nExpires:\n{4}" "fi" "Tiedotus:\n \nNimi:\n{1}\nSteamID:\n{2}\nRyhmä:\n{3}\nErääntyy:\n{4}" - "de" "Accountinformationen:\n \nDer Name:\n{1}\nSteamID:\n{2}\nDie Gruppe:\n{3}\nLäuft ab:\n{4}" + "de" "Accountinformationen:\n \nName:\n{1}\nSteamID:\n{2}\nGruppe:\n{3}\nLäuft ab:\n{4}" "pt" "Informação:\n \nNick:\n{1}\nSteamID:\n{2}\nGrupo:\n{3}\nExpira:\n{4}" "pt_p" "Informação:\n \nNome:\n{1}\nSteamID:\n{2}\nGrupo:\n{3}\nExpira:\n{4}" "ru" "Информация:\n \nИмя:\n{1}\nSteamID:\n{2}\nГруппа:\n{3}\nИстекает:\n{4}" @@ -413,6 +417,7 @@ "TEMPORARY" { "en" "Temporary" + "de" "Temporär" "pt" "Temporário" "ru" "Временный" "ua" "Тимчасовий" @@ -421,7 +426,7 @@ { "en" "Information" "fi" "Tiedotus" - "de" "Information" + "de" "Informationen" "pt" "Informação" "pt_p" "Informação" "ru" "Информация" @@ -451,7 +456,7 @@ { "en" "ERROR" "fi" "Virhe" - "de" "ERROR" + "de" "FEHLER" "pt" "ERRO" "pt_p" "ERRO" "ru" "Произошла ошибка" @@ -462,7 +467,7 @@ { "en" "No players available!" "fi" "Ei ole pelaajia saatavilla!" - "de" "Es gibt keine ferfügbare Spieler!" + "de" "Keine Spieler vorhanden!" "pt" "Nenhum player disponível!" "pt_p" "Sem jogadores disponíveis" "ru" "Нет доступных игроков!" @@ -472,7 +477,7 @@ { "en" "Couldn't load player!" "fi" "Ei voitu ladata pelaajaa!" - "de" "Fehler beim Laden der Spieler!" + "de" "Konnte Spieler nicht laden!" "pt" "Não foi possível carregar o player!" "pt_p" "Falha a carregar jogador!" "ru" "Не удалось загрузить игрока!" @@ -492,7 +497,7 @@ { "en" "No groups available!" "fi" "Ei ole ryhmiä saatavilla!" - "de" "Es gibt keine Gruppen!" + "de" "Keine Gruppen verfügbar!" "pt" "Sem grupos disponíveis!" "pt_p" "Sem grupos disponíveis!" "ru" "Нет доступных групп!" @@ -502,7 +507,7 @@ { "en" "Reload VIP-players" "fi" "Ladata uudelleen VIP-pelaajat" - "de" "VIP-Spieler neu starten" + "de" "VIP-Spieler neu laden" "pt" "Recarregar Players com VIP" "pt_p" "Recarregar Jogadores VIP" "ru" "Перезагрузить VIP-игроков" @@ -512,7 +517,7 @@ { "en" "VIP-cache has been refreshed!" "fi" "Luettelo VIP-pelaajille on käynnistetty uudelleen!" - "de" "Liste der VIP-Spieler neu gestartet wurde!" + "de" "VIP-Cache wurde aktualisiert!" "pt" "Cache dos VIPS foi atualizado!" "pt_p" "A cache dos VIP's foi actualizada!" "ru" "Список VIP-игроков перезагружен!" @@ -520,9 +525,9 @@ } "ADMIN_MENU_RELOAD_VIP_CFG" { - "en" "Reload VIP Settings" + "en" "Reload the VIP settings" "fi" "Päivitetty VIP asetukset" - "de" "VIP neu starten" + "de" "VIP-Einstellungen neu laden" "pt" "Recarregar Configurações do VIP" "pt_p" "Recarregar as configurações VIP" "ru" "Перезагрузить настройки VIP" @@ -532,7 +537,7 @@ { "en" "VIP-settings has been reloaded!" "fi" "VIP-asetukset on käynnistetty uudelleen!" - "de" "VIP-Einstellungen neu gestartet wurden!" + "de" "Die VIP-Einstellungen wurden neu geladen!" "pt" "As configurações do VIP foram atualizadas!" "pt_p" "As definições VIP foram actualizadas!" "ru" "Настройки VIP перезагружены!" @@ -541,30 +546,35 @@ "BY_ADMIN" { "en" "by admin" + "de" "von admin" "pt" "por administrador" "ru" "админом" } "BY_SERVER" { "en" "by server" + "de" "von Server" "pt" "por servidor" "ru" "сервером" } "BY_PLUGIN" { "en" "by plugin" + "de" "durch Plugin" "pt" "por plugin" "ru" "плагином" } "REASON_EXPIRED" { "en" "Expired" + "de" "Abgelaufen" "pt" "Expirado" "ru" "Истек срок" } "REASON_INACTIVITY" { "en" "For inactivity" + "de" "Für Inaktivität" "pt" "Por inatividade" "ru" "По неактивности" } @@ -582,7 +592,7 @@ { "en" "None" "fi" "Ei Mitään" - "de" "Kein(e)" + "de" "Keine" "pt" "Nenhum" "pt_p" "Nenhum" "ru" "Нет" @@ -592,7 +602,7 @@ { "en" "Never" "fi" "Ei koskaan" - "de" "Nie" + "de" "Niemals" "pt" "Nunca" "pt_p" "Nunca" "ru" "Никогда" @@ -621,11 +631,11 @@ } "ENTER_AUTH" { - "en" "Enter the chat Name/SteamID\n and press" + "en" "Enter the chat Name/SteamID\nand press" "fi" "Kirjoita chattiin Nimi/SteamID\nja paina" - "de" "Gehen Sie in den Chat Der Name/Nach SteamID" + "de" "Gehen Sie in den Chat den Namen/SteamID\nund drücken Sie" "pt" "Digite Nick/SteamID\nno chat e confirme" - "pt_p" "Introduz no chat Nome/SteamID\ne confirmar" + "pt_p" "Introduz no chat Nome/SteamID\nand Confirmar" "ru" "Введите в чат Имя/SteamId\nи нажмите" "ua" "Введіть в чат Ім'я/SteamId\nі натисніть" } @@ -643,7 +653,7 @@ { "en" "Incorrect time" "fi" "Virhellinen aika" - "de" "Falsches Zeit" + "de" "Falsche Zeit" "pt" "Período incorrecto" "pt_p" "Período incorrecto" "ru" "Некорректное время" @@ -663,7 +673,7 @@ { "en" "Incorrect usage" "fi" "virheellinen käyttö" - "de" "Falscheingabe" + "de" "Falsche Eingabe" "pt" "Uso incorreto" "pt_p" "Uso incorreto" "ru" "Неверное использование" @@ -684,7 +694,7 @@ { "en" "This player already has VIP!" "fi" "Tämä pelaaja on jo VIP!" - "de" "Dieser Spieler schon hat VIP-Zugriff!" + "de" "Dieser Spieler hat schon VIP-Zugriff!" "pt" "Este player já tem VIP!" "pt_p" "Este jogador já tem VIP!" "ru" "Игрок уже является VIP-игроком!" @@ -694,7 +704,7 @@ { "en" "Specified admin-group does not exist!" "fi" "Määritelty admin-ryhmä ei ole olemassa!" - "de" "Diese admin-Guppe existiert nicht!" + "de" "Diese Admin-Gruppe existiert nicht!" "pt" "Grupo de administração especificado não existe!" "pt_p" "O grupo-admin especificado não existe!" "ru" "Указанная админ-группа не существует!" @@ -704,7 +714,7 @@ { "en" "Specified VIP-group does not exist!" "fi" "Määritelty VIP-ryhmä ei ole olemassa!" - "de" "Diese VIP-Guppe existiert nicht!" + "de" "Diese VIP-Gruppe existiert nicht!" "pt" "Grupo VIP especificado não existe!" "pt_p" "O grupo VIP especificado não existe!" "ru" "Указанная VIP-группа не существует!" From 5e70568ff2cc228d9f5c196a04fb1b4d7c9c4d14 Mon Sep 17 00:00:00 2001 From: crashzk Date: Mon, 19 Apr 2021 15:36:44 -0300 Subject: [PATCH 48/99] Update info.ini --- addons/sourcemod/data/vip/cfg/info.ini | 46 +++++++++++++------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/addons/sourcemod/data/vip/cfg/info.ini b/addons/sourcemod/data/vip/cfg/info.ini index f958cd8..ff02670 100644 --- a/addons/sourcemod/data/vip/cfg/info.ini +++ b/addons/sourcemod/data/vip/cfg/info.ini @@ -1,24 +1,24 @@ "VIP_INFO" { - "connect_info_time" // Сообщение для VIP-игрока при входе на сервер (когда вип на время) + "connect_info_time" // Сообщение для VIP-игрока при входе на сервер (когда вип на время) | Message for the VIP player when entering the server (when the VIP is on time) { - // {NAME} - Ник игрока - // {GROUP} - Группа игрока - // {TIMELEFT} - Через сколько истекает VIP-статус - // {EXPIRES} - Когда истекает VIP-статус + // {NAME} - Ник игрока | Player Nickname + // {GROUP} - Группа игрока | Player Group + // {TIMELEFT} - Через сколько истекает VIP-статус | How long does it take for VIP status to expire? + // {EXPIRES} - Когда истекает VIP-статус | When VIP status expires - "chat" // Сообщение в чат + "chat" // Сообщение в чат | Chat Message { "ru" "{DEFAULT}Здравствуйте, {GREEN}{NAME}{DEFAULT}! Вы являетесь {LIGHTGREEN}VIP-игроком{DEFAULT}. Ваш VIP статус истекает {GREEN}{EXPIRES}" "en" "{DEFAULT}Hello, {GREEN}{NAME}{DEFAULT}! You have {LIGHTGREEN}VIP features {DEFAULT}for {GREEN}{EXPIRES}" "pt" "{DEFAULT}Olá, {GREEN}{NAME}{DEFAULT}! Você tem {LIGHTGREEN}status VIP {DEFAULT}para {GREEN}{EXPIRES}" } - "menu" // Сообщение в меню + "menu" // Сообщение в меню | Menu Message { - "time" "12" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) + "time" "12" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) | After how many seconds the menu will be closed automatically (0 - until the player closes himself) "ru" { - // Пукнты меню + // Пукнты меню | Menu Items "item" "Вы имеете VIP-статус" "item" "SPACER" "item" "Ник: {NAME}" @@ -46,23 +46,23 @@ } } } - "connect_info_perm" // Сообщение для VIP-игрока при входе на сервер (когда вип навсегда) + "connect_info_perm" // Сообщение для VIP-игрока при входе на сервер (когда вип навсегда) | A message for the VIP player when entering the server (when the VIP is forever) { - // {NAME} - Ник игрока - // {GROUP} - Группа игрока + // {NAME} - Ник игрока | Player Nickname + // {GROUP} - Группа игрока | Player Group - "chat" // Сообщение в чат + "chat" // Сообщение в чат | Chat Message { "ru" "{DEFAULT}Здравствуйте, {GREEN}{NAME}{DEFAULT}! Вы являетесь {LIGHTGREEN}VIP-игроком{DEFAULT}." "en" "{DEFAULT}Hello, {GREEN}{NAME}{DEFAULT}! You have {LIGHTGREEN}VIP features{DEFAULT}." "pt" "{DEFAULT}Olá, {GREEN}{NAME}{DEFAULT}! Você tem {LIGHTGREEN}status VIP{DEFAULT}." } - "menu" // Сообщение в меню + "menu" // Сообщение в меню | Menu Message { - "time" "30" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) + "time" "30" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) | After how many seconds the menu will be closed automatically (0 - until the player closes himself) "ru" { - // Пукнты меню + // Пукнты меню | Menu Items "item" "Вы имеете VIP-статус" "item" "Группа: {GROUP}" } @@ -80,12 +80,12 @@ } "no_access_info" // Сообщение об остутствии VIP-статуса { - "menu" // Сообщение в меню + "menu" // Сообщение в меню | Menu Message { - "time" "12" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) + "time" "12" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) | After how many seconds the menu will be closed automatically (0 - until the player closes himself) "ru" { - // Пукнты меню + // Пукнты меню | Menu Items "item" "У вас нет доступа к этому меню" "item" "Чтобы приобрести VIP-статус" "item" "Oбратитесь к администратору" @@ -104,7 +104,7 @@ } } - "url" // Ссылка, которую нужно открыть + "url" // Ссылка, которую нужно открыть | Link to open { "ru" "http://mysite.ru/vip/no_access.php?lang=ru" "en" "http://mysite.ru/vip/no_access.php?lang=en" @@ -113,12 +113,12 @@ } "expired_info" // Сообщение об истечении VIP-статуса { - "menu" // Сообщение в меню + "menu" // Сообщение в меню | Menu Message { - "time" "12" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) + "time" "12" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) | After how many seconds the menu will be closed automatically (0 - until the player closes himself) "ru" { - // Пукнты меню + // Пукнты меню | Menu Items "item" "Срок вашего VIP-статуса истек" "item" "Чтобы вновь приобрести VIP-статус" "item" "Oбратитесь к администратору" From 1a567e7e5d72be140d0487d3ad92b9541e608cf0 Mon Sep 17 00:00:00 2001 From: crashzk Date: Mon, 19 Apr 2021 15:39:37 -0300 Subject: [PATCH 49/99] Update vip_core.phrases.txt --- addons/sourcemod/translations/vip_core.phrases.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index 9d53479..96d0169 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -217,7 +217,7 @@ { "en" "Add Time" "fi" "Lisää aikaa" - "de" "Zeiten verlängern" + "de" "Zeit hinzufügen" "pt" "Adicionar Tempo" "pt_p" "Adicionar Tempo" "ru" "Добавить время" @@ -726,7 +726,7 @@ "fi" "v." "de" "j." "pt" "a." - "pt_p" "a." + "pt_p" "ano." "ru" "г." "es" "a." "ua" "р." From 15d2f1a48b819d6b17990754d258cab3420738f0 Mon Sep 17 00:00:00 2001 From: crashzk Date: Mon, 19 Apr 2021 15:40:44 -0300 Subject: [PATCH 50/99] Update vip_core.phrases.txt --- addons/sourcemod/translations/vip_core.phrases.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index 96d0169..5d779f9 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -147,7 +147,7 @@ { "#format" "{1:s},{2:d},{3:s},{4:s},{5:s},{6:s}" "en" "VIP-Player {1} (ID: {2}, Duration: {3}, Expires: {4}, Group: {5}) added {6}" - "de" "VIP-Spieler {1} (ID: {2}, Laufzeit: {3}, Läuft ab: {4}, Gruppe: {5}) Hinzugefügt {6}" + "de" "VIP-Spieler {1} (ID: {2}, Laufzeit: {3}, Läuft ab: {4}, Gruppe: {5}) Hinzugefügt {6}" "pt" "VIP do Player {1} (ID: {2}, Duração: {3}, Expira: {4}, Grupo: {5}) adicionado {6}" "ru" "VIP-Игрок {1} (ID: {2}, Длительность: {3}, Истекает: {4}, Группа: {5}) добавлен {6}" } From 2b5c8d28f80269961ca4412892229e097e334f58 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sun, 30 May 2021 12:17:19 +0300 Subject: [PATCH 51/99] Update vip_core.inc --- addons/sourcemod/scripting/include/vip_core.inc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/sourcemod/scripting/include/vip_core.inc b/addons/sourcemod/scripting/include/vip_core.inc index 233f118..6e7bb75 100644 --- a/addons/sourcemod/scripting/include/vip_core.inc +++ b/addons/sourcemod/scripting/include/vip_core.inc @@ -655,6 +655,11 @@ stock void VIP_BuildModulesPath(char[] szBuffer, int iMaxLen, const char[] szFil BuildPath(Path_SM, szBuffer, iMaxLen, "data/vip/modules/%s", szFileName); } +stock bool IsVipCoreAvailable() +{ + return CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "VIP_UnregisterFeature") == FeatureStatus_Available; +} + public SharedPlugin __pl_vip_core= { name = "vip_core", From a737397731ced524ab8fc7ffc1f010161912d0e5 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sun, 30 May 2021 12:36:31 +0300 Subject: [PATCH 52/99] Create vip_modules.phrases.txt --- .../translations/vip_modules.phrases.txt | 2046 +++++++++++++++++ 1 file changed, 2046 insertions(+) create mode 100644 addons/sourcemod/translations/vip_modules.phrases.txt diff --git a/addons/sourcemod/translations/vip_modules.phrases.txt b/addons/sourcemod/translations/vip_modules.phrases.txt new file mode 100644 index 0000000..71956af --- /dev/null +++ b/addons/sourcemod/translations/vip_modules.phrases.txt @@ -0,0 +1,2046 @@ +"Phrases" +{ + "additional_menu" + { + "ru" "Дополнительное VIP" + "en" "Additional VIP" + "pt" "VIP Adicional" + "fi" "Lisää VIP" + "ua" "Додаткове VIP" + "es" "VIP Adicional" + "ar" "إضافي VIP" + } + "AutoRespawn" + { + "ru" "Авто возрождение" + "en" "Auto Respawn" + "pt" "Respawn Automático" + "fi" "Automaattinen palautuminen" + "ua" "Авто відродження" + "es" "Reaparición automática" + "ar" "بيضة السيارات" + } + "AimTeleport" + { + "ru" "AIM Телепорт" + "en" "AIM Teleport" + "pt" "AIM Teleport" + "fi" "AIM Teleport" + "ua" "AIM Телепорт" + "es" "AIM Teleport" + "ar" "النقل الفضائي AIM" + } + "AustraliumWeapons" + { + "ru" "Оружие из Австралия" + "en" "Weapons from Australium" + "pt" "Armas de Australium" + "fi" "Aseita australiasta" + "ua" "Зброя з Австралія" + "es" "Armas de Australium" + "ar" "أسلحة من أستراليا" + } + "AutoBuy" + { + "ru" "Автозакупка" + "en" "Auto Buy" + "pt" "Auto Buy" + "fi" "Automaattinen ostos" + "ua" "Автозакупівля" + "es" "Compra automática" + "ar" "شراء تلقائي" + } + "AutoBuyMenu" + { + "ru" "Настройка автозакупки" + "en" "Auto Buy Setting" + "pt" "Configurações do Auto Buy" + "fi" "Automaattisen ostoiden valikko" + "ua" "Налаштування автозакупівлі" + "es" "Configuración de compra automática" + "ar" "إعداد شراء السيارات" + } + "AutoSilencer_usp" + { + "ru" "Авто глушитель на USP" + "en" "Auto Silencer for USP" + "pt" "Silenciador Automático USP" + "fi" "Automaatti äänenvaimennin USP varten" + "ua" "Авто глушник на USP-S" + "es" "Silenciador automático para USP" + "ar" "كاتم الصوت التلقائي لـ USP" + } + "AutoSilencer_m4a1" + { + "ru" "Авто глушитель на M4A1" + "en" "Auto Silencer for M4A1" + "pt" "Silenciador Automático M4A1" + "fi" "Automaatti äänenvaimennin M4A1 varten" + "ua" "Авто глушник на M4A1-S" + "es" "Silenciador automático para M4A1" + "ar" "كاتم الصوت التلقائي لـ M4A1" + } + "AntiFlash" + { + "ru" "Анти-флеш" + "en" "Anti-Flash" + "pt" "Anti-Flash" + "fi" "Anti-Flash" + "ua" "Анти-Флеш" + "es" "Anti-Flash" + "ar" "مضاد للفلاش" + } + "Armor" + { + "ru" "Бронь" + "en" "Armor" + "pt" "Colete" + "fi" "Suojaliivi" + "ua" "Броня" + "es" "Armadura" + "ar" "درع" + } + "AURA" + { + "ru" "Аура" + "en" "Aura" + "pt" "Aura" + "fi" "Säteily" + "ua" "Аура" + "es" "Aura" + "ar" "هالة" + } + "AURA_M" + { + "ru" "Цвет ауры" + "en" "Color Aura" + "pt" "Cor da Aura" + "fi" "Säteilyn väri" + "ua" "Колір аури" + "es" "Aura de color" + "ar" "هالة اللون" + } + "Burning" + { + "ru" "Горение" + "en" "Burning" + "pt" "Burning" + "fi" "Polttava" + "ua" "Горіння" + "es" "Ardiente" + "ar" "احتراق" + } + "Breachcharge" + { + "ru" "Взрывчатка" + "en" "Explosive" + "pt" "Explosivo" + "fi" "Räjähtävä" + "ua" "Вибухівка" + "es" "Explosiva" + "ar" "مادة متفجرة" + } + "BunnyHop" + { + "ru" "БанниХоп" + "en" "BunnyHop" + "fi" "BunnyHop" + "ua" "БанніХоп" + "es" "BunnyHop" + "ar" "باني هوب" + } + "BHOP_TIME" + { + "#format" "{1:f}" + "ru" "Банихоп будет доступен через {1} секунд" + "ua" "Банніхоп буде доступний через {1} секунд" + "en" "BunnyHop will be available in {1} seconds" + "pt" "BunnyHop estará disponível em {1} segundos" + "fi" "Bunnyhop sera disponible dans {1} secondes" + "fi" "BunnyHop sera disponible dans {1} secondes" + "ar" "سوف يكون Bunnyhop متاحًا في {1} ثواني" + } + "BuyZona" + { + "ru" "Зона закупки" + "en" "Buy Zona" + "pt" "Buy Zona" + "fi" "Hankinta-alue" + "ua" "Зона закупівлі" + "es" "Comprar Zona" + "ar" "شراء المنطقة" + } + "BoostLadder" + { + "ru" "Ускорение подъема по лестнице" + "en" "Boost Ladder" + "pt" "Boost Ladder" + "fi" "Nopeutuva porraskiipeily" + "ua" "Прискорення підйому по драбині" + "es" "Escalera de refuerzo" + "ar" "رفع السلم" + } + "Chat" + { + "ru" "Чат" + "en" "Chat" + "pt" "Chat" + "fi" "Chatti" + "ua" "Чат" + "es" "Charla" + "ar" "دردشة" + } + "Chat_Menu" + { + "ru" "Настройка чата" + "en" "Chat Settings" + "pt" "Configurações do Chat" + "fi" "Inställning av chatt" + "ua" "Налаштування чату" + "es" "Configuraciones de chat" + "ar" "إعدادات المحادثة" + } + "CT_C4" + { + "ru" "Бомба за КТ" + "en" "C4 CT" + "pt" "C4 CT" + "fi" "C4 Erikoisjoukot" + "ua" "С4 за Спецназ" + "es" "C4 CT" + "ar" "قنبلة CT" + } + "CausedDamage" + { + "ru" "Наносимый урон" + "en" "Caused Damage" + "pt" "Dano Causado" + "fi" "Aiheuttanut vahinkoa" + "ua" "Завдана шкода" + "es" "Daño causado" + "ar" "تسببت في الضرر" + } + "COIN" + { + "ru" "Монеты" + "en" "Coins" + "pt" "Medalhas" + "fi" "Mitaleiden asetukset" + "ua" "Монети" + "es" "Monedas" + "ar" "عملات معدنية" + } + "CarryC4" + { + "ru" "Переносная бомба" + "en" "Carry C4" + "fi" "Kannettava pommi" + "ua" "Переносна С4" + "es" "Llevar C4" + "ar" "حمل C4" + } + "change_color_props" + { + "ru" "Смена цвета пропов" + "en" "Сhange Сolors Props" + "fi" "Värien muutos" + "ua" "Зміна кольорів пропів" + "es" "Сhange Сolors Props" + "ar" "دعائم تغيير الألوان" + } + "Changeteam" + { + "ru" "Смена команды" + "en" "Change Team" + "pt" "Change Team" + "fi" "Tiimin muutos" + "ua" "Зміна команди" + "es" "Cambiar equipo" + "ar" "فريق التغيير" + } + "ColoredFlash" + { + "ru" "Разноцветное ослепление" + "en" "Colored Flash" + "pt" "Flash Colorida" + "fi" "Värikäs sokaisin" + "ua" "Різнокольоровий осліплення" + "es" "Flash de Color" + "ar" "فلاش ملون" + } + "CustomWeapons" + { + "ru" "Модели оружия" + "en" "Weapon Models" + "pt" "Modelos de Armas" + "fi" "Ase Mallit" + "ua" "Моделі зброї" + "es" "Modelos de Armas" + "ar" "نماذج الأسلحة" + } + "C4_Model" + { + "ru" "Измененная бомба" + "en" "C4 Model" + "pt" "Modelo de C4" + "fi" "Muunnettu Pommi" + "ua" "Модель С4" + "es" "Modelo C4" + "ar" "نموذج C4" + } + "CCC_Settings" + { + "ru" "Настройки чата" + "en" "Chat Settings" + "pt" "Configurações do Chat" + "fi" "Chat-asetukset" + "ua" "Налаштування чату" + "es" "Configuraciones de chat" + "ar" "إعدادات المحادثة" + } + "С4" + { + "ru" "Бесплатная бомба" + "en" "Free Bomb" + "fi" "Ilmainen C4" + "ua" "Безкоштовна С4" + "es" "Libre bomba" + "ar" "قنبلة مجانية" + } + "CF_BuyVip" + { + "ru" "Данный функционал доступен только VIP-игрокам!" + "en" "This is feature available only for VIP-players!" + "fi" "Tämä toiminto on käytettävissä vain VIP-pelaajille!" + "ua" "Цей функціонал доступний лише VIP-гравцям!" + "es" "¡Esta función está disponible solo para jugadores VIP!" + "ar" "هذه الميزة متاحة فقط للاعبين VIP!" + } + "CCC_Enabler" + { + "ru" "Активация настроек чата" + "en" "Activate chat settings" + "fi" "Aktivoi chat-asetukset" + "ua" "Активація налаштувань чату" + "es" "Activa la configuración de chat" + "ar" "تنشيط إعدادات الدردشة" + } + "CAUSED_DAMAGE" + { + "ru" "Наносимый урон" + "en" "Caused Damage" + "pt" "Dano Causado" + "fi" "Aiheuttanut vahinkoa" + "ua" "Завдана шкода" + "es" "Daño causado" + "ar" "تسببت في الضرر" + } + "Defuser" + { + "ru" "Набор обезвреживания" + "en" "Defuse Kit" + "en" "Kit Defuse" + "fi" "Defuse Kit" + "ua" "Набір знешкодження" + "es" "Defuse Kit" + "ar" "طقم نزع الفتيل" + } + "Decoy" + { + "ru" "Телепорт-граната" + "en" "Decoy Teleport" + "fi" "Teleportti-kranaatti" + "ua" "Телепортаційна граната" + "es" "Teletransporte señuelo" + "ar" "شرك التخاطر" + } + "DissolveBody" + { + "ru" "Растворение тела" + "en" "Dissolution of the body" + "fi" "Liukeneminen elimistössä" + "ua" "Розчинення тіла" + "es" "Disolución del cuerpo" + "ar" "انحلال الجسم" + } + "DissolveBodyNew" + { + "ru" "Растворение тела" + "en" "Dissolution of the body" + "pt" "Dissolução do corpo" + "fi" "Liukeneminen elimistössä" + "ua" "Розчинення тіла" + "es" "Disolución del cuerpo" + "ar" "انحلال الجسم" + } + "ElectroEffects" + { + "ru" "Электрические эффекты" + "en" "Electro Effects" + "fi" "Salama Effekti" + "ua" "Електричні ефекти" + "es" "Efectos electricos" + "ar" "التأثيرات الكهربائية" + } + "evade" + { + "ru" "Уворот" + "en" "Dodge" + "fi" "Väistää" + "ua" "Ухилення" + "es" "Esquivar" + "ar" "يتملص" + } + "Endurance" + { + "ru" "Выносливость" + "en" "Endurance" + "fi" "Kestävyys" + "ua" "Витривалість" + "es" "Resistencia" + "ar" "قدرة التحمل" + } + "ExplosiveBullets" + { + "ru" "Взрывные пули" + "en" "Explosive Bullets" + "pt" "Balas Explosivas" + "fi" "Räjähtävät luodit" + "ua" "Вибухові кулі" + "es" "Balas explosivas" + "ar" "الرصاصات المتفجرة" + } + "ExtendedAmmoClip" + { + "ru" "Расширенные патроны в обойме" + "en" "Extended Ammo In Clip" + "fi" "Ammuksien lisäystä pääasiassa aseeseen" + "ua" "Розширені патрони в обоймі" + "es" "Munición extendida en el clip" + "ar" "ذخيرة ممتدة في مقطع" + } + "ExtendedAmmoReserve" + { + "ru" "Расширенные патроны в запасе" + "en" "Extended Ammo In Stock" + "fi" "Ammuksien lisäystä lippaaseen" + "ua" "Розширені патрони в запасі" + "es" "Munición extendida en stock" + "ar" "ممتد الذخيرة في المخزون" + } + "Fzi_Rescued" + { + "#format" "{1:N}" + "ru" "Вы были выбраны первым зомби, но были спасены благодаря VIP. {1} заражен вместо вас." + "en" "You were chosen as the first zombie, but were saved thanks to the VIP. {1} is infected for you." + "fi" "Olet valittu ensimmäiseksi zombiksi, mutta olit tallennettu VIP: n ansiosta. {1} tartunnan saaneet." + "ua" "Ви обрані в якості першого зомбі, але були врятовані завдяки VIP. {1} заражений замість вас." + "es" "Fuiste elegido como el primer zombie, pero te salvaste gracias al VIP. {1} está infectado por ti." + "ar" "تم اختيارك كأول غيبوبة ، ولكن تم إنقاذك بفضل VIP. {1} مصاب لك." + } + "Fzi" + { + "ru" "Иммунитет от первого заражения" + "en" "First Inf. Immunity" + "fi" "Immuniteetti ensimmäisestä infektiosta" + "ua" "Імунітет від першого зараження" + "es" "First Inf. Inmunidad" + "ar" "أول إنف. حصانة" + } + "FastReload" + { + "ru" "Быстрая перезарядка" + "en" "Fast Reload" + "fi" "Nopea lataus" + "ua" "Швидка перезарядка" + "es" "Recarga rápida" + "ar" "إعادة تحميل سريعة" + } + "FastSwitch" + { + "ru" "Быстрая смена оружия" + "en" "Fast Weapon Switch" + "fi" "Nopea aseenvaihto" + "ua" "Швидка заміна зброї" + "es" "Cambio rápido de arma" + "ar" "التبديل سلاح سريع" + } + "Fastplant" + { + "ru" "Быстрый плент бомбы" + "en" "Fast Plant Bomb" + "fi" "Nopean pommin pläntti" + "ua" "Швидкий плент бомби" + "es" "Bomba de planta rápida" + "ar" "قنبلة نباتية سريعة" + } + "FireDamage" + { + "ru" "Поджигающие повреждения" + "en" "Fire Damage" + "fi" "Sytytys Vahinko" + "ua" "Запалювальні пошкодження" + "es" "Daño por fuego" + "ar" "الخسائر الناجمة عن الحرائق" + } + "Gloves" + { + "ru" "Перчатки" + "en" "Gloves" + "pt" "Luvas" + "fi" "Hanskat" + "ua" "Рукавички" + "es" "Guantes" + "ar" "قفاز" + } + "Gloves_MENU" + { + "ru" "Выбор перчаток" + "en" "Choose Gloves" + "pt" "Escolha Luvas" + "fi" "Hanskojen valikko" + "ua" "Вибір рукавичок" + "es" "Elige guantes" + "ar" "اختر القفازات" + } + "GOD" + { + "ru" "Бессмертие" + "en" "GOD" + "fi" "Kuolemattomuus" + "ua" "Безсмертя" + "es" "DIOS" + "ar" "خلود" + } + "GrenadeTrails" + { + "ru" "Трейлы гранат" + "en" "Grenade Trails" + "pt" "Trilhas de Granadas" + "fi" "Kranaattijälki" + "ua" "Сліди гранат" + "es" "Granada Senderos" + "ar" "ممرات القنابل اليدوية" + } + "GrenadeTrails_MENU" + { + "ru" "Цвет трейлов гранат" + "en" "Color Grenade Trails" + "pt" "Cores das Trilhas de Grenadas" + "fi" "Kranaattijäljen väri" + "ua" "Колір слідів гранат" + "es" "Granada de color" + "ar" "مسارات القنابل الملونة" + } + "Grenades" + { + "ru" "Гранаты" + "en" "Grenades" + "pt" "Granadas" + "fi" "Kranaatit" + "ua" "Гранати" + "es" "Granadas" + "ar" "قنبلة يدوية" + } + "GoldStatues" + { + "ru" "Золотые статуи" + "en" "Gold Statues" + "fi" "Kulta patsaat" + "ua" "Золоті статуї" + "es" "Estatuas de oro" + "ar" "التماثيل الذهبية" + } + "Gravity" + { + "ru" "Гравитация" + "en" "Gravity" + "pt" "Gravidade" + "fi" "Gravitaatio" + "ua" "Гравітація" + "es" "Gravedad" + "ar" "الجاذبية" + } + "HP" + { + "ru" "ХП" + "en" "HP" + "fi" "Terveys" + "ua" "Здоров'я" + "es" "Salud" + "ar" "الصحة" + } + "HealCube" + { + "ru" "Регенерационный куб" + "en" "Heal Cube" + "fi" "Paranna kuutio" + "ua" "Відновлювальний куб" + "es" "Curar el cubo" + "ar" "شفاء المكعب" + } + "Healthshot" + { + "ru" "Укол здоровья" + "en" "Healthshot" + "pt" "Healthshot" + "fi" "Terveyden piikki" + "ua" "Укол здоров'я" + "es" "Disparo de salud" + "ar" "لقطة صحية" + } + "HeavyArmor" + { + "ru" "Тяжелая броня" + "en" "Heavy Armor" + "fi" "Kova suojaliivi" + "ua" "Важка броня" + "es" "Armadura pesada" + "ar" "درع ثقيل" + } + "HitMarker" + { + "ru" "Хитмаркер" + "en" "Hit Marker" + "fi" "Hit Marker" + "ua" "Хітмаркер" + "es" "Dar en el objetivo" + "ar" "ضرب علامة" + } + "JoinSound" + { + "ru" "Музыка при входе" + "en" "Join Sound" + "fi" "Musiikki tervehdys" + "ua" "Музика при підключенні" + "es" "Unirse al sonido" + "ar" "انضم إلى الصوت" + } + "jumps" + { + "ru" "Несколько прыжков" + "en" "Some Jumps" + "fi" "Useita hyppyjä" + "ua" "Декілька стрибків" + "es" "Algunos saltos" + "ar" "بعض القفزات" + } + "JoinMessage" + { + "ru" "Оповещение о входе" + "en" "Join Message" + "fi" "Kirjaudu sisään" + "ua" "Оповіщення про вхід" + "es" "Unirse al mensaje" + "ar" "الانضمام إلى الرسالة" + } + "KillScreen" + { + "ru" "Эффект при убийстве" + "en" "Kill Effect" + "fi" "Tappaus effekti" + "ua" "Ефект під час вбивства" + "es" "Efecto de Matar" + "ar" "تأثير القتل" + } + "Kick" + { + "ru" "Кикнуть игрока" + "en" "Kick Player" + "pt" "Kick Player" + "fi" "Potkia pelaaja" + "ua" "Вигнати гравця" + "es" "Jugador de Patada" + "ar" "لاعب ركلة" + } + "Language" + { + "ru" "Изменить язык" + "en" "Change Language" + "pt" "Mudar Idioma" + "fi" "Vaihda kieli" + "ua" "Змінити мову" + "es" "Cambiar Idioma" + "ar" "تغيير اللغة" + } + "LongJump" + { + "ru" "Длинный прыжок" + "en" "Long Jump" + "fi" "Pitkä hyppy" + "ua" "Довгий стрибок" + "es" "Salto Largo" + "ar" "قفزة طويلة" + } + "Left" + { + "#format" "{1:i}" + "ru" "Осталось: {1}" + "en" "Left: {1}" + "fi" "Jäljellä: {1}" + "ua" "Залишилось: {1}" + "es" "Lzquierda: {1}" + "ar" "اليسار: {1}" + } + "MKIT" + { + "ru" "Музыкальный комплект" + "en" "Music Kit" + "pt" "Kit de Música" + "fi" "Music Kit" + "ua" "Музичний набір" + "es" "Kit de Música" + "ar" "إعدادات مجموعة الموسيقى" + } + "Medkit" + { + "ru" "Аптечка" + "en" "Medic Kit" + "pt" "Kit Médico" + "fi" "Lääkkeet" + "ua" "Аптечка" + "es" "Kit Medico" + "ar" "عدة طبية" + } + "MuteGagSilence" + { + "ru" "Чат/Микрофон" + "en" "Mute/Gag/Silence" + "pt" "Mute/Gag/Silence" + "fi" "Chatti/Mikrofoni" + "ua" "Чат/Мікрофон" + "es" "Mute/Gag/Silence" + "ar" "كتم الصوت / الكمامة / الصمت" + } + "Money" + { + "ru" "Деньги" + "en" "Money" + "pt" "Dinheiro" + "fi" "Raha" + "ua" "Гроші" + "es" "Dinero" + "ar" "مال" + } + "mvp" + { + "ru" "MVP значки" + "en" "MVP" + "pt" "MVP" + "fi" "MVP merkit" + "ua" "MVP значки" + "es" "MVP" + "ar" "أفضل لاعب" + } + "NoRecoil" + { + "ru" "Стрельба без отдачи" + "en" "No Recoil" + "fi" "Kuvaaminen ilman palautusta" + "ua" "Стрілянина без віддачі" + "es" "Sin retroceso" + "ar" "لا نكص" + } + "NoSelfDamage" + { + "ru" "Нет урона от себя" + "en" "No Self Damage" + "fi" "Ei vaurioita itseään" + "ua" "Без самопошкодження" + "es" "Sin autolesiones" + "ar" "لا ضرر على النفس" + } + "NEON" + { + "ru" "Неон" + "en" "Neon" + "pt" "Neon" + "fi" "Neon" + "ua" "Неон" + "es" "Neón" + "ar" "نيون" + } + "Non_Lethal_Damage" + { + "ru" "Не смертельный урон" + "en" "No Lethal Damage" + "fi" "Ei tappavaa vahinkoa" + "ua" "Не смертельна шкода" + "es" "Daño no letal" + "ar" "ضرر غير مميت" + } + "NEON_MENU" + { + "ru" "Цвет неона" + "en" "Color Neon" + "pt" "Cor do Neon" + "fi" "Neon Väri" + "ua" "Колір неону" + "es" "Color neón" + "ar" "لون النيون" + } + "nightvision" + { + "ru" "Ночное зрение" + "en" "Night Vision" + "pt" "Visão Noturna" + "fi" "Yö visio" + "ua" "Нічне бачення" + "es" "Vision nocturna" + "ar" "رؤية ليلية" + } + "NoFallDamage" + { + "ru" "Нет урона от мира" + "en" "No Fall Damage" + "fi" "Ei vaurioita maailmalta" + "ua" "Без шкоди від світу" + "es" "No hay daño por caida" + "ar" "لا ضرر السقوط" + } + "OOImmunity" + { + "ru" "Иммунитет от ограничения оружия" + "en" "Weapon restriction immunity" + "fi" "Gun limit immunity" + "ua" "Імунітет від обмеження зброї" + "es" "Inmunidad de restricción de armas" + "ar" "حصانة تقييد السلاح" + } + "paint" + { + "ru" "Рисовалка" + "en" "Paint" + "pt" "Paint" + "fi" "Maalaus" + "ua" "Малювалка" + "es" "Pintar" + "ar" "رسم" + } + "paint_menu" + { + "ru" "Настройка рисовалки" + "en" "Paint Menu" + "pt" "Paint Menu" + "fi" "Maalaus Menu" + "ua" "Налаштування малювалки" + "es" "Menú de pintura" + "ar" "رسم قائمة طعام" + } + "Parachute" + { + "ru" "Парашют" + "en" "Parachute" + "pt" "Paraquedas" + "fi" "Laskuvarjo" + "ua" "Парашут" + "es" "Paracaídas" + "ar" "المظلة" + } + "Pets_Display" + { + "ru" "Питомцы" + "en" "Pets" + "pt" "Pets" + "fi" "Lemmikkieläimet" + "ua" "Вихованці" + "es" "Mascotas" + "ar" "حيوان اليف" + } + "PaintBall" + { + "ru" "Пейнтбол" + "en" "Paintball" + "pt" "Paintball" + "fi" "Paintball" + "ua" "Пейнтбол" + "es" "Paintball" + "ar" "كرات الطلاء" + } + "Pets_Title" + { + "ru" "Выбор питомца" + "en" "Choosing Pet" + "pt" "Escolha um Pet" + "fi" "Lemmikkien valinta" + "ua" "Обрати вихованця" + "es" "Elegir una mascota" + "ar" "اختيار حيوان أليف" + } + "Pets_Disable" + { + "ru" "Выключить" + "en" "Disable" + "pt" "Desabilitar" + "fi" "Sammuta" + "ua" "Вимкнути" + "es" "Inhabilitar" + "ar" "تعطيل" + } + "QuickDefuse" + { + "ru" "Быстрое обезвреживание" + "en" "Quick Defuse" + "fi" "Nopea Purkaus" + "ua" "Швидке знешкодження" + "es" "Desactivación rápida" + "ar" "تحييد سريع" + } + "QHR" + { + "ru" "Быстрое спасение заложников" + "en" "Quick Hostage Rescue" + "fi" "Nopean panttivangien pelastus" + "ua" "Швидке рятування заручників" + "es" "Rescate rápido de rehenes" + "ar" "الإنقاذ السريع للرهائن" + } + "RegenArmor" + { + "ru" "Регенерация брони" + "en" "Regeneration Armor" + "fi" "Suojaliivin uudistaminen" + "ua" "Регенерація броні" + "es" "Armadura de regeneración" + "ar" "تجديد درع" + } + "Radar-Invis" + { + "ru" "Инвиз на радаре" + "en" "Radar Invis" + "fi" "Inviz tutkalla" + "ua" "Невидимість на радарі" + "es" "Radar Invis" + "ar" "رادار إينفيس" + } + "Respawn" + { + "ru" "Возрождение" + "en" "Respawn" + "fi" "Uudestisyntyminen" + "ua" "Відродження" + "es" "Reaparecer" + "ar" "إعادة" + } + "RegenHP" + { + "ru" "Регенерация здоровья" + "en" "HP Regeneration" + "fi" "Terveyden uudistaminen" + "ua" "Регенерація здоров'я" + "es" "Regeneración HP" + "ar" "تجديد الصحة" + } + "ReceivedDamage" + { + "ru" "Получаемый урон" + "en" "Received Damage" + "fi" "Aiheutuvat vahingot" + "ua" "Отримана шкода" + "es" "Daño recibido" + "ar" "تلقى الضرر" + } + "RADAR" + { + "ru" "Невидимость на радаре" + "en" "Hide in Radar" + "pt" "Esconder no Radar" + "fi" "Näkymättömyys tutka" + "ua" "Невидимість на радарі" + "es" "Esconderse en el radar" + "ar" "اختبئ في الرادار" + } + "RANK" + { + "ru" "Настройка ранга" + "en" "Rank Settings" + "fi" "Rank Asetukset" + "ua" "Налаштування рангу" + "es" "Configuraciones de rango" + "ar" "إعدادات الترتيب" + } + "RECEIVED_DAMAGE" + { + "ru" "Получаемый урон" + "en" "Received Damage" + "fi" "Aiheutuvat vahingot" + "ua" "Отримана шкода" + "es" "Daño recibido" + "ar" "تلقى الضرر" + } + "skybox" + { + "ru" "Небо" + "en" "Skybox" + "pt" "SkyBox" + "fi" "Taivas" + "ua" "Небо" + "es" "Skybox" + "ar" "سكايبوكس" + } + "skybox_share" + { + "ru" "Поделиться SkyBox'ом" + "en" "Share SkyBox" + "pt" "Compartilhar SkyBox" + } + "SmokeColors" + { + "ru" "Цвет дыма" + "en" "Smoke Color" + "pt" "Cor da Smoke" + "fi" "Savun väri" + "ua" "Колір диму" + "es" "Color de humo" + "ar" "لون الدخان" + } + "SWGM_VIP_Give" + { + "ru" "Вы получили VIP за вступление в нашу Steam группу." + "en" "You got VIP because you join our Steam group." + "fi" "Sait VIP-jäsenen Steam-ryhmään liittymisestä." + "ua" "Ви отримали VIP за приєднання до нашої групи Steam." + "es" "Tienes VIP porque te unes a nuestro grupo Steam." + "ar" "لقد حصلت على VIP لأنك انضممت إلى مجموعة Steam الخاصة بنا." + } + "SWGM_VIP_Take" + { + "ru" "Вы потеряли VIP, потому что вышли из нашей Steam группы." + "en" "You lost VIP because you leave our Steam group." + "fi" "Menetit VIP, koska jätit Steam-ryhmämme." + "ua" "Ви втратили VIP, тому що покинули нашу групу Steam." + "es" "Perdiste VIP porque dejaste nuestro grupo Steam." + "ar" "لقد فقدت VIP لأنك تركت مجموعة Steam الخاصة بنا." + } + "Skins" + { + "ru" "Скины" + "en" "Skins" + "pt" "Skins" + "fi" "Skinit" + "ua" "Персонаж" + "es" "Piel" + "ar" "بشرة" + } + "Skins_Menu" + { + "ru" "Скины Mеню" + "en" "Skins Menu" + "pt" "Menu Skins" + "fi" "Skini Valikko" + "ua" "Меню Cкінів" + "es" "Menú Skins" + "ar" "اختيار الجلد" + } + "Speed" + { + "ru" "Повышенная скорость" + "en" "Speed" + "fi" "Nopeus" + "ua" "Підвищена швидкість" + "es" "Velocidad" + "ar" "سرعة" + } + "SmokeColors_MENU" + { + "ru" "Выбрать цвет дыма" + "en" "Select Smoke Color" + "fi" "Valitse savun väri" + "ua" "Обрати колір диму" + "es" "Seleccionar color de humo" + "ar" "حدد لون الدخان" + } + "status" + { + "ru" "Показ премиум статуса" + "en" "Show Pemium Status" + "fi" "Näytetään premium-tila" + "ua" "Показ преміум статусу" + "es" "Mostrar estado premium" + "ar" "عرض حالة قسط" + } + "Showdamagehud" + { + "ru" "Показ урона (HUD)" + "en" "Show Damage (HUD)" + "fi" "Vahinkonäyttö (HUD)" + "ua" "Показ пошкоджень (HUD)" + "es" "Mostrar daño (HUD)" + "ar" "إظهار الضرر (HUD)" + } + "ShowDamageExtended" + { + "ru" "Показ урона" + "en" "Show Damage" + "fi" "Näytetään vaurioita" + "ua" "Показ пошкоджень" + "es" "Mostrar daño" + "ar" "عرض الضرر" + } + "Spawn_Effects" + { + "ru" "Эффекты при возрождении" + "en" "Spawn Effects" + "fi" "Uudestisyntymisen effektit" + "ua" "Ефекти при відродженні" + "es" "Efectos de engendro" + "ar" "تأثيرات النشر" + } + "Sparks" + { + "en" "Sparks" + "ru" "Искры" + "fi" "Kipinät" + "ua" "Іскри" + "es" "Chispas" + "ar" "شرارات" + } + "Switchteam" + { + "ru" "Изменить команду" + "en" "Switch Team" + "fi" "Muuta komentoa" + "ua" "Змінити команду" + "es" "Cambiar de equipo" + "ar" "فريق التبديل" + } + "Survivability" + { + "ru" "Выживаемость" + "en" "Survivability" + "fi" "Eloonjäämisaste" + "ua" "Життєздатність" + "es" "Supervivencia" + "ar" "البقاء على قيد الحياة" + } + "ShowDamage" + { + "ru" "Показ урона" + "en" "Displaying Damage" + "fi" "Näytetään vahinkopaneeli" + "ua" "Показ пошкодження" + "es" "Mostrar daño" + "ar" "عرض الضرر" + } + "Trails" + { + "ru" "Трейлы" + "en" "Trails" + "fi" "Jäljet" + "ua" "Трейли" + "es" "Caminos" + "ar" "الممرات" + } + "Trails_MENU" + { + "ru" "Выбор трейла" + "en" "Select Trail" + "fi" "Jäljen Valitseminen" + "ua" "Вибір трейлу" + "es" "Selección de caminos" + "ar" "اختيار الممر" + } + "Tracers" + { + "ru" "Трасеры" + "en" "Tracers" + "fi" "Merkkiaineet" + "ua" "Трасери" + "es" "Trazadores" + "ar" "الراسمات" + } + "Tracers_MENU" + { + "ru" "Цвет трасеров" + "en" "Color Tracers" + "fi" "Merkkiaineiden väri" + "ua" "Колір трасерів" + "es" "Trazadores de color" + "ar" "متتبعات اللون" + } + "Tagrenade" + { + "ru" "Таговая граната" + "en" "TA Grenade" + "pt" "TA Grenade" + "fi" "Tag Granaattiomena" + "ua" "Tag граната" + "es" "Tagrenade" + "ar" "تاجريناد" + } + "TopIcon" + { + "ru" "VIP Mодель над головой" + "en" "VIP Model over the head" + "fi" "VIP Malli päässä" + "ua" "VIP Mодель над головою" + "es" "Modelo VIP sobre la cabeza" + "ar" "نموذج VIP فوق الرأس" + } + "ThrowingKnives" + { + "ru" "Метательные ножи" + "en" "Throwing Knives" + "fi" "Heitto veitset" + "ua" "Метальні ножі" + "es" "Lanzando cuchillos" + "ar" "رمي السكاكين" + } + "TEAMMATES_HEAL" + { + "ru" "Лечение союзников" + "en" "Teammates Heal" + "fi" "Ally-hoito" + "ua" "Лікування союзників" + "es" "Compañeros de equipo sanan" + "ar" "زملاء الفريق شفاء" + } + "Tag" + { + "ru" "Тег" + "en" "TAG" + "fi" "TAG" + "ua" "Тег" + "es" "Etiqueta" + "ar" "بطاقة شعار" + } + "Tag_Menu" + { + "ru" "Настройки тега" + "en" "TAG Settings" + "fi" "TAG Asetukset" + "ua" "Налаштування тегу" + "es" "Configuraciones de etiqueta" + "ar" "إعدادات العلامات" + } + "UnlimitedAmmo" + { + "ru" "Бесконечные Патроны" + "en" "Unlimited Ammo" + "fi" "Rajoittamattomat ammukset" + "ua" "Нескінченні набої" + "es" "Munición ilimitada" + "ar" "إعدادات العلامات" + } + "UnlimPrimaryAmmo" + { + "ru" "Бесконечные патроны в основной обойме" + "en" "Infinite Ammo in the main clip" + "fi" "Loputtomasti ammuksia pääasiassa aseeseen" + "ua" "Нескінченні набої в основній обоймі" + "es" "Munición infinita en el clip principal" + "ar" "الذخيرة اللانهائية في المقطع الرئيسي" + } + "UnlimReserveAmmo" + { + "ru" "Бесконечные патроны в запасе" + "en" "Infinite ammo in stock" + "fi" "Loputtomasti ammuksia lippaaseen" + "ua" "Нескінченні набої у запасі" + "es" "Munición infinita en stock" + "ar" "ذخيرة لانهائية في المخزون" + } + "VIP_SWAPPOSITION" + { + "ru" "Смена позиций" + "en" "Swap Positions" + "fi" "Asemien muuttaminen" + "ua" "Зміна позицій" + "es" "Posiciones de intercambio" + "ar" "مراكز المبادلة" + } + "VIP_ICE" + { + "ru" "Заморозка" + "en" "Freeze" + "fi" "Jäätymispiste" + "ua" "Заморозка" + "es" "Congelar" + "ar" "تجميد" + } + "VIP_PLAYERCOLOR" + { + "ru" "Смена цветов" + "en" "Color Changing" + "fi" "Väri muuttuu" + "ua" "Зміна кольорів" + "es" "Cambio de color" + "ar" "تغيير اللون" + } + "VIP_DROPWEAPON" + { + "ru" "Выбить оружие" + "en" "Drop Weapon" + "fi" "Katkaise aseet" + "ua" "Вибити зброю" + "es" "Soltar arma" + "ar" "إسقاط السلاح" + } + "Vampirism" + { + "ru" "Вампиризм" + "en" "Vampirism" + "pt" "Vampirismo" + "fi" "Vampirismi" + "ua" "Вампіризм" + "es" "Vampirismo" + "ar" "مصاص دماء" + } + "ValveGloves" + { + "ru" "Перчатки (Valve)" + "en" "Gloves (Valve)" + "pt" "Luvas (Valve)" + "fi" "Käsineet (Valve)" + "ua" "Рукавички (Valve)" + "es" "Guantes (Valve)" + "ar" "القفازات (Valve)" + } + "ValveGloves_MENU" + { + "ru" "Выбор перчаток (Valve)" + "en" "Select Gloves (Valve)" + "pt" "Selecione Luvas (Valve)" + "fi" "Käsineiden valinta (Valve)" + "ua" "Вибір рукавичок (Valve)" + "es" "Seleccionar guantes (Valve)" + "ar" "حدد القفازات (Valve)" + } + "VoiceSoundPlayer" + { + "ru" "Фразы" + "en" "Voice Sound" + "fi" "Äänen ääni" + "ua" "Фрази" + "es" "Sonido de voz" + "ar" "صوت الصوت" + } + "WaterEffect" + { + "ru" "Брызги воды" + "en" "Water Splashing" + "fi" "Veden roiskeita" + "ua" "Бризки води" + "es" "Salpicaduras de agua" + "ar" "رش الماء" + } + "Weaponpack" + { + "ru" "Комплект оружий | WP" + "en" "Weapon Pack | WP" + "pt" "Pack de Armas | WP" + "fi" "Aseiden setti | WP" + "ua" "Комплект зброї | WP" + "es" "Set de armas | WP" + "ar" "مجموعة سلاح } WP" + } + "WeaponJumping" + { + "ru" "Прыжок от выстрела" + "en" "Jump from the shot" + "fi" "Shot Jump" + "ua" "Стрибок від пострілу" + "es" "Salta desde el tiro" + "ar" "القفز من اللقطة" + } + "ExoJumpBoots" + { + "ru" "Exo Jump ботинки" + "en" "Exo Jump Boots" + "pt" "Botas Exo Jump" + "fi" "Exo Jump stövlar" + "ua" "Exo Jump черевики" + "es" "Botas Exo Jump" + "ar" "القفز إكسو الروبوتات" + } + "BuyTeamWeapon" + { + "ru" "Покупка оружия команды" + "en" "Buy Team Weapon" + "fi" "Köp lagsvapen" + "ua" "Купівля командої зброї" + "es" "Comprar arma de equipo" + "ar" "شراء سلاح الفريق" + } + "Bumpmine" + { + "ru" "Толчковые мины" + "en" "Bump Mine" + "pt" "Bump Mine" + "fi" "Bump Min" + "ua" "Відштовхувальні міни" + "es" "Golpear la mía" + "ar" "عثرة الألغام" + } + "CashBack" + { + "ru" "Возврат денег" + "en" "Cash Back" + "fi" "Pengar tillbaka" + "ua" "Повернення грошей" + "es" "Devolución de dinero" + "ar" "كاش باك" + } + "BHOP" + { + "ru" "Банихоп" + "ua" "Банніхоп" + "en" "BunnyHop" + "pt" "BunnyHop" + "fi" "BunnyHop" + "es" "BunnyHop" + "ar" "بانيهوب" + } + "TF2_HalloweenFootprints" + { + "ru" "Следы под ногами (Хэллоуин)" + "en" "Footsteps (Halloween)" + "fi" "Fotspår (Halloween)" + "ua" "Сліди під ногами (Хеллоуїн)" + "es" "Pasos (Halloween)" + "ar" "خطى (هالوين)" + } + "TF2_DistortedHalloweenVoice" + { + "ru" "Искажённый голос (Хэллоуин)" + "en" "Distorted Voice (Halloween)" + "fi" "Förvrängd röst (Halloween)" + "ua" "Спотворений голос (Хеллоуїн)" + "es" "Voz distorsionada (Halloween)" + "ar" "صوت مشوه (الهالوين)" + } + "ShowTriggers" + { + "ru" "Показ триггеров" + "en" "Show Triggers" + "fi" "Visa triggers" + "ua" "Показати тригери" + "es" "Mostrar disparadores" + "ar" "إظهار المشغلات" + } + "color_management" + { + "ru" "Управление цветами" + "en" "Color Management" + "fi" "Färghantering" + "ua" "Керування кольорами" + "es" "Manejo del color" + "ar" "إدارة الألوان" + } + "AutoBandage" + { + "ru" "Авто бинтование" + "en" "Auto Bandage" + "fi" "Automaattinen Sidonta" + "ua" "Автоматичне бинтування" + "es" "Vendaje automático" + "ar" "الضمادة التلقائية" + } + "Shield" + { + "ru" "Щит" + "en" "Shield" + "fi" "Skydda" + "ua" "Щит" + "es" "Proteger" + "ar" "درع" + } + "ReWeapon" + { + "ru" "Восстановление боеприпасов" + "en" "Switch Weapon" + "fi" "Byt vapen" + "ua" "Відновлення боєприпасів" + "es" "Cambiar de arma" + "ar" "تبديل السلاح" + } + "FakeRanks" + { + "ru" "Фейк Ранг:" + "en" "Fake Ranks:" + "fi" "Fake Ranks:" + "ua" "Фейк Ранг:" + "es" "Fake Ranks:" + "ar" "الرتب الوهمية:" + } + + "FakeRanks_Menu" + { + "ru" "Меню Фейк-Ранга:" + "en" "Fake Ranks Menu:" + "fi" "Fake Ranks Menyn:" + "ua" "Меню Фейк Рангу:" + "es" "Menú FakeRanks:" + "ar" "قائمة الرتب الوهمية:" + } + "Instruments" + { + "ru" "Инструменты" + "en" "Instruments" + "fi" "instrument" + "ua" "Інструменти" + "es" "Instrumentos" + "ar" "الادوات" + } + "jump_effect" + { + "en" "Jump Effect" + "ru" "Эффект от прыжков" + "fi" "Hoppeffekt" + "ua" "Ефект від стрибків" + "es" "Efecto de salto" + "ar" "تأثير القفز" + } + "nade_wave_effect" + { + "en" "Nade Wave Effect" + "ru" "Волны от гранат" + "fi" "Nade våg effekt" + "ua" "Хвилі від гранат" + "es" "Efecto de onda Nade" + "ar" "تأثير موجة نادى" + } + "HALO" + { + "ru" "Нимб" + "en" "Halo" + "fi" "Halo" + "ua" "Німб" + "es" "Aureola" + "ar" "هالو" + } + "HALO_M" + { + "ru" "Цвет нимба" + "en" "Color Halo" + "fi" "Halo väri" + "ua" "Колір німбу" + "es" "Aureola de color" + "ar" "هالة ملونة" + } + "HALO_BLACK" + { + "ru" "Нимб Черный" + "en" "Halo Black" + "fi" "Halo Musta" + "ua" "Німб Чорний" + "es" "Aureola Svarti" + "ar" "هالو بلاك" + } + "VIP_SOUNDEFFECTS" + { + "ru" "Звуки" + "en" "Sounds" + "fi" "äänet" + "ua" "Звуки" + "es" "Suena" + "ar" "اصوات" + } + "NVD" + { + "ru" "ПНВ" + "en" "NVD" + "fi" "NVD" + "ua" "ПНБ" + "es" "NVD" + "ar" "NVG" + } + "Pets_Display" + { + "en" "Pets" + "ru" "Питомцы" + "fi" "Lemmikkieläimet" + "ua" "Вихованці" + "es" "Mascotas" + "ar" "الحيوانات الأليفة" + } + "Pets_Title" + { + "en" "Choosing Pet" + "ru" "Выбор питомца" + "fi" "Lemmikin valitseminen" + "ua" "Вибір вихованця" + "es" "Elegir una mascota" + "ar" "اختيار الحيوانات الأليفة" + } + "Pets_Disable" + { + "ru" "Выключить" + "en" "Disable" + "fi" "Poista käytöstä" + "ua" "Вимкнути" + "es" "Inhabilitar" + "ar" "تعطيل" + } + "bullet_effect" + { + "ru" "Эффект от выстрела" + "en" "Bullet Effect" + "fi" "Luodin vaikutus" + "ua" "Ефект від пострілу" + "es" "Efecto Bala" + "ar" "تأثير رصاصة" + } + "DuckSpeed" + { + "ru" "Отключить замедление скорости при приседании" + "en" "Disable slowdown when use duck" + "fi" "Poista hidastus käytöstä ankkaa käytettäessä" + "ua" "Відключити уповільнення швидкості під час присідання" + "es" "Desactiva la ralentización cuando usas pato" + "ar" "تعطيل التباطؤ عند استخدام البطة" + } + "vip_name_color" + { + "ru" "Цвет никнейма" + "en" "Client Username Color" + "fi" "Asiakkaan käyttäjänimen väri" + "ua" "Колір нікнейму" + "es" "Color del nombre de usuario del cliente" + "ar" "لون اسم مستخدم العميل" + } + "vip_message_color" + { + "ru" "Цвет сообщения" + "en" "Client Message Color" + "fi" "Asiakkaan viestin väri" + "ua" "Колір повідомлення" + "es" "Color del mensaje del cliente" + "ar" "لون رسالة العميل" + } + "vip_prefix" + { + "ru" "Префикс" + "en" "Client Prefix" + "fi" "Asiakkaan etuliite" + "ua" "Префікс" + "es" "Prefijo de cliente" + "ar" "بادئة العميل" + } + "vip_prefix_color" + { + "ru" "Цвет префикса" + "en" "Client Prefix Color" + "fi" "Asiakkaan etuliitteen väri" + "ua" "Колір префіксу" + "es" "Color del prefijo del cliente" + "ar" "لون بادئة العميل" + } + "vip_chat_nameco" + { + "ru" "Цвет никнейма" + "en" "Client Username Color" + "fi" "Asiakkaan käyttäjänimen väri" + "ua" "Колір нікнейму" + "es" "Color del nombre de usuario del cliente" + "ar" "لون اسم مستخدم العميل" + } + "vip_chat_msgco" + { + "ru" "Цвет сообщения" + "en" "Client Message Color" + "fi" "Asiakkaan viestin väri" + "ua" "Колір повідомлення" + "es" "Color del mensaje del cliente" + "ar" "لون رسالة العميل" + } + "vip_chat_prefix" + { + "ru" "Префикс" + "en" "Client Prefix" + "pt" "Prefixo do Client" + "fi" "Asiakkaan etuliite" + "ua" "Префікс" + "es" "Prefijo de cliente" + "ar" "بادئة العميل" + } + "vip_chat_prefixco" + { + "ru" "Цвет префикса" + "en" "Client Prefix Color" + "fi" "Asiakkaan etuliitteen väri" + "ua" "Колір префіксу" + "es" "Color del prefijo del cliente" + "ar" "لون بادئة العميل" + } + "advanced_message" + { + "ru" "Продвинутые сообщения" + "en" "Advanced Message" + "fi" "Lisäasetukset-viesti" + "ua" "Розширені повідомлення" + "es" "Mensaje avanzado" + "ar" "رسالة متقدمة" + } + "HintShowDamage" + { + "ru" "Отображение урона" + "en" "Damage Display" + "fi" "Skada display" + "ua" "Відображення пошкоджень" + "es" "Pantalla de daños" + "ar" "عرض الضرر" + } + "Rainbow_Player" + { + "ru" "Радужная модель" + "en" "Rainbow Pattern" + "fi" "Sateenkaarikuvio" + "ua" "Райдужна модель" + "es" "Padrão de arco-íris" + "ar" "نمط قوس قزح" + } + "RoundEndBhop" + { + "ru" "Банихоп в конце раунда" + "en" "BunnyHop at the end of the round" + "pt" "BunnyHop no final do round" + "fi" "BunnyHop kierroksen lopussa" + "ua" "Баніхоп у кінці раунду" + "es" "BunnyHop al final de la ronda" + "ar" "بانيهوب في نهاية الجولة" + } + "Xscope" + { + "ru" "Улучшенный снайперский прицел" + "en" "Advanced Sniper Sight" + "fi" "Advanced sniper näky" + "ua" "Покращений снайперський приціл" + "es" "Mira de francotirador avanzada" + "ar" "مشهد قناص متقدم" + } + "AmmoWeapons" + { + "ru" "Расширенная обойма" + "en" "Extended Clip" + "fi" "Laajennettu leike" + "ua" "Розширена обойма" + "es" "Clip extendido" + "ar" "كليب موسع" + } + "Invis" + { + "ru" "Прозрачность" + "en" "Invis" + "fi" "Läpikuultavuus" + "ua" "Прозорість" + "es" "Transparencia" + "ar" "إينفيس" + } + "Equipments" + { + "ru" "Экипировка" + "en" "Equipments" + "pt" "Equipamentos" + "fi" "Tamineet" + "ua" "Спорядження" + "es" "Transparencia" + "ar" "المعدات" + } + "EquipmentsMenu" + { + "ru" "Настройка экипировки" + "en" "Equipment Setting" + "en" "Configuração do Equipamento" + "fi" "Laitteiden asettaminen" + "ua" "Налаштування екіпіровки" + "es" "Configuración del equipo" + "ar" "إعداد المعدات" + } + "Icon" + { + "ru" "Иконка" + "en" "Icon" + "pt" "Ícone" + "fi" "Ikoni" + "ua" "Іконка" + "es" "Icono" + "ar" "أيقونة" + } + "NadeModels" + { + "ru" "Модели гранат" + "en" "Grenade Models" + "pt" "Modelos de Granada" + "fi" "Kranaatti malli" + "ua" "Моделі гранат" + "es" "Modelos granate" + "ar" "نماذج القنابل اليدوية" + } + "NadeModels_Menu" + { + "ru" "Настройка моделей гранат" + "en" "Grenade Models Settings" + "pt" "Configuração dos Modelos de Granada" + "fi" "Kranaatti mallin asetukset" + "ua" "Налаштування моделей гранат" + "es" "Configuración de modelos granadas" + "ar" "إعدادات نماذج القنبلة" + } + "NoDamageVelocity" + { + "ru" "Не терять скорость, когда в вас стреляют" + "en" "Don't lose speed when you are being shot at" + "fi" "Älä menetä nopeutta, kun olet ammuttu" + "ua" "Не втрачати швидкість, коли по вас стріляють" + "es" "No pierdas la velocidad cuando te disparan" + "ar" "لا تفقد السرعة عندما يتم إطلاق النار عليك" + } + "X16Walls" + { + "ru" "Прострел стен" + "en" "Wall Shot" + "fi" "Seinä laukaus" + "ua" "Простріл стін" + "es" "Muro de tiro" + "ar" "طلقة الجدار" + } + "ReloadProgressBar" + { + "ru" "Индикатор выполнения перезарядки" + "en" "Reload Progress Bar" + "fi" "Latauksen ilmaisin" + "ua" "Індикатор виконання перезарядки" + "es" "Indicador de progreso de recarga" + "ar" "إعادة تحميل شريط التقدم" + } + "Killcredits" + { + "ru" "Кредиты за убийство" + "en" "Credits for Kill" + "pt" "Créditos por Kill" + "fi" "Hyvitykset tappaa" + "ua" "Кредити за вбивство" + "es" "Créditos por matar" + "ar" "قروض للقتل" + } + "HEADcredits" + { + "ru" "Кредиты за HS" + "en" "Credits for HS" + "pt" "Créditos por HS" + "fi" "Hyvitykset HS: lle" + "ua" "Кредити за HS" + "es" "Créditos para HS" + "ar" "قروض لضربة رأس" + } + "KNIFEcredits" + { + "ru" "Кредиты за нож" + "en" "Credits for Knife" + "pt" "Créditos por Faca" + "fi" "Laajuus veitsi" + "ua" "Кредити за ніж" + "es" "Créditos para el cuchillo" + "ar" "قروض للسكين" + } + "two_guns" + { + "ru" "Два оружия в одном слоте" + "en" "Two weapons in one slot" + "fi" "Kaksi asetta yhdessä korttipaikassa" + "ua" "Дві зброї в одному слоті" + "es" "Dos armas en una ranura" + "ar" "سلاحان في فتحة واحدة" + } + "Fists" + { + "ru" "Кулаки" + "en" "Fists" + "pt" "Punhos" + "fi" "Nyrkki" + "ua" "Кулаки" + "es" "Puños" + "ar" "القبضات" + } + "mu_GiveLoots" + { + "ru" "Дополнительные улики" + "en" "Additional Evidence" + "pt" "Evidência Adicional" + "fi" "Lisätodisteet" + "ua" "Додаткові докази" + "es" "Evidencia adicional" + "ar" "أدلة إضافية" + } + "ColoredSmoke" + { + "ru" "Цветной дым" + "en" "Colored Smoke" + "pt" "Smoke Colorida" + "fi" "Värillinen Savu" + "ua" "Кольоровий дим" + "es" "Humo de color" + "ar" "دخان ملون" + } + "SmokeColor" + { + "ru" "Указать цвет" + "en" "Select Color" + "pt" "Selecione a Cor" + "fi" "Valitse väri" + "ua" "Вказати колір" + "es" "Seleccionar color" + "ar" "إختر لون" + } + "Ban" + { + "ru" "Забанить игрока" + "en" "Ban Player" + "pt" "Banir Player" + "fi" "Kieltää pelaaja" + "ua" "Забанити гравця" + "es" "Prohibir al jugador" + "ar" "حظر لاعب" + } + "Agents" + { + "ru" "Агенты" + "en" "Agents" + "pt" "Agentes" + "fi" "Agentti" + "ua" "Агенти" + "es" "Agente" + "ar" "عملاء" + } + "VIP_Agents_M" + { + "ru" "Меню Агентов" + "en" "Agents Menu" + "pt" "Menu Agentes" + "fi" "Agenttien Valikko" + "ua" "Меню Агентів" + "es" "Menú Agentes" + "ar" "قائمة الوكلاء" + } + "resimm" + { + "ru" "Иммунитет от ограничения оружия" + "en" "Weapon Restriction Immunity" + "fi" "Gun limit immunity" + "ua" "Імунітет від обмеження зброї" + "es" "Inmunidad de restricción de armas" + "ar" "حصانة تقييد السلاح" + } + "switch_speed" + { + "ru" "Быстрая смена оружия" + "en" "Quick change of weapons" + "fi" "Nopea aseiden vaihto" + "ua" "Швидка зміна зброї" + "es" "Cambio rápido de armas" + "ar" "تغيير سريع للأسلحة" + } + "Disable" + { + "ru" "Выключить" + "en" "Disable" + "pt" "Desabilitar" + "fi" "Sammuta" + "ua" "Вимкнути" + "es" "Inhabilitar" + "ar" "تعطيل" + } + "FOV" + { + "ru" "Угол обзора" + "en" "Viewing Angle | FOV" + "pt" "Ângulo de Visão | FOV" + "fi" "Katselukulma" + "ua" "Кут огляду" + "es" "Ángulo de visión" + "ar" "زاوية عرض" + } + "ChatSound" + { + "ru" "Звук чата" + "en" "Chat message sound" + "pt" "Som da mensagem do bate-papo" + "fi" "Keskusteluviestin ääni" + "ua" "Звук чату" + "es" "Chat mensaje sonido" + "ar" "رسالة الدردشة الصوتية" + } + "lr_select_fakerank" + { + "ru" "Выбрать ранги" + "en" "Select Ranks" + "pt" "Selecionar Ranks" + "fi" "Valitse rivit" + "ua" "Вибрати ранги" + "es" "Seleccionar rangos" + "ar" "اختر الرتب" + } + "VIP_NO_LIMIT" + { + "#format" "{1:s}" + "ru" "Лимит использования {1} исчерпан!" + "en" "The limit of use {1} has been reached!" + "pt" "O limite de uso {1} foi atingido!" + "fi" "Käyttöraja {1} on saavutettu!" + "ua" "Межа використання {1} досягнута!" + "es" "¡Se ha alcanzado el límite de uso {1}!" + "ar" "تم الوصول إلى حد الاستخدام {1}!" + } + "VIP_END_TIME_USE" + { + "#format" "{1:s}" + "ru" "Время действия {1} закончилось!" + "en" "Action time {1} is over!" + "pt" "O tempo de ação {1} acabou!" + "fi" "Toiminta-aika {1} on ohi!" + "ua" "Час дії {1} закінчився!" + "es" "¡El tiempo de acción {1} ha terminado!" + "ar" "وقت العمل {1} هو أكثر!" + } + "Setclass" + { + "ru" "Смена Классов" + "en" "Set Class" + "pt" "Definir Classe" + "fi" "Luokanvaihto" + "ua" "Зміна КЛАСІВ" + "es" "Cambio De Clases" + "ar" "تغيير الفصول" + } + "sprays" + { + "ru" "Спрей" + "en" "Spray" + "pt" "Spray" + "fi" "Spray" + "ua" "Спрей" + "es" "Spray" + "ar" "رذاذ" + } + "sprays_menu" + { + "ru" "Выбор спрея" + "en" "Spray selection" + "pt" "Selecção da pulverização" + "fi" "Spray valinta" + "ua" "Вибір спрею" + "es" "Selección de Spray" + "ar" "رذاذ اختيار" + } + "AntiKnifeDamage" + { + "ru" "Защита от урона ножом" + "en" "Protection from knife damage" + "pt" "Proteção contra danos com uma faca" + "fi" "Suojaa veitsi vahinko" + "ua" "Захист від шкоди ножем" + "es" "Protección contra daños con cuchillo" + "ar" "الحماية من تلف السكين" + } + "ClanCreate" + { + "ru" "Возможность создавать клан" + "en" "Clan create permission" + "pt" "Clã criar permissão" + "fi" "Klaanin luontioikeus" + "ua" "Дозвіл на створення клану" + "es" "Permiso para crear clan" + "ar" "عشيرة إنشاء إذن" + } +} From 89eae97c61b21704750349acd4c306bd4090f057 Mon Sep 17 00:00:00 2001 From: vandrienko Date: Sun, 30 May 2021 12:50:02 +0300 Subject: [PATCH 53/99] add turn of features when delete vip status --- addons/sourcemod/scripting/vip/API.sp | 6 ++++-- addons/sourcemod/scripting/vip/Configs.sp | 2 +- addons/sourcemod/scripting/vip/adminmenu/Del.sp | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 3963452..409a79a 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -29,9 +29,9 @@ void API_SetupForwards() } // Global Forwards -void CreateForward_OnVIPLoaded() +void CallForward_OnVIPLoaded() { - DBG_API("CreateForward_OnVIPLoaded()") + DBG_API("CallForward_OnVIPLoaded()") Call_StartForward(g_hGlobalForward_OnVIPLoaded); Call_Finish(); } @@ -690,6 +690,8 @@ int API_RemoveClientVIP(Handle hPlugin, CancelClientMenu(iClient); } + + Features_TurnOffAll(iClient); ResetClient(iClient); char szBuffer[PMP]; diff --git a/addons/sourcemod/scripting/vip/Configs.sp b/addons/sourcemod/scripting/vip/Configs.sp index 74a9fb9..d57a41b 100644 --- a/addons/sourcemod/scripting/vip/Configs.sp +++ b/addons/sourcemod/scripting/vip/Configs.sp @@ -16,7 +16,7 @@ void OnReadyToStart() { GLOBAL_INFO |= IS_STARTED; - CreateForward_OnVIPLoaded(); + CallForward_OnVIPLoaded(); for (int iClient = 1; iClient <= MaxClients; ++iClient) { diff --git a/addons/sourcemod/scripting/vip/adminmenu/Del.sp b/addons/sourcemod/scripting/vip/adminmenu/Del.sp index 594fd98..3f93d24 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/Del.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/Del.sp @@ -47,6 +47,7 @@ public int MenuHandler_DeleteVipPlayerMenu(Menu hMenu, MenuAction action, int iC if (iTarget) { DB_RemoveClientFromID(iClient, iTarget, _, true); + Features_TurnOffAll(iTarget); ResetClient(iTarget); CreateForward_OnVIPClientRemoved(iTarget, "Removed by Admin", iClient); DisplayClientInfo(iTarget, "expired_info"); From d42b48e026bddcab9c35f4404b7758d60b274517 Mon Sep 17 00:00:00 2001 From: vandrienko Date: Sun, 30 May 2021 12:52:54 +0300 Subject: [PATCH 54/99] rename CreateForward to CallForward --- addons/sourcemod/scripting/vip/API.sp | 58 +++++++++---------- addons/sourcemod/scripting/vip/AdminMenu.sp | 2 +- addons/sourcemod/scripting/vip/Clients.sp | 20 +++---- addons/sourcemod/scripting/vip/Info.sp | 2 +- addons/sourcemod/scripting/vip/UTIL.sp | 4 +- addons/sourcemod/scripting/vip/VipMenu.sp | 2 +- .../sourcemod/scripting/vip/adminmenu/Del.sp | 2 +- 7 files changed, 45 insertions(+), 45 deletions(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 409a79a..506acab 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -36,7 +36,7 @@ void CallForward_OnVIPLoaded() Call_Finish(); } -bool CreateForward_OnClientPreLoad(int iClient) +bool CallForward_OnClientPreLoad(int iClient) { DBG_API("g_hGlobalForward_OnClientPreLoad(%N (%d), %b)", iClient, iClient, g_iClientInfo[iClient] & IS_VIP) bool bResult = true; @@ -48,44 +48,44 @@ bool CreateForward_OnClientPreLoad(int iClient) return bResult; } -void CreateForward_OnClientLoaded(int iClient) +void CallForward_OnClientLoaded(int iClient) { - DBG_API("CreateForward_OnClientLoaded(%N (%d), %b)", iClient, iClient, g_iClientInfo[iClient] & IS_VIP) + DBG_API("CallForward_OnClientLoaded(%N (%d), %b)", iClient, iClient, g_iClientInfo[iClient] & IS_VIP) Call_StartForward(g_hGlobalForward_OnClientLoaded); Call_PushCell(iClient); Call_PushCell(g_iClientInfo[iClient] & IS_VIP); Call_Finish(); } -void CreateForward_OnVIPClientLoaded(int iClient) +void CallForward_OnVIPClientLoaded(int iClient) { - DBG_API("CreateForward_OnVIPClientLoaded(%N (%d))", iClient, iClient) + DBG_API("CallForward_OnVIPClientLoaded(%N (%d))", iClient, iClient) Call_StartForward(g_hGlobalForward_OnVIPClientLoaded); Call_PushCell(iClient); Call_Finish(); } -void CreateForward_OnClientDisconnect(int iClient) +void CallForward_OnClientDisconnect(int iClient) { - DBG_API("CreateForward_OnClientDisconnect(%N (%d), %b)", iClient, iClient, g_iClientInfo[iClient] & IS_VIP) + DBG_API("CallForward_OnClientDisconnect(%N (%d), %b)", iClient, iClient, g_iClientInfo[iClient] & IS_VIP) Call_StartForward(g_hGlobalForward_OnClientDisconnect); Call_PushCell(iClient); Call_PushCell(g_iClientInfo[iClient] & IS_VIP); Call_Finish(); } -void CreateForward_OnVIPClientAdded(int iClient, int iAdmin = OWNER_PLUGIN) +void CallForward_OnVIPClientAdded(int iClient, int iAdmin = OWNER_PLUGIN) { - DBG_API("CreateForward_OnVIPClientAdded(%N (%d), %d)", iClient, iClient, iAdmin) + DBG_API("CallForward_OnVIPClientAdded(%N (%d), %d)", iClient, iClient, iAdmin) Call_StartForward(g_hGlobalForward_OnVIPClientAdded); Call_PushCell(iClient); Call_PushCell(iAdmin); Call_Finish(); } -void CreateForward_OnVIPClientRemoved(int iClient, const char[] sReason, int iAdmin = OWNER_PLUGIN) +void CallForward_OnVIPClientRemoved(int iClient, const char[] sReason, int iAdmin = OWNER_PLUGIN) { - DBG_API("CreateForward_OnVIPClientRemoved(%N (%d), %d, '%s')", iClient, iClient, iAdmin, sReason) + DBG_API("CallForward_OnVIPClientRemoved(%N (%d), %d, '%s')", iClient, iClient, iAdmin, sReason) Call_StartForward(g_hGlobalForward_OnVIPClientRemoved); Call_PushCell(iClient); Call_PushString(sReason); @@ -93,9 +93,9 @@ void CreateForward_OnVIPClientRemoved(int iClient, const char[] sReason, int iAd Call_Finish(); } -void CreateForward_OnPlayerSpawn(int iClient, int iTeam) +void CallForward_OnPlayerSpawn(int iClient, int iTeam) { - DBG_API("CreateForward_OnPlayerSpawn(%N (%d), %d, %b)", iClient, iClient, iTeam, g_iClientInfo[iClient] & IS_VIP) + DBG_API("CallForward_OnPlayerSpawn(%N (%d), %d, %b)", iClient, iClient, iTeam, g_iClientInfo[iClient] & IS_VIP) Call_StartForward(g_hGlobalForward_OnPlayerSpawn); Call_PushCell(iClient); Call_PushCell(iTeam); @@ -103,9 +103,9 @@ void CreateForward_OnPlayerSpawn(int iClient, int iTeam) Call_Finish(); } -Action CreateForward_OnShowClientInfo(int iClient, const char[] szEvent, const char[] szType, KeyValues hKeyValues) +Action CallForward_OnShowClientInfo(int iClient, const char[] szEvent, const char[] szType, KeyValues hKeyValues) { - DBG_API("CreateForward_OnShowClientInfo(%N (%d), '%s', '%s')", iClient, iClient, szEvent, szType) + DBG_API("CallForward_OnShowClientInfo(%N (%d), '%s', '%s')", iClient, iClient, szEvent, szType) Action eResult = Plugin_Continue; Call_StartForward(g_hGlobalForward_OnShowClientInfo); Call_PushCell(iClient); @@ -113,14 +113,14 @@ Action CreateForward_OnShowClientInfo(int iClient, const char[] szEvent, const c Call_PushString(szType); Call_PushCell(hKeyValues); Call_Finish(eResult); - DBG_API("CreateForward_OnShowClientInfo = %d", eResult) + DBG_API("CallForward_OnShowClientInfo = %d", eResult) return eResult; } -VIP_ToggleState CreateForward_OnFeatureToggle(int iClient, const char[] szFeature, VIP_ToggleState eOldStatus, VIP_ToggleState eNewStatus) +VIP_ToggleState CallForward_OnFeatureToggle(int iClient, const char[] szFeature, VIP_ToggleState eOldStatus, VIP_ToggleState eNewStatus) { - DBG_API("CreateForward_OnFeatureToggle(%N (%d), '%s', %d, %d)", iClient, iClient, szFeature, eOldStatus, eNewStatus) + DBG_API("CallForward_OnFeatureToggle(%N (%d), '%s', %d, %d)", iClient, iClient, szFeature, eOldStatus, eNewStatus) Action aResult = Plugin_Continue; VIP_ToggleState eResultStatus = eNewStatus; @@ -130,7 +130,7 @@ VIP_ToggleState CreateForward_OnFeatureToggle(int iClient, const char[] szFeatur Call_PushCell(eOldStatus); Call_PushCellRef(eResultStatus); Call_Finish(aResult); - DBG_API("CreateForward_OnShowClientInfo = %b", bResult) + DBG_API("CallForward_OnShowClientInfo = %b", bResult) switch (aResult) { @@ -151,17 +151,17 @@ VIP_ToggleState CreateForward_OnFeatureToggle(int iClient, const char[] szFeatur return eResultStatus; } -void CreateForward_OnFeatureRegistered(const char[] szFeature) +void CallForward_OnFeatureRegistered(const char[] szFeature) { - DBG_API("CreateForward_OnFeatureRegistered('%s')", szFeature) + DBG_API("CallForward_OnFeatureRegistered('%s')", szFeature) Call_StartForward(g_hGlobalForward_OnFeatureRegistered); Call_PushString(szFeature); Call_Finish(); } -void CreateForward_OnFeatureUnregistered(const char[] szFeature) +void CallForward_OnFeatureUnregistered(const char[] szFeature) { - DBG_API("CreateForward_OnFeatureUnregistered('%s')", szFeature) + DBG_API("CallForward_OnFeatureUnregistered('%s')", szFeature) Call_StartForward(g_hGlobalForward_OnFeatureUnregistered); Call_PushString(szFeature); Call_Finish(); @@ -587,7 +587,7 @@ int API_GiveClientVIP(Handle hPlugin, { ResetClient(iClient); - CreateForward_OnVIPClientRemoved(iClient, "Removed for VIP-status change", iAdmin); + CallForward_OnVIPClientRemoved(iClient, "Removed for VIP-status change", iAdmin); } else { @@ -696,7 +696,7 @@ int API_RemoveClientVIP(Handle hPlugin, char szBuffer[PMP]; FormatEx(SZF(szBuffer), "Removed by %s", szPluginName); - CreateForward_OnVIPClientRemoved(iClient, szBuffer, iAdmin); + CallForward_OnVIPClientRemoved(iClient, szBuffer, iAdmin); if (bNotify) { @@ -792,7 +792,7 @@ public int Native_RegisterFeature(Handle hPlugin, int iNumParams) } } - CreateForward_OnFeatureRegistered(szFeature); + CallForward_OnFeatureRegistered(szFeature); DebugMessage("Feature \"%s\" registered", szFeature) return 1; @@ -901,7 +901,7 @@ void UnregisterFeature(const char[] szFeature, ArrayList hArray) } } - CreateForward_OnFeatureUnregistered(szFeature); + CallForward_OnFeatureUnregistered(szFeature); DebugMessage("Feature \"%s\" unregistered", szFeature) } @@ -1153,7 +1153,7 @@ public int Native_GiveClientFeature(Handle hPlugin, int iNumParams) { Function_OnItemToggle(view_as(hArray.Get(FEATURES_PLUGIN)), fCallback, iClient, szFeature, NO_ACCESS, ENABLED); } - CreateForward_OnFeatureToggle(iClient, szFeature, NO_ACCESS, ENABLED); + CallForward_OnFeatureToggle(iClient, szFeature, NO_ACCESS, ENABLED); } return 1; @@ -1198,7 +1198,7 @@ public int Native_RemoveClientFeature(Handle hPlugin, int iNumParams) { Function_OnItemToggle(view_as(hArray.Get(FEATURES_PLUGIN)), fCallback, iClient, szFeature, eToggleState, NO_ACCESS); } - CreateForward_OnFeatureToggle(iClient, szFeature, eToggleState, NO_ACCESS); + CallForward_OnFeatureToggle(iClient, szFeature, eToggleState, NO_ACCESS); } return 1; diff --git a/addons/sourcemod/scripting/vip/AdminMenu.sp b/addons/sourcemod/scripting/vip/AdminMenu.sp index 557ea52..f177a62 100644 --- a/addons/sourcemod/scripting/vip/AdminMenu.sp +++ b/addons/sourcemod/scripting/vip/AdminMenu.sp @@ -564,7 +564,7 @@ public int MenuHandler_GroupsList(Menu hMenu, MenuAction action, int iClient, in if (iTarget) { ResetClient(iTarget); - CreateForward_OnVIPClientRemoved(iTarget, "VIP-Group Changed", iClient); + CallForward_OnVIPClientRemoved(iTarget, "VIP-Group Changed", iClient); Clients_CheckVipAccess(iTarget, false); } diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index 67dfb69..a9cf774 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -27,7 +27,7 @@ public void OnClientDisconnect(int iClient) if(!IsFakeClient(iClient)) { - CreateForward_OnClientDisconnect(iClient); + CallForward_OnClientDisconnect(iClient); } ResetClient(iClient); @@ -37,7 +37,7 @@ public void OnClientDisconnect(int iClient) void Clients_CheckVipAccess(int iClient, bool bNotify = false, bool bForward = false) { - if(bForward && !CreateForward_OnClientPreLoad(iClient)) + if(bForward && !CallForward_OnClientPreLoad(iClient)) { return; } @@ -54,7 +54,7 @@ void Clients_CheckVipAccess(int iClient, bool bNotify = false, bool bForward = f else { g_iClientInfo[iClient] |= IS_LOADED; - CreateForward_OnClientLoaded(iClient); + CallForward_OnClientLoaded(iClient); } } @@ -141,12 +141,12 @@ public void SQL_Callback_OnClientAuthorized(Database hOwner, DBResultSet hResult DB_RemoveClientFromID(REASON_EXPIRED, iClient, iAccountID, false, _, szGroup); } - CreateForward_OnVIPClientRemoved(iClient, "Expired"); + CallForward_OnVIPClientRemoved(iClient, "Expired"); DisplayClientInfo(iClient, "expired_info"); g_iClientInfo[iClient] |= IS_LOADED; - CreateForward_OnClientLoaded(iClient); + CallForward_OnClientLoaded(iClient); return; } @@ -166,7 +166,7 @@ public void SQL_Callback_OnClientAuthorized(Database hOwner, DBResultSet hResult g_iClientInfo[iClient] |= IS_VIP|IS_LOADED; - CreateForward_OnClientLoaded(iClient); + CallForward_OnClientLoaded(iClient); char szName[MAX_NAME_LENGTH*2+1]; hResult.FetchString(2, SZF(szName)); @@ -191,14 +191,14 @@ public void SQL_Callback_OnClientAuthorized(Database hOwner, DBResultSet hResult return; } - CreateForward_OnClientLoaded(iClient); + CallForward_OnClientLoaded(iClient); } void Clients_OnVIPClientLoaded(int iClient) { Features_TurnOnAll(iClient); - CreateForward_OnVIPClientLoaded(iClient); + CallForward_OnVIPClientLoaded(iClient); } void Clients_CreateClientVIPSettings(int iClient, int iExp) @@ -491,7 +491,7 @@ public Action Timer_OnPlayerSpawn(Handle hTimer, any UserID) } g_iClientInfo[iClient] |= IS_SPAWNED; - CreateForward_OnPlayerSpawn(iClient, iTeam); + CallForward_OnPlayerSpawn(iClient, iTeam); } } return Plugin_Stop; @@ -559,7 +559,7 @@ void Clients_ExpiredClient(int iClient) ResetClient(iClient); - CreateForward_OnVIPClientRemoved(iClient, "Expired"); + CallForward_OnVIPClientRemoved(iClient, "Expired"); DisplayClientInfo(iClient, "expired_info"); } diff --git a/addons/sourcemod/scripting/vip/Info.sp b/addons/sourcemod/scripting/vip/Info.sp index 3ee2c2f..32abd59 100644 --- a/addons/sourcemod/scripting/vip/Info.sp +++ b/addons/sourcemod/scripting/vip/Info.sp @@ -30,7 +30,7 @@ void DisplayInfo(int iClient, const char[] szEvent, const char[] szType, char[] { KeyValues hKeyValues = new KeyValues(szType); KvCopySubkeys(g_hInfo, hKeyValues); - switch(CreateForward_OnShowClientInfo(iClient, szEvent, szType, hKeyValues)) + switch(CallForward_OnShowClientInfo(iClient, szEvent, szType, hKeyValues)) { case Plugin_Stop, Plugin_Handled: { diff --git a/addons/sourcemod/scripting/vip/UTIL.sp b/addons/sourcemod/scripting/vip/UTIL.sp index 7bdfee8..e684838 100644 --- a/addons/sourcemod/scripting/vip/UTIL.sp +++ b/addons/sourcemod/scripting/vip/UTIL.sp @@ -266,7 +266,7 @@ void UTIL_REM_VIP_PLAYER(int iClient = OWNER_SERVER, int iTarget = 0, int iAccID ResetClient(iTarget); - CreateForward_OnVIPClientRemoved(iTarget, szReason); + CallForward_OnVIPClientRemoved(iTarget, szReason); DisplayClientInfo(iTarget, "expired_info"); } @@ -435,7 +435,7 @@ public void SQL_Callback_OnVIPClientAdded(Database hOwner, DBResultSet hResult, if (iTarget) { Clients_CheckVipAccess(iTarget, true); - CreateForward_OnVIPClientAdded(iTarget, iAdmin); + CallForward_OnVIPClientAdded(iTarget, iAdmin); } char szAuth[32]; diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index a0e3770..5f8c4e0 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -265,7 +265,7 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti if (eNewStatus != eOldStatus) { - eNewStatus = CreateForward_OnFeatureToggle(iClient, szFeature, eOldStatus, eNewStatus); + eNewStatus = CallForward_OnFeatureToggle(iClient, szFeature, eOldStatus, eNewStatus); if (eNewStatus != eOldStatus) { Features_SetStatus(iClient, szFeature, eNewStatus); diff --git a/addons/sourcemod/scripting/vip/adminmenu/Del.sp b/addons/sourcemod/scripting/vip/adminmenu/Del.sp index 3f93d24..6e6a351 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/Del.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/Del.sp @@ -49,7 +49,7 @@ public int MenuHandler_DeleteVipPlayerMenu(Menu hMenu, MenuAction action, int iC DB_RemoveClientFromID(iClient, iTarget, _, true); Features_TurnOffAll(iTarget); ResetClient(iTarget); - CreateForward_OnVIPClientRemoved(iTarget, "Removed by Admin", iClient); + CallForward_OnVIPClientRemoved(iTarget, "Removed by Admin", iClient); DisplayClientInfo(iTarget, "expired_info"); BackToAdminMenu(iClient); return 0; From 950ed7306c81d701ac45f99c19cc2938e9a1b943 Mon Sep 17 00:00:00 2001 From: vandrienko Date: Sun, 30 May 2021 13:19:49 +0300 Subject: [PATCH 55/99] remake core version & add interface version --- addons/sourcemod/scripting/VIP_Core.sp | 10 ++++----- .../sourcemod/scripting/include/vip_core.inc | 2 ++ addons/sourcemod/scripting/vip/Cvars.sp | 21 +++++++------------ .../scripting/vip/{Debug.sp => Debugger.sp} | 0 4 files changed, 13 insertions(+), 20 deletions(-) rename addons/sourcemod/scripting/vip/{Debug.sp => Debugger.sp} (100%) diff --git a/addons/sourcemod/scripting/VIP_Core.sp b/addons/sourcemod/scripting/VIP_Core.sp index 46b7d79..55da388 100644 --- a/addons/sourcemod/scripting/VIP_Core.sp +++ b/addons/sourcemod/scripting/VIP_Core.sp @@ -6,10 +6,8 @@ #include #include -#if defined VIP_CORE_VERSION -#define VIP_VERSION VIP_CORE_VERSION -#else -#define VIP_VERSION "3.1 DEV" +#if !defined VIP_CORE_VERSION +#define VIP_CORE_VERSION "3.1.0 DEV" #endif #define DEBUG_MODE 0 // Режим отладки @@ -34,12 +32,12 @@ public Plugin myinfo = { name = "[VIP] Core", author = "R1KO", - version = VIP_VERSION, + version = VIP_CORE_VERSION, url = "http://hlmod.ru" }; #include "vip/Global.sp" -#include "vip/Debug.sp" +#include "vip/Debugger.sp" #include "vip/Downloads.sp" #include "vip/Colors.sp" #include "vip/UTIL.sp" diff --git a/addons/sourcemod/scripting/include/vip_core.inc b/addons/sourcemod/scripting/include/vip_core.inc index 6e7bb75..c85cb6d 100644 --- a/addons/sourcemod/scripting/include/vip_core.inc +++ b/addons/sourcemod/scripting/include/vip_core.inc @@ -3,6 +3,8 @@ #endif #define _vip_core_included +#define VIP_CORE_INTERFACE 310 + /* Типы данных VIP-функций */ enum VIP_ValueType { diff --git a/addons/sourcemod/scripting/vip/Cvars.sp b/addons/sourcemod/scripting/vip/Cvars.sp index 3cfaf46..03c81ca 100644 --- a/addons/sourcemod/scripting/vip/Cvars.sp +++ b/addons/sourcemod/scripting/vip/Cvars.sp @@ -1,7 +1,7 @@ void Cvars_Setup() { - CreateConVar("sm_vip_core_version", VIP_VERSION, "VIP-CORE VERSION", FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_CHEAT|FCVAR_DONTRECORD); + CreateConVar("sm_vip_core_version", VIP_CORE_VERSION, "VIP-CORE VERSION", FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_CHEAT|FCVAR_DONTRECORD); ConVar hCvar = CreateConVar("sm_vip_admin_flag", "z", "Флаг админа, необходимый чтобы иметь доступ к управлению VIP-игроками."); hCvar.AddChangeHook(OnAdminFlagChange); @@ -12,18 +12,7 @@ void Cvars_Setup() hCvar = CreateConVar("sm_vip_server_id", "0", "ID сервера при приспользовании MySQL базы данных", _, true, 0.0); hCvar.AddChangeHook(OnServerIDChange); g_CVAR_iServerID = hCvar.IntValue; - if (GLOBAL_INFO & IS_MySQL) - { - #if USE_MORE_SERVERS 1 - FormatEx(SZF(g_szSID), " AND (`sid` = %d OR `sid` = 0)", g_CVAR_iServerID); - #else - FormatEx(SZF(g_szSID), " AND `sid` = %d", g_CVAR_iServerID); - #endif - } - else - { - g_szSID[0] = 0; - } + SetupServerID(); hCvar = CreateConVar("sm_vip_auto_open_menu", "0", "Автоматически открывать VIP-меню при входе (0 - Выключено, 1 - Включено)", _, true, 0.0, true, 1.0); hCvar.AddChangeHook(OnAutoOpenMenuChange); @@ -84,6 +73,11 @@ public void OnAdminFlagChange(ConVar hCvar, const char[] szOldValue, const char[ public void OnServerIDChange(ConVar hCvar, const char[] szOldValue, const char[] szNewValue) { g_CVAR_iServerID = hCvar.IntValue; + SetupServerID(); +} + +void SetupServerID() +{ if (GLOBAL_INFO & IS_MySQL) { #if USE_MORE_SERVERS 1 @@ -114,7 +108,6 @@ public void OnDeleteExpiredChange(ConVar hCvar, const char[] szOldValue, const c if(g_CVAR_iDeleteExpired < -1) { g_CVAR_iDeleteExpired = -1; - return; } } diff --git a/addons/sourcemod/scripting/vip/Debug.sp b/addons/sourcemod/scripting/vip/Debugger.sp similarity index 100% rename from addons/sourcemod/scripting/vip/Debug.sp rename to addons/sourcemod/scripting/vip/Debugger.sp From a3e9c65a26e09f88b6ce6b98c72a32d4fb35acf1 Mon Sep 17 00:00:00 2001 From: vandrienko Date: Sun, 30 May 2021 19:19:57 +0300 Subject: [PATCH 56/99] add internal storage --- addons/sourcemod/scripting/VIP_Core.sp | 14 +- .../sourcemod/scripting/include/vip_core.inc | 32 +++ addons/sourcemod/scripting/vip/API.sp | 117 ++++++--- addons/sourcemod/scripting/vip/AdminMenu.sp | 9 +- addons/sourcemod/scripting/vip/Clients.sp | 240 +++++++++--------- addons/sourcemod/scripting/vip/Database.sp | 36 ++- addons/sourcemod/scripting/vip/Features.sp | 59 ++++- addons/sourcemod/scripting/vip/Global.sp | 20 +- addons/sourcemod/scripting/vip/Storage.sp | 145 +++++++++++ addons/sourcemod/scripting/vip/UTIL.sp | 20 -- addons/sourcemod/scripting/vip/VipMenu.sp | 4 +- .../sourcemod/scripting/vip/adminmenu/Del.sp | 5 +- .../sourcemod/scripting/vip/adminmenu/List.sp | 2 +- 13 files changed, 514 insertions(+), 189 deletions(-) create mode 100644 addons/sourcemod/scripting/vip/Storage.sp diff --git a/addons/sourcemod/scripting/VIP_Core.sp b/addons/sourcemod/scripting/VIP_Core.sp index 55da388..9ca26d9 100644 --- a/addons/sourcemod/scripting/VIP_Core.sp +++ b/addons/sourcemod/scripting/VIP_Core.sp @@ -4,24 +4,31 @@ #include #include -#include #if !defined VIP_CORE_VERSION #define VIP_CORE_VERSION "3.1.0 DEV" #endif -#define DEBUG_MODE 0 // Режим отладки +#define DEBUG_MODE 0 // Режим отладки -#define USE_ADMINMENU 1 // Включение админ-меню для управления VIP +#define USE_ADMINMENU 1 // Включение админ-меню для управления VIP #define USE_MORE_SERVERS 1 // Включить/Отключить режим при котором если ID сервера у игрока 0 - то VIP будет работать на всех серверах + +#define USE_CLIENTPREFS 0 // Использовать ли стандартные куки для хранения данных игроков + #define CHARSET "utf8mb4" #define COLLATION "utf8mb4_unicode_ci" //#define CHARSET "utf8" //#define COLLATION "utf8_unicode_ci" + +#if USE_CLIENTPREFS 1 +#include +#endif + #if USE_ADMINMENU 1 #undef REQUIRE_PLUGIN #include @@ -41,6 +48,7 @@ public Plugin myinfo = #include "vip/Downloads.sp" #include "vip/Colors.sp" #include "vip/UTIL.sp" +#include "vip/Storage.sp" #include "vip/Features.sp" #include "vip/Sounds.sp" #include "vip/Info.sp" diff --git a/addons/sourcemod/scripting/include/vip_core.inc b/addons/sourcemod/scripting/include/vip_core.inc index c85cb6d..74721df 100644 --- a/addons/sourcemod/scripting/include/vip_core.inc +++ b/addons/sourcemod/scripting/include/vip_core.inc @@ -115,6 +115,15 @@ forward void VIP_OnPlayerSpawn(int iClient, int iTeam, bool bIsVIP); */ forward Action VIP_OnShowClientInfo(int iClient, const char[] szEvent, const char[] szType, KeyValues hKeyValues); +/** + * Вызывается когда загружены данные из хранилища игрока + * + * @param iClient Индекс игрока. + * + * @noreturn +*/ +forward void VIP_OnClientStorageLoaded(int iClient); + /** * Вызывается когда у VIP-игрока изменяется статус функции. * @@ -580,6 +589,29 @@ native bool VIP_GiveClientFeature(int iClient, const char[] szFeature, const cha */ native bool VIP_RemoveClientFeature(int iClient, const char[] szFeature); + +/** + * Сохраняет значение в хранилище игрока + * + * @param iClient Индекс игрока. + * @param szKey Ключ + * @param szValue Значение + * + * @noreturn +*/ +native void VIP_SetClientStorageValue(int iClient, const char[] szKey, const char[] szValue); + +/** + * Получает значение из хранилища игрока + * + * @param szKey Ключ + * @param szValue Буфер, в который будет помещен результат. + * @param iMaxLength Размер буфера. + * + * @noreturn +*/ +native void VIP_GetClientStorageValue(int iClient, const char[] szKey, char[] szValue, int iMaxLength); + /** * Получает Handle базы данных. После работы необходимо закрыть с помощью CloseHandle() или delete * diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 506acab..b45aa1a 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -10,6 +10,7 @@ static Handle g_hGlobalForward_OnFeatureToggle; static Handle g_hGlobalForward_OnFeatureRegistered; static Handle g_hGlobalForward_OnFeatureUnregistered; static Handle g_hGlobalForward_OnClientDisconnect; +static Handle g_hGlobalForward_OnClientStorageLoaded; void API_SetupForwards() { @@ -26,6 +27,7 @@ void API_SetupForwards() g_hGlobalForward_OnFeatureRegistered = CreateGlobalForward("VIP_OnFeatureRegistered", ET_Ignore, Param_String); g_hGlobalForward_OnFeatureUnregistered = CreateGlobalForward("VIP_OnFeatureUnregistered", ET_Ignore, Param_String); g_hGlobalForward_OnClientDisconnect = CreateGlobalForward("VIP_OnClientDisconnect", ET_Ignore, Param_Cell, Param_Cell); + g_hGlobalForward_OnClientStorageLoaded = CreateGlobalForward("VIP_OnClientStorageLoaded", ET_Ignore, Param_Cell); } // Global Forwards @@ -38,7 +40,7 @@ void CallForward_OnVIPLoaded() bool CallForward_OnClientPreLoad(int iClient) { - DBG_API("g_hGlobalForward_OnClientPreLoad(%N (%d), %b)", iClient, iClient, g_iClientInfo[iClient] & IS_VIP) + DBG_API("g_hGlobalForward_OnClientPreLoad(%N (%d), %b)", iClient, iClient, IS_CLIENT_VIP(iClient)) bool bResult = true; Call_StartForward(g_hGlobalForward_OnClientPreLoad); Call_PushCell(iClient); @@ -50,7 +52,7 @@ bool CallForward_OnClientPreLoad(int iClient) void CallForward_OnClientLoaded(int iClient) { - DBG_API("CallForward_OnClientLoaded(%N (%d), %b)", iClient, iClient, g_iClientInfo[iClient] & IS_VIP) + DBG_API("CallForward_OnClientLoaded(%N (%d), %b)", iClient, iClient, IS_CLIENT_VIP(iClient)) Call_StartForward(g_hGlobalForward_OnClientLoaded); Call_PushCell(iClient); Call_PushCell(g_iClientInfo[iClient] & IS_VIP); @@ -67,7 +69,7 @@ void CallForward_OnVIPClientLoaded(int iClient) void CallForward_OnClientDisconnect(int iClient) { - DBG_API("CallForward_OnClientDisconnect(%N (%d), %b)", iClient, iClient, g_iClientInfo[iClient] & IS_VIP) + DBG_API("CallForward_OnClientDisconnect(%N (%d), %b)", iClient, iClient, IS_CLIENT_VIP(iClient)) Call_StartForward(g_hGlobalForward_OnClientDisconnect); Call_PushCell(iClient); Call_PushCell(g_iClientInfo[iClient] & IS_VIP); @@ -95,7 +97,7 @@ void CallForward_OnVIPClientRemoved(int iClient, const char[] sReason, int iAdmi void CallForward_OnPlayerSpawn(int iClient, int iTeam) { - DBG_API("CallForward_OnPlayerSpawn(%N (%d), %d, %b)", iClient, iClient, iTeam, g_iClientInfo[iClient] & IS_VIP) + DBG_API("CallForward_OnPlayerSpawn(%N (%d), %d, %b)", iClient, iClient, iTeam, IS_CLIENT_VIP(iClient)) Call_StartForward(g_hGlobalForward_OnPlayerSpawn); Call_PushCell(iClient); Call_PushCell(iTeam); @@ -118,6 +120,14 @@ Action CallForward_OnShowClientInfo(int iClient, const char[] szEvent, const cha return eResult; } +void CallForward_OnClientStorageLoaded(int iClient) +{ + DBG_API("CallForward_OnClientStorageLoaded(%N (%d))", iClient, iClient) + Call_StartForward(g_hGlobalForward_OnClientStorageLoaded); + Call_PushCell(iClient); + Call_Finish(); +} + VIP_ToggleState CallForward_OnFeatureToggle(int iClient, const char[] szFeature, VIP_ToggleState eOldStatus, VIP_ToggleState eNewStatus) { DBG_API("CallForward_OnFeatureToggle(%N (%d), '%s', %d, %d)", iClient, iClient, szFeature, eOldStatus, eNewStatus) @@ -264,6 +274,10 @@ public APLRes AskPluginLoad2(Handle myself, bool bLate, char[] szError, int err_ RegNative(GiveClientFeature); RegNative(RemoveClientFeature); + // Storage + RegNative(SetClientStorageValue); + RegNative(GetClientStorageValue); + // Helpers RegNative(PrintToChatClient); RegNative(PrintToChatAll); @@ -579,13 +593,24 @@ int API_GiveClientVIP(Handle hPlugin, { if (CheckValidClient(iClient, false) && (iAdmin < 1 || CheckValidClient(iAdmin, false))) { + + if (!UTIL_CheckValidVIPGroup(szGroup)) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Invalid VIP-group (%s)", szGroup); + } + + if (iTime < 0) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Invalid time (%d)", iTime); + } + if (g_iClientInfo[iClient] & IS_VIP) { int iClientID; g_hFeatures[iClient].GetValue(KEY_CID, iClientID); if (iClientID == -1 && bAddToDB) { - ResetClient(iClient); + Clients_ResetClient(iClient); CallForward_OnVIPClientRemoved(iClient, "Removed for VIP-status change", iAdmin); } @@ -594,15 +619,6 @@ int API_GiveClientVIP(Handle hPlugin, return ThrowNativeError(SP_ERROR_NATIVE, "The player %L is already a VIP", iClient, iClient); } } - - if (!UTIL_CheckValidVIPGroup(szGroup)) - { - return ThrowNativeError(SP_ERROR_NATIVE, "Invalid VIP-group (%s)", szGroup); - } - if (iTime < 0) - { - return ThrowNativeError(SP_ERROR_NATIVE, "Invalid time (%d)", iTime); - } if (bAddToDB) { @@ -611,22 +627,18 @@ int API_GiveClientVIP(Handle hPlugin, UTIL_ADD_VIP_PLAYER(iAdmin, iClient, _, iTime, szGroup, szPluginName); return 0; } - if (iTime == 0) - { - Clients_CreateClientVIPSettings(iClient, iTime); - } - else + + int iExpires = iTime; + + if (iTime != 0) { int iCurrentTime = GetTime(); - Clients_CreateClientVIPSettings(iClient, iTime+iCurrentTime); - Clients_CreateExpiredTimer(iClient, iTime+iCurrentTime, iCurrentTime); + iExpires = iTime + iCurrentTime; + Clients_CreateExpiredTimer(iClient, iExpires, iCurrentTime); } - g_hFeatures[iClient].SetString(KEY_GROUP, szGroup); - g_hFeatures[iClient].SetValue(KEY_CID, -1); - g_iClientInfo[iClient] |= IS_VIP; - g_iClientInfo[iClient] |= IS_LOADED; + Clients_InitVIPClient(iClient, -1, szGroup, iExpires); Clients_LoadVIPFeatures(iClient); @@ -692,7 +704,8 @@ int API_RemoveClientVIP(Handle hPlugin, Features_TurnOffAll(iClient); - ResetClient(iClient); + Clients_ResetClient(iClient); + SET_BIT(g_iClientInfo[iClient], IS_LOADED); char szBuffer[PMP]; FormatEx(SZF(szBuffer), "Removed by %s", szPluginName); @@ -757,10 +770,13 @@ public int Native_RegisterFeature(Handle hPlugin, int iNumParams) if (eType != HIDE) { Handle hCookie = null; + + #if USE_CLIENTPREFS 1 if (eType == TOGGLABLE || (eType == SELECTABLE && iNumParams > 7 && GetNativeCell(8))) { hCookie = RegClientCookie(szFeature, szFeature, CookieAccess_Private); } + #endif Function fCallback = GetNativeCell(4); if (eType == SELECTABLE && fCallback == INVALID_FUNCTION) @@ -1019,8 +1035,7 @@ public int Native_SetClientFeatureStatus(Handle hPlugin, int iNumParams) Features_SetStatus(iClient, szFeature, eNewStatus); if(iNumParams > 4 && GetNativeCell(5)) { - IntToString(view_as(eNewStatus), SZF(szFeature)); - SetClientCookie(iClient, view_as(GetArrayCell(hArray, FEATURES_COOKIE)), szFeature); + Features_SetStatusToStorage(iClient, szFeature, hArray, eNewStatus); } return true; } @@ -1116,9 +1131,10 @@ public int Native_GiveClientFeature(Handle hPlugin, int iNumParams) if (!(g_iClientInfo[iClient] & IS_VIP)) { - Clients_CreateClientVIPSettings(iClient, 0); + Clients_InitVIPClient(iClient, -1, NULL_STRING, 0); g_hFeatures[iClient].SetValue(KEY_CID, -1); - g_iClientInfo[iClient] |= IS_VIP|IS_LOADED; + SET_BIT(g_iClientInfo[iClient], IS_VIP); + SET_BIT(g_iClientInfo[iClient], IS_LOADED); } switch (view_as(hArray.Get(FEATURES_VALUE_TYPE))) @@ -1183,10 +1199,13 @@ public int Native_RemoveClientFeature(Handle hPlugin, int iNumParams) g_hFeatures[iClient].Remove(szFeature); g_hFeatureStatus[iClient].Remove(szFeature); + /* if (!g_hFeatures[iClient].Size) { - ResetClient(iClient); + Clients_ResetClient(iClient); + SET_BIT(g_iClientInfo[iClient], IS_LOADED); } + */ if (eToggleState != NO_ACCESS && view_as(hArray.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) { @@ -1204,6 +1223,40 @@ public int Native_RemoveClientFeature(Handle hPlugin, int iNumParams) return 1; } +public int Native_SetClientStorageValue(Handle hPlugin, int iNumParams) +{ + int iClient = GetNativeCell(1); + if (!CheckValidClient(iClient, false)) + { + return 0; + } + + char szKey[128], szValue[256]; + GetNativeString(2, SZF(szKey)); + GetNativeString(3, SZF(szValue)); + + Storage_SetClientValue(iClient, szKey, szValue); + + return 0; +} + +public int Native_GetClientStorageValue(Handle hPlugin, int iNumParams) +{ + int iClient = GetNativeCell(1); + if (!CheckValidClient(iClient, false)) + { + return 0; + } + + char szKey[128], szValue[256]; + GetNativeString(2, SZF(szKey)); + + Storage_GetClientValue(iClient, szKey, SZF(szValue)); + SetNativeString(3, szValue, GetNativeCell(4), true); + + return 0; +} + public int Native_GetDatabase(Handle hPlugin, int iNumParams) { return view_as(CloneHandle(g_hDatabase, hPlugin)); @@ -1291,7 +1344,7 @@ bool CheckValidClient(const int &iClient, bool bCheckVIP = true) } */ - return view_as(g_iClientInfo[iClient] & IS_VIP); + return IS_CLIENT_VIP(iClient); } return true; diff --git a/addons/sourcemod/scripting/vip/AdminMenu.sp b/addons/sourcemod/scripting/vip/AdminMenu.sp index f177a62..f76aaa1 100644 --- a/addons/sourcemod/scripting/vip/AdminMenu.sp +++ b/addons/sourcemod/scripting/vip/AdminMenu.sp @@ -67,7 +67,7 @@ void InitiateDataMap(int iClient) } } -int IsClientOnline(int ID) +int GetClientByID(int ID) { int iClientID; for (int i = 1; i <= MaxClients; ++i) @@ -558,12 +558,13 @@ public int MenuHandler_GroupsList(Menu hMenu, MenuAction action, int iClient, in iTarget = CID(iTarget); if (!iTarget) { - iTarget = IsClientOnline(iTargetID); + iTarget = GetClientByID(iTargetID); } if (iTarget) { - ResetClient(iTarget); + Clients_ResetClient(iTarget); + SET_BIT(g_iClientInfo[iTarget], IS_LOADED); CallForward_OnVIPClientRemoved(iTarget, "VIP-Group Changed", iClient); Clients_CheckVipAccess(iTarget, false); } @@ -606,7 +607,7 @@ public void SQL_Callback_ChangeTime(Database hOwner, DBResultSet hResult, const if(!iTarget) { g_hClientData[iClient].GetValue(DATA_KEY_TargetID, iTarget); - iTarget = IsClientOnline(iTarget); + iTarget = GetClientByID(iTarget); } if (iTarget) diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index a9cf774..c681d57 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -1,8 +1,8 @@ -void ResetClient(int iClient) +void Clients_ResetClient(int iClient) { - g_iClientInfo[iClient] = IS_LOADED; - + g_iClientInfo[iClient] = 0; + UTIL_CloseHandleEx(g_hFeatures[iClient]); UTIL_CloseHandleEx(g_hFeatureStatus[iClient]); } @@ -12,10 +12,13 @@ public void OnClientPutInServer(int iClient) // g_iClientInfo[iClient] = 0; DebugMessage("OnClientPutInServer %N (%d): %b", iClient, iClient, g_iClientInfo[iClient]) - if(!IsFakeClient(iClient) && !IsClientSourceTV(iClient)) + if(IsFakeClient(iClient) || IsClientSourceTV(iClient)) { - Clients_CheckVipAccess(iClient, true, true); + return; } + + Storage_LoadClient(iClient); + Clients_CheckVipAccess(iClient, true, true); } public void OnClientDisconnect(int iClient) @@ -28,9 +31,11 @@ public void OnClientDisconnect(int iClient) if(!IsFakeClient(iClient)) { CallForward_OnClientDisconnect(iClient); + Storage_SaveClient(iClient); + Storage_ResetClient(iClient); } - ResetClient(iClient); + Clients_ResetClient(iClient); UTIL_CloseHandleEx(g_hClientData[iClient]); g_iClientInfo[iClient] = 0; } @@ -42,9 +47,9 @@ void Clients_CheckVipAccess(int iClient, bool bNotify = false, bool bForward = f return; } - g_iClientInfo[iClient] &= ~IS_LOADED; - - ResetClient(iClient); + Clients_ResetClient(iClient); + + // UNSET_BIT(g_iClientInfo[iClient], IS_LOADED); if (IsFakeClient(iClient) == false && (GLOBAL_INFO & IS_STARTED) && g_hDatabase) { @@ -66,20 +71,10 @@ void Clients_LoadClient(int iClient, bool bNotify) DebugMessage("Clients_LoadClient %N (%d), %b: - > %x, %u", iClient, iClient, g_iClientInfo[iClient], g_hDatabase, g_hDatabase) - char szWhere[64]; - if(g_szSID[0]) - { - #if USE_MORE_SERVERS 1 - FormatEx(SZF(szWhere), " AND (`sid` = %d OR `sid` = 0)", g_CVAR_iServerID); - #else - strcopy(SZF(szWhere), g_szSID); - #endif - } - FormatEx(SZF(szQuery), "SELECT `expires`, `group`, `name` \ FROM `vip_users` \ WHERE `account_id` = %d%s LIMIT 1;", - iAccountID, szWhere); + iAccountID, g_szSID); DataPack hDataPack = new DataPack(); hDataPack.WriteCell(UID(iClient)); @@ -114,86 +109,96 @@ public void SQL_Callback_OnClientAuthorized(Database hOwner, DBResultSet hResult return; } - if (hResult.FetchRow()) + if (!hResult.FetchRow()) { - DBG_SQL_Response("hResult.FetchRow()") - - int iExpires = hResult.FetchInt(0); - DBG_SQL_Response("hResult.FetchInt(0) = %d", iExpires) - if (iExpires > 0) - { - int iTime = GetTime(); - - if (iTime > iExpires) - { - if (g_CVAR_iDeleteExpired == 0 || (g_CVAR_iDeleteExpired > 0 && iTime >= ((g_CVAR_iDeleteExpired * 86400) + iExpires))) - { - if (g_CVAR_bLogsEnable) - { - LogToFile(g_szLogFile, "%T", "REMOVING_PLAYER", LANG_SERVER, iClient); - } - - DebugMessage("Clients_LoadClient %N (%d):\tDelete", iClient, iClient) + OnClientLoaded(iClient); + return; + } + DBG_SQL_Response("hResult.FetchRow()") - char szGroup[64]; - hResult.FetchString(1, SZF(szGroup)); + int iExpires = hResult.FetchInt(0); + DBG_SQL_Response("hResult.FetchInt(0) = %d", iExpires) + char szGroup[64]; + hResult.FetchString(1, SZF(szGroup)); + DBG_SQL_Response("hResult.FetchString(1) = '%s", szGroup) - DB_RemoveClientFromID(REASON_EXPIRED, iClient, iAccountID, false, _, szGroup); - } + + LoadClient(iClient, iAccountID, szGroup, iExpires); + OnClientLoaded(iClient); - CallForward_OnVIPClientRemoved(iClient, "Expired"); - - DisplayClientInfo(iClient, "expired_info"); - - g_iClientInfo[iClient] |= IS_LOADED; - CallForward_OnClientLoaded(iClient); - return; - } - - Clients_CreateExpiredTimer(iClient, iExpires, iTime); - } + if (IS_CLIENT_VIP(iClient)) + { + char szName[MAX_NAME_LENGTH*2+1]; + hResult.FetchString(2, SZF(szName)); + DB_UpdateClient(iClient, szName); - char szGroup[64]; - hResult.FetchString(1, SZF(szGroup)); - DBG_SQL_Response("hResult.FetchString(1) = '%s", szGroup) - if (szGroup[0] && UTIL_CheckValidVIPGroup(szGroup)) + if (bNotify) { - Clients_CreateClientVIPSettings(iClient, iExpires); + if (g_CVAR_bAutoOpenMenu) + { + g_hVIPMenu.Display(iClient, MENU_TIME_FOREVER); + } - g_hFeatures[iClient].SetValue(KEY_CID, iAccountID); + DisplayClientInfo(iClient, iExpires == 0 ? "connect_info_perm":"connect_info_time"); + } - g_hFeatures[iClient].SetString(KEY_GROUP, szGroup); - - g_iClientInfo[iClient] |= IS_VIP|IS_LOADED; + // TODO: load from storage + Clients_LoadVIPFeaturesPre(iClient); + } +} - CallForward_OnClientLoaded(iClient); +void LoadClient(int iClient, int iAccountID, const char[] szGroup, int iExpires) +{ + if (!szGroup[0] || !UTIL_CheckValidVIPGroup(szGroup)) + { + LogError("Invalid VIP-Group/Некорректная VIP-группа: %s (Игрок: %d)", szGroup, iAccountID); + return; + } - char szName[MAX_NAME_LENGTH*2+1]; - hResult.FetchString(2, SZF(szName)); - DB_UpdateClient(iClient, szName); + if (iExpires > 0) + { + int iTime = GetTime(); - if (bNotify) + if (iTime > iExpires) + { + if (g_CVAR_iDeleteExpired == 0 || (g_CVAR_iDeleteExpired > 0 && iTime >= ((g_CVAR_iDeleteExpired * 86400) + iExpires))) { - if (g_CVAR_bAutoOpenMenu) + if (g_CVAR_bLogsEnable) { - g_hVIPMenu.Display(iClient, MENU_TIME_FOREVER); + LogToFile(g_szLogFile, "%T", "REMOVING_PLAYER", LANG_SERVER, iClient); } - DisplayClientInfo(iClient, iExpires == 0 ? "connect_info_perm":"connect_info_time"); + DebugMessage("Clients_LoadClient %N (%d):\tDelete", iClient, iClient) + + DB_RemoveClientFromID(REASON_EXPIRED, iClient, iAccountID, false, _, szGroup); } - Clients_LoadVIPFeaturesPre(iClient); - } - else - { - LogError("Invalid VIP-Group/Некорректная VIP-группа: %s (Игрок: %d)", szGroup, iAccountID); + CallForward_OnVIPClientRemoved(iClient, "Expired"); + + DisplayClientInfo(iClient, "expired_info"); + + return; } - return; + + Clients_CreateExpiredTimer(iClient, iExpires, iTime); } + Clients_InitVIPClient(iClient, iAccountID, szGroup, iExpires); +} + + +void OnClientLoaded(int iClient) +{ + SET_BIT(g_iClientInfo[iClient], IS_LOADED); CallForward_OnClientLoaded(iClient); } +void OnVIPClientLoaded(int iClient) +{ + SET_BIT(g_iClientInfo[iClient], IS_LOADED); + CallForward_OnVIPClientLoaded(iClient); +} + void Clients_OnVIPClientLoaded(int iClient) { Features_TurnOnAll(iClient); @@ -201,34 +206,55 @@ void Clients_OnVIPClientLoaded(int iClient) CallForward_OnVIPClientLoaded(iClient); } -void Clients_CreateClientVIPSettings(int iClient, int iExp) +void Clients_InitVIPClient(int iClient, int iAccountID = -1, const char[] szGroup = NULL_STRING, int iExpires = 0) { - /* g_hFeatures[iClient] = new StringMap(); g_hFeatureStatus[iClient] = new StringMap(); - */ - g_hFeatures[iClient] = CreateTrie(); - g_hFeatureStatus[iClient] = CreateTrie(); - g_hFeatures[iClient].SetValue(KEY_EXPIRES, iExp); + g_hFeatures[iClient].SetValue(KEY_EXPIRES, iExpires); + g_hFeatures[iClient].SetString(KEY_GROUP, szGroup); + g_hFeatures[iClient].SetValue(KEY_CID, iAccountID); + + SET_BIT(g_iClientInfo[iClient], IS_VIP); } -#if DEBUG_MODE 1 +#if USE_CLIENTPREFS 1 public void OnClientCookiesCached(int iClient) { DebugMessage("OnClientCookiesCached %d %N", iClient, iClient) DebugMessage("AreClientCookiesCached %b", AreClientCookiesCached(iClient)) + OnClientStorageLoaded(iClient); +} +#else +public void VIP_OnClientStorageLoaded(int iClient) +{ + DebugMessage("VIP_OnClientStorageLoaded: %d %N", iClient, iClient) + OnClientStorageLoaded(iClient); } #endif +void OnClientStorageLoaded(int iClient) +{ + DebugMessage("OnClientStorageLoaded: %d %N", iClient, iClient) +} + +bool IsClientStorageLoaded(int iClient) +{ + #if USE_CLIENTPREFS 1 + return AreClientCookiesCached(iClient); + #else + return Storage_IsClientLoaded(iClient); + #endif +} + void Clients_LoadVIPFeaturesPre(int iClient, const char[] szFeature = NULL_STRING) { DebugMessage("Clients_LoadVIPFeaturesPre %N", iClient) - DebugMessage("AreClientCookiesCached %b", AreClientCookiesCached(iClient)) + // DebugMessage("AreClientCookiesCached %b", AreClientCookiesCached(iClient)) - if (!AreClientCookiesCached(iClient)) + if (!IsClientStorageLoaded(iClient)) { DataPack hDataPack = new DataPack(); hDataPack.WriteCell(UID(iClient)); @@ -259,7 +285,7 @@ public Action Timer_CheckCookies(Handle hTimer, Handle hDP) hDataPack.Reset(); int iClient = CID(hDataPack.ReadCell()); - DebugMessage("Timer_CheckCookies -> iClient: %N (%d), IsClientVIP: %b,", iClient, iClient, view_as(g_iClientInfo[iClient] & IS_VIP)) + DebugMessage("Timer_CheckCookies -> iClient: %N (%d), IsClientVIP: %b", iClient, iClient, IS_CLIENT_VIP(iClient)) if (iClient && g_iClientInfo[iClient] & IS_VIP) { char szFeature[FEATURE_NAME_LENGTH]; @@ -300,7 +326,7 @@ void Clients_LoadVIPFeatures(int iClient) DebugMessage("Clients_OnVIPClientLoaded: %d %N", iClient, iClient) - Clients_OnVIPClientLoaded(iClient); + OnVIPClientLoaded(iClient); } @@ -340,25 +366,10 @@ void Clients_LoadFeature(int iClient, const char[] szFeature) DebugMessage("GetValue: == true") if (view_as(hArray.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) { - static char szBuffer[4]; - static Handle hCookie; - hCookie = view_as(hArray.Get(FEATURES_COOKIE)); - GetClientCookie(iClient, hCookie, SZF(szBuffer)); - eStatus = view_as(StringToInt(szBuffer)); - DebugMessage("GetFeatureCookie: '%s'", szBuffer) - if (szBuffer[0] == '\0' || (view_as(eStatus) > 2 || view_as(eStatus) < 0)) - { - switch(hArray.Get(FEATURES_DEF_STATUS)) - { - case NO_ACCESS: eStatus = g_CVAR_bDefaultStatus ? ENABLED:DISABLED; - case ENABLED: eStatus = ENABLED; - case DISABLED: eStatus = DISABLED; - } - - IntToString(view_as(eStatus), SZF(szBuffer)); - SetClientCookie(iClient, hCookie, szBuffer); - // Features_SaveStatus(iClient, szFeature, hCookie, eStatus); - } + eStatus = Features_GetStatusFromStorage(iClient, szFeature, hArray); + DebugMessage("Features_GetStatusFromStorage: '%d'", eStatus) + + Features_SetStatusToStorage(iClient, szFeature, hArray, eStatus); } else { @@ -376,10 +387,6 @@ bool GetValue(int iClient, VIP_ValueType ValueType, const char[] szFeature) DebugMessage("GetValue: %d - %s", ValueType, szFeature) switch (ValueType) { - case VIP_NULL: - { - return false; - } case BOOL: { if (g_hGroups.GetNum(szFeature)) @@ -423,6 +430,10 @@ bool GetValue(int iClient, VIP_ValueType ValueType, const char[] szFeature) } return false; } + case VIP_NULL: + { + return false; + } } return false; @@ -557,9 +568,10 @@ void Clients_ExpiredClient(int iClient) CancelClientMenu(iClient); } - ResetClient(iClient); - + Clients_ResetClient(iClient); + SET_BIT(g_iClientInfo[iClient], IS_LOADED); + CallForward_OnVIPClientRemoved(iClient, "Expired"); - + DisplayClientInfo(iClient, "expired_info"); } diff --git a/addons/sourcemod/scripting/vip/Database.sp b/addons/sourcemod/scripting/vip/Database.sp index a0957e2..71cce29 100644 --- a/addons/sourcemod/scripting/vip/Database.sp +++ b/addons/sourcemod/scripting/vip/Database.sp @@ -80,7 +80,8 @@ void CreateTables() #else FormatEx(SZF(g_szSID), " AND `sid` = %d", g_CVAR_iServerID); #endif - g_hDatabase.Query(SQL_Callback_TableCreate, "CREATE TABLE IF NOT EXISTS `vip_users` (\ + + g_hDatabase.Query(SQL_Callback_TableCreate, "CREATE TABLE IF NOT EXISTS `vip_users` (\ `account_id` INT NOT NULL, \ `name` VARCHAR(64) NOT NULL default 'unknown' COLLATE '" ... COLLATION ... "', \ `lastvisit` INT UNSIGNED NOT NULL default 0, \ @@ -89,16 +90,34 @@ void CreateTables() `expires` INT UNSIGNED NOT NULL default 0, \ CONSTRAINT pk_PlayerID PRIMARY KEY (`account_id`, `sid`) \ ) DEFAULT CHARSET=" ... CHARSET ... ";"); + + g_hDatabase.Query(SQL_Callback_StorageTableCreate, "CREATE TABLE IF NOT EXISTS `vip_storage` (\ + `account_id` INT NOT NULL, \ + `key` VARCHAR(128) NOT NULL, \ + `value` varchar(256) NOT NULL default '', \ + `sid` INT UNSIGNED NOT NULL, \ + `updated` INT UNSIGNED NOT NULL default 0, \ + PRIMARY KEY (`account_id`, `key`, `sid`) \ + ) DEFAULT CHARSET=" ... CHARSET ... ";"); } else { g_szSID[0] = 0; - g_hDatabase.Query(SQL_Callback_TableCreate, "CREATE TABLE IF NOT EXISTS `vip_users` (\ + + g_hDatabase.Query(SQL_Callback_TableCreate, "CREATE TABLE IF NOT EXISTS `vip_users` (\ `account_id` INTEGER PRIMARY KEY NOT NULL, \ `name` VARCHAR(64) NOT NULL default 'unknown', \ `lastvisit` INTEGER UNSIGNED NOT NULL default 0, \ `group` VARCHAR(64) NOT NULL, \ `expires` INTEGER UNSIGNED NOT NULL default 0);"); + + g_hDatabase.Query(SQL_Callback_StorageTableCreate, "CREATE TABLE IF NOT EXISTS `vip_storage` (\ + `account_id` INTEGER PRIMARY KEY NOT NULL, \ + `key` VARCHAR(128) NOT NULL, \ + `value` TEXT NOT NULL default '', \ + `updated` INTEGER UNSIGNED NOT NULL default 0, \ + PRIMARY KEY (`account_id`, `key`) \ + );"); } } @@ -106,7 +125,7 @@ public void SQL_Callback_TableCreate(Database hOwner, DBResultSet hResult, const { DBG_SQL_Response("SQL_Callback_TableCreate") - if (szError[0]) + if (!hResult || szError[0]) { SetFailState("SQL_Callback_TableCreate: %s", szError); return; @@ -132,6 +151,17 @@ public void SQL_Callback_TableCreate(Database hOwner, DBResultSet hResult, const } } +public void SQL_Callback_StorageTableCreate(Database hOwner, DBResultSet hResult, const char[] szError, any data) +{ + DBG_SQL_Response("SQL_Callback_StorageTableCreate") + + if (!hResult || szError[0]) + { + SetFailState("SQL_Callback_StorageTableCreate: %s", szError); + return; + } +} + void RemoveExpAndOutPlayers() { if (g_CVAR_iDeleteExpired >= 0) diff --git a/addons/sourcemod/scripting/vip/Features.sp b/addons/sourcemod/scripting/vip/Features.sp index d177dd5..8bcb445 100644 --- a/addons/sourcemod/scripting/vip/Features.sp +++ b/addons/sourcemod/scripting/vip/Features.sp @@ -94,4 +94,61 @@ VIP_ToggleState Features_GetStatus(const int &iClient, const char[] szFeature) DebugMessage("Features_GetStatus: %N (%i) -> Feature: %s, eStatus: %i", iClient, iClient, szFeature, NO_ACCESS) return NO_ACCESS; -} \ No newline at end of file +} + + +#if USE_CLIENTPREFS == 0 +void Features_GetStorageKeyName(const char[] szFeature, char[] szValue, int iMaxLength) +{ + FormatEx(szValue, iMaxLength, "FeatureStatus-%s", szFeature); +} +#endif + +void Features_GetValueFromStorage(int iClient, const char[] szFeature, ArrayList hArray, char[] szValue, int iMaxLength) +{ + #if USE_CLIENTPREFS 1 + Handle hCookie = view_as(hArray.Get(FEATURES_COOKIE)); + GetClientCookie(iClient, hCookie, szValue, iMaxLength); + #else + char szKey[128]; + Features_GetStorageKeyName(szFeature, SZF(szKey)); + Storage_GetClientValue(iClient, szKey, szValue, iMaxLength); + #endif + +} + +void Features_SetValueToStorage(int iClient, const char[] szFeature, ArrayList hArray, const char[] szValue) +{ + #if USE_CLIENTPREFS 1 + SetClientCookie(iClient, szValue); + #else + char szKey[128]; + Features_GetStorageKeyName(szFeature, SZF(szKey)); + Storage_SetClientValue(iClient, szKey, szValue); + #endif +} + +VIP_ToggleState Features_GetStatusFromStorage(int iClient, const char[] szFeature, ArrayList hArray) +{ + char szValue[4]; + Features_GetValueFromStorage(iClient, szFeature, hArray, SZF(szValue)); + VIP_ToggleState eStatus = view_as(StringToInt(szValue)); + if (szValue[0] == '\0' || (view_as(eStatus) > 2 || view_as(eStatus) < 0)) + { + switch(hArray.Get(FEATURES_DEF_STATUS)) + { + case NO_ACCESS: eStatus = g_CVAR_bDefaultStatus ? ENABLED:DISABLED; + case ENABLED: eStatus = ENABLED; + case DISABLED: eStatus = DISABLED; + } + } + + return eStatus; +} + +void Features_SetStatusToStorage(int iClient, const char[] szFeature, ArrayList hArray, VIP_ToggleState eStatus) +{ + char szValue[4]; + IntToString(view_as(eStatus), SZF(szValue)); + Features_SetValueToStorage(iClient, szFeature, hArray, szValue); +} diff --git a/addons/sourcemod/scripting/vip/Global.sp b/addons/sourcemod/scripting/vip/Global.sp index 527f9bd..b799057 100644 --- a/addons/sourcemod/scripting/vip/Global.sp +++ b/addons/sourcemod/scripting/vip/Global.sp @@ -20,12 +20,17 @@ #define SET_BIT(%0,%1) %0 |= %1 #define UNSET_BIT(%0,%1) %0 &= ~%1 -#define IS_VIP (1<<0) // VIP ли игрок -#define IS_LOADED (1<<1) // Загружен ли игрок -#define IS_WAIT_CHAT_PASS (1<<2) // Ожидается ввод пароля в чат -#define IS_WAIT_CHAT_SEARCH (1<<3) // Ожидается ввод значения для поиска в чат -#define IS_SPAWNED (1<<4) // Игрок возродился -#define IS_MENU_OPEN (1<<5) // VIP-меню открыто +#define IS_VIP (1<<0) // VIP ли игрок +#define IS_LOADED (1<<1) // Загружен ли игрок +#define IS_CACHE_LOADED (1<<2) // Загружен ли кеш игрока +#define IS_WAIT_CHAT_PASS (1<<3) // Ожидается ввод пароля в чат +#define IS_WAIT_CHAT_SEARCH (1<<4) // Ожидается ввод значения для поиска в чат +#define IS_SPAWNED (1<<5) // Игрок возродился +#define IS_MENU_OPEN (1<<6) // VIP-меню открыто + +#define IS_CLIENT_VIP(%0) g_iClientInfo[%0] & IS_VIP == IS_VIP +#define IS_CLIENT_LOADED(%0) g_iClientInfo[%0] & IS_LOADED == IS_LOADED +#define IS_CLIENT_CACHE_LOADED(%0) g_iClientInfo[%0] & IS_CACHE_LOADED == IS_CACHE_LOADED #define IS_STARTED (1<<0) #define IS_MySQL (1<<1) @@ -52,6 +57,8 @@ enum FEATURES_COOKIE, FEATURES_MENU_CALLBACKS, FEATURES_DEF_STATUS + // TODO + // FEATURES_STORAGE_KEY, } DataPackPos ITEM_SELECT = view_as(0); @@ -94,6 +101,7 @@ ArrayList g_hSortArray; StringMap g_hFeatures[MAXPLAYERS+1]; StringMap g_hFeatureStatus[MAXPLAYERS+1]; +StringMap g_hCache[MAXPLAYERS+1]; StringMap g_hClientData[MAXPLAYERS+1]; diff --git a/addons/sourcemod/scripting/vip/Storage.sp b/addons/sourcemod/scripting/vip/Storage.sp new file mode 100644 index 0000000..a8df2d5 --- /dev/null +++ b/addons/sourcemod/scripting/vip/Storage.sp @@ -0,0 +1,145 @@ + +bool Storage_IsClientLoaded(int iClient) +{ + return IS_CLIENT_CACHE_LOADED(iClient) && g_hCache[iClient]; +} + +void Storage_SetClientValue(int iClient, const char[] szKey, const char[] szValue) +{ + if (Storage_IsClientLoaded(iClient)) + { + g_hCache[iClient].SetString(szKey, szValue); + } +} + +void Storage_GetClientValue(int iClient, const char[] szKey, char[] szValue, int iMaxLength) +{ + if (Storage_IsClientLoaded(iClient)) + { + g_hCache[iClient].GetString(szKey, szValue, iMaxLength); + } +} + +void Storage_LoadClient(int iClient) +{ + char szQuery[256]; + + int iAccountID = GetSteamAccountID(iClient); + + DebugMessage("Storage_LoadClient %N (%d)", iClient, iClient) + + FormatEx(SZF(szQuery), "SELECT `key`, `value` \ + FROM `vip_storage` \ + WHERE `account_id` = %d%s;", + iAccountID, g_szSID); + + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_OnClientLoadStorage, szQuery, UID(iClient)); +} + +public void SQL_Callback_OnClientLoadStorage(Database hOwner, DBResultSet hResult, const char[] szError, any iUserID) +{ + DBG_SQL_Response("SQL_Callback_OnClientLoadStorage") + if (hResult == null || szError[0]) + { + LogError("SQL_Callback_OnClientLoadStorage: %s", szError); + return; + } + + int iClient = CID(iUserID); + if (!iClient || !IsClientInGame(iClient)) + { + return; + } + + g_hCache[iClient] = new StringMap(); + + if (!hResult.RowCount) + { + return; + } + + char szKey[128], szValue[256]; + + while (hResult.FetchRow()) + { + hResult.FetchString(0, SZF(szKey)); + hResult.FetchString(1, SZF(szValue)); + + g_hCache[iClient].SetString(szKey, szValue); + } + + SET_BIT(g_iClientInfo[iClient], IS_CACHE_LOADED); + + CallForward_OnClientStorageLoaded(iClient); +} + +void Storage_ResetClient(int iClient) +{ + if (g_hCache[iClient]) + { + delete g_hCache[iClient]; + g_hCache[iClient] = null; + } + + UNSET_BIT(g_iClientInfo[iClient], IS_CACHE_LOADED); +} + +void Storage_SaveClient(int iClient) +{ + if (!Storage_IsClientLoaded(iClient) || !g_hCache[iClient]) + { + return; + } + int iAccountID = GetSteamAccountID(iClient); + int iUpdated = GetTime(); + + StringMapSnapshot hStorageSnapshot = g_hCache[iClient].Snapshot(); + + char szKey[128], szValue[256]; + + for(int i = 0, iSize = hStorageSnapshot.Length; i < iSize; ++i) + { + hStorageSnapshot.GetKey(i, SZF(szKey)); + g_hCache[iClient].GetString(szKey, SZF(szValue)); + + Storage_SaveClientValue(iAccountID, szKey, szValue, iUpdated); + } + + delete hStorageSnapshot; +} + +void Storage_SaveClientValue(int iAccountID, const char[] szKey, const char[] szValue, int iUpdated) +{ + char szQuery[512]; + if (GLOBAL_INFO & IS_MySQL) + { + g_hDatabase.Format(SZF(szQuery), "INSERT INTO `vip_storage` (`account_id`, `sid`, `key`, `value`, `updated`) \ + VALUES (%d, %d, \"%s\", \"%s\", %d) \ + ON DUPLICATE KEY UPDATE \ + `value` = \"%s\", `updated` = %d;", + iAccountID, g_CVAR_iServerID, szKey, szValue, iUpdated, szValue, iUpdated); + } + else + { + g_hDatabase.Format(SZF(szQuery), "INSERT OR REPLACE INTO `vip_storage` (`account_id`, `sid`, `key`, `value`, `updated`) \ + VALUES (%d, %d, \"%s\", \"%s\", %d);", + iAccountID, g_CVAR_iServerID, szKey, szValue, iUpdated); + } + + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_OnClientSaveStorage, szQuery); +} + +public void SQL_Callback_OnClientSaveStorage(Database hOwner, DBResultSet hResult, const char[] szError, any iData) +{ + DBG_SQL_Response("SQL_Callback_OnClientSaveStorage") + if (hResult == null || szError[0]) + { + LogError("SQL_Callback_OnClientLoadStorage: %s", szError); + return; + } +} + +// TODO: add clear outdated + diff --git a/addons/sourcemod/scripting/vip/UTIL.sp b/addons/sourcemod/scripting/vip/UTIL.sp index e684838..f2f3d3e 100644 --- a/addons/sourcemod/scripting/vip/UTIL.sp +++ b/addons/sourcemod/scripting/vip/UTIL.sp @@ -251,26 +251,6 @@ void UTIL_ReloadVIPPlayers(int iClient, bool bNotify) UTIL_Reply(iClient, "%t", "VIP_CACHE_REFRESHED"); } } -/* -void UTIL_REM_VIP_PLAYER(int iClient = OWNER_SERVER, int iTarget = 0, int iAccID = 0, int iClientID, const char[] szReason) -{ - if (g_CVAR_bLogsEnable) - { - if(iTarget) - { - LogToFile(g_szLogFile, "%T", "REMOVING_PLAYER", LANG_SERVER, iTarget); - } - } - - DB_RemoveClientFromID(iClient, iClientID, false); - - ResetClient(iTarget); - - CallForward_OnVIPClientRemoved(iTarget, szReason); - - DisplayClientInfo(iTarget, "expired_info"); -} -*/ void UTIL_Reply(int iClient, const char[] szMsg, any ...) { diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index 5f8c4e0..d9a8be5 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -253,7 +253,6 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti hPlugin = view_as(hBuffer.Get(FEATURES_PLUGIN)); if (view_as(hBuffer.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) { - char szBuffer[4]; VIP_ToggleState eOldStatus, eNewStatus; eOldStatus = Features_GetStatus(iClient, szFeature); @@ -269,8 +268,7 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti if (eNewStatus != eOldStatus) { Features_SetStatus(iClient, szFeature, eNewStatus); - IntToString(view_as(eNewStatus), SZF(szBuffer)); - SetClientCookie(iClient, view_as(GetArrayCell(hBuffer, FEATURES_COOKIE)), szBuffer); + Features_SetStatusToStorage(iClient, szFeature, hBuffer, eNewStatus); } } diff --git a/addons/sourcemod/scripting/vip/adminmenu/Del.sp b/addons/sourcemod/scripting/vip/adminmenu/Del.sp index 6e6a351..b13220f 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/Del.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/Del.sp @@ -41,14 +41,15 @@ public int MenuHandler_DeleteVipPlayerMenu(Menu hMenu, MenuAction action, int iC iTarget = CID(iTarget); if (!iTarget && iTargetID != -1) { - iTarget = IsClientOnline(iTargetID); + iTarget = GetClientByID(iTargetID); } if (iTarget) { DB_RemoveClientFromID(iClient, iTarget, _, true); Features_TurnOffAll(iTarget); - ResetClient(iTarget); + Clients_ResetClient(iTarget); + SET_BIT(g_iClientInfo[iTarget], IS_LOADED); CallForward_OnVIPClientRemoved(iTarget, "Removed by Admin", iClient); DisplayClientInfo(iTarget, "expired_info"); BackToAdminMenu(iClient); diff --git a/addons/sourcemod/scripting/vip/adminmenu/List.sp b/addons/sourcemod/scripting/vip/adminmenu/List.sp index 10d5f00..369ead2 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/List.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/List.sp @@ -288,7 +288,7 @@ public void SQL_Callback_SelectVipPlayers(Database hOwner, DBResultSet hResult, DBG_SQL_Response("hResult.FetchInt(0) = %d", iClientID) DBG_SQL_Response("hResult.FetchString(1) = '%s", szName) - if(IsClientOnline(iClientID)) + if(GetClientByID(iClientID)) { Format(SZF(szName), "• %s", szName); } From aca3b94d9a210fffc6446831065a4ec4a48ecad8 Mon Sep 17 00:00:00 2001 From: vandrienko Date: Mon, 28 Jun 2021 17:09:09 +0300 Subject: [PATCH 57/99] refactoring macro --- addons/sourcemod/scripting/vip/API.sp | 28 +++--- addons/sourcemod/scripting/vip/Clients.sp | 109 ++++++++++++--------- addons/sourcemod/scripting/vip/Cvars.sp | 4 +- addons/sourcemod/scripting/vip/Database.sp | 2 +- addons/sourcemod/scripting/vip/Debugger.sp | 22 ++++- addons/sourcemod/scripting/vip/Features.sp | 23 ++++- addons/sourcemod/scripting/vip/Storage.sp | 27 ++++- 7 files changed, 142 insertions(+), 73 deletions(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index b45aa1a..5581b99 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -1,3 +1,5 @@ +#define VIP_CLIENT(%0) (g_hFeatures[%0] && IS_CLIENT_VIP(iClient) && IS_CLIENT_LOADED(iClient)) + static Handle g_hGlobalForward_OnVIPLoaded; static Handle g_hGlobalForward_OnClientPreLoad; static Handle g_hGlobalForward_OnClientLoaded; @@ -55,7 +57,7 @@ void CallForward_OnClientLoaded(int iClient) DBG_API("CallForward_OnClientLoaded(%N (%d), %b)", iClient, iClient, IS_CLIENT_VIP(iClient)) Call_StartForward(g_hGlobalForward_OnClientLoaded); Call_PushCell(iClient); - Call_PushCell(g_iClientInfo[iClient] & IS_VIP); + Call_PushCell(IS_CLIENT_VIP(iClient)); Call_Finish(); } @@ -302,8 +304,6 @@ public APLRes AskPluginLoad2(Handle myself, bool bLate, char[] szError, int err_ return APLRes_Success; } -#define VIP_CLIENT(%0) (g_hFeatures[%0] && (g_iClientInfo[%0] & IS_VIP)) - public int Native_CheckClient(Handle hPlugin, int iNumParams) { DBG_API("Native_CheckClient(%d)", iNumParams) @@ -323,9 +323,10 @@ public int Native_IsClientVIP(Handle hPlugin, int iNumParams) if (CheckValidClient(iClient, false)) { DBG_API("IS_VIP = %b", (g_iClientInfo[iClient] & IS_VIP)) - return view_as(g_iClientInfo[iClient] & IS_VIP); + DBG_API("IS_CLIENT_LOADED = %b", (g_iClientInfo[iClient] & IS_LOADED)) + return IS_CLIENT_VIP(iClient) && IS_CLIENT_LOADED(iClient); } - + return false; } @@ -453,7 +454,7 @@ public int Native_SetClientVIPGroup(Handle hPlugin, int iNumParams) } else { - Clients_LoadVIPFeatures(iClient); + Clients_LoadFeatures(iClient); } return 1; @@ -640,7 +641,7 @@ int API_GiveClientVIP(Handle hPlugin, Clients_InitVIPClient(iClient, -1, szGroup, iExpires); - Clients_LoadVIPFeatures(iClient); + Clients_LoadFeatures(iClient); DisplayClientInfo(iClient, iTime == 0 ? "connect_info_perm":"connect_info_time"); @@ -749,6 +750,7 @@ public int Native_RegisterFeature(Handle hPlugin, int iNumParams) { return ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" already defined", szFeature); } + if (g_hFeaturesArray.Length == 0) { g_hVIPMenu.RemoveItem(0); @@ -794,23 +796,23 @@ public int Native_RegisterFeature(Handle hPlugin, int iNumParams) if(eType == TOGGLABLE) { - hArray.Push(iNumParams > 6 ? GetNativeCell(7):NO_ACCESS); + hArray.Push(iNumParams > 6 ? GetNativeCell(7) : NO_ACCESS); } AddFeatureToVIPMenu(szFeature); } + CallForward_OnFeatureRegistered(szFeature); + DebugMessage("Feature \"%s\" registered", szFeature) + for (int iClient = 1; iClient <= MaxClients; ++iClient) { - if (IsClientInGame(iClient) && g_iClientInfo[iClient] & IS_VIP) + if (IsClientInGame(iClient) && VIP_CLIENT(iClient)) { - Clients_LoadVIPFeaturesPre(iClient, szFeature); + Clients_TryLoadFeature(iClient, szFeature); } } - CallForward_OnFeatureRegistered(szFeature); - DebugMessage("Feature \"%s\" registered", szFeature) - return 1; } diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index c681d57..7678630 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -124,7 +124,6 @@ public void SQL_Callback_OnClientAuthorized(Database hOwner, DBResultSet hResult LoadClient(iClient, iAccountID, szGroup, iExpires); - OnClientLoaded(iClient); if (IS_CLIENT_VIP(iClient)) { @@ -142,9 +141,11 @@ public void SQL_Callback_OnClientAuthorized(Database hOwner, DBResultSet hResult DisplayClientInfo(iClient, iExpires == 0 ? "connect_info_perm":"connect_info_time"); } - // TODO: load from storage - Clients_LoadVIPFeaturesPre(iClient); + Clients_TryLoadFeatures(iClient); + return; } + + OnClientLoaded(iClient); } void LoadClient(int iClient, int iAccountID, const char[] szGroup, int iExpires) @@ -242,68 +243,76 @@ void OnClientStorageLoaded(int iClient) bool IsClientStorageLoaded(int iClient) { #if USE_CLIENTPREFS 1 + DebugMessage("AreClientCookiesCached: %d %N", iClient, iClient) return AreClientCookiesCached(iClient); #else + DebugMessage("Storage_IsClientLoaded: %d %N", iClient, iClient) return Storage_IsClientLoaded(iClient); #endif } -void Clients_LoadVIPFeaturesPre(int iClient, const char[] szFeature = NULL_STRING) +void Clients_TryLoadFeatures(int iClient) { - DebugMessage("Clients_LoadVIPFeaturesPre %N", iClient) - - // DebugMessage("AreClientCookiesCached %b", AreClientCookiesCached(iClient)) + DebugMessage("Clients_TryLoadFeatures %N", iClient) if (!IsClientStorageLoaded(iClient)) { + // TODO: may be will add attempts counter DataPack hDataPack = new DataPack(); hDataPack.WriteCell(UID(iClient)); - if(szFeature[0]) - { - hDataPack.WriteCell(true); - hDataPack.WriteString(szFeature); - } - else - { - hDataPack.WriteCell(false); - } - CreateTimer(0.5, Timer_CheckCookies, hDataPack, TIMER_FLAG_NO_MAPCHANGE|TIMER_DATA_HNDL_CLOSE); + CreateTimer(1.0, Timer_CheckStorageLoadFeatures, hDataPack, TIMER_FLAG_NO_MAPCHANGE|TIMER_DATA_HNDL_CLOSE); } + + Clients_LoadFeatures(iClient); +} - if(szFeature[0]) +public Action Timer_CheckStorageLoadFeatures(Handle hTimer, DataPack hDataPack) +{ + hDataPack.Reset(); + int iClient = CID(hDataPack.ReadCell()); + + DebugMessage("Timer_CheckStorageLoadFeatures -> iClient: %N (%d), IsClientVIP: %b", iClient, iClient, IS_CLIENT_VIP(iClient)) + if (iClient && IS_CLIENT_VIP(iClient)) { - Clients_LoadVIPFeature(iClient, szFeature); - return; + Clients_TryLoadFeatures(iClient); } - - Clients_LoadVIPFeatures(iClient); + + return Plugin_Stop; } -public Action Timer_CheckCookies(Handle hTimer, Handle hDP) + +void Clients_TryLoadFeature(int iClient, const char[] szFeature) +{ + DebugMessage("Clients_TryLoadFeatures %N", iClient) + + if (!IsClientStorageLoaded(iClient)) + { + DataPack hDataPack = new DataPack(); + hDataPack.WriteCell(UID(iClient)); + hDataPack.WriteString(szFeature); + CreateTimer(1.0, Timer_CheckStorageLoadFeature, hDataPack, TIMER_FLAG_NO_MAPCHANGE|TIMER_DATA_HNDL_CLOSE); + } + + Clients_LoadFeature(iClient, szFeature); +} + +public Action Timer_CheckStorageLoadFeature(Handle hTimer, DataPack hDataPack) { - DataPack hDataPack = view_as(hDP); hDataPack.Reset(); int iClient = CID(hDataPack.ReadCell()); - DebugMessage("Timer_CheckCookies -> iClient: %N (%d), IsClientVIP: %b", iClient, iClient, IS_CLIENT_VIP(iClient)) - if (iClient && g_iClientInfo[iClient] & IS_VIP) + DebugMessage("Timer_CheckStorageLoadFeature -> iClient: %N (%d), IsClientVIP: %b", iClient, iClient, IS_CLIENT_VIP(iClient)) + if (iClient && IS_CLIENT_VIP(iClient)) { char szFeature[FEATURE_NAME_LENGTH]; - if(hDataPack.ReadCell()) - { - hDataPack.ReadString(SZF(szFeature)); - } - else - { - szFeature[0] = 0; - } - Clients_LoadVIPFeaturesPre(iClient, szFeature); + hDataPack.ReadString(SZF(szFeature)); + Clients_LoadFeature(iClient, szFeature); } return Plugin_Stop; } -void Clients_LoadVIPFeatures(int iClient) +void Clients_LoadFeatures(int iClient) { DebugMessage("LoadVIPFeatures %N", iClient) @@ -319,18 +328,19 @@ void Clients_LoadVIPFeatures(int iClient) for (int i = 0; i < iFeaturesCount; ++i) { g_hFeaturesArray.GetString(i, SZF(szFeature)); - Clients_LoadFeature(iClient, szFeature); + Clients_LoadFeatureValue(iClient, szFeature); } } } DebugMessage("Clients_OnVIPClientLoaded: %d %N", iClient, iClient) + OnClientLoaded(iClient); OnVIPClientLoaded(iClient); } -void Clients_LoadVIPFeature(int iClient, const char[] szFeature) +void Clients_LoadFeature(int iClient, const char[] szFeature) { DebugMessage("LoadVIPFeature %N", iClient) @@ -343,7 +353,7 @@ void Clients_LoadVIPFeature(int iClient, const char[] szFeature) g_hFeatures[iClient].GetString(KEY_GROUP, SZF(szGroup)); if (UTIL_CheckValidVIPGroup(szGroup)) { - Clients_LoadFeature(iClient, szFeature); + Clients_LoadFeatureValue(iClient, szFeature); } } /* @@ -353,22 +363,33 @@ void Clients_LoadVIPFeature(int iClient, const char[] szFeature) */ } -void Clients_LoadFeature(int iClient, const char[] szFeature) +void Clients_LoadFeatureValue(int iClient, const char[] szFeature) { static ArrayList hArray; if (GLOBAL_TRIE.GetValue(szFeature, hArray)) { DebugMessage("LoadClientFeature: %s", szFeature) - if (GetValue(iClient, view_as(hArray.Get(FEATURES_VALUE_TYPE)), szFeature)) + if (GetFeatureValue(iClient, view_as(hArray.Get(FEATURES_VALUE_TYPE)), szFeature)) { - static VIP_ToggleState eStatus; + static VIP_ToggleState eStatus; DebugMessage("GetValue: == true") if (view_as(hArray.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) { + static Function fnToggleCallback; eStatus = Features_GetStatusFromStorage(iClient, szFeature, hArray); DebugMessage("Features_GetStatusFromStorage: '%d'", eStatus) + // TODO: add call toggle callback + if (eStatus != NO_ACCESS) + { + fnToggleCallback = Feature_GetSelectCallback(); + if(fnToggleCallback != INVALID_FUNCTION) + { + Function_OnItemToggle(view_as(hArray.Get(FEATURES_PLUGIN)), fnToggleCallback, iClient, szFeature, NO_ACCESS, eStatus); + } + } + Features_SetStatusToStorage(iClient, szFeature, hArray, eStatus); } else @@ -382,9 +403,9 @@ void Clients_LoadFeature(int iClient, const char[] szFeature) } } -bool GetValue(int iClient, VIP_ValueType ValueType, const char[] szFeature) +bool GetFeatureValue(int iClient, VIP_ValueType ValueType, const char[] szFeature) { - DebugMessage("GetValue: %d - %s", ValueType, szFeature) + DebugMessage("GetFeatureValue: %d - %s", ValueType, szFeature) switch (ValueType) { case BOOL: diff --git a/addons/sourcemod/scripting/vip/Cvars.sp b/addons/sourcemod/scripting/vip/Cvars.sp index 03c81ca..5d515bb 100644 --- a/addons/sourcemod/scripting/vip/Cvars.sp +++ b/addons/sourcemod/scripting/vip/Cvars.sp @@ -22,11 +22,11 @@ void Cvars_Setup() hCvar.AddChangeHook(OnTimeModeChange); g_CVAR_iTimeMode = hCvar.IntValue; - hCvar = CreateConVar("sm_vip_delete_expired", "1", "Удалять VIP-игроков у которых истек срок (-1 - Не удалять, 0 - Удалять сразу, > 0 - Количество дней, по истечению которых удалять)", _, true, -1.0, true, 365.0); + hCvar = CreateConVar("sm_vip_delete_expired", "1", "Удалять VIP-игроков у которых истек срок и они не заходили на сервер (-1 - Не удалять, 0 - Удалять сразу, > 0 - Количество дней, по истечению которых удалять)", _, true, -1.0, true, 365.0); hCvar.AddChangeHook(OnDeleteExpiredChange); g_CVAR_iDeleteExpired = hCvar.IntValue; - hCvar = CreateConVar("sm_vip_delete_outdated", "-1", "Удалять VIP-игроков которые не заходили на сервер X дней (-1 - Не удалять, > 0 - Количество дней, по истечению которых удалять (минимум 3 суток))", _, true, -1.0, true, 365.0); + hCvar = CreateConVar("sm_vip_delete_outdated", "-1", "Удалять VIP-игроков которые не заходили на сервер X дней (-1 или 0 - Не удалять, > 0 - Количество дней, по истечению которых удалять (минимум 3 суток))", _, true, -1.0, true, 365.0); hCvar.AddChangeHook(OnDeleteOutdatedChange); g_CVAR_iOutdatedExpired = hCvar.IntValue; diff --git a/addons/sourcemod/scripting/vip/Database.sp b/addons/sourcemod/scripting/vip/Database.sp index 71cce29..2c63b9d 100644 --- a/addons/sourcemod/scripting/vip/Database.sp +++ b/addons/sourcemod/scripting/vip/Database.sp @@ -112,7 +112,7 @@ void CreateTables() `expires` INTEGER UNSIGNED NOT NULL default 0);"); g_hDatabase.Query(SQL_Callback_StorageTableCreate, "CREATE TABLE IF NOT EXISTS `vip_storage` (\ - `account_id` INTEGER PRIMARY KEY NOT NULL, \ + `account_id` INTEGER NOT NULL, \ `key` VARCHAR(128) NOT NULL, \ `value` TEXT NOT NULL default '', \ `updated` INTEGER UNSIGNED NOT NULL default 0, \ diff --git a/addons/sourcemod/scripting/vip/Debugger.sp b/addons/sourcemod/scripting/vip/Debugger.sp index 433b082..ffea293 100644 --- a/addons/sourcemod/scripting/vip/Debugger.sp +++ b/addons/sourcemod/scripting/vip/Debugger.sp @@ -14,10 +14,11 @@ void DebugMsg(const char[] sMsg, any ...) // #define LOG_DOWNLOADS // SQL Запросы #define LOG_QUERIES // SQL Запросы #define LOG_RESPONSE // Ответы SQL запросов -// #define LOG_API // API -// #define LOG_FEATURES // API -// #define LOG_CLIENTS // API -// #define LOG_DB // API +// #define LOG_API // API +#define LOG_FEATURES // API +// #define LOG_CLIENTS // API +// #define LOG_DB // API +#define LOG_STORAGE #else #define DebugMessage(%0) @@ -46,3 +47,16 @@ void DebugMsg(const char[] sMsg, any ...) #else #define DBG_API(%0) #endif + +#if defined LOG_FEATURES +#define DBG_FEATURES(%0) DebugMsg("FEATURES: " ... %0); +#else +#define DBG_FEATURES(%0) +#endif + + +#if defined LOG_STORAGE +#define DBG_STORAGE(%0) DebugMsg("STORAGE: " ... %0); +#else +#define DBG_STORAGE(%0) +#endif diff --git a/addons/sourcemod/scripting/vip/Features.sp b/addons/sourcemod/scripting/vip/Features.sp index 8bcb445..9a41169 100644 --- a/addons/sourcemod/scripting/vip/Features.sp +++ b/addons/sourcemod/scripting/vip/Features.sp @@ -106,6 +106,7 @@ void Features_GetStorageKeyName(const char[] szFeature, char[] szValue, int iMax void Features_GetValueFromStorage(int iClient, const char[] szFeature, ArrayList hArray, char[] szValue, int iMaxLength) { + DBG_FEATURES("Features_GetValueFromStorage %N (%d): '%s'", iClient, iClient, szFeature) #if USE_CLIENTPREFS 1 Handle hCookie = view_as(hArray.Get(FEATURES_COOKIE)); GetClientCookie(iClient, hCookie, szValue, iMaxLength); @@ -117,8 +118,10 @@ void Features_GetValueFromStorage(int iClient, const char[] szFeature, ArrayList } + void Features_SetValueToStorage(int iClient, const char[] szFeature, ArrayList hArray, const char[] szValue) { + DBG_FEATURES("Features_SetValueToStorage %N (%d): '%s' -> '%s'", iClient, iClient, szFeature, szValue) #if USE_CLIENTPREFS 1 SetClientCookie(iClient, szValue); #else @@ -128,10 +131,19 @@ void Features_SetValueToStorage(int iClient, const char[] szFeature, ArrayList h #endif } +void Features_SetStatusToStorage(int iClient, const char[] szFeature, ArrayList hArray, VIP_ToggleState eStatus) +{ + DBG_FEATURES("Features_SetStatusToStorage %N (%d): '%s' -> %d", iClient, iClient, szFeature, eStatus) + char szValue[4]; + IntToString(view_as(eStatus), SZF(szValue)); + Features_SetValueToStorage(iClient, szFeature, hArray, szValue); +} + VIP_ToggleState Features_GetStatusFromStorage(int iClient, const char[] szFeature, ArrayList hArray) { char szValue[4]; Features_GetValueFromStorage(iClient, szFeature, hArray, SZF(szValue)); + DBG_FEATURES("Features_GetStatusFromStorage %N (%d): '%s' -> '%s'", iClient, iClient, szFeature, szValue) VIP_ToggleState eStatus = view_as(StringToInt(szValue)); if (szValue[0] == '\0' || (view_as(eStatus) > 2 || view_as(eStatus) < 0)) { @@ -142,13 +154,16 @@ VIP_ToggleState Features_GetStatusFromStorage(int iClient, const char[] szFeatur case DISABLED: eStatus = DISABLED; } } + DBG_FEATURES("Features_GetStatusFromStorage %N (%d): '%s' -> %d", iClient, iClient, szFeature, eStatus) return eStatus; } -void Features_SetStatusToStorage(int iClient, const char[] szFeature, ArrayList hArray, VIP_ToggleState eStatus) + +Function Feature_GetSelectCallback(ArrayList hFeature) { - char szValue[4]; - IntToString(view_as(eStatus), SZF(szValue)); - Features_SetValueToStorage(iClient, szFeature, hArray, szValue); + DataPack hDataPack = view_as(hFeature.Get(FEATURES_MENU_CALLBACKS)); + hDataPack.Position = ITEM_SELECT; + return hDataPack.ReadFunction();; } + diff --git a/addons/sourcemod/scripting/vip/Storage.sp b/addons/sourcemod/scripting/vip/Storage.sp index a8df2d5..071d899 100644 --- a/addons/sourcemod/scripting/vip/Storage.sp +++ b/addons/sourcemod/scripting/vip/Storage.sp @@ -1,6 +1,7 @@ bool Storage_IsClientLoaded(int iClient) { + DBG_STORAGE("Storage_IsClientLoaded: %N (%d): %b", iClient, iClient, IS_CLIENT_CACHE_LOADED(iClient) && g_hCache[iClient]) return IS_CLIENT_CACHE_LOADED(iClient) && g_hCache[iClient]; } @@ -25,8 +26,9 @@ void Storage_LoadClient(int iClient) char szQuery[256]; int iAccountID = GetSteamAccountID(iClient); + DBG_STORAGE("Storage_LoadClient: %N (%d): %d", iClient, iClient, iAccountID) - DebugMessage("Storage_LoadClient %N (%d)", iClient, iClient) + DebugMessage("Storage_LoadClient %N (%d): %d", iClient, iClient, iAccountID) FormatEx(SZF(szQuery), "SELECT `key`, `value` \ FROM `vip_storage` \ @@ -54,8 +56,11 @@ public void SQL_Callback_OnClientLoadStorage(Database hOwner, DBResultSet hResul g_hCache[iClient] = new StringMap(); + DBG_STORAGE("SQL_Callback_OnClientLoadStorage: %N (%d)", iClient, iClient) + DBG_STORAGE("RowCount: %d", hResult.RowCount) if (!hResult.RowCount) { + Storage_OnClientLoaded(iClient); return; } @@ -65,10 +70,16 @@ public void SQL_Callback_OnClientLoadStorage(Database hOwner, DBResultSet hResul { hResult.FetchString(0, SZF(szKey)); hResult.FetchString(1, SZF(szValue)); + DBG_STORAGE("SetString: '%s' -> '%s'", szKey, szValue) g_hCache[iClient].SetString(szKey, szValue); } + Storage_OnClientLoaded(iClient); +} + +void Storage_OnClientLoaded(int iClient) +{ SET_BIT(g_iClientInfo[iClient], IS_CACHE_LOADED); CallForward_OnClientStorageLoaded(iClient); @@ -76,6 +87,8 @@ public void SQL_Callback_OnClientLoadStorage(Database hOwner, DBResultSet hResul void Storage_ResetClient(int iClient) { + DBG_STORAGE("Storage_ResetClient: %N (%d)", iClient, iClient) + if (g_hCache[iClient]) { delete g_hCache[iClient]; @@ -87,6 +100,8 @@ void Storage_ResetClient(int iClient) void Storage_SaveClient(int iClient) { + DBG_STORAGE("Storage_SaveClient: %N (%d)", iClient, iClient) + if (!Storage_IsClientLoaded(iClient) || !g_hCache[iClient]) { return; @@ -102,6 +117,8 @@ void Storage_SaveClient(int iClient) { hStorageSnapshot.GetKey(i, SZF(szKey)); g_hCache[iClient].GetString(szKey, SZF(szValue)); + DBG_STORAGE("GetString: '%s' -> '%s'", szKey, szValue) + Storage_SaveClientValue(iAccountID, szKey, szValue, iUpdated); } @@ -122,9 +139,9 @@ void Storage_SaveClientValue(int iAccountID, const char[] szKey, const char[] sz } else { - g_hDatabase.Format(SZF(szQuery), "INSERT OR REPLACE INTO `vip_storage` (`account_id`, `sid`, `key`, `value`, `updated`) \ - VALUES (%d, %d, \"%s\", \"%s\", %d);", - iAccountID, g_CVAR_iServerID, szKey, szValue, iUpdated); + g_hDatabase.Format(SZF(szQuery), "INSERT OR REPLACE INTO `vip_storage` (`account_id`, `key`, `value`, `updated`) \ + VALUES (%d, \"%s\", \"%s\", %d);", + iAccountID, szKey, szValue, iUpdated); } DBG_SQL_Query(szQuery) @@ -136,7 +153,7 @@ public void SQL_Callback_OnClientSaveStorage(Database hOwner, DBResultSet hResul DBG_SQL_Response("SQL_Callback_OnClientSaveStorage") if (hResult == null || szError[0]) { - LogError("SQL_Callback_OnClientLoadStorage: %s", szError); + LogError("SQL_Callback_OnClientSaveStorage: %s", szError); return; } } From ff04f0e314ab9d429303792dc9e5c989f68bb55d Mon Sep 17 00:00:00 2001 From: vandrienko Date: Fri, 2 Jul 2021 18:50:17 +0300 Subject: [PATCH 58/99] fix memory leak --- addons/sourcemod/scripting/vip/Database.sp | 84 +++++++++++----------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/addons/sourcemod/scripting/vip/Database.sp b/addons/sourcemod/scripting/vip/Database.sp index a0957e2..3653219 100644 --- a/addons/sourcemod/scripting/vip/Database.sp +++ b/addons/sourcemod/scripting/vip/Database.sp @@ -281,24 +281,27 @@ public void SQL_Callback_SelectRemoveClient(Database hOwner, DBResultSet hResult return; } - if (hResult.FetchRow()) + if (!hResult.FetchRow()) { - DBG_SQL_Response("hResult.FetchRow()") - hPack.Reset(); - int iClientID = hPack.ReadCell(); - hPack.ReadCell(); - hPack.ReadCell(); - char szName[MAX_NAME_LENGTH*2+1]; - hPack.ReadString(SZF(szName)); - hResult.FetchString(0, SZF(szName)); - DBG_SQL_Response("hResult.FetchString(0) = '%s", szName) - hPack.WriteString(szName); - hResult.FetchString(1, SZF(szName)); - DBG_SQL_Response("hResult.FetchString(1) = '%s", szName) - hPack.WriteString(szName); - - DB_RemoveClient(hPack, iClientID); + delete hPack; + return; } + + DBG_SQL_Response("hResult.FetchRow()") + hPack.Reset(); + int iClientID = hPack.ReadCell(); + hPack.ReadCell(); + hPack.ReadCell(); + char szName[MAX_NAME_LENGTH*2+1]; + hPack.ReadString(SZF(szName)); + hResult.FetchString(0, SZF(szName)); + DBG_SQL_Response("hResult.FetchString(0) = '%s", szName) + hPack.WriteString(szName); + hResult.FetchString(1, SZF(szName)); + DBG_SQL_Response("hResult.FetchString(1) = '%s", szName) + hPack.WriteString(szName); + + DB_RemoveClient(hPack, iClientID); } void DB_RemoveClient(DataPack hDataPack, int iClientID) @@ -323,35 +326,36 @@ public void SQL_Callback_RemoveClient(Database hOwner, DBResultSet hResult, cons DBG_SQL_Response("hResult.AffectedRows = %d", hResult.AffectedRows) - if (hResult.AffectedRows) + if (!hResult.AffectedRows) { - hPack.Reset(); - - int iClientID = hPack.ReadCell(); - int iAdmin = GET_CID(hPack.ReadCell()); - bool bNotify = view_as(hPack.ReadCell()); - char szAdmin[128], szName[MNL], szGroup[64]; - hPack.ReadString(SZF(szAdmin)); - hPack.ReadString(SZF(szName)); - hPack.ReadString(SZF(szGroup)); - - if(iAdmin == -1) - { - return; - } + delete hPack; + return; + } + hPack.Reset(); + + int iClientID = hPack.ReadCell(); + int iAdmin = GET_CID(hPack.ReadCell()); + bool bNotify = view_as(hPack.ReadCell()); + char szAdmin[128], szName[MNL], szGroup[64]; + hPack.ReadString(SZF(szAdmin)); + hPack.ReadString(SZF(szName)); + hPack.ReadString(SZF(szGroup)); + delete hPack; - if (g_CVAR_bLogsEnable) - { - LogToFile(g_szLogFile, "%T", "LOG_VIP_DELETED", LANG_SERVER, szName, iClientID, szGroup, szAdmin); - } + if(iAdmin == -1) + { + return; + } - if (bNotify && iAdmin > 0) - { - ReplyToCommand(iAdmin, "%t", "ADMIN_VIP_PLAYER_DELETED", szName, iClientID); - } + if (g_CVAR_bLogsEnable) + { + LogToFile(g_szLogFile, "%T", "LOG_VIP_DELETED", LANG_SERVER, szName, iClientID, szGroup, szAdmin); } - delete hPack; + if (bNotify && iAdmin > 0) + { + ReplyToCommand(iAdmin, "%t", "ADMIN_VIP_PLAYER_DELETED", szName, iClientID); + } } public void SQL_Callback_SelectExpiredAndOutdated(Database hOwner, DBResultSet hResult, const char[] szError, int iReason) From 56be2a2c08586698b521e412cb5427cca00206b6 Mon Sep 17 00:00:00 2001 From: vandrienko Date: Fri, 2 Jul 2021 19:10:43 +0300 Subject: [PATCH 59/99] fix CI --- addons/sourcemod/scripting/vip/Clients.sp | 4 +-- addons/sourcemod/scripting/vip/Features.sp | 37 ++++++++++++++++------ 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index 7678630..5fe5fc0 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -200,7 +200,7 @@ void OnVIPClientLoaded(int iClient) CallForward_OnVIPClientLoaded(iClient); } -void Clients_OnVIPClientLoaded(int iClient) +stock void Clients_OnVIPClientLoaded(int iClient) { Features_TurnOnAll(iClient); @@ -383,7 +383,7 @@ void Clients_LoadFeatureValue(int iClient, const char[] szFeature) // TODO: add call toggle callback if (eStatus != NO_ACCESS) { - fnToggleCallback = Feature_GetSelectCallback(); + fnToggleCallback = Feature_GetSelectCallback(hArray); if(fnToggleCallback != INVALID_FUNCTION) { Function_OnItemToggle(view_as(hArray.Get(FEATURES_PLUGIN)), fnToggleCallback, iClient, szFeature, NO_ACCESS, eStatus); diff --git a/addons/sourcemod/scripting/vip/Features.sp b/addons/sourcemod/scripting/vip/Features.sp index 9a41169..9821e17 100644 --- a/addons/sourcemod/scripting/vip/Features.sp +++ b/addons/sourcemod/scripting/vip/Features.sp @@ -39,7 +39,7 @@ void Features_TurnOffAll(int iClient) } } -void Features_TurnOnAll(int iClient) +stock void Features_TurnOnAll(int iClient) { DebugMessage("Features_TurnOnAll %N (%i)", iClient, iClient) @@ -104,45 +104,64 @@ void Features_GetStorageKeyName(const char[] szFeature, char[] szValue, int iMax } #endif +#if USE_CLIENTPREFS 1 void Features_GetValueFromStorage(int iClient, const char[] szFeature, ArrayList hArray, char[] szValue, int iMaxLength) { DBG_FEATURES("Features_GetValueFromStorage %N (%d): '%s'", iClient, iClient, szFeature) - #if USE_CLIENTPREFS 1 Handle hCookie = view_as(hArray.Get(FEATURES_COOKIE)); GetClientCookie(iClient, hCookie, szValue, iMaxLength); - #else + +} +#else +void Features_GetValueFromStorage(int iClient, const char[] szFeature, char[] szValue, int iMaxLength) +{ + DBG_FEATURES("Features_GetValueFromStorage %N (%d): '%s'", iClient, iClient, szFeature) char szKey[128]; Features_GetStorageKeyName(szFeature, SZF(szKey)); Storage_GetClientValue(iClient, szKey, szValue, iMaxLength); - #endif } +#endif - +#if USE_CLIENTPREFS 1 void Features_SetValueToStorage(int iClient, const char[] szFeature, ArrayList hArray, const char[] szValue) { DBG_FEATURES("Features_SetValueToStorage %N (%d): '%s' -> '%s'", iClient, iClient, szFeature, szValue) - #if USE_CLIENTPREFS 1 + SetClientCookie(iClient, szValue); - #else +} +#else +void Features_SetValueToStorage(int iClient, const char[] szFeature, const char[] szValue) +{ + DBG_FEATURES("Features_SetValueToStorage %N (%d): '%s' -> '%s'", iClient, iClient, szFeature, szValue) char szKey[128]; Features_GetStorageKeyName(szFeature, SZF(szKey)); Storage_SetClientValue(iClient, szKey, szValue); - #endif } +#endif + void Features_SetStatusToStorage(int iClient, const char[] szFeature, ArrayList hArray, VIP_ToggleState eStatus) { DBG_FEATURES("Features_SetStatusToStorage %N (%d): '%s' -> %d", iClient, iClient, szFeature, eStatus) char szValue[4]; IntToString(view_as(eStatus), SZF(szValue)); + #if USE_CLIENTPREFS 1 Features_SetValueToStorage(iClient, szFeature, hArray, szValue); + #else + Features_SetValueToStorage(iClient, szFeature, szValue); + #endif } VIP_ToggleState Features_GetStatusFromStorage(int iClient, const char[] szFeature, ArrayList hArray) { char szValue[4]; + #if USE_CLIENTPREFS 1 Features_GetValueFromStorage(iClient, szFeature, hArray, SZF(szValue)); + #else + Features_GetValueFromStorage(iClient, szFeature, SZF(szValue)); + #endif + DBG_FEATURES("Features_GetStatusFromStorage %N (%d): '%s' -> '%s'", iClient, iClient, szFeature, szValue) VIP_ToggleState eStatus = view_as(StringToInt(szValue)); if (szValue[0] == '\0' || (view_as(eStatus) > 2 || view_as(eStatus) < 0)) @@ -164,6 +183,6 @@ Function Feature_GetSelectCallback(ArrayList hFeature) { DataPack hDataPack = view_as(hFeature.Get(FEATURES_MENU_CALLBACKS)); hDataPack.Position = ITEM_SELECT; - return hDataPack.ReadFunction();; + return hDataPack.ReadFunction(); } From 245711ee62a52488310e4f8aafc2113ae395e74f Mon Sep 17 00:00:00 2001 From: vandrienko Date: Fri, 2 Jul 2021 19:23:35 +0300 Subject: [PATCH 60/99] fix CI --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index e07092a..84e329f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,7 +36,7 @@ before_script: - cp -R addons build - cp LICENSE build script: - - $SCRIPTING/spcomp -E -o$SCRIPTING'/compiled/VIP_Core' -v0 $SCRIPTING'/VIP_Core.sp' + - $SCRIPTING/spcomp -E -w203 -o$SCRIPTING'/compiled/VIP_Core' -v0 $SCRIPTING'/VIP_Core.sp' #Release before_deploy: @@ -56,4 +56,4 @@ deploy: #Notifications notifications: - email: false + email: true From b873f70853dfde2d215ac2a55354f7fd034f865a Mon Sep 17 00:00:00 2001 From: vandrienko Date: Fri, 17 Sep 2021 21:09:09 +0300 Subject: [PATCH 61/99] fix timer --- addons/sourcemod/scripting/vip/Clients.sp | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index 5fe5fc0..5184b8a 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -261,6 +261,7 @@ void Clients_TryLoadFeatures(int iClient) DataPack hDataPack = new DataPack(); hDataPack.WriteCell(UID(iClient)); CreateTimer(1.0, Timer_CheckStorageLoadFeatures, hDataPack, TIMER_FLAG_NO_MAPCHANGE|TIMER_DATA_HNDL_CLOSE); + return; } Clients_LoadFeatures(iClient); From 1ea1107c2ceeb4263913d5b0029b4680c6ac1a48 Mon Sep 17 00:00:00 2001 From: vandrienko Date: Tue, 5 Oct 2021 23:19:10 +0300 Subject: [PATCH 62/99] fix forwards order logic --- addons/sourcemod/scripting/vip/API.sp | 4 +- addons/sourcemod/scripting/vip/Clients.sp | 29 ++---- addons/sourcemod/scripting/vip/Features.sp | 113 ++++++++++++--------- addons/sourcemod/scripting/vip/Global.sp | 10 +- addons/sourcemod/scripting/vip/Storage.sp | 10 +- 5 files changed, 87 insertions(+), 79 deletions(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 5581b99..6ece7f5 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -1,4 +1,4 @@ -#define VIP_CLIENT(%0) (g_hFeatures[%0] && IS_CLIENT_VIP(iClient) && IS_CLIENT_LOADED(iClient)) +#define VIP_CLIENT(%0) (g_hFeatures[%0] && IS_CLIENT_VIP(%0) && IS_CLIENT_LOADED(%0)) static Handle g_hGlobalForward_OnVIPLoaded; static Handle g_hGlobalForward_OnClientPreLoad; @@ -527,7 +527,7 @@ public void SQL_Callback_ChangeClientSettings(Database hOwner, DBResultSet hResu public int Native_GetVIPClientTrie(Handle hPlugin, int iNumParams) { int iClient = GetNativeCell(1); - if (CheckValidClient(iClient, false) && VIP_CLIENT(iClient)) + if (CheckValidClient(iClient, false) && g_hFeatures[iClient] && IS_CLIENT_VIP(iClient)) { return view_as(g_hFeatures[iClient]); } diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index 5184b8a..7112257 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -32,12 +32,13 @@ public void OnClientDisconnect(int iClient) { CallForward_OnClientDisconnect(iClient); Storage_SaveClient(iClient); - Storage_ResetClient(iClient); } - + Clients_ResetClient(iClient); UTIL_CloseHandleEx(g_hClientData[iClient]); g_iClientInfo[iClient] = 0; + + Storage_ResetClient(iClient); } void Clients_CheckVipAccess(int iClient, bool bNotify = false, bool bForward = false) @@ -225,20 +226,21 @@ public void OnClientCookiesCached(int iClient) DebugMessage("OnClientCookiesCached %d %N", iClient, iClient) DebugMessage("AreClientCookiesCached %b", AreClientCookiesCached(iClient)) - OnClientStorageLoaded(iClient); + //OnClientStorageLoaded(iClient); } #else public void VIP_OnClientStorageLoaded(int iClient) { DebugMessage("VIP_OnClientStorageLoaded: %d %N", iClient, iClient) - OnClientStorageLoaded(iClient); + //OnClientStorageLoaded(iClient); } #endif - +/* void OnClientStorageLoaded(int iClient) { DebugMessage("OnClientStorageLoaded: %d %N", iClient, iClient) } +*/ bool IsClientStorageLoaded(int iClient) { @@ -338,9 +340,9 @@ void Clients_LoadFeatures(int iClient) OnClientLoaded(iClient); OnVIPClientLoaded(iClient); + Features_TurnOnAll(iClient); } - void Clients_LoadFeature(int iClient, const char[] szFeature) { DebugMessage("LoadVIPFeature %N", iClient) @@ -369,7 +371,7 @@ void Clients_LoadFeatureValue(int iClient, const char[] szFeature) static ArrayList hArray; if (GLOBAL_TRIE.GetValue(szFeature, hArray)) { - DebugMessage("LoadClientFeature: %s", szFeature) + DebugMessage("Clients_LoadFeatureValue: %s", szFeature) if (GetFeatureValue(iClient, view_as(hArray.Get(FEATURES_VALUE_TYPE)), szFeature)) { @@ -377,21 +379,8 @@ void Clients_LoadFeatureValue(int iClient, const char[] szFeature) DebugMessage("GetValue: == true") if (view_as(hArray.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) { - static Function fnToggleCallback; eStatus = Features_GetStatusFromStorage(iClient, szFeature, hArray); DebugMessage("Features_GetStatusFromStorage: '%d'", eStatus) - - // TODO: add call toggle callback - if (eStatus != NO_ACCESS) - { - fnToggleCallback = Feature_GetSelectCallback(hArray); - if(fnToggleCallback != INVALID_FUNCTION) - { - Function_OnItemToggle(view_as(hArray.Get(FEATURES_PLUGIN)), fnToggleCallback, iClient, szFeature, NO_ACCESS, eStatus); - } - } - - Features_SetStatusToStorage(iClient, szFeature, hArray, eStatus); } else { diff --git a/addons/sourcemod/scripting/vip/Features.sp b/addons/sourcemod/scripting/vip/Features.sp index 9821e17..16917e0 100644 --- a/addons/sourcemod/scripting/vip/Features.sp +++ b/addons/sourcemod/scripting/vip/Features.sp @@ -1,13 +1,13 @@ bool IsValidFeature(const char[] szFeature) { - DebugMessage("IsValidFeature:: FindStringInArray -> %i", g_hFeaturesArray.FindString(szFeature)) + DBG_FEATURES("IsValidFeature:: FindStringInArray -> %i", g_hFeaturesArray.FindString(szFeature)) return (g_hFeaturesArray.FindString(szFeature) != -1); } void Features_TurnOffAll(int iClient) { - DebugMessage("Features_TurnOffAll %N (%i)", iClient, iClient) + DBG_FEATURES("Features_TurnOffAll %N (%i)", iClient, iClient) int iFeaturesCount = g_hFeaturesArray.Length; if(!iFeaturesCount) { @@ -15,70 +15,89 @@ void Features_TurnOffAll(int iClient) } char szFeature[FEATURE_NAME_LENGTH]; VIP_ToggleState eOldStatus; - Function Function_Toggle; + Function fnToggleCallback; ArrayList hArray; - DataPack hDataPack; for(int i = 0; i < iFeaturesCount; ++i) { g_hFeaturesArray.GetString(i, SZF(szFeature)); - if(GLOBAL_TRIE.GetValue(szFeature, hArray)) + if(!GetTrieValue(GLOBAL_TRIE, szFeature, hArray)) { - if(view_as(hArray.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) - { - eOldStatus = Features_GetStatus(iClient, szFeature); - hDataPack = view_as(hArray.Get(FEATURES_MENU_CALLBACKS)); - hDataPack.Position = ITEM_SELECT; - Function_Toggle = hDataPack.ReadFunction(); - if(Function_Toggle != INVALID_FUNCTION) - { - Function_OnItemToggle(view_as(hArray.Get(FEATURES_PLUGIN)), Function_Toggle, iClient, szFeature, eOldStatus, NO_ACCESS); - } - } + continue; } + + if(view_as(hArray.Get(FEATURES_ITEM_TYPE)) != TOGGLABLE) + { + continue; + } + + fnToggleCallback = Feature_GetSelectCallback(hArray); + if(fnToggleCallback == INVALID_FUNCTION) + { + continue; + } + + eOldStatus = Features_GetStatus(iClient, szFeature); + if(eOldStatus == NO_ACCESS) + { + continue; + } + + Function_OnItemToggle(view_as(hArray.Get(FEATURES_PLUGIN)), fnToggleCallback, iClient, szFeature, eOldStatus, NO_ACCESS); } } -stock void Features_TurnOnAll(int iClient) +void Features_TurnOnAll(int iClient) { - DebugMessage("Features_TurnOnAll %N (%i)", iClient, iClient) + DBG_FEATURES("Features_TurnOnAll %N (%i)", iClient, iClient) int iFeaturesCount = g_hFeaturesArray.Length; - if(iFeaturesCount != 0) + if(!iFeaturesCount) + { + return; + } + char szFeature[FEATURE_NAME_LENGTH]; + VIP_ToggleState eStatus, eNewStatus; + Function fnToggleCallback; + ArrayList hArray; + + for(int i = 0; i < iFeaturesCount; ++i) { - char szFeature[FEATURE_NAME_LENGTH]; - VIP_ToggleState eNewStatus; - Function Function_Toggle; - ArrayList hArray; - DataPack hDataPack; + GetArrayString(g_hFeaturesArray, i, SZF(szFeature)); + if(!GetTrieValue(GLOBAL_TRIE, szFeature, hArray)) + { + continue; + } - for(int i = 0; i < iFeaturesCount; ++i) + if(view_as(hArray.Get(FEATURES_ITEM_TYPE)) != TOGGLABLE) { - GetArrayString(g_hFeaturesArray, i, SZF(szFeature)); - if(GetTrieValue(GLOBAL_TRIE, szFeature, hArray)) - { - if(view_as(hArray.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) - { - hDataPack = view_as(hArray.Get(FEATURES_MENU_CALLBACKS)); - hDataPack.Position = ITEM_SELECT; - Function_Toggle = hDataPack.ReadFunction(); - if(Function_Toggle != INVALID_FUNCTION) - { - eNewStatus = Features_GetStatus(iClient, szFeature); - if(eNewStatus != NO_ACCESS) - { - Function_OnItemToggle(view_as(hArray.Get(FEATURES_PLUGIN)), Function_Toggle, iClient, szFeature, NO_ACCESS, eNewStatus); - } - } - } - } + continue; + } + + fnToggleCallback = Feature_GetSelectCallback(hArray); + if(fnToggleCallback == INVALID_FUNCTION) + { + continue; + } + + eStatus = Features_GetStatus(iClient, szFeature); + if(eStatus == NO_ACCESS) + { + continue; + } + + eNewStatus = Function_OnItemToggle(view_as(hArray.Get(FEATURES_PLUGIN)), fnToggleCallback, iClient, szFeature, NO_ACCESS, eStatus); + + if (eNewStatus != eStatus) + { + Features_SetStatus(iClient, szFeature, eStatus); } } } void Features_SetStatus(int iClient, const char[] szFeature, VIP_ToggleState eStatus) { - DebugMessage("Features_SetStatus: %N (%i) -> Feature: %s, eStatus: %i", iClient, iClient, szFeature, eStatus) + DBG_FEATURES("Features_SetStatus: %N (%i) -> Feature: %s, eStatus: %i", iClient, iClient, szFeature, eStatus) SetTrieValue(g_hFeatureStatus[iClient], szFeature, eStatus); } @@ -87,11 +106,11 @@ VIP_ToggleState Features_GetStatus(const int &iClient, const char[] szFeature) static VIP_ToggleState eStatus; if(g_hFeatureStatus[iClient].GetValue(szFeature, eStatus)) { - DebugMessage("Features_GetStatus: %N (%i) -> Feature: %s, eStatus: %i", iClient, iClient, szFeature, eStatus) + DBG_FEATURES("Features_GetStatus: %N (%i) -> Feature: %s, eStatus: %i", iClient, iClient, szFeature, eStatus) return eStatus; } - - DebugMessage("Features_GetStatus: %N (%i) -> Feature: %s, eStatus: %i", iClient, iClient, szFeature, NO_ACCESS) + + DBG_FEATURES("Features_GetStatus: %N (%i) -> Feature: %s, eStatus: %i", iClient, iClient, szFeature, NO_ACCESS) return NO_ACCESS; } diff --git a/addons/sourcemod/scripting/vip/Global.sp b/addons/sourcemod/scripting/vip/Global.sp index b799057..936920d 100644 --- a/addons/sourcemod/scripting/vip/Global.sp +++ b/addons/sourcemod/scripting/vip/Global.sp @@ -22,15 +22,13 @@ #define IS_VIP (1<<0) // VIP ли игрок #define IS_LOADED (1<<1) // Загружен ли игрок -#define IS_CACHE_LOADED (1<<2) // Загружен ли кеш игрока -#define IS_WAIT_CHAT_PASS (1<<3) // Ожидается ввод пароля в чат -#define IS_WAIT_CHAT_SEARCH (1<<4) // Ожидается ввод значения для поиска в чат -#define IS_SPAWNED (1<<5) // Игрок возродился -#define IS_MENU_OPEN (1<<6) // VIP-меню открыто +#define IS_WAIT_CHAT_PASS (1<<2) // Ожидается ввод пароля в чат +#define IS_WAIT_CHAT_SEARCH (1<<3) // Ожидается ввод значения для поиска в чат +#define IS_SPAWNED (1<<4) // Игрок возродился +#define IS_MENU_OPEN (1<<5) // VIP-меню открыто #define IS_CLIENT_VIP(%0) g_iClientInfo[%0] & IS_VIP == IS_VIP #define IS_CLIENT_LOADED(%0) g_iClientInfo[%0] & IS_LOADED == IS_LOADED -#define IS_CLIENT_CACHE_LOADED(%0) g_iClientInfo[%0] & IS_CACHE_LOADED == IS_CACHE_LOADED #define IS_STARTED (1<<0) #define IS_MySQL (1<<1) diff --git a/addons/sourcemod/scripting/vip/Storage.sp b/addons/sourcemod/scripting/vip/Storage.sp index 071d899..8e76249 100644 --- a/addons/sourcemod/scripting/vip/Storage.sp +++ b/addons/sourcemod/scripting/vip/Storage.sp @@ -1,4 +1,8 @@ +#define IS_CLIENT_CACHE_LOADED(%0) g_bIsCacheLoaded[%0] + +static bool g_bIsCacheLoaded[MPL+1]; + bool Storage_IsClientLoaded(int iClient) { DBG_STORAGE("Storage_IsClientLoaded: %N (%d): %b", iClient, iClient, IS_CLIENT_CACHE_LOADED(iClient) && g_hCache[iClient]) @@ -28,8 +32,6 @@ void Storage_LoadClient(int iClient) int iAccountID = GetSteamAccountID(iClient); DBG_STORAGE("Storage_LoadClient: %N (%d): %d", iClient, iClient, iAccountID) - DebugMessage("Storage_LoadClient %N (%d): %d", iClient, iClient, iAccountID) - FormatEx(SZF(szQuery), "SELECT `key`, `value` \ FROM `vip_storage` \ WHERE `account_id` = %d%s;", @@ -80,7 +82,7 @@ public void SQL_Callback_OnClientLoadStorage(Database hOwner, DBResultSet hResul void Storage_OnClientLoaded(int iClient) { - SET_BIT(g_iClientInfo[iClient], IS_CACHE_LOADED); + g_bIsCacheLoaded[iClient] = true; CallForward_OnClientStorageLoaded(iClient); } @@ -95,7 +97,7 @@ void Storage_ResetClient(int iClient) g_hCache[iClient] = null; } - UNSET_BIT(g_iClientInfo[iClient], IS_CACHE_LOADED); + g_bIsCacheLoaded[iClient] = false; } void Storage_SaveClient(int iClient) From e1089c43a432cbde33edd38c79f25555808b8485 Mon Sep 17 00:00:00 2001 From: vandrienko Date: Tue, 5 Oct 2021 23:58:11 +0300 Subject: [PATCH 63/99] move add vip player to other file --- addons/sourcemod/scripting/VIP_Core.sp | 10 +- addons/sourcemod/scripting/vip/API.sp | 56 +++--- addons/sourcemod/scripting/vip/AdminMenu.sp | 40 ++-- addons/sourcemod/scripting/vip/CMD.sp | 20 +- addons/sourcemod/scripting/vip/Clients.sp | 131 +++++++++++-- addons/sourcemod/scripting/vip/Colors.sp | 6 +- addons/sourcemod/scripting/vip/Cvars.sp | 21 +- addons/sourcemod/scripting/vip/Database.sp | 140 ++++++++++++-- addons/sourcemod/scripting/vip/Downloads.sp | 16 +- addons/sourcemod/scripting/vip/Features.sp | 29 +-- addons/sourcemod/scripting/vip/Global.sp | 6 - addons/sourcemod/scripting/vip/Info.sp | 4 +- addons/sourcemod/scripting/vip/UTIL.sp | 181 +----------------- addons/sourcemod/scripting/vip/VipMenu.sp | 4 +- .../sourcemod/scripting/vip/adminmenu/Del.sp | 4 +- .../sourcemod/scripting/vip/adminmenu/Edit.sp | 2 +- .../sourcemod/scripting/vip/adminmenu/List.sp | 16 +- 17 files changed, 349 insertions(+), 337 deletions(-) diff --git a/addons/sourcemod/scripting/VIP_Core.sp b/addons/sourcemod/scripting/VIP_Core.sp index 9ca26d9..18904a8 100644 --- a/addons/sourcemod/scripting/VIP_Core.sp +++ b/addons/sourcemod/scripting/VIP_Core.sp @@ -118,10 +118,10 @@ public void OnPluginStart() #if USE_ADMINMENU 1 RegConsoleCmd("sm_vipadmin", VIPAdmin_CMD); - if(LibraryExists("adminmenu")) + if (LibraryExists("adminmenu")) { TopMenu hTopMenu = GetAdminTopMenu(); - if(hTopMenu != null) + if (hTopMenu != null) { OnAdminMenuReady(hTopMenu); } @@ -137,11 +137,11 @@ public void OnAllPluginsLoaded() #if USE_ADMINMENU 1 public Action OnClientSayCommand(int iClient, const char[] szCommand, const char[] szArgs) { - if(iClient > 0 && iClient <= MaxClients && szArgs[0]) + if (iClient > 0 && iClient <= MaxClients && szArgs[0]) { - if(g_iClientInfo[iClient] & IS_WAIT_CHAT_SEARCH) + if (g_iClientInfo[iClient] & IS_WAIT_CHAT_SEARCH) { - if(g_iClientInfo[iClient] & IS_WAIT_CHAT_SEARCH) + if (g_iClientInfo[iClient] & IS_WAIT_CHAT_SEARCH) { ShowWaitSearchMenu(iClient, szArgs); } diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 6ece7f5..c0e9931 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -360,17 +360,16 @@ public int Native_PrintToChatAll(Handle hPlugin, int iNumParams) } } } + public int Native_LogMessage(Handle hPlugin, int iNumParams) { DBG_API("Native_LogMessage(%d)", iNumParams) - if (g_CVAR_bLogsEnable) - { - char szMessage[512]; - SetGlobalTransTarget(LANG_SERVER); - FormatNativeString(0, 1, 2, sizeof(szMessage), _, szMessage); - - LogToFile(g_szLogFile, szMessage); - } + + char szMessage[512]; + SetGlobalTransTarget(LANG_SERVER); + FormatNativeString(0, 1, 2, sizeof(szMessage), _, szMessage); + + LogToFile(g_szLogFile, szMessage); } public int Native_GetClientID(Handle hPlugin, int iNumParams) @@ -440,23 +439,20 @@ public int Native_SetClientVIPGroup(Handle hPlugin, int iNumParams) DBG_SQL_Query(szQuery) g_hDatabase.Query(SQL_Callback_ChangeClientSettings, szQuery, UID(iClient)); - if (g_CVAR_bLogsEnable) - { - char szName[MNL], szAdmin[128], szPluginName[128], szOldGroup[64]; - GetClientName(iClient, SZF(szName)); - GetPluginInfo(hPlugin, PlInfo_Name, SZF(szPluginName)); - FormatEx(SZF(szAdmin), "%T %s", "BY_PLUGIN", LANG_SERVER, szPluginName); - g_hFeatures[iClient].GetString(KEY_GROUP, SZF(szOldGroup)); - g_hFeatures[iClient].GetValue(KEY_CID, iClientID); - LogToFile(g_szLogFile, "%T", "LOG_CHANGE_GROUP", LANG_SERVER, szName, iClientID, szOldGroup, szGroup, szAdmin); - } + char szName[MNL], szAdmin[128], szPluginName[128], szOldGroup[64]; + GetClientName(iClient, SZF(szName)); + GetPluginInfo(hPlugin, PlInfo_Name, SZF(szPluginName)); + FormatEx(SZF(szAdmin), "%T %s", "BY_PLUGIN", LANG_SERVER, szPluginName); + g_hFeatures[iClient].GetString(KEY_GROUP, SZF(szOldGroup)); + g_hFeatures[iClient].GetValue(KEY_CID, iClientID); + LogToFile(g_szLogFile, "%T", "LOG_CHANGE_GROUP", LANG_SERVER, szName, iClientID, szOldGroup, szGroup, szAdmin); } - } - else - { - Clients_LoadFeatures(iClient); + + return 1; } + Clients_LoadFeatures(iClient); + return 1; } @@ -527,7 +523,7 @@ public void SQL_Callback_ChangeClientSettings(Database hOwner, DBResultSet hResu public int Native_GetVIPClientTrie(Handle hPlugin, int iNumParams) { int iClient = GetNativeCell(1); - if (CheckValidClient(iClient, false) && g_hFeatures[iClient] && IS_CLIENT_VIP(iClient)) + if (CheckValidClient(iClient, false) && VIP_CLIENT(iClient)) { return view_as(g_hFeatures[iClient]); } @@ -542,12 +538,12 @@ public int Native_SendClientVIPMenu(Handle hPlugin, int iNumParams) { bool bSelection = false; - if(iNumParams == 2) + if (iNumParams == 2) { bSelection = view_as(GetNativeCell(2)); } - if(bSelection) + if (bSelection) { g_hVIPMenu.Display(iClient, MENU_TIME_FOREVER); return; @@ -625,7 +621,7 @@ int API_GiveClientVIP(Handle hPlugin, { char szPluginName[128]; GetPluginInfo(hPlugin, PlInfo_Name, SZF(szPluginName)); - UTIL_ADD_VIP_PLAYER(iAdmin, iClient, _, iTime, szGroup, szPluginName); + Clients_AddVipPlayer(iAdmin, iClient, _, iTime, szGroup, szPluginName); return 0; } @@ -698,7 +694,7 @@ int API_RemoveClientVIP(Handle hPlugin, } } - if(g_iClientInfo[iClient] & IS_MENU_OPEN) + if (g_iClientInfo[iClient] & IS_MENU_OPEN) { CancelClientMenu(iClient); } @@ -794,7 +790,7 @@ public int Native_RegisterFeature(Handle hPlugin, int iNumParams) hDataPack.WriteFunction(GetNativeCell(6)); hArray.Push(hDataPack); - if(eType == TOGGLABLE) + if (eType == TOGGLABLE) { hArray.Push(iNumParams > 6 ? GetNativeCell(7) : NO_ACCESS); } @@ -1021,7 +1017,7 @@ public int Native_SetClientFeatureStatus(Handle hPlugin, int iNumParams) { if (view_as(hArray.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) { - if(iNumParams > 3 && GetNativeCell(4)) + if (iNumParams > 3 && GetNativeCell(4)) { DataPack hDataPack = view_as(hArray.Get(FEATURES_MENU_CALLBACKS)); hDataPack.Position = ITEM_SELECT; @@ -1035,7 +1031,7 @@ public int Native_SetClientFeatureStatus(Handle hPlugin, int iNumParams) if (eOldStatus != eNewStatus) { Features_SetStatus(iClient, szFeature, eNewStatus); - if(iNumParams > 4 && GetNativeCell(5)) + if (iNumParams > 4 && GetNativeCell(5)) { Features_SetStatusToStorage(iClient, szFeature, hArray, eNewStatus); } diff --git a/addons/sourcemod/scripting/vip/AdminMenu.sp b/addons/sourcemod/scripting/vip/AdminMenu.sp index f76aaa1..e3ad014 100644 --- a/addons/sourcemod/scripting/vip/AdminMenu.sp +++ b/addons/sourcemod/scripting/vip/AdminMenu.sp @@ -180,12 +180,7 @@ public void OnAdminMenuReady(Handle aTopMenu) } g_hTopMenu = hTopMenu; - - /*if (g_CVAR_bAddItemToAdminMenu) - { - AddItemsToTopMenu(); - } - */ + AddItemsToTopMenu(); } // g_CVAR_iAdminFlag @@ -385,10 +380,7 @@ public int MenuHandler_TimeMenu(Menu hMenu, MenuAction action, int iClient, int FormatTime(SZF(szTime), "%d/%m/%Y - %H:%M", iExpires); VIP_PrintToChatClient(iClient, "%t", "ADMIN_SET_EXPIRATION", szName, szTime); - if (g_CVAR_bLogsEnable) - { - LogToFile(g_szLogFile, "%T", "LOG_ADMIN_SET_EXPIRATION", LANG_SERVER, iClient, szName, szTime); - } + LogToFile(g_szLogFile, "%T", "LOG_ADMIN_SET_EXPIRATION", LANG_SERVER, iClient, szName, szTime); } case TIME_ADD: { @@ -405,10 +397,7 @@ public int MenuHandler_TimeMenu(Menu hMenu, MenuAction action, int iClient, int UTIL_GetTimeFromStamp(SZF(szTime), iTime, iClient); VIP_PrintToChatClient(iClient, "%t", "ADMIN_EXTENDED", szName, szTime); - if (g_CVAR_bLogsEnable) - { - LogToFile(g_szLogFile, "%T", "LOG_ADMIN_EXTENDED", LANG_SERVER, iClient, szName, szTime); - } + LogToFile(g_szLogFile, "%T", "LOG_ADMIN_EXTENDED", LANG_SERVER, iClient, szName, szTime); } case TIME_TAKE: { @@ -433,10 +422,7 @@ public int MenuHandler_TimeMenu(Menu hMenu, MenuAction action, int iClient, int VIP_PrintToChatClient(iClient, "%t", "ADMIN_REDUCED", szName, szTime); - if (g_CVAR_bLogsEnable) - { - LogToFile(g_szLogFile, "%T", "LOG_ADMIN_REDUCED", LANG_SERVER, iClient, szName, szTime); - } + LogToFile(g_szLogFile, "%T", "LOG_ADMIN_REDUCED", LANG_SERVER, iClient, szName, szTime); } } @@ -469,7 +455,7 @@ void ShowGroupsMenu(int iClient, const char[] sTargetGroup = NULL_STRING) { if (g_hGroups.GetSectionName(SZF(szGroup))) { - if(sTargetGroup[0] && !strcmp(sTargetGroup, szGroup)) + if (sTargetGroup[0] && !strcmp(sTargetGroup, szGroup)) { Format(SZF(szGroup), "%s [X]", szGroup); hMenu.AddItem(szGroup, szGroup, ITEMDRAW_DISABLED); @@ -530,7 +516,7 @@ public int MenuHandler_GroupsList(Menu hMenu, MenuAction action, int iClient, in { g_hClientData[iClient].GetValue(DATA_KEY_Time, iBuffer); g_hClientData[iClient].Clear(); - UTIL_ADD_VIP_PLAYER(iClient, iTarget, _, iBuffer, szGroup); + Clients_AddVipPlayer(iClient, iTarget, _, iBuffer, szGroup); } else { @@ -570,13 +556,11 @@ public int MenuHandler_GroupsList(Menu hMenu, MenuAction action, int iClient, in } VIP_PrintToChatClient(iClient, "%t", "ADMIN_SET_GROUP", szName, szGroup); - if (g_CVAR_bLogsEnable) - { - char szAdmin[256], szAdminInfo[128]; - UTIL_GetClientInfo(iClient, SZF(szAdminInfo)); - FormatEx(SZF(szAdmin), "%T %s", "BY_ADMIN", LANG_SERVER, szAdminInfo); - LogToFile(g_szLogFile, "%T", "LOG_CHANGE_GROUP", LANG_SERVER, szName, iTargetID, szOldGroup, szGroup, szAdmin); - } + + char szAdmin[256], szAdminInfo[128]; + UTIL_GetClientInfo(iClient, SZF(szAdminInfo)); + FormatEx(SZF(szAdmin), "%T %s", "BY_ADMIN", LANG_SERVER, szAdminInfo); + LogToFile(g_szLogFile, "%T", "LOG_CHANGE_GROUP", LANG_SERVER, szName, iTargetID, szOldGroup, szGroup, szAdmin); ShowTargetInfo(iClient); } @@ -604,7 +588,7 @@ public void SQL_Callback_ChangeTime(Database hOwner, DBResultSet hResult, const int iTarget; g_hClientData[iClient].GetValue(DATA_KEY_TargetUID, iTarget); iTarget = CID(iTarget); - if(!iTarget) + if (!iTarget) { g_hClientData[iClient].GetValue(DATA_KEY_TargetID, iTarget); iTarget = GetClientByID(iTarget); diff --git a/addons/sourcemod/scripting/vip/CMD.sp b/addons/sourcemod/scripting/vip/CMD.sp index c5e44dd..8d8a99e 100644 --- a/addons/sourcemod/scripting/vip/CMD.sp +++ b/addons/sourcemod/scripting/vip/CMD.sp @@ -79,7 +79,7 @@ public Action AddVIP_CMD(int iClient, int iArgs) bool bIsMulti; int iTargets, iAccountID = 0; - if((iTargets = ProcessTargetString( + if ((iTargets = ProcessTargetString( szBuffer, iClient, iTargetList, @@ -89,7 +89,7 @@ public Action AddVIP_CMD(int iClient, int iArgs) bIsMulti)) < 1) { iAccountID = UTIL_GetAccountIDFromSteamID(szBuffer); - if(!iAccountID) + if (!iAccountID) { ReplyToTargetError(iClient, iTargets); return Plugin_Handled; @@ -113,11 +113,11 @@ public Action AddVIP_CMD(int iClient, int iArgs) return Plugin_Handled; } - if(iTargets > 0) + if (iTargets > 0) { for(int i = 0; i < iTargets; ++i) { - if(IsClientInGame(iTargetList[i])) + if (IsClientInGame(iTargetList[i])) { if (g_iClientInfo[iTargetList[i]] & IS_VIP) { @@ -125,14 +125,14 @@ public Action AddVIP_CMD(int iClient, int iArgs) continue; } - UTIL_ADD_VIP_PLAYER(iClient, iTargetList[i], _, UTIL_TimeToSeconds(iTime), szGroup); + Clients_AddVipPlayer(iClient, iTargetList[i], _, UTIL_TimeToSeconds(iTime), szGroup); } } return Plugin_Handled; } - UTIL_ADD_VIP_PLAYER(iClient, _, iAccountID, UTIL_TimeToSeconds(iTime), szGroup); + Clients_AddVipPlayer(iClient, _, iAccountID, UTIL_TimeToSeconds(iTime), szGroup); return Plugin_Handled; } @@ -151,7 +151,7 @@ public Action DelVIP_CMD(int iClient, int iArgs) GetCmdArg(1, SZF(szAuth)); int iAccountID = UTIL_GetAccountIDFromSteamID(szAuth); - if(!iAccountID) + if (!iAccountID) { ReplyToTargetError(iClient, COMMAND_TARGET_NONE); return Plugin_Handled; @@ -210,13 +210,13 @@ public Action DumpFeatures_CMD(int iClient, int iArgs) CHECK_ACCESS(iClient) int iFeatures = g_hFeaturesArray.Length; - if(iFeatures != 0) + if (iFeatures != 0) { char szBuffer[PLATFORM_MAX_PATH]; BuildPath(Path_SM, SZF(szBuffer), "data/vip/features_dump.txt"); File hFile = OpenFile(szBuffer, "w"); - if(hFile != null) + if (hFile != null) { char szPluginName[64]; char szPluginPath[PLATFORM_MAX_PATH]; @@ -230,7 +230,7 @@ public Action DumpFeatures_CMD(int iClient, int iArgs) for(int i = 0; i < iFeatures; ++i) { g_hFeaturesArray.GetString(i, SZF(szFeature)); - if(GLOBAL_TRIE.GetValue(szFeature, hArray)) + if (GLOBAL_TRIE.GetValue(szFeature, hArray)) { hPlugin = view_as(hArray.Get(FEATURES_PLUGIN)); GetPluginInfo(hPlugin, PlInfo_Name, SZF(szPluginName)); diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index 7112257..3b7a9ff 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -12,7 +12,7 @@ public void OnClientPutInServer(int iClient) // g_iClientInfo[iClient] = 0; DebugMessage("OnClientPutInServer %N (%d): %b", iClient, iClient, g_iClientInfo[iClient]) - if(IsFakeClient(iClient) || IsClientSourceTV(iClient)) + if (IsFakeClient(iClient) || IsClientSourceTV(iClient)) { return; } @@ -28,7 +28,7 @@ public void OnClientDisconnect(int iClient) SaveClient(iClient); }*/ - if(!IsFakeClient(iClient)) + if (!IsFakeClient(iClient)) { CallForward_OnClientDisconnect(iClient); Storage_SaveClient(iClient); @@ -43,7 +43,7 @@ public void OnClientDisconnect(int iClient) void Clients_CheckVipAccess(int iClient, bool bNotify = false, bool bForward = false) { - if(bForward && !CallForward_OnClientPreLoad(iClient)) + if (bForward && !CallForward_OnClientPreLoad(iClient)) { return; } @@ -165,10 +165,7 @@ void LoadClient(int iClient, int iAccountID, const char[] szGroup, int iExpires) { if (g_CVAR_iDeleteExpired == 0 || (g_CVAR_iDeleteExpired > 0 && iTime >= ((g_CVAR_iDeleteExpired * 86400) + iExpires))) { - if (g_CVAR_bLogsEnable) - { - LogToFile(g_szLogFile, "%T", "REMOVING_PLAYER", LANG_SERVER, iClient); - } + LogToFile(g_szLogFile, "%T", "REMOVING_PLAYER", LANG_SERVER, iClient); DebugMessage("Clients_LoadClient %N (%d):\tDelete", iClient, iClient) @@ -565,16 +562,13 @@ void Clients_ExpiredClient(int iClient) { if (g_hFeatures[iClient].GetValue(KEY_CID, iClientID) && iClientID != -1) { - if (g_CVAR_bLogsEnable) - { - LogToFile(g_szLogFile, "%T", "REMOVING_PLAYER", LANG_SERVER, iClient); - } - + LogToFile(g_szLogFile, "%T", "REMOVING_PLAYER", LANG_SERVER, iClient); + DB_RemoveClientFromID(REASON_EXPIRED, iClient, _, false); } } - if(g_iClientInfo[iClient] & IS_MENU_OPEN) + if (g_iClientInfo[iClient] & IS_MENU_OPEN) { CancelClientMenu(iClient); } @@ -586,3 +580,114 @@ void Clients_ExpiredClient(int iClient) DisplayClientInfo(iClient, "expired_info"); } + +void Clients_AddVipPlayer( + int iAdmin = OWNER_SERVER, + int iTarget = 0, + int iTargetAccountID = 0, + int iDuration, + const char[] szGroup, + const char[] szByWho = NULL_STRING +) +{ + char szAdminInfo[PMP], szTargetInfo[PMP]; + int iExpires; + + if (iDuration) + { + iExpires = iDuration + GetTime(); + } + else + { + iExpires = iDuration; + } + + if (iTarget) + { + iTargetAccountID = GetSteamAccountID(iTarget); + UTIL_GetClientInfo(iTarget, SZF(szTargetInfo)); + } + else + { + char szAuth[32]; + UTIL_GetSteamIDFromAccountID(iTargetAccountID, SZF(szAuth)); + FormatEx(SZF(szTargetInfo), "unknown (%s, unknown)", szAuth); + } + + switch(iAdmin) + { + case OWNER_PLUGIN: + { + FormatEx(SZF(szAdminInfo), "%T %s", "BY_PLUGIN", LANG_SERVER, szByWho); + } + case OWNER_SERVER: + { + FormatEx(SZF(szAdminInfo), "%T", "BY_SERVER", LANG_SERVER); + } + default: + { + char szAdmin[128]; + UTIL_GetClientInfo(iAdmin, SZF(szAdmin)); + FormatEx(SZF(szAdminInfo), "%T %s", "BY_ADMIN", LANG_SERVER, szAdmin); + iAdmin = UID(iAdmin); + } + } + + DB_AddVipPlayer( + iAdmin, + szAdminInfo, + iTarget, + iTargetAccountID, + szTargetInfo, + iDuration, + iExpires, + szGroup + ); +} + +void Clients_OnVipPlayerAdded( + const int iAdmin, + const char[] szAdminInfo, + const int iTarget, + const int iTargetAccountID, + const char[] szTargetInfo, + const int iDuration, + const int iExpires, + const char[] szGroup +) +{ + char szExpires[64], szDuration[64]; + + if (iTarget) + { + Clients_CheckVipAccess(iTarget, true); + CallForward_OnVIPClientAdded(iTarget, iAdmin); + } + + if (iAdmin >= 0) + { + if (iDuration) + { + UTIL_GetTimeFromStamp(SZF(szDuration), iDuration, iAdmin); + FormatTime(SZF(szExpires), "%d/%m/%Y - %H:%M", iExpires); + } + else + { + FormatEx(SZF(szDuration), "%T", "PERMANENT", iAdmin); + FormatEx(SZF(szExpires), "%T", "NEVER", iAdmin); + } + UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_SUCCESS", szTargetInfo, iTargetAccountID); + } + + if (iDuration) + { + UTIL_GetTimeFromStamp(SZF(szExpires), iDuration, LANG_SERVER); + } + else + { + FormatEx(SZF(szExpires), "%T", "PERMANENT", LANG_SERVER); + FormatEx(SZF(szExpires), "%T", "NEVER", LANG_SERVER); + } + + LogToFile(g_szLogFile, "%T", "LOG_VIP_ADDED", LANG_SERVER, szTargetInfo, iTargetAccountID, szDuration, szExpires, szGroup, szAdminInfo); +} diff --git a/addons/sourcemod/scripting/vip/Colors.sp b/addons/sourcemod/scripting/vip/Colors.sp index a0e0706..5e596e6 100644 --- a/addons/sourcemod/scripting/vip/Colors.sp +++ b/addons/sourcemod/scripting/vip/Colors.sp @@ -142,16 +142,16 @@ void Colors_RemoveColors(char[] szBuffer) for(; i < iLen; ++i) { - if(bIgnore) + if (bIgnore) { - if(szTemp[i] == '}') + if (szTemp[i] == '}') { bIgnore = false; } continue; } - if(szTemp[i] == '{') + if (szTemp[i] == '{') { bIgnore = true; continue; diff --git a/addons/sourcemod/scripting/vip/Cvars.sp b/addons/sourcemod/scripting/vip/Cvars.sp index 5d515bb..d094d98 100644 --- a/addons/sourcemod/scripting/vip/Cvars.sp +++ b/addons/sourcemod/scripting/vip/Cvars.sp @@ -45,10 +45,6 @@ void Cvars_Setup() hCvar = CreateConVar("sm_vip_features_default_status", "1", "Статус функций по-умолчанию (0 - Выключены, 1 - Включены)", _, true, 0.0, true, 1.0); hCvar.AddChangeHook(OnDefaultStatusChange); g_CVAR_bDefaultStatus = hCvar.BoolValue; - - hCvar = CreateConVar("sm_vip_logs_enable", "1", "Вести ли лог logs/VIP_Logs.log (0 - Выключено, 1 - Включено)", _, true, 0.0, true, 1.0); - hCvar.AddChangeHook(OnLogsEnableChange); - g_CVAR_bLogsEnable = hCvar.BoolValue; AutoExecConfig(true, "VIP_Core", "vip"); } @@ -58,9 +54,9 @@ public void OnAdminFlagChange(ConVar hCvar, const char[] szOldValue, const char[ g_CVAR_iAdminFlag = UTIL_GetConVarAdminFlag(hCvar); #if USE_ADMINMENU 1 - if(g_hTopMenu) + if (g_hTopMenu) { - if(VIPAdminMenuObject != INVALID_TOPMENUOBJECT ) + if (VIPAdminMenuObject != INVALID_TOPMENUOBJECT) { RemoveFromTopMenu(g_hTopMenu, VIPAdminMenuObject); } @@ -105,7 +101,7 @@ public void OnTimeModeChange(ConVar hCvar, const char[] szOldValue, const char[] public void OnDeleteExpiredChange(ConVar hCvar, const char[] szOldValue, const char[] szNewValue) { g_CVAR_iDeleteExpired = hCvar.IntValue; - if(g_CVAR_iDeleteExpired < -1) + if (g_CVAR_iDeleteExpired < -1) { g_CVAR_iDeleteExpired = -1; } @@ -114,15 +110,15 @@ public void OnDeleteExpiredChange(ConVar hCvar, const char[] szOldValue, const c public void OnDeleteOutdatedChange(ConVar hCvar, const char[] szOldValue, const char[] szNewValue) { g_CVAR_iOutdatedExpired = hCvar.IntValue; - if(g_CVAR_iOutdatedExpired != -1) + if (g_CVAR_iOutdatedExpired != -1) { - if(g_CVAR_iOutdatedExpired < 1) + if (g_CVAR_iOutdatedExpired < 1) { g_CVAR_iOutdatedExpired = -1; return; } - if(g_CVAR_iOutdatedExpired < 3) + if (g_CVAR_iOutdatedExpired < 3) { g_CVAR_iOutdatedExpired = 3; } @@ -148,8 +144,3 @@ public void OnDefaultStatusChange(ConVar hCvar, const char[] szOldValue, const c { g_CVAR_bDefaultStatus = hCvar.BoolValue; } - -public void OnLogsEnableChange(ConVar hCvar, const char[] szOldValue, const char[] szNewValue) -{ - g_CVAR_bLogsEnable = hCvar.BoolValue; -} diff --git a/addons/sourcemod/scripting/vip/Database.sp b/addons/sourcemod/scripting/vip/Database.sp index 3f03afc..99ea1c9 100644 --- a/addons/sourcemod/scripting/vip/Database.sp +++ b/addons/sourcemod/scripting/vip/Database.sp @@ -228,9 +228,9 @@ void DB_RemoveClientFromID(int iAdmin = 0, char szQuery[256], szName[MNL], szGroup[64]; DataPack hDataPack = new DataPack(); - if(iClient) + if (iClient) { - if(szSourceName[0]) + if (szSourceName[0]) { strcopy(SZF(szName), szSourceName); } @@ -239,15 +239,15 @@ void DB_RemoveClientFromID(int iAdmin = 0, GetClientName(iClient, SZF(szName)); } - if(szSourceGroup[0]) + if (szSourceGroup[0]) { strcopy(SZF(szGroup), szSourceGroup); } - else if(g_hFeatures[iClient]) + else if (g_hFeatures[iClient]) { g_hFeatures[iClient].GetString(KEY_GROUP, SZF(szGroup)); - if(!iClientID) + if (!iClientID) { g_hFeatures[iClient].GetValue(KEY_CID, iClientID); } @@ -286,7 +286,7 @@ void DB_RemoveClientFromID(int iAdmin = 0, hDataPack.WriteString(szAdmin); - if(szName[0] && szGroup[0]) + if (szName[0] && szGroup[0]) { hDataPack.WriteString(szName); hDataPack.WriteString(szGroup); @@ -372,15 +372,12 @@ public void SQL_Callback_RemoveClient(Database hOwner, DBResultSet hResult, cons hPack.ReadString(SZF(szGroup)); delete hPack; - if(iAdmin == -1) + if (iAdmin == -1) { return; } - if (g_CVAR_bLogsEnable) - { - LogToFile(g_szLogFile, "%T", "LOG_VIP_DELETED", LANG_SERVER, szName, iClientID, szGroup, szAdmin); - } + LogToFile(g_szLogFile, "%T", "LOG_VIP_DELETED", LANG_SERVER, szName, iClientID, szGroup, szAdmin); if (bNotify && iAdmin > 0) { @@ -417,3 +414,124 @@ public void SQL_Callback_SelectExpiredAndOutdated(Database hOwner, DBResultSet h } } } + +void DB_AddVipPlayer( + const int iAdmin, + const char[] szAdminInfo, + const int iTarget, + const int iTargetAccountID, + const char[] szTargetInfo, + const int iDuration, + const int iExpires, + const char[] szGroup +) +{ + DataPack hDataPack = new DataPack(); + + // Admin + hDataPack.WriteCell(iAdmin); + hDataPack.WriteString(szAdminInfo); + + // Target + hDataPack.WriteCell(GET_UID(iTarget)); + hDataPack.WriteCell(iTargetAccountID); + hDataPack.WriteString(szTargetInfo); + + // Data + hDataPack.WriteCell(iDuration); + hDataPack.WriteCell(iExpires); + hDataPack.WriteString(szGroup); + + int iLastVisit = iTarget ? GetTime() : 0; + + char szQuery[512], szName[MNL*2+1]; + if (iTarget) + { + GetClientName(iTarget, SZF(szQuery)); + g_hDatabase.Escape(szQuery, SZF(szName)); + } + else + { + strcopy(SZF(szName), "unknown"); + } + + if (GLOBAL_INFO & IS_MySQL) + { + FormatEx(SZF(szQuery), "INSERT INTO `vip_users` (`account_id`, `sid`, `expires`, `group`, `name`, `lastvisit`) VALUES (%d, %d, %d, '%s', '%s', %d) \ + ON DUPLICATE KEY UPDATE `expires` = %d, `group` = '%s';", iTargetAccountID, g_CVAR_iServerID, iExpires, szGroup, szName, iLastVisit, iExpires, szGroup); + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_OnVIPClientAdded, szQuery, hDataPack); + + return; + } + + FormatEx(SZF(szQuery), "INSERT OR REPLACE INTO `vip_users` (`account_id`, `name`, `expires`, `group`, `lastvisit`) VALUES (%d, '%s', %d, '%s', %d);", iTargetAccountID, szName, iExpires, szGroup, iLastVisit); + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_OnVIPClientAdded, szQuery, hDataPack); +} + +public void SQL_Callback_OnVIPClientAdded(Database hOwner, DBResultSet hResult, const char[] szError, any hPack) +{ + DBG_SQL_Response("SQL_Callback_OnVIPClientAdded") + DataPack hDataPack = view_as(hPack); + hDataPack.Reset(); + + // Admin + int iAdmin = GET_CID(hDataPack.ReadCell()); + + if (hResult == null || szError[0]) + { + delete hDataPack; + + if (iAdmin >= 0) + { + UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_FAILED"); + } + + LogError("SQL_Callback_OnVIPClientAdded: %s", szError); + return; + } + + DBG_SQL_Response("hResult.AffectedRows = %d", hResult.AffectedRows) + + if (!hResult.AffectedRows) + { + delete hDataPack; + + if (iAdmin >= 0) + { + UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_FAILED"); + } + return; + } + + int iTarget, iDuration, iExpires, iAccountID; + char szAdminInfo[PMP], szTargetInfo[PMP], szGroup[64]; + + hDataPack.ReadString(SZF(szAdminInfo)); + + // Target + iTarget = GET_CID(hDataPack.ReadCell()); + iAccountID = hDataPack.ReadCell(); + hDataPack.ReadString(SZF(szTargetInfo)); + + // Data + iDuration = hDataPack.ReadCell(); + iExpires = hDataPack.ReadCell(); + hDataPack.ReadString(SZF(szGroup)); + + delete hDataPack; + + + Clients_OnVipPlayerAdded( + iAdmin, + szAdminInfo, + iTarget, + iAccountID, + szTargetInfo, + iDuration, + iExpires, + szGroup + ); +} + diff --git a/addons/sourcemod/scripting/vip/Downloads.sp b/addons/sourcemod/scripting/vip/Downloads.sp index 5c30e9a..848586d 100644 --- a/addons/sourcemod/scripting/vip/Downloads.sp +++ b/addons/sourcemod/scripting/vip/Downloads.sp @@ -6,23 +6,23 @@ void ReadDownloads() BuildPath(Path_SM, SZF(szBuffer), "data/vip/modules/downloadlist.txt"); File hFile = OpenFile(szBuffer, "r"); - if(hFile != null) + if (hFile != null) { DBG_Download("OpenFile('%s')", szBuffer) int iEndPos; while (!hFile.EndOfFile() && hFile.ReadLine(SZF(szBuffer))) { DBG_Download("ReadLine = '%s'", szBuffer) - if(szBuffer[0]) + if (szBuffer[0]) { iEndPos = StrContains(szBuffer, "//"); DBG_Download("iEndPos = %d", iEndPos) - if(iEndPos != -1) + if (iEndPos != -1) { szBuffer[iEndPos] = 0; } - if(szBuffer[0] && IsCharAlpha(szBuffer[0])) + if (szBuffer[0] && IsCharAlpha(szBuffer[0])) { DBG_Download("ReadFileLine: '%s'", szBuffer) @@ -41,13 +41,13 @@ bool File_AddToDownloadsTable(const char[] szPath) { DBG_Download("File_AddToDownloadsTable: '%s'", szPath) - if(FileExists(szPath)) + if (FileExists(szPath)) { DBG_Download("File '%s' Loaded", szPath) AddFileToDownloadsTable(szPath); } - else if(DirExists(szPath)) + else if (DirExists(szPath)) { Dir_AddToDownloadsTable(szPath); } @@ -57,10 +57,10 @@ bool Dir_AddToDownloadsTable(const char[] szPath) { DBG_Download("Dir_AddToDownloadsTable: '%s'", szPath) - if(DirExists(szPath)) + if (DirExists(szPath)) { DirectoryListing hDir = OpenDirectory(szPath); - if(hDir != null) + if (hDir != null) { char szDirEntry[PLATFORM_MAX_PATH]; while (hDir.GetNext(SZF(szDirEntry))) diff --git a/addons/sourcemod/scripting/vip/Features.sp b/addons/sourcemod/scripting/vip/Features.sp index 16917e0..69218c0 100644 --- a/addons/sourcemod/scripting/vip/Features.sp +++ b/addons/sourcemod/scripting/vip/Features.sp @@ -9,7 +9,7 @@ void Features_TurnOffAll(int iClient) { DBG_FEATURES("Features_TurnOffAll %N (%i)", iClient, iClient) int iFeaturesCount = g_hFeaturesArray.Length; - if(!iFeaturesCount) + if (!iFeaturesCount) { return; } @@ -21,29 +21,31 @@ void Features_TurnOffAll(int iClient) for(int i = 0; i < iFeaturesCount; ++i) { g_hFeaturesArray.GetString(i, SZF(szFeature)); - if(!GetTrieValue(GLOBAL_TRIE, szFeature, hArray)) + if (!GetTrieValue(GLOBAL_TRIE, szFeature, hArray)) { continue; } - if(view_as(hArray.Get(FEATURES_ITEM_TYPE)) != TOGGLABLE) + if (view_as(hArray.Get(FEATURES_ITEM_TYPE)) != TOGGLABLE) { continue; } fnToggleCallback = Feature_GetSelectCallback(hArray); - if(fnToggleCallback == INVALID_FUNCTION) + if (fnToggleCallback == INVALID_FUNCTION) { continue; } eOldStatus = Features_GetStatus(iClient, szFeature); - if(eOldStatus == NO_ACCESS) + if (eOldStatus == NO_ACCESS) { continue; } - + + CallForward_OnFeatureToggle(iClient, szFeature, eOldStatus, NO_ACCESS); Function_OnItemToggle(view_as(hArray.Get(FEATURES_PLUGIN)), fnToggleCallback, iClient, szFeature, eOldStatus, NO_ACCESS); + Features_SetStatus(iClient, szFeature, NO_ACCESS); } } @@ -52,7 +54,7 @@ void Features_TurnOnAll(int iClient) DBG_FEATURES("Features_TurnOnAll %N (%i)", iClient, iClient) int iFeaturesCount = g_hFeaturesArray.Length; - if(!iFeaturesCount) + if (!iFeaturesCount) { return; } @@ -64,28 +66,29 @@ void Features_TurnOnAll(int iClient) for(int i = 0; i < iFeaturesCount; ++i) { GetArrayString(g_hFeaturesArray, i, SZF(szFeature)); - if(!GetTrieValue(GLOBAL_TRIE, szFeature, hArray)) + if (!GetTrieValue(GLOBAL_TRIE, szFeature, hArray)) { continue; } - if(view_as(hArray.Get(FEATURES_ITEM_TYPE)) != TOGGLABLE) + if (view_as(hArray.Get(FEATURES_ITEM_TYPE)) != TOGGLABLE) { continue; } fnToggleCallback = Feature_GetSelectCallback(hArray); - if(fnToggleCallback == INVALID_FUNCTION) + if (fnToggleCallback == INVALID_FUNCTION) { continue; } eStatus = Features_GetStatus(iClient, szFeature); - if(eStatus == NO_ACCESS) + if (eStatus == NO_ACCESS) { continue; } - + + eNewStatus = CallForward_OnFeatureToggle(iClient, szFeature, NO_ACCESS, eStatus); eNewStatus = Function_OnItemToggle(view_as(hArray.Get(FEATURES_PLUGIN)), fnToggleCallback, iClient, szFeature, NO_ACCESS, eStatus); if (eNewStatus != eStatus) @@ -104,7 +107,7 @@ void Features_SetStatus(int iClient, const char[] szFeature, VIP_ToggleState eSt VIP_ToggleState Features_GetStatus(const int &iClient, const char[] szFeature) { static VIP_ToggleState eStatus; - if(g_hFeatureStatus[iClient].GetValue(szFeature, eStatus)) + if (g_hFeatureStatus[iClient].GetValue(szFeature, eStatus)) { DBG_FEATURES("Features_GetStatus: %N (%i) -> Feature: %s, eStatus: %i", iClient, iClient, szFeature, eStatus) return eStatus; diff --git a/addons/sourcemod/scripting/vip/Global.sp b/addons/sourcemod/scripting/vip/Global.sp index 936920d..f0435b2 100644 --- a/addons/sourcemod/scripting/vip/Global.sp +++ b/addons/sourcemod/scripting/vip/Global.sp @@ -117,15 +117,9 @@ int g_CVAR_iDeleteExpired; int g_CVAR_iOutdatedExpired; float g_CVAR_fSpawnDelay; bool g_CVAR_bAutoOpenMenu; -/* -#if USE_ADMINMENU 1 -bool g_CVAR_bAddItemToAdminMenu; -#endif -*/ bool g_CVAR_bUpdateName; bool g_CVAR_bHideNoAccessItems; bool g_CVAR_bDefaultStatus; -bool g_CVAR_bLogsEnable; EngineVersion g_EngineVersion; bool g_bIsTranslationPhraseExistsAvailable; diff --git a/addons/sourcemod/scripting/vip/Info.sp b/addons/sourcemod/scripting/vip/Info.sp index 32abd59..d658195 100644 --- a/addons/sourcemod/scripting/vip/Info.sp +++ b/addons/sourcemod/scripting/vip/Info.sp @@ -71,7 +71,7 @@ void DisplayInfo(int iClient, const char[] szEvent, const char[] szType, char[] { if (!g_hInfo.GotoFirstSubKey()) { - if(hKeyValues != g_hInfo) + if (hKeyValues != g_hInfo) { delete hKeyValues; } @@ -143,7 +143,7 @@ void DisplayInfo(int iClient, const char[] szEvent, const char[] szType, char[] } } - if(hKeyValues != g_hInfo) + if (hKeyValues != g_hInfo) { delete hKeyValues; } diff --git a/addons/sourcemod/scripting/vip/UTIL.sp b/addons/sourcemod/scripting/vip/UTIL.sp index f2f3d3e..87bddcf 100644 --- a/addons/sourcemod/scripting/vip/UTIL.sp +++ b/addons/sourcemod/scripting/vip/UTIL.sp @@ -222,7 +222,6 @@ void UTIL_GetSteamIDFromAccountID(int iAccountID, char[] szSteamID, int iMaxLen) iAccountID -= iPart; FormatEx(szSteamID, iMaxLen, "STEAM_%d:%d:%d", g_EngineVersion == Engine_CSGO ? 1:0, iPart, iAccountID/2); } - } } @@ -230,7 +229,7 @@ void UTIL_GetClientInfo(int iClient, char[] szBuffer, int iMaxLen) { char szName[MNL], szAuth[32], szIP[24]; GetClientName(iClient, SZF(szName)); - GetClientAuthId(iClient, AuthId_Steam2, SZF(szAuth)); + GetClientAuthId(iClient, AuthId_Engine, SZF(szAuth)); GetClientIP(iClient, SZF(szIP)); FormatEx(szBuffer, iMaxLen, "%s (%s, %s)", szName, szAuth, szIP); @@ -272,181 +271,3 @@ void UTIL_Reply(int iClient, const char[] szMsg, any ...) PrintToServer(szMessage); } } - -void UTIL_ADD_VIP_PLAYER(int iAdmin = OWNER_SERVER, - int iTarget = 0, - int iAccID = 0, - int iDuration, - const char[] szGroup, - const char[] szByWho = NULL_STRING) -{ - char szQuery[PMP*2], szName[MNL*2+1]; - char szAdmin[PMP], szTargetInfo[PMP]; - int iExpires, iAccountID; - - if (iDuration) - { - iExpires = iDuration + GetTime(); - } - else - { - iExpires = iDuration; - } - - if (iTarget) - { - GetClientName(iTarget, SZF(szQuery)); - g_hDatabase.Escape(szQuery, SZF(szName)); - iAccountID = GetSteamAccountID(iTarget); - UTIL_GetClientInfo(iTarget, SZF(szTargetInfo)); - } - else - { - strcopy(SZF(szName), "unknown"); - iAccountID = iAccID; - UTIL_GetSteamIDFromAccountID(iAccountID, SZF(szQuery)); - FormatEx(SZF(szTargetInfo), "unknown (%s, unknown)", szQuery); - } - - DataPack hDataPack = new DataPack(); - - // Admin - - switch(iAdmin) - { - case OWNER_PLUGIN: - { - FormatEx(SZF(szAdmin), "%T %s", "BY_PLUGIN", LANG_SERVER, szByWho); - } - case OWNER_SERVER: - { - FormatEx(SZF(szAdmin), "%T", "BY_SERVER", LANG_SERVER); - } - default: - { - char szAdminInfo[128]; - UTIL_GetClientInfo(iAdmin, SZF(szAdminInfo)); - FormatEx(SZF(szAdmin), "%T %s", "BY_ADMIN", LANG_SERVER, szAdminInfo); - iAdmin = UID(iAdmin); - } - } - hDataPack.WriteCell(iAdmin); - hDataPack.WriteString(szAdmin); - - // Target - hDataPack.WriteCell(GET_UID(iTarget)); - hDataPack.WriteCell(iAccountID); - hDataPack.WriteString(szTargetInfo); - - // Data - hDataPack.WriteCell(iDuration); - hDataPack.WriteCell(iExpires); - hDataPack.WriteString(szGroup); - - int iLastVisit = iTarget ? GetTime():0; - - if (GLOBAL_INFO & IS_MySQL) - { - FormatEx(SZF(szQuery), "INSERT INTO `vip_users` (`account_id`, `sid`, `expires`, `group`, `name`, `lastvisit`) VALUES (%d, %d, %d, '%s', '%s', %d) \ - ON DUPLICATE KEY UPDATE `expires` = %d, `group` = '%s';", iAccountID, g_CVAR_iServerID, iExpires, szGroup, szName, iLastVisit, iExpires, szGroup); - DBG_SQL_Query(szQuery) - g_hDatabase.Query(SQL_Callback_OnVIPClientAdded, szQuery, hDataPack); - - return; - } - - FormatEx(SZF(szQuery), "INSERT OR REPLACE INTO `vip_users` (`account_id`, `name`, `expires`, `group`, `lastvisit`) VALUES (%d, '%s', %d, '%s', %d);", iAccountID, szName, iExpires, szGroup, iLastVisit); - DBG_SQL_Query(szQuery) - g_hDatabase.Query(SQL_Callback_OnVIPClientAdded, szQuery, hDataPack); -} - -public void SQL_Callback_OnVIPClientAdded(Database hOwner, DBResultSet hResult, const char[] szError, any hPack) -{ - DBG_SQL_Response("SQL_Callback_OnVIPClientAdded") - DataPack hDataPack = view_as(hPack); - hDataPack.Reset(); - - // Admin - int iAdmin = GET_CID(hDataPack.ReadCell()); - - if (hResult == null || szError[0]) - { - delete hDataPack; - - if (iAdmin >= 0) - { - UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_FAILED"); - } - - LogError("SQL_Callback_OnVIPClientAdded: %s", szError); - return; - } - - DBG_SQL_Response("hResult.AffectedRows = %d", hResult.AffectedRows) - - if (!hResult.AffectedRows) - { - delete hDataPack; - - if (iAdmin >= 0) - { - UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_FAILED"); - } - return; - } - - int iTarget, iDuration, iExpires, iAccountID; - char szAdmin[PMP], szTargetInfo[PMP], szExpires[64], szDuration[64], szGroup[64]; - - hDataPack.ReadString(SZF(szAdmin)); - - // Target - iTarget = GET_CID(hDataPack.ReadCell()); - iAccountID = hDataPack.ReadCell(); - hDataPack.ReadString(SZF(szTargetInfo)); - - // Data - iDuration = hDataPack.ReadCell(); - iExpires = hDataPack.ReadCell(); - hDataPack.ReadString(SZF(szGroup)); - - delete hDataPack; - - if (iTarget) - { - Clients_CheckVipAccess(iTarget, true); - CallForward_OnVIPClientAdded(iTarget, iAdmin); - } - - char szAuth[32]; - I2S(iAccountID, szAuth); - - if (iAdmin >= 0) - { - if (iDuration) - { - UTIL_GetTimeFromStamp(SZF(szDuration), iDuration, iAdmin); - FormatTime(SZF(szExpires), "%d/%m/%Y - %H:%M", iExpires); - } - else - { - FormatEx(SZF(szDuration), "%T", "PERMANENT", iAdmin); - FormatEx(SZF(szExpires), "%T", "NEVER", iAdmin); - } - UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_SUCCESS", szTargetInfo, iAccountID); - } - - if (g_CVAR_bLogsEnable) - { - if (iDuration) - { - UTIL_GetTimeFromStamp(SZF(szExpires), iDuration, LANG_SERVER); - } - else - { - FormatEx(SZF(szExpires), "%T", "PERMANENT", LANG_SERVER); - FormatEx(SZF(szExpires), "%T", "NEVER", LANG_SERVER); - } - LogToFile(g_szLogFile, "%T", "LOG_VIP_ADDED", LANG_SERVER, szTargetInfo, iAccountID, szDuration, szExpires, szGroup, szAdmin); - } -} \ No newline at end of file diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index d9a8be5..d70c237 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -95,7 +95,7 @@ stock void PrintArray(ArrayList &hArray) */ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOption) { - if((action == MenuAction_Display || + if ((action == MenuAction_Display || action == MenuAction_DisplayItem || action == MenuAction_DrawItem || action == MenuAction_Select) && @@ -220,7 +220,7 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti } } - if(IsTranslationPhraseExists(szFeature)) + if (IsTranslationPhraseExists(szFeature)) { FormatEx(SZF(szDisplay), "%T", szFeature, iClient); } diff --git a/addons/sourcemod/scripting/vip/adminmenu/Del.sp b/addons/sourcemod/scripting/vip/adminmenu/Del.sp index b13220f..d3aff90 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/Del.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/Del.sp @@ -36,7 +36,7 @@ public int MenuHandler_DeleteVipPlayerMenu(Menu hMenu, MenuAction action, int iC g_hClientData[iClient].GetValue(DATA_KEY_TargetID, iTargetID); int iTarget = 0; - if(g_hClientData[iClient].GetValue(DATA_KEY_TargetUID, iTarget)) + if (g_hClientData[iClient].GetValue(DATA_KEY_TargetUID, iTarget)) { iTarget = CID(iTarget); if (!iTarget && iTargetID != -1) @@ -57,7 +57,7 @@ public int MenuHandler_DeleteVipPlayerMenu(Menu hMenu, MenuAction action, int iC } } - if(iTargetID != -1) + if (iTargetID != -1) { char szGroup[64], szName[MAX_NAME_LENGTH]; g_hClientData[iClient].GetString(DATA_KEY_Name, SZF(szName)); diff --git a/addons/sourcemod/scripting/vip/adminmenu/Edit.sp b/addons/sourcemod/scripting/vip/adminmenu/Edit.sp index c759d97..9e5f863 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/Edit.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/Edit.sp @@ -25,7 +25,7 @@ public int MenuHandler_EditTimeMenu(Menu hMenu, MenuAction action, int iClient, case MenuAction_End: delete hMenu; case MenuAction_Cancel: { - if(Item == MenuCancel_ExitBack) + if (Item == MenuCancel_ExitBack) { ShowTargetInfoMenu(iClient); } diff --git a/addons/sourcemod/scripting/vip/adminmenu/List.sp b/addons/sourcemod/scripting/vip/adminmenu/List.sp index 369ead2..cc76af7 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/List.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/List.sp @@ -98,7 +98,7 @@ public int MenuHandler_VipPlayersListMenu(Menu hMenu, MenuAction action, int iCl g_hFeatures[iTarget].GetValue(KEY_CID, UserID); g_hClientData[iClient].SetValue(DATA_KEY_TargetID, UserID); - if(UserID == -1) + if (UserID == -1) { ShowTemporaryTargetInfo(iClient); return 0; @@ -197,10 +197,10 @@ void ShowVipPlayersFromDBMenu(int iClient, int iOffset = 0) char szQuery[1024], szSearch[64], szWhere[128]; szSearch[0] = 0; szWhere[0] = 0; - if(g_hClientData[iClient].GetString(DATA_KEY_Search, SZF(szSearch)) && szSearch[0]) + if (g_hClientData[iClient].GetString(DATA_KEY_Search, SZF(szSearch)) && szSearch[0]) { int iAccountID = UTIL_GetAccountIDFromSteamID(szSearch); - if(iAccountID) + if (iAccountID) { FormatEx(SZF(szWhere), " AND `account_id` = %d", iAccountID); } @@ -221,7 +221,7 @@ void ShowVipPlayersFromDBMenu(int iClient, int iOffset = 0) } else { - if(szWhere[0]) + if (szWhere[0]) { FormatEx(SZF(szQuery), "SELECT `account_id`, `name` \ FROM `vip_users` \ @@ -258,7 +258,7 @@ public void SQL_Callback_SelectVipPlayers(Database hOwner, DBResultSet hResult, hMenu.ExitBackButton = true; szSearch[0] = 0; g_hClientData[iClient].GetString(DATA_KEY_Search, SZF(szSearch)); - if(szSearch[0]) + if (szSearch[0]) { hMenu.SetTitle("%T:\n%T:\n ", "MENU_LIST_VIP", iClient, "MENU_SEARCH", iClient, szSearch, hResult.RowCount); } @@ -288,7 +288,7 @@ public void SQL_Callback_SelectVipPlayers(Database hOwner, DBResultSet hResult, DBG_SQL_Response("hResult.FetchInt(0) = %d", iClientID) DBG_SQL_Response("hResult.FetchString(1) = '%s", szName) - if(GetClientByID(iClientID)) + if (GetClientByID(iClientID)) { Format(SZF(szName), "• %s", szName); } @@ -372,7 +372,7 @@ void ShowTemporaryTargetInfo(int iClient) int iTarget; g_hClientData[iClient].GetValue(DATA_KEY_TargetUID, iTarget); iTarget = CID(iTarget); - if(!iTarget) + if (!iTarget) { VIP_PrintToChatClient(iClient, "%t", "PLAYER_NO_LONGER_AVAILABLE"); ShowVipPlayersListMenu(iClient); @@ -424,7 +424,7 @@ void ShowTargetInfoMenu(int iClient) FormatEx(SZF(szBuffer), "%T", "NEVER", iClient); } - if(iClientID == -1) + if (iClientID == -1) { Format(SZF(szBuffer), "%s (%T)", szBuffer, "TEMPORARY", iClient); } From 380e690619236bba5cb73153a153775fce15099e Mon Sep 17 00:00:00 2001 From: vandrienko Date: Wed, 6 Oct 2021 01:19:15 +0300 Subject: [PATCH 64/99] move remove vip player to other file --- addons/sourcemod/scripting/vip/API.sp | 4 +- addons/sourcemod/scripting/vip/AdminMenu.sp | 14 +- addons/sourcemod/scripting/vip/CMD.sp | 33 +- addons/sourcemod/scripting/vip/Clients.sp | 103 +++- addons/sourcemod/scripting/vip/Database.sp | 531 ++++++++++++------ addons/sourcemod/scripting/vip/Features.sp | 33 +- addons/sourcemod/scripting/vip/Global.sp | 1 + addons/sourcemod/scripting/vip/UTIL.sp | 26 +- addons/sourcemod/scripting/vip/VipMenu.sp | 2 +- .../sourcemod/scripting/vip/adminmenu/Del.sp | 27 +- .../sourcemod/scripting/vip/adminmenu/List.sp | 4 +- .../translations/vip_core.phrases.txt | 1 - 12 files changed, 515 insertions(+), 264 deletions(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index c0e9931..e93afe5 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -690,7 +690,7 @@ int API_RemoveClientVIP(Handle hPlugin, int iClientID; if (g_hFeatures[iClient].GetValue(KEY_CID, iClientID) && iClientID != -1) { - DB_RemoveClientFromID(OWNER_PLUGIN, iClient, _, true, _, _, szPluginName); + Clients_RemoveVipPlayer(OWNER_PLUGIN, iClient, _, true, szPluginName); } } @@ -1033,7 +1033,7 @@ public int Native_SetClientFeatureStatus(Handle hPlugin, int iNumParams) Features_SetStatus(iClient, szFeature, eNewStatus); if (iNumParams > 4 && GetNativeCell(5)) { - Features_SetStatusToStorage(iClient, szFeature, hArray, eNewStatus); + Features_SetStatusToStorage(iClient, szFeature, eNewStatus); } return true; } diff --git a/addons/sourcemod/scripting/vip/AdminMenu.sp b/addons/sourcemod/scripting/vip/AdminMenu.sp index e3ad014..1ffd33a 100644 --- a/addons/sourcemod/scripting/vip/AdminMenu.sp +++ b/addons/sourcemod/scripting/vip/AdminMenu.sp @@ -67,16 +67,6 @@ void InitiateDataMap(int iClient) } } -int GetClientByID(int ID) -{ - int iClientID; - for (int i = 1; i <= MaxClients; ++i) - { - if (IsClientInGame(i) && g_hFeatures[i] != null && g_hFeatures[i].GetValue(KEY_CID, iClientID) && iClientID == ID) return i; - } - return 0; -} - // ************************ ADMIN_MENU ************************ void VIPAdminMenu_Setup() { @@ -544,7 +534,7 @@ public int MenuHandler_GroupsList(Menu hMenu, MenuAction action, int iClient, in iTarget = CID(iTarget); if (!iTarget) { - iTarget = GetClientByID(iTargetID); + iTarget = UTIL_GetVipClientByAccountID(iTargetID); } if (iTarget) @@ -591,7 +581,7 @@ public void SQL_Callback_ChangeTime(Database hOwner, DBResultSet hResult, const if (!iTarget) { g_hClientData[iClient].GetValue(DATA_KEY_TargetID, iTarget); - iTarget = GetClientByID(iTarget); + iTarget = UTIL_GetVipClientByAccountID(iTarget); } if (iTarget) diff --git a/addons/sourcemod/scripting/vip/CMD.sp b/addons/sourcemod/scripting/vip/CMD.sp index 8d8a99e..ab8e10e 100644 --- a/addons/sourcemod/scripting/vip/CMD.sp +++ b/addons/sourcemod/scripting/vip/CMD.sp @@ -46,7 +46,7 @@ public Action ReloadVIPPlayers_CMD(int iClient, int iArgs) { CHECK_ACCESS(iClient) - UTIL_ReloadVIPPlayers(iClient, true); + Clients_ReloadVipPlayers(iClient, true); return Plugin_Handled; } @@ -56,7 +56,7 @@ public Action ReloadVIPCfg_CMD(int iClient, int iArgs) CHECK_ACCESS(iClient) ReadConfigs(); - UTIL_ReloadVIPPlayers(iClient, false); + Clients_ReloadVipPlayers(iClient, false); UTIL_Reply(iClient, "%t", "VIP_CFG_REFRESHED"); return Plugin_Handled; @@ -189,14 +189,31 @@ public void SQL_Callback_OnSelectRemoveClient(Database hOwner, DBResultSet hResu if (hResult.FetchRow()) { - DBG_SQL_Response("hResult.FetchRow()") - int iAccountID = hResult.FetchInt(0); - DBG_SQL_Response("hResult.FetchInt(0) = %d", iAccountID) - char szName[MNL], szGroup[64]; + int iAccountID; + char szName[MNL*2], szGroup[64], szAdminInfo[128], szTargetInfo[128], szAuth[32]; + UTIL_GetClientInfo(iClient, SZF(szTargetInfo)); + FormatEx(SZF(szAdminInfo), "%T %s", "BY_ADMIN", LANG_SERVER, szTargetInfo); + + iAccountID = hResult.FetchInt(0); hResult.FetchString(1, SZF(szName)); hResult.FetchString(2, SZF(szGroup)); - DBG_SQL_Response("hResult.FetchString(1) = '%s", szName) - DB_RemoveClientFromID(iClient, _, iAccountID, true, szName, szGroup); + + DBG_SQL_Response("hResult.FetchInt(0) = %d", iAccountID) + DBG_SQL_Response("hResult.FetchString(1) = '%s'", szName) + DBG_SQL_Response("hResult.FetchString(2) = '%s'", szGroup) + + UTIL_GetSteamIDFromAccountID(iAccountID, SZF(szAuth)); + FormatEx(SZF(szTargetInfo), "%s (%s, unknown)", szName, szAuth); + + DB_RemoveVipPlayerByData( + iClient, + szAdminInfo, + 0, + iAccountID, + szTargetInfo, + szGroup, + true + ); } else { diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index 3b7a9ff..1dd368a 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -169,7 +169,7 @@ void LoadClient(int iClient, int iAccountID, const char[] szGroup, int iExpires) DebugMessage("Clients_LoadClient %N (%d):\tDelete", iClient, iClient) - DB_RemoveClientFromID(REASON_EXPIRED, iClient, iAccountID, false, _, szGroup); + Clients_RemoveVipPlayer(REASON_EXPIRED, iClient, iAccountID, true); } CallForward_OnVIPClientRemoved(iClient, "Expired"); @@ -564,7 +564,7 @@ void Clients_ExpiredClient(int iClient) { LogToFile(g_szLogFile, "%T", "REMOVING_PLAYER", LANG_SERVER, iClient); - DB_RemoveClientFromID(REASON_EXPIRED, iClient, _, false); + Clients_RemoveVipPlayer(REASON_EXPIRED, iClient, _, true); } } @@ -691,3 +691,102 @@ void Clients_OnVipPlayerAdded( LogToFile(g_szLogFile, "%T", "LOG_VIP_ADDED", LANG_SERVER, szTargetInfo, iTargetAccountID, szDuration, szExpires, szGroup, szAdminInfo); } + +void Clients_RemoveVipPlayer( + int iAdmin = 0, + int iTarget = 0, + int iTargetAccountID = 0, + bool bNotify, + const char[] szByWho = NULL_STRING +) +{ + DebugMessage("Clients_RemoveVipPlayer %d: - > iTargetAccountID: %d, : bNotify: %b", iTarget, iTargetAccountID, bNotify) + + if (iTarget) { + iTargetAccountID = GetSteamAccountID(iTarget); + } + + char szAdminInfo[PMP]; + switch(iAdmin) + { + case REASON_EXPIRED: + { + FormatEx(SZF(szAdminInfo), "%T", "REASON_EXPIRED", LANG_SERVER); + } + case REASON_OUTDATED: + { + FormatEx(SZF(szAdminInfo), "%T", "REASON_INACTIVITY", LANG_SERVER); + } + case OWNER_PLUGIN: + { + FormatEx(SZF(szAdminInfo), "%T %s", "BY_PLUGIN", LANG_SERVER, szByWho); + } + case OWNER_SERVER: + { + FormatEx(SZF(szAdminInfo), "%T", "BY_SERVER", LANG_SERVER); + } + default: + { + char szAdmin[128]; + UTIL_GetClientInfo(iAdmin, SZF(szAdmin)); + FormatEx(SZF(szAdminInfo), "%T %s", "BY_ADMIN", LANG_SERVER, szAdmin); + iAdmin = UID(iAdmin); + } + } + + DB_RemoveVipPlayer( + iAdmin, + szAdminInfo, + iTarget, + iTargetAccountID, + bNotify + ); +} + +void Clients_OnVipPlayerRemoved( + const int iAdmin, + const char[] szAdminInfo, + const int iTarget, + const int iTargetAccountID, + const char[] szTargetInfo, + const char[] szGroup, + const bool bNotify +) +{ + LogToFile(g_szLogFile, "%T", "LOG_VIP_DELETED", LANG_SERVER, szTargetInfo, iTargetAccountID, szGroup, szAdminInfo); + + if (iTarget) + { + Features_TurnOffAll(iTarget); + Clients_ResetClient(iTarget); + //CallForward_OnVIPClientRemoved(iTarget, "Removed by Admin", iClient); + // SET_BIT(g_iClientInfo[iTarget], IS_LOADED); + // DisplayClientInfo(iTarget, "expired_info"); + + if (bNotify) + { + // TODO: notify player + } + } + + if (iAdmin > 0) + { + ReplyToCommand(iAdmin, "%t", "ADMIN_VIP_PLAYER_DELETED", szTargetInfo, iTargetAccountID); + } +} + +void Clients_ReloadVipPlayers(int iClient, bool bNotify) +{ + for (int i = 1; i <= MaxClients; ++i) + { + if (IsClientInGame(i)) + { + Clients_CheckVipAccess(i, false, true); + } + } + + if (bNotify) + { + UTIL_Reply(iClient, "%t", "VIP_CACHE_REFRESHED"); + } +} diff --git a/addons/sourcemod/scripting/vip/Database.sp b/addons/sourcemod/scripting/vip/Database.sp index 99ea1c9..8f40404 100644 --- a/addons/sourcemod/scripting/vip/Database.sp +++ b/addons/sourcemod/scripting/vip/Database.sp @@ -33,7 +33,7 @@ void DB_Connect() } } -public void OnDBConnect(Database hDatabase, const char[] szError, any data) +public void OnDBConnect(Database hDatabase, const char[] szError, int data) { if (hDatabase == null || szError[0]) { @@ -143,7 +143,7 @@ public void SQL_Callback_TableCreate(Database hOwner, DBResultSet hResult, const OnReadyToStart(); - UTIL_ReloadVIPPlayers(0, false); + Clients_ReloadVipPlayers(0, false); if (g_CVAR_iDeleteExpired != -1 || g_CVAR_iOutdatedExpired != -1) { @@ -216,6 +216,332 @@ void DB_UpdateClient(int iClient, const char[] szDbName = NULL_STRING) g_hDatabase.Query(SQL_Callback_ErrorCheck, szQuery); } +public void SQL_Callback_SelectExpiredAndOutdated(Database hOwner, DBResultSet hResult, const char[] szError, int iReason) +{ + DBG_SQL_Response("SQL_Callback_SelectExpiredAndOutdated") + + if (szError[0]) + { + LogError("SQL_Callback_SelectExpiredAndOutdated: %s", szError); + return; + } + + DBG_SQL_Response("hResult.RowCount = %d", hResult.RowCount) + + if (hResult.RowCount) + { + int iAccountID; + char szName[MNL*2], szGroup[64], szAdminInfo[128], szTargetInfo[128], szAuth[32]; + FormatEx(SZF(szAdminInfo), "%T", "REASON_EXPIRED", LANG_SERVER); + while (hResult.FetchRow()) + { + DBG_SQL_Response("hResult.FetchRow()") + iAccountID = hResult.FetchInt(0); + hResult.FetchString(1, SZF(szName)); + hResult.FetchString(2, SZF(szGroup)); + + DBG_SQL_Response("hResult.FetchInt(0) = %d", iAccountID) + DBG_SQL_Response("hResult.FetchString(1) = '%s'", szName) + DBG_SQL_Response("hResult.FetchString(2) = '%s'", szGroup) + + UTIL_GetSteamIDFromAccountID(iAccountID, SZF(szAuth)); + FormatEx(SZF(szTargetInfo), "%s (%s, unknown)", szName, szAuth); + + DB_RemoveVipPlayerByData( + REASON_EXPIRED, + szAdminInfo, + 0, + iAccountID, + szTargetInfo, + szGroup, + true + ); + } + } +} + +void DB_AddVipPlayer( + const int iAdmin, + const char[] szAdminInfo, + const int iTarget, + const int iTargetAccountID, + const char[] szTargetInfo, + const int iDuration, + const int iExpires, + const char[] szGroup +) +{ + DataPack hDataPack = new DataPack(); + + // Admin + hDataPack.WriteCell(iAdmin); + hDataPack.WriteString(szAdminInfo); + + // Target + hDataPack.WriteCell(GET_UID(iTarget)); + hDataPack.WriteCell(iTargetAccountID); + hDataPack.WriteString(szTargetInfo); + + // Data + hDataPack.WriteCell(iDuration); + hDataPack.WriteCell(iExpires); + hDataPack.WriteString(szGroup); + + int iLastVisit = iTarget ? GetTime() : 0; + + char szQuery[512], szName[MNL*2+1]; + if (iTarget) + { + GetClientName(iTarget, SZF(szQuery)); + g_hDatabase.Escape(szQuery, SZF(szName)); + } + else + { + strcopy(SZF(szName), "unknown"); + } + + if (GLOBAL_INFO & IS_MySQL) + { + FormatEx(SZF(szQuery), "INSERT INTO `vip_users` (`account_id`, `sid`, `expires`, `group`, `name`, `lastvisit`) VALUES (%d, %d, %d, '%s', '%s', %d) \ + ON DUPLICATE KEY UPDATE `expires` = %d, `group` = '%s';", iTargetAccountID, g_CVAR_iServerID, iExpires, szGroup, szName, iLastVisit, iExpires, szGroup); + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_OnVIPClientAdded, szQuery, hDataPack); + + return; + } + + FormatEx(SZF(szQuery), "INSERT OR REPLACE INTO `vip_users` (`account_id`, `name`, `expires`, `group`, `lastvisit`) VALUES (%d, '%s', %d, '%s', %d);", iTargetAccountID, szName, iExpires, szGroup, iLastVisit); + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_OnVIPClientAdded, szQuery, hDataPack); +} + +public void SQL_Callback_OnVIPClientAdded(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hDataPack) +{ + DBG_SQL_Response("SQL_Callback_OnVIPClientAdded") + hDataPack.Reset(); + + // Admin + int iAdmin = GET_CID(hDataPack.ReadCell()); + + if (hResult == null || szError[0]) + { + delete hDataPack; + + if (iAdmin >= 0) + { + UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_FAILED"); + } + + LogError("SQL_Callback_OnVIPClientAdded: %s", szError); + return; + } + + DBG_SQL_Response("hResult.AffectedRows = %d", hResult.AffectedRows) + + if (!hResult.AffectedRows) + { + delete hDataPack; + + if (iAdmin >= 0) + { + UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_FAILED"); + } + return; + } + + int iTarget, iDuration, iExpires, iAccountID; + char szAdminInfo[PMP], szTargetInfo[PMP], szGroup[64]; + + hDataPack.ReadString(SZF(szAdminInfo)); + + // Target + iTarget = GET_CID(hDataPack.ReadCell()); + iAccountID = hDataPack.ReadCell(); + hDataPack.ReadString(SZF(szTargetInfo)); + + // Data + iDuration = hDataPack.ReadCell(); + iExpires = hDataPack.ReadCell(); + hDataPack.ReadString(SZF(szGroup)); + + delete hDataPack; + + Clients_OnVipPlayerAdded( + iAdmin, + szAdminInfo, + iTarget, + iAccountID, + szTargetInfo, + iDuration, + iExpires, + szGroup + ); +} + +void DB_RemoveVipPlayer( + const int iAdmin, + const char[] szAdminInfo, + const int iTarget, + const int iTargetAccountID, + const bool bNotify +) +{ + DataPack hDataPack = new DataPack(); + hDataPack.WriteCell(iAdmin); + hDataPack.WriteString(szAdminInfo); + hDataPack.WriteCell(GET_UID(iTarget)); + hDataPack.WriteCell(iTargetAccountID); + hDataPack.WriteCell(bNotify); + + char szQuery[512]; + FormatEx(SZF(szQuery), "SELECT `name`, `group` FROM `vip_users` WHERE `account_id` = %d%s;", iTargetAccountID, g_szSID); + + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_SelectForRemoveClient, szQuery, hDataPack); +} + +public void SQL_Callback_SelectForRemoveClient(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hDataPack) +{ + DBG_SQL_Response("SQL_Callback_SelectForRemoveClient") + + if (szError[0]) + { + delete hDataPack; + LogError("SQL_Callback_SelectForRemoveClient: %s", szError); + return; + } + + if (!hResult.FetchRow()) + { + delete hDataPack; + return; + } + + DBG_SQL_Response("hResult.FetchRow()") + hDataPack.Reset(); + + int iAdmin, iTarget, iTargetAccountID; + char szAdminInfo[128], szTargetInfo[128]; + + iAdmin = hDataPack.ReadCell(); + hDataPack.ReadString(SZF(szAdminInfo)); + iTarget = GET_CID(hDataPack.ReadCell()); + iTargetAccountID = hDataPack.ReadCell(); + bool bNotify = hDataPack.ReadCell(); + + char szGroup[64]; + hResult.FetchString(1, SZF(szGroup)); + + if (iTarget) + { + UTIL_GetClientInfo(iTarget, SZF(szTargetInfo)); + } + else + { + char szName[MAX_NAME_LENGTH*2+1], szAuth[32]; + UTIL_GetSteamIDFromAccountID(iTargetAccountID, SZF(szAuth)); + hResult.FetchString(0, SZF(szName)); + FormatEx(SZF(szTargetInfo), "%s (%s, unknown)", szName, szAuth); + } + + DB_RemoveVipPlayerByData( + iAdmin, + szAdminInfo, + iTarget, + iTargetAccountID, + szTargetInfo, + szGroup, + bNotify + ); +} + +void DB_RemoveVipPlayerByData( + const int iAdmin, + const char[] szAdminInfo, + const int iTarget, + const int iTargetAccountID, + const char[] szTargetInfo, + const char[] szGroup, + const bool bNotify +) +{ + DataPack hDataPack = new DataPack(); + + // Admin + hDataPack.WriteCell(iAdmin); + hDataPack.WriteString(szAdminInfo); + + // Target + hDataPack.WriteCell(GET_UID(iTarget)); + hDataPack.WriteCell(iTargetAccountID); + hDataPack.WriteString(szTargetInfo); + + // Data + hDataPack.WriteString(szGroup); + hDataPack.WriteCell(bNotify); + + char szQuery[256]; + FormatEx(SZF(szQuery), "DELETE FROM `vip_users` WHERE `account_id` = %d%s;", iTargetAccountID, g_szSID); + + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_RemoveClient, szQuery, hDataPack); +} + +public void SQL_Callback_RemoveClient(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hDataPack) +{ + DBG_SQL_Response("SQL_Callback_SelectRemoveClient") + + if (szError[0]) + { + delete hDataPack; + LogError("SQL_Callback_RemoveClient: %s", szError); + return; + } + + DBG_SQL_Response("hResult.AffectedRows = %d", hResult.AffectedRows) + + if (!hResult.AffectedRows) + { + delete hDataPack; + return; + } + hDataPack.Reset(); + + + int iAdmin, iTarget, iAccountID; + char szAdminInfo[PMP], szTargetInfo[PMP], szGroup[64]; + + // Admin + iAdmin = GET_CID(hDataPack.ReadCell()); + hDataPack.ReadString(SZF(szAdminInfo)); + + // Target + iTarget = GET_CID(hDataPack.ReadCell()); + iAccountID = hDataPack.ReadCell(); + hDataPack.ReadString(SZF(szTargetInfo)); + + // Data + hDataPack.ReadString(SZF(szGroup)); + bool bNotify = hDataPack.ReadCell(); + + delete hDataPack; + + if (!iTarget) + { + iTarget = UTIL_GetVipClientByAccountID(iAccountID); + } + + Clients_OnVipPlayerRemoved( + iAdmin, + szAdminInfo, + iTarget, + iAccountID, + szTargetInfo, + szGroup, + bNotify + ); +} +/** void DB_RemoveClientFromID(int iAdmin = 0, int iClient = 0, int iClientID = 0, @@ -300,41 +626,41 @@ void DB_RemoveClientFromID(int iAdmin = 0, g_hDatabase.Query(SQL_Callback_SelectRemoveClient, szQuery, hDataPack); } -public void SQL_Callback_SelectRemoveClient(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hPack) +public void SQL_Callback_SelectRemoveClient(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hDataPack) { DBG_SQL_Response("SQL_Callback_SelectRemoveClient") if (szError[0]) { - delete hPack; + delete hDataPack; LogError("SQL_Callback_SelectRemoveClient: %s", szError); return; } if (!hResult.FetchRow()) { - delete hPack; + delete hDataPack; return; } DBG_SQL_Response("hResult.FetchRow()") - hPack.Reset(); - int iClientID = hPack.ReadCell(); - hPack.ReadCell(); - hPack.ReadCell(); + hDataPack.Reset(); + int iClientID = hDataPack.ReadCell(); + hDataPack.ReadCell(); + hDataPack.ReadCell(); char szName[MAX_NAME_LENGTH*2+1]; - hPack.ReadString(SZF(szName)); + hDataPack.ReadString(SZF(szName)); hResult.FetchString(0, SZF(szName)); DBG_SQL_Response("hResult.FetchString(0) = '%s", szName) - hPack.WriteString(szName); + hDataPack.WriteString(szName); hResult.FetchString(1, SZF(szName)); DBG_SQL_Response("hResult.FetchString(1) = '%s", szName) - hPack.WriteString(szName); + hDataPack.WriteString(szName); - DB_RemoveClient(hPack, iClientID); + DB_RemoveClient(hDataPack, iClientID); } -void DB_RemoveClient(DataPack hDataPack, int iClientID) +void DB_RemoveClient(int iClientID, DataPack hDataPack) { char szQuery[256]; FormatEx(SZF(szQuery), "DELETE FROM `vip_users` WHERE `account_id` = %d%s;", iClientID, g_szSID); @@ -343,195 +669,42 @@ void DB_RemoveClient(DataPack hDataPack, int iClientID) g_hDatabase.Query(SQL_Callback_RemoveClient, szQuery, hDataPack); } -public void SQL_Callback_RemoveClient(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hPack) +public void SQL_Callback_RemoveClient(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hDataPack) { DBG_SQL_Response("SQL_Callback_SelectRemoveClient") if (szError[0]) { - delete hPack; + delete hDataPack; LogError("SQL_Callback_RemoveClient: %s", szError); return; } DBG_SQL_Response("hResult.AffectedRows = %d", hResult.AffectedRows) - if (!hResult.AffectedRows) - { - delete hPack; - return; - } - hPack.Reset(); - - int iClientID = hPack.ReadCell(); - int iAdmin = GET_CID(hPack.ReadCell()); - bool bNotify = view_as(hPack.ReadCell()); - char szAdmin[128], szName[MNL], szGroup[64]; - hPack.ReadString(SZF(szAdmin)); - hPack.ReadString(SZF(szName)); - hPack.ReadString(SZF(szGroup)); - delete hPack; - - if (iAdmin == -1) - { - return; - } - - LogToFile(g_szLogFile, "%T", "LOG_VIP_DELETED", LANG_SERVER, szName, iClientID, szGroup, szAdmin); - - if (bNotify && iAdmin > 0) - { - ReplyToCommand(iAdmin, "%t", "ADMIN_VIP_PLAYER_DELETED", szName, iClientID); - } -} - -public void SQL_Callback_SelectExpiredAndOutdated(Database hOwner, DBResultSet hResult, const char[] szError, int iReason) -{ - DBG_SQL_Response("SQL_Callback_SelectExpiredAndOutdated") - - if (szError[0]) - { - LogError("SQL_Callback_SelectExpiredAndOutdated: %s", szError); - return; - } - - DBG_SQL_Response("hResult.RowCount = %d", hResult.RowCount) - - if (hResult.RowCount) - { - int iClientID; - char szName[MNL*2], szGroup[64]; - while (hResult.FetchRow()) - { - DBG_SQL_Response("hResult.FetchRow()") - iClientID = hResult.FetchInt(0); - DBG_SQL_Response("hResult.FetchInt(0) = %d", iClientID) - hResult.FetchString(1, SZF(szName)); - DBG_SQL_Response("hResult.FetchString(1) = '%s'", szName) - hResult.FetchString(2, SZF(szGroup)); - DBG_SQL_Response("hResult.FetchString(2) = '%s'", szGroup) - DB_RemoveClientFromID(iReason, _, iClientID, false, szName, szGroup); - } - } -} - -void DB_AddVipPlayer( - const int iAdmin, - const char[] szAdminInfo, - const int iTarget, - const int iTargetAccountID, - const char[] szTargetInfo, - const int iDuration, - const int iExpires, - const char[] szGroup -) -{ - DataPack hDataPack = new DataPack(); - - // Admin - hDataPack.WriteCell(iAdmin); - hDataPack.WriteString(szAdminInfo); - - // Target - hDataPack.WriteCell(GET_UID(iTarget)); - hDataPack.WriteCell(iTargetAccountID); - hDataPack.WriteString(szTargetInfo); - - // Data - hDataPack.WriteCell(iDuration); - hDataPack.WriteCell(iExpires); - hDataPack.WriteString(szGroup); - - int iLastVisit = iTarget ? GetTime() : 0; - - char szQuery[512], szName[MNL*2+1]; - if (iTarget) - { - GetClientName(iTarget, SZF(szQuery)); - g_hDatabase.Escape(szQuery, SZF(szName)); - } - else - { - strcopy(SZF(szName), "unknown"); - } - - if (GLOBAL_INFO & IS_MySQL) - { - FormatEx(SZF(szQuery), "INSERT INTO `vip_users` (`account_id`, `sid`, `expires`, `group`, `name`, `lastvisit`) VALUES (%d, %d, %d, '%s', '%s', %d) \ - ON DUPLICATE KEY UPDATE `expires` = %d, `group` = '%s';", iTargetAccountID, g_CVAR_iServerID, iExpires, szGroup, szName, iLastVisit, iExpires, szGroup); - DBG_SQL_Query(szQuery) - g_hDatabase.Query(SQL_Callback_OnVIPClientAdded, szQuery, hDataPack); - - return; - } - - FormatEx(SZF(szQuery), "INSERT OR REPLACE INTO `vip_users` (`account_id`, `name`, `expires`, `group`, `lastvisit`) VALUES (%d, '%s', %d, '%s', %d);", iTargetAccountID, szName, iExpires, szGroup, iLastVisit); - DBG_SQL_Query(szQuery) - g_hDatabase.Query(SQL_Callback_OnVIPClientAdded, szQuery, hDataPack); -} - -public void SQL_Callback_OnVIPClientAdded(Database hOwner, DBResultSet hResult, const char[] szError, any hPack) -{ - DBG_SQL_Response("SQL_Callback_OnVIPClientAdded") - DataPack hDataPack = view_as(hPack); - hDataPack.Reset(); - - // Admin - int iAdmin = GET_CID(hDataPack.ReadCell()); - - if (hResult == null || szError[0]) - { - delete hDataPack; - - if (iAdmin >= 0) - { - UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_FAILED"); - } - - LogError("SQL_Callback_OnVIPClientAdded: %s", szError); - return; - } - - DBG_SQL_Response("hResult.AffectedRows = %d", hResult.AffectedRows) - if (!hResult.AffectedRows) { delete hDataPack; - - if (iAdmin >= 0) - { - UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_FAILED"); - } return; } - - int iTarget, iDuration, iExpires, iAccountID; - char szAdminInfo[PMP], szTargetInfo[PMP], szGroup[64]; - - hDataPack.ReadString(SZF(szAdminInfo)); + hDataPack.Reset(); - // Target - iTarget = GET_CID(hDataPack.ReadCell()); - iAccountID = hDataPack.ReadCell(); - hDataPack.ReadString(SZF(szTargetInfo)); - - // Data - iDuration = hDataPack.ReadCell(); - iExpires = hDataPack.ReadCell(); + int iClientID = hDataPack.ReadCell(); + int iAdmin = GET_CID(hDataPack.ReadCell()); + bool bNotify = view_as(hDataPack.ReadCell()); + char szAdmin[128], szName[MNL], szGroup[64]; + hDataPack.ReadString(SZF(szAdmin)); + hDataPack.ReadString(SZF(szName)); hDataPack.ReadString(SZF(szGroup)); - delete hDataPack; - - Clients_OnVipPlayerAdded( + Clients_OnVipPlayerRemoved( iAdmin, szAdminInfo, iTarget, - iAccountID, + iTargetAccountID, szTargetInfo, - iDuration, - iExpires, szGroup ); } - +*/ \ No newline at end of file diff --git a/addons/sourcemod/scripting/vip/Features.sp b/addons/sourcemod/scripting/vip/Features.sp index 69218c0..419c6be 100644 --- a/addons/sourcemod/scripting/vip/Features.sp +++ b/addons/sourcemod/scripting/vip/Features.sp @@ -127,9 +127,12 @@ void Features_GetStorageKeyName(const char[] szFeature, char[] szValue, int iMax #endif #if USE_CLIENTPREFS 1 -void Features_GetValueFromStorage(int iClient, const char[] szFeature, ArrayList hArray, char[] szValue, int iMaxLength) +void Features_GetValueFromStorage(int iClient, const char[] szFeature, char[] szValue, int iMaxLength) { DBG_FEATURES("Features_GetValueFromStorage %N (%d): '%s'", iClient, iClient, szFeature) + + ArrayList hArray; + GetTrieValue(GLOBAL_TRIE, szFeature, hArray); Handle hCookie = view_as(hArray.Get(FEATURES_COOKIE)); GetClientCookie(iClient, hCookie, szValue, iMaxLength); @@ -141,21 +144,23 @@ void Features_GetValueFromStorage(int iClient, const char[] szFeature, char[] sz char szKey[128]; Features_GetStorageKeyName(szFeature, SZF(szKey)); Storage_GetClientValue(iClient, szKey, szValue, iMaxLength); - } #endif #if USE_CLIENTPREFS 1 -void Features_SetValueToStorage(int iClient, const char[] szFeature, ArrayList hArray, const char[] szValue) +void Features_SetValueToStorage(int iClient, const char[] szFeature, const char[] szValue) { DBG_FEATURES("Features_SetValueToStorage %N (%d): '%s' -> '%s'", iClient, iClient, szFeature, szValue) - - SetClientCookie(iClient, szValue); + + ArrayList hArray; + GetTrieValue(GLOBAL_TRIE, szFeature, hArray); + Handle hCookie = view_as(hArray.Get(FEATURES_COOKIE)); + SetClientCookie(iClient, hCookie, szValue); } #else void Features_SetValueToStorage(int iClient, const char[] szFeature, const char[] szValue) { - DBG_FEATURES("Features_SetValueToStorage %N (%d): '%s' -> '%s'", iClient, iClient, szFeature, szValue) + DBG_FEATURES("Features_SetValueToStorage %L: '%s' -> '%s'", iClient, szFeature, szValue) char szKey[128]; Features_GetStorageKeyName(szFeature, SZF(szKey)); Storage_SetClientValue(iClient, szKey, szValue); @@ -163,28 +168,20 @@ void Features_SetValueToStorage(int iClient, const char[] szFeature, const char[ #endif -void Features_SetStatusToStorage(int iClient, const char[] szFeature, ArrayList hArray, VIP_ToggleState eStatus) +void Features_SetStatusToStorage(int iClient, const char[] szFeature, VIP_ToggleState eStatus) { - DBG_FEATURES("Features_SetStatusToStorage %N (%d): '%s' -> %d", iClient, iClient, szFeature, eStatus) + DBG_FEATURES("Features_SetStatusToStorage %L: '%s' -> %d", iClient, szFeature, eStatus) char szValue[4]; IntToString(view_as(eStatus), SZF(szValue)); - #if USE_CLIENTPREFS 1 - Features_SetValueToStorage(iClient, szFeature, hArray, szValue); - #else Features_SetValueToStorage(iClient, szFeature, szValue); - #endif } VIP_ToggleState Features_GetStatusFromStorage(int iClient, const char[] szFeature, ArrayList hArray) { char szValue[4]; - #if USE_CLIENTPREFS 1 - Features_GetValueFromStorage(iClient, szFeature, hArray, SZF(szValue)); - #else Features_GetValueFromStorage(iClient, szFeature, SZF(szValue)); - #endif - DBG_FEATURES("Features_GetStatusFromStorage %N (%d): '%s' -> '%s'", iClient, iClient, szFeature, szValue) + DBG_FEATURES("Features_GetStatusFromStorage %L: '%s' -> '%s'", iClient, szFeature, szValue) VIP_ToggleState eStatus = view_as(StringToInt(szValue)); if (szValue[0] == '\0' || (view_as(eStatus) > 2 || view_as(eStatus) < 0)) { @@ -195,7 +192,7 @@ VIP_ToggleState Features_GetStatusFromStorage(int iClient, const char[] szFeatur case DISABLED: eStatus = DISABLED; } } - DBG_FEATURES("Features_GetStatusFromStorage %N (%d): '%s' -> %d", iClient, iClient, szFeature, eStatus) + DBG_FEATURES("Features_GetStatusFromStorage %L: '%s' -> %d", iClient, szFeature, eStatus) return eStatus; } diff --git a/addons/sourcemod/scripting/vip/Global.sp b/addons/sourcemod/scripting/vip/Global.sp index f0435b2..dd00542 100644 --- a/addons/sourcemod/scripting/vip/Global.sp +++ b/addons/sourcemod/scripting/vip/Global.sp @@ -34,6 +34,7 @@ #define IS_MySQL (1<<1) #define IS_LOADING (1<<2) +#define REASON_SERVER 0 #define REASON_PLUGIN -1 #define REASON_EXPIRED -2 #define REASON_OUTDATED -3 diff --git a/addons/sourcemod/scripting/vip/UTIL.sp b/addons/sourcemod/scripting/vip/UTIL.sp index 87bddcf..8ba9f74 100644 --- a/addons/sourcemod/scripting/vip/UTIL.sp +++ b/addons/sourcemod/scripting/vip/UTIL.sp @@ -235,22 +235,6 @@ void UTIL_GetClientInfo(int iClient, char[] szBuffer, int iMaxLen) FormatEx(szBuffer, iMaxLen, "%s (%s, %s)", szName, szAuth, szIP); } -void UTIL_ReloadVIPPlayers(int iClient, bool bNotify) -{ - for (int i = 1; i <= MaxClients; ++i) - { - if (IsClientInGame(i)) - { - Clients_CheckVipAccess(i, false, true); - } - } - - if (bNotify) - { - UTIL_Reply(iClient, "%t", "VIP_CACHE_REFRESHED"); - } -} - void UTIL_Reply(int iClient, const char[] szMsg, any ...) { if(iClient < 0) @@ -271,3 +255,13 @@ void UTIL_Reply(int iClient, const char[] szMsg, any ...) PrintToServer(szMessage); } } + +int UTIL_GetVipClientByAccountID(int iAccountID) +{ + int iClientID; + for (int i = 1; i <= MaxClients; ++i) + { + if (IsClientInGame(i) && g_hFeatures[i] != null && g_hFeatures[i].GetValue(KEY_CID, iClientID) && iClientID == iAccountID) return i; + } + return 0; +} diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index d70c237..af82028 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -268,7 +268,7 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti if (eNewStatus != eOldStatus) { Features_SetStatus(iClient, szFeature, eNewStatus); - Features_SetStatusToStorage(iClient, szFeature, hBuffer, eNewStatus); + Features_SetStatusToStorage(iClient, szFeature, eNewStatus); } } diff --git a/addons/sourcemod/scripting/vip/adminmenu/Del.sp b/addons/sourcemod/scripting/vip/adminmenu/Del.sp index d3aff90..bfa89f4 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/Del.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/Del.sp @@ -1,4 +1,4 @@ -void ShowDeleteVipPlayerMenu(int iClient) +void ShowConfirmDeleteVipPlayerMenu(int iClient) { char szBuffer[128]; @@ -39,31 +39,12 @@ public int MenuHandler_DeleteVipPlayerMenu(Menu hMenu, MenuAction action, int iC if (g_hClientData[iClient].GetValue(DATA_KEY_TargetUID, iTarget)) { iTarget = CID(iTarget); - if (!iTarget && iTargetID != -1) - { - iTarget = GetClientByID(iTargetID); - } - - if (iTarget) - { - DB_RemoveClientFromID(iClient, iTarget, _, true); - Features_TurnOffAll(iTarget); - Clients_ResetClient(iTarget); - SET_BIT(g_iClientInfo[iTarget], IS_LOADED); - CallForward_OnVIPClientRemoved(iTarget, "Removed by Admin", iClient); - DisplayClientInfo(iTarget, "expired_info"); - BackToAdminMenu(iClient); - return 0; - } } - - if (iTargetID != -1) + if (iTarget) { - char szGroup[64], szName[MAX_NAME_LENGTH]; - g_hClientData[iClient].GetString(DATA_KEY_Name, SZF(szName)); - g_hClientData[iClient].GetString(DATA_KEY_Group, SZF(szGroup)); - DB_RemoveClientFromID(iClient, _, iTargetID, true, szName, szGroup); + CallForward_OnVIPClientRemoved(iTarget, "Removed by Admin", iClient); } + Clients_RemoveVipPlayer(iClient, iTarget, iTargetID, true); BackToAdminMenu(iClient); } diff --git a/addons/sourcemod/scripting/vip/adminmenu/List.sp b/addons/sourcemod/scripting/vip/adminmenu/List.sp index cc76af7..1011c5c 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/List.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/List.sp @@ -288,7 +288,7 @@ public void SQL_Callback_SelectVipPlayers(Database hOwner, DBResultSet hResult, DBG_SQL_Response("hResult.FetchInt(0) = %d", iClientID) DBG_SQL_Response("hResult.FetchString(1) = '%s", szName) - if (GetClientByID(iClientID)) + if (UTIL_GetVipClientByAccountID(iClientID)) { Format(SZF(szName), "• %s", szName); } @@ -478,7 +478,7 @@ public int MenuHandler_VipClientInfoMenu(Menu hMenu, MenuAction action, int iCli { switch (Item) { - case 0: ShowDeleteVipPlayerMenu(iClient); + case 0: ShowConfirmDeleteVipPlayerMenu(iClient); case 1: ShowEditTimeMenu(iClient); case 2: { diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index 64da0a3..9727334 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -360,7 +360,6 @@ "ru" "VIP-игрок {1} (ID: {2}) успешно удален" "ua" "VIP-гравець {1} (ID: {2}) успішно видалений" } - "LOG_VIP_DELETED" { "#format" "{1:s},{2:d},{3:s},{4:s}" From e37defbb75a3c4f45716c12077ea2d94a5347701 Mon Sep 17 00:00:00 2001 From: vandrienko Date: Wed, 6 Oct 2021 01:38:40 +0300 Subject: [PATCH 65/99] fix admin messages --- addons/sourcemod/scripting/vip/Clients.sp | 5 ++- addons/sourcemod/scripting/vip/Database.sp | 8 ++--- addons/sourcemod/scripting/vip/UTIL.sp | 2 +- .../sourcemod/scripting/vip/adminmenu/Del.sp | 2 ++ .../translations/vip_core.phrases.txt | 32 +++++++++---------- 5 files changed, 25 insertions(+), 24 deletions(-) diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index 1dd368a..fc21c25 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -676,7 +676,7 @@ void Clients_OnVipPlayerAdded( FormatEx(SZF(szDuration), "%T", "PERMANENT", iAdmin); FormatEx(SZF(szExpires), "%T", "NEVER", iAdmin); } - UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_SUCCESS", szTargetInfo, iTargetAccountID); + UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_SUCCESS", szTargetInfo, szGroup); } if (iDuration) @@ -730,7 +730,6 @@ void Clients_RemoveVipPlayer( char szAdmin[128]; UTIL_GetClientInfo(iAdmin, SZF(szAdmin)); FormatEx(SZF(szAdminInfo), "%T %s", "BY_ADMIN", LANG_SERVER, szAdmin); - iAdmin = UID(iAdmin); } } @@ -771,7 +770,7 @@ void Clients_OnVipPlayerRemoved( if (iAdmin > 0) { - ReplyToCommand(iAdmin, "%t", "ADMIN_VIP_PLAYER_DELETED", szTargetInfo, iTargetAccountID); + UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_PLAYER_DELETED", szTargetInfo, szGroup); } } diff --git a/addons/sourcemod/scripting/vip/Database.sp b/addons/sourcemod/scripting/vip/Database.sp index 8f40404..51bf382 100644 --- a/addons/sourcemod/scripting/vip/Database.sp +++ b/addons/sourcemod/scripting/vip/Database.sp @@ -387,7 +387,7 @@ void DB_RemoveVipPlayer( ) { DataPack hDataPack = new DataPack(); - hDataPack.WriteCell(iAdmin); + hDataPack.WriteCell(GET_UID(iAdmin)); hDataPack.WriteString(szAdminInfo); hDataPack.WriteCell(GET_UID(iTarget)); hDataPack.WriteCell(iTargetAccountID); @@ -423,7 +423,7 @@ public void SQL_Callback_SelectForRemoveClient(Database hOwner, DBResultSet hRes int iAdmin, iTarget, iTargetAccountID; char szAdminInfo[128], szTargetInfo[128]; - iAdmin = hDataPack.ReadCell(); + iAdmin = GET_CID(hDataPack.ReadCell()); hDataPack.ReadString(SZF(szAdminInfo)); iTarget = GET_CID(hDataPack.ReadCell()); iTargetAccountID = hDataPack.ReadCell(); @@ -468,7 +468,7 @@ void DB_RemoveVipPlayerByData( DataPack hDataPack = new DataPack(); // Admin - hDataPack.WriteCell(iAdmin); + hDataPack.WriteCell(GET_UID(iAdmin)); hDataPack.WriteString(szAdminInfo); // Target @@ -514,7 +514,7 @@ public void SQL_Callback_RemoveClient(Database hOwner, DBResultSet hResult, cons // Admin iAdmin = GET_CID(hDataPack.ReadCell()); hDataPack.ReadString(SZF(szAdminInfo)); - + // Target iTarget = GET_CID(hDataPack.ReadCell()); iAccountID = hDataPack.ReadCell(); diff --git a/addons/sourcemod/scripting/vip/UTIL.sp b/addons/sourcemod/scripting/vip/UTIL.sp index 8ba9f74..0b182d7 100644 --- a/addons/sourcemod/scripting/vip/UTIL.sp +++ b/addons/sourcemod/scripting/vip/UTIL.sp @@ -232,7 +232,7 @@ void UTIL_GetClientInfo(int iClient, char[] szBuffer, int iMaxLen) GetClientAuthId(iClient, AuthId_Engine, SZF(szAuth)); GetClientIP(iClient, SZF(szIP)); - FormatEx(szBuffer, iMaxLen, "%s (%s, %s)", szName, szAuth, szIP); + FormatEx(szBuffer, iMaxLen, "%s <%s, %s>", szName, szAuth, szIP); } void UTIL_Reply(int iClient, const char[] szMsg, any ...) diff --git a/addons/sourcemod/scripting/vip/adminmenu/Del.sp b/addons/sourcemod/scripting/vip/adminmenu/Del.sp index bfa89f4..f0f8582 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/Del.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/Del.sp @@ -13,6 +13,8 @@ void ShowConfirmDeleteVipPlayerMenu(int iClient) hMenu.AddItem(NULL_STRING, szBuffer); ReductionMenu(hMenu, 4); + + // TODO: add back button hMenu.Display(iClient, MENU_TIME_FOREVER); } diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index 9727334..848c1f3 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -134,14 +134,14 @@ } "ADMIN_VIP_ADD_SUCCESS" { - "#format" "{1:s},{2:d}" - "en" "VIP-player {1} ({2}, ID: {3}) successfully added!" - "fi" "VIP-Pelaaja {1} ({2}, ID: {3}) onnistuneesti lisätty!" - "de" "VIP-Spieler {1} ({2}, ID: {3}) erfolgreich hinzugefügt!" - "pt" "VIP adicionado {1} ({2}, ID: {3}) com sucesso!" - "pt_p" "VIP adicionado {1} ({2}, ID: {3}) com sucesso!" - "ru" "{DEFAULT}VIP-Игрок {GREEN}{1} {DEFAULT}(ID: {GREEN}{2}{DEFAULT}) успешно добавлен!" - "ua" "{DEFAULT}VIP-Гравець {GREEN}{1} {DEFAULT}(ID: {GREEN}{2}{DEFAULT}) успішно доданий!" + "#format" "{1:s},{2:s}" + "en" "{DEFAULT}VIP-player {GREEN}{1} {DEFAULT}({GREEN}{2}{DEFAULT}) successfully added!" + "fi" "{DEFAULT}VIP-Pelaaja {GREEN}{1} {DEFAULT}({GREEN}{2}{DEFAULT}) onnistuneesti lisätty!" + "de" "{DEFAULT}VIP-Spieler {GREEN}{1} {DEFAULT}({GREEN}{2}{DEFAULT}) erfolgreich hinzugefügt!" + "pt" "{DEFAULT}VIP adicionado {GREEN}{1} {DEFAULT}({GREEN}{2}{DEFAULT}) com sucesso!" + "pt_p" "{DEFAULT}VIP adicionado {GREEN}{1} {DEFAULT}({GREEN}{2}{DEFAULT}) com sucesso!" + "ru" "{DEFAULT}VIP-Игрок {GREEN}{1} {DEFAULT}({GREEN}{2}{DEFAULT}) успешно добавлен!" + "ua" "{DEFAULT}VIP-Гравець {GREEN}{1} {DEFAULT}({GREEN}{2}{DEFAULT}) успішно доданий!" } "LOG_VIP_ADDED" @@ -351,14 +351,14 @@ } "ADMIN_VIP_PLAYER_DELETED" { - "#format" "{1:s},{2:i}" - "en" "VIP-player {1} (ID: {2}) was successfully removed" - "fi" "VIP-Pelaaja {1} (ID: {2}) on onnistuneesti poistettu" - "de" "VIP-Spieler {1} (ID: {2}) wurde erfolgreich gelöscht" - "pt" "VIP do player {1} (ID: {2}) foi removido com sucesso" - "pt_p" "O VIP do jogador {1} (ID: {2}) foi removido com sucesso" - "ru" "VIP-игрок {1} (ID: {2}) успешно удален" - "ua" "VIP-гравець {1} (ID: {2}) успішно видалений" + "#format" "{1:s},{2:s}" + "en" "{DEFAULT}VIP-player {GREEN}{1} {DEFAULT}({GREEN}{2}{DEFAULT}) was successfully removed" + "fi" "{DEFAULT}VIP-Pelaaja {GREEN}{1} {DEFAULT}({GREEN}{2}{DEFAULT}) on onnistuneesti poistettu" + "de" "{DEFAULT}VIP-Spieler {GREEN}{1} {DEFAULT}({GREEN}{2}{DEFAULT}) wurde erfolgreich gelöscht" + "pt" "{DEFAULT}VIP do player {GREEN}{1} {DEFAULT}({GREEN}{2}{DEFAULT}) foi removido com sucesso" + "pt_p" "{DEFAULT}O VIP do jogador {GREEN}{1} {DEFAULT}({GREEN}{2}{DEFAULT}) foi removido com sucesso" + "ru" "{DEFAULT}VIP-игрок {GREEN}{1} {DEFAULT}({GREEN}{2}{DEFAULT}) успешно удален" + "ua" "{DEFAULT}VIP-гравець {GREEN}{1} {DEFAULT}({GREEN}{2}{DEFAULT}) успішно видалений" } "LOG_VIP_DELETED" { From 31853409210ef021029f14ab6e4617e3a6ef7091 Mon Sep 17 00:00:00 2001 From: vandrienko Date: Sat, 30 Oct 2021 22:21:23 +0300 Subject: [PATCH 66/99] remake call forwards & fix load features --- addons/sourcemod/scripting/VIP_Core.sp | 17 +++ addons/sourcemod/scripting/vip/API.sp | 10 +- addons/sourcemod/scripting/vip/AdminMenu.sp | 6 +- addons/sourcemod/scripting/vip/CMD.sp | 2 +- addons/sourcemod/scripting/vip/Clients.sp | 115 +++++++++++--------- addons/sourcemod/scripting/vip/Configs.sp | 11 -- addons/sourcemod/scripting/vip/Database.sp | 13 ++- addons/sourcemod/scripting/vip/Debugger.sp | 15 ++- addons/sourcemod/scripting/vip/Storage.sp | 1 + 9 files changed, 111 insertions(+), 79 deletions(-) diff --git a/addons/sourcemod/scripting/VIP_Core.sp b/addons/sourcemod/scripting/VIP_Core.sp index 18904a8..89d6c1b 100644 --- a/addons/sourcemod/scripting/VIP_Core.sp +++ b/addons/sourcemod/scripting/VIP_Core.sp @@ -153,3 +153,20 @@ public Action OnClientSayCommand(int iClient, const char[] szCommand, const char return Plugin_Continue; } #endif + +public void OnMapStart() +{ + LoadSounds(); + ReadDownloads(); +} + +public void OnConfigsExecuted() +{ + DebugMessage("OnConfigsExecuted: %x", g_hDatabase) + CMD_Register(); + + if (g_hDatabase && (GLOBAL_INFO & IS_STARTED)) + { + RemoveExpAndOutPlayers(); + } +} diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index e93afe5..4df169b 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -608,6 +608,7 @@ int API_GiveClientVIP(Handle hPlugin, if (iClientID == -1 && bAddToDB) { Clients_ResetClient(iClient); + SET_BIT(g_iClientInfo[iClient], IS_LOADED); CallForward_OnVIPClientRemoved(iClient, "Removed for VIP-status change", iAdmin); } @@ -637,7 +638,7 @@ int API_GiveClientVIP(Handle hPlugin, Clients_InitVIPClient(iClient, -1, szGroup, iExpires); - Clients_LoadFeatures(iClient); + Clients_TryLoadFeatures(iClient); DisplayClientInfo(iClient, iTime == 0 ? "connect_info_perm":"connect_info_time"); @@ -690,16 +691,17 @@ int API_RemoveClientVIP(Handle hPlugin, int iClientID; if (g_hFeatures[iClient].GetValue(KEY_CID, iClientID) && iClientID != -1) { - Clients_RemoveVipPlayer(OWNER_PLUGIN, iClient, _, true, szPluginName); + Clients_RemoveVipPlayer(OWNER_PLUGIN, iClient, iClientID, bNotify, szPluginName); + return 1; } } - + + // TODO: remake this if (g_iClientInfo[iClient] & IS_MENU_OPEN) { CancelClientMenu(iClient); } - Features_TurnOffAll(iClient); Clients_ResetClient(iClient); SET_BIT(g_iClientInfo[iClient], IS_LOADED); diff --git a/addons/sourcemod/scripting/vip/AdminMenu.sp b/addons/sourcemod/scripting/vip/AdminMenu.sp index 1ffd33a..90e71d6 100644 --- a/addons/sourcemod/scripting/vip/AdminMenu.sp +++ b/addons/sourcemod/scripting/vip/AdminMenu.sp @@ -539,9 +539,9 @@ public int MenuHandler_GroupsList(Menu hMenu, MenuAction action, int iClient, in if (iTarget) { - Clients_ResetClient(iTarget); - SET_BIT(g_iClientInfo[iTarget], IS_LOADED); - CallForward_OnVIPClientRemoved(iTarget, "VIP-Group Changed", iClient); + //Clients_ResetClient(iTarget); + //SET_BIT(g_iClientInfo[iTarget], IS_LOADED); + //CallForward_OnVIPClientRemoved(iTarget, "VIP-Group Changed", iClient); Clients_CheckVipAccess(iTarget, false); } diff --git a/addons/sourcemod/scripting/vip/CMD.sp b/addons/sourcemod/scripting/vip/CMD.sp index ab8e10e..7beb414 100644 --- a/addons/sourcemod/scripting/vip/CMD.sp +++ b/addons/sourcemod/scripting/vip/CMD.sp @@ -10,7 +10,7 @@ void CMD_Setup() #endif } -public void OnConfigsExecuted() +public void CMD_Register() { static bool bIsRegistered; if (bIsRegistered == false) diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index fc21c25..a276e74 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -10,7 +10,7 @@ void Clients_ResetClient(int iClient) public void OnClientPutInServer(int iClient) { // g_iClientInfo[iClient] = 0; - DebugMessage("OnClientPutInServer %N (%d): %b", iClient, iClient, g_iClientInfo[iClient]) + DBG_CLIENTS("OnClientPutInServer %N (%d): %b", iClient, iClient, g_iClientInfo[iClient]) if (IsFakeClient(iClient) || IsClientSourceTV(iClient)) { @@ -55,11 +55,11 @@ void Clients_CheckVipAccess(int iClient, bool bNotify = false, bool bForward = f if (IsFakeClient(iClient) == false && (GLOBAL_INFO & IS_STARTED) && g_hDatabase) { Clients_LoadClient(iClient, bNotify); - // DebugMessage("Clients_CheckVipAccess %N:\tИгрок %sявляется VIP игроком", iClient, g_bIsClientVIP[iClient] ? "":"не ") + // DBG_CLIENTS("Clients_CheckVipAccess %N:\tИгрок %sявляется VIP игроком", iClient, g_bIsClientVIP[iClient] ? "":"не ") } else { - g_iClientInfo[iClient] |= IS_LOADED; + SET_BIT(g_iClientInfo[iClient], IS_LOADED); CallForward_OnClientLoaded(iClient); } } @@ -70,7 +70,7 @@ void Clients_LoadClient(int iClient, bool bNotify) int iAccountID = GetSteamAccountID(iClient); - DebugMessage("Clients_LoadClient %N (%d), %b: - > %x, %u", iClient, iClient, g_iClientInfo[iClient], g_hDatabase, g_hDatabase) + DBG_CLIENTS("Clients_LoadClient %N (%d), %b: - > %x, %u", iClient, iClient, g_iClientInfo[iClient], g_hDatabase, g_hDatabase) FormatEx(SZF(szQuery), "SELECT `expires`, `group`, `name` \ FROM `vip_users` \ @@ -104,7 +104,7 @@ public void SQL_Callback_OnClientAuthorized(Database hOwner, DBResultSet hResult bool bNotify = view_as(hDataPack.ReadCell()); delete hDataPack; - DebugMessage("SQL_Callback_OnClientAuthorized: %d", iClient) + DBG_CLIENTS("SQL_Callback_OnClientAuthorized: %d", iClient) if (!iClient || !IsClientInGame(iClient)) { return; @@ -151,6 +151,7 @@ public void SQL_Callback_OnClientAuthorized(Database hOwner, DBResultSet hResult void LoadClient(int iClient, int iAccountID, const char[] szGroup, int iExpires) { + DBG_CLIENTS("LoadClient: %d, %d, %s, %d", iClient, iAccountID, szGroup, iExpires) if (!szGroup[0] || !UTIL_CheckValidVIPGroup(szGroup)) { LogError("Invalid VIP-Group/Некорректная VIP-группа: %s (Игрок: %d)", szGroup, iAccountID); @@ -167,7 +168,7 @@ void LoadClient(int iClient, int iAccountID, const char[] szGroup, int iExpires) { LogToFile(g_szLogFile, "%T", "REMOVING_PLAYER", LANG_SERVER, iClient); - DebugMessage("Clients_LoadClient %N (%d):\tDelete", iClient, iClient) + DBG_CLIENTS("Clients_LoadClient %N (%d): >>> Delete", iClient, iClient) Clients_RemoveVipPlayer(REASON_EXPIRED, iClient, iAccountID, true); } @@ -207,6 +208,7 @@ stock void Clients_OnVIPClientLoaded(int iClient) void Clients_InitVIPClient(int iClient, int iAccountID = -1, const char[] szGroup = NULL_STRING, int iExpires = 0) { + DBG_CLIENTS("Clients_InitVIPClient: %d, %d, %s, %d", iClient, iAccountID, szGroup, iExpires) g_hFeatures[iClient] = new StringMap(); g_hFeatureStatus[iClient] = new StringMap(); @@ -220,39 +222,40 @@ void Clients_InitVIPClient(int iClient, int iAccountID = -1, const char[] szGrou #if USE_CLIENTPREFS 1 public void OnClientCookiesCached(int iClient) { - DebugMessage("OnClientCookiesCached %d %N", iClient, iClient) + DBG_CLIENTS("OnClientCookiesCached %d %N", iClient, iClient) - DebugMessage("AreClientCookiesCached %b", AreClientCookiesCached(iClient)) + DBG_CLIENTS("AreClientCookiesCached %b", AreClientCookiesCached(iClient)) //OnClientStorageLoaded(iClient); } #else public void VIP_OnClientStorageLoaded(int iClient) { - DebugMessage("VIP_OnClientStorageLoaded: %d %N", iClient, iClient) + DBG_CLIENTS("VIP_OnClientStorageLoaded: %d %N", iClient, iClient) //OnClientStorageLoaded(iClient); } #endif /* void OnClientStorageLoaded(int iClient) { - DebugMessage("OnClientStorageLoaded: %d %N", iClient, iClient) + DBG_CLIENTS("OnClientStorageLoaded: %d %N", iClient, iClient) } */ bool IsClientStorageLoaded(int iClient) { #if USE_CLIENTPREFS 1 - DebugMessage("AreClientCookiesCached: %d %N", iClient, iClient) + DBG_CLIENTS("AreClientCookiesCached: %d %N", iClient, iClient) return AreClientCookiesCached(iClient); #else - DebugMessage("Storage_IsClientLoaded: %d %N", iClient, iClient) + DBG_CLIENTS("Storage_IsClientLoaded: %d %N", iClient, iClient) return Storage_IsClientLoaded(iClient); #endif } void Clients_TryLoadFeatures(int iClient) { - DebugMessage("Clients_TryLoadFeatures %N", iClient) + DBG_CLIENTS("Clients_TryLoadFeatures %L", iClient) + DBG_CLIENTS("IsClientStorageLoaded %b", IsClientStorageLoaded(iClient)) if (!IsClientStorageLoaded(iClient)) { @@ -271,7 +274,7 @@ public Action Timer_CheckStorageLoadFeatures(Handle hTimer, DataPack hDataPack) hDataPack.Reset(); int iClient = CID(hDataPack.ReadCell()); - DebugMessage("Timer_CheckStorageLoadFeatures -> iClient: %N (%d), IsClientVIP: %b", iClient, iClient, IS_CLIENT_VIP(iClient)) + DBG_CLIENTS("Timer_CheckStorageLoadFeatures -> iClient: %N (%d), IsClientVIP: %b", iClient, iClient, IS_CLIENT_VIP(iClient)) if (iClient && IS_CLIENT_VIP(iClient)) { Clients_TryLoadFeatures(iClient); @@ -283,7 +286,7 @@ public Action Timer_CheckStorageLoadFeatures(Handle hTimer, DataPack hDataPack) void Clients_TryLoadFeature(int iClient, const char[] szFeature) { - DebugMessage("Clients_TryLoadFeatures %N", iClient) + DBG_CLIENTS("Clients_TryLoadFeature %L", iClient) if (!IsClientStorageLoaded(iClient)) { @@ -301,7 +304,7 @@ public Action Timer_CheckStorageLoadFeature(Handle hTimer, DataPack hDataPack) hDataPack.Reset(); int iClient = CID(hDataPack.ReadCell()); - DebugMessage("Timer_CheckStorageLoadFeature -> iClient: %N (%d), IsClientVIP: %b", iClient, iClient, IS_CLIENT_VIP(iClient)) + DBG_CLIENTS("Timer_CheckStorageLoadFeature -> iClient: %N (%d), IsClientVIP: %b", iClient, iClient, IS_CLIENT_VIP(iClient)) if (iClient && IS_CLIENT_VIP(iClient)) { char szFeature[FEATURE_NAME_LENGTH]; @@ -314,10 +317,10 @@ public Action Timer_CheckStorageLoadFeature(Handle hTimer, DataPack hDataPack) void Clients_LoadFeatures(int iClient) { - DebugMessage("LoadVIPFeatures %N", iClient) + DBG_CLIENTS("LoadVIPFeatures %N", iClient) int iFeaturesCount = g_hFeaturesArray.Length; - DebugMessage("FeaturesArraySize: %d", iFeaturesCount) + DBG_CLIENTS("FeaturesArraySize: %d", iFeaturesCount) if (iFeaturesCount > 0) { char szFeature[FEATURE_NAME_LENGTH]; @@ -333,7 +336,7 @@ void Clients_LoadFeatures(int iClient) } } - DebugMessage("Clients_OnVIPClientLoaded: %d %N", iClient, iClient) + DBG_CLIENTS("Clients_OnVIPClientLoaded: %d %N", iClient, iClient) OnClientLoaded(iClient); OnVIPClientLoaded(iClient); @@ -342,10 +345,10 @@ void Clients_LoadFeatures(int iClient) void Clients_LoadFeature(int iClient, const char[] szFeature) { - DebugMessage("LoadVIPFeature %N", iClient) + DBG_CLIENTS("LoadVIPFeature %N", iClient) int iFeaturesCount = g_hFeaturesArray.Length; - DebugMessage("FeaturesArraySize: %d", iFeaturesCount) + DBG_CLIENTS("FeaturesArraySize: %d", iFeaturesCount) if (iFeaturesCount > 0) { char szGroup[FEATURE_NAME_LENGTH]; @@ -357,7 +360,7 @@ void Clients_LoadFeature(int iClient, const char[] szFeature) } } /* - DebugMessage("Clients_OnVIPClientLoaded: %d %N", iClient, iClient) + DBG_CLIENTS("Clients_OnVIPClientLoaded: %d %N", iClient, iClient) Clients_OnVIPClientLoaded(iClient); */ @@ -368,16 +371,16 @@ void Clients_LoadFeatureValue(int iClient, const char[] szFeature) static ArrayList hArray; if (GLOBAL_TRIE.GetValue(szFeature, hArray)) { - DebugMessage("Clients_LoadFeatureValue: %s", szFeature) + DBG_CLIENTS("Clients_LoadFeatureValue: %s", szFeature) if (GetFeatureValue(iClient, view_as(hArray.Get(FEATURES_VALUE_TYPE)), szFeature)) { static VIP_ToggleState eStatus; - DebugMessage("GetValue: == true") + DBG_CLIENTS("GetValue: == true") if (view_as(hArray.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) { eStatus = Features_GetStatusFromStorage(iClient, szFeature, hArray); - DebugMessage("Features_GetStatusFromStorage: '%d'", eStatus) + DBG_CLIENTS("Features_GetStatusFromStorage: '%d'", eStatus) } else { @@ -392,14 +395,14 @@ void Clients_LoadFeatureValue(int iClient, const char[] szFeature) bool GetFeatureValue(int iClient, VIP_ValueType ValueType, const char[] szFeature) { - DebugMessage("GetFeatureValue: %d - %s", ValueType, szFeature) + DBG_CLIENTS("GetFeatureValue: %d - %s", ValueType, szFeature) switch (ValueType) { case BOOL: { if (g_hGroups.GetNum(szFeature)) { - DebugMessage("value: 1") + DBG_CLIENTS("value: 1") return g_hFeatures[iClient].SetValue(szFeature, true); } return false; @@ -410,7 +413,7 @@ bool GetFeatureValue(int iClient, VIP_ValueType ValueType, const char[] szFeatur iValue = g_hGroups.GetNum(szFeature); if (iValue != 0) { - DebugMessage("value: %d", iValue) + DBG_CLIENTS("value: %d", iValue) return g_hFeatures[iClient].SetValue(szFeature, iValue); } return false; @@ -421,7 +424,7 @@ bool GetFeatureValue(int iClient, VIP_ValueType ValueType, const char[] szFeatur fValue = g_hGroups.GetFloat(szFeature); if (fValue != 0.0) { - DebugMessage("value: %f", fValue) + DBG_CLIENTS("value: %f", fValue) return g_hFeatures[iClient].SetValue(szFeature, fValue); } @@ -433,7 +436,7 @@ bool GetFeatureValue(int iClient, VIP_ValueType ValueType, const char[] szFeatur g_hGroups.GetString(szFeature, SZF(szBuffer)); if (szBuffer[0]) { - DebugMessage("value: %s", szBuffer) + DBG_CLIENTS("value: %s", szBuffer) return g_hFeatures[iClient].SetString(szFeature, szBuffer); } return false; @@ -451,32 +454,31 @@ void Clients_CreateExpiredTimer(int iClient, int iExp, int iTime) { int iTimeLeft; GetMapTimeLeft(iTimeLeft); - DebugMessage("Clients_CreateExpiredTimer %N (%d):\tiTimeLeft: %d", iClient, iClient, iTimeLeft) + DBG_CLIENTS("Clients_CreateExpiredTimer %N (%d): iTimeLeft: %d", iClient, iClient, iTimeLeft) if (iTimeLeft > 0) { - DebugMessage("Clients_CreateExpiredTimer %N (%d):\tiTimeLeft+iTime: %d", iClient, iClient, iTimeLeft + iTime) - if ((iTimeLeft + iTime) > iExp) + DBG_CLIENTS("Clients_CreateExpiredTimer %N (%d): iTimeLeft+iTime: %d", iClient, iClient, iTimeLeft + iTime) + if ((iTimeLeft + iTime) < iExp) { - DebugMessage("Clients_CreateExpiredTimer %N (%d):\tTimerDealy: %f", iClient, iClient, float((iExp - iTime) + 3)) - - CreateTimer(float((iExp - iTime) + 3), Timer_VIP_Expired, UID(iClient), TIMER_FLAG_NO_MAPCHANGE); + DBG_CLIENTS("Skip timer") + return; } } + + DBG_CLIENTS("Clients_CreateExpiredTimer %N (%d): TimerDealy: %f", iClient, iClient, float((iExp - iTime) + 3)) + CreateTimer(float((iExp - iTime) + 3), Timer_VIP_Expired, UID(iClient), TIMER_FLAG_NO_MAPCHANGE); } public void Event_MatchEndRestart(Event hEvent, const char[] sEvName, bool bDontBroadcast) { - if (g_CVAR_iDeleteExpired != -1 || g_CVAR_iOutdatedExpired != -1) - { - RemoveExpAndOutPlayers(); - } + RemoveExpAndOutPlayers(); } public void Event_PlayerSpawn(Event hEvent, const char[] sEvName, bool bDontBroadcast) { int UserID = hEvent.GetInt("userid"); int iClient = CID(UserID); - DebugMessage("Event_PlayerSpawn: %N (%d)", iClient, iClient) + DBG_CLIENTS("Event_PlayerSpawn: %N (%d)", iClient, iClient) if (!(g_iClientInfo[iClient] & IS_SPAWNED)) { CreateTimer(g_CVAR_fSpawnDelay, Timer_OnPlayerSpawn, UserID, TIMER_FLAG_NO_MAPCHANGE); @@ -486,7 +488,7 @@ public void Event_PlayerSpawn(Event hEvent, const char[] sEvName, bool bDontBroa public void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast) { int iClient = CID(hEvent.GetInt("userid")); - DebugMessage("Event_PlayerDeath: %N (%d)", iClient, iClient) + DBG_CLIENTS("Event_PlayerDeath: %N (%d)", iClient, iClient) g_iClientInfo[iClient] &= ~IS_SPAWNED; } @@ -498,7 +500,7 @@ public Action Timer_OnPlayerSpawn(Handle hTimer, any UserID) int iTeam = GetClientTeam(iClient); if (iTeam > 1 && IsPlayerAlive(iClient)) { - DebugMessage("Timer_OnPlayerSpawn: %N (%d)", iClient, iClient) + DBG_CLIENTS("Timer_OnPlayerSpawn: %N (%d)", iClient, iClient) if (g_iClientInfo[iClient] & IS_VIP) { @@ -518,7 +520,7 @@ public Action Timer_OnPlayerSpawn(Handle hTimer, any UserID) public void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast) { - DebugMessage("Event_RoundEnd") + DBG_CLIENTS("Event_RoundEnd") int iTime, iExp, i; iTime = GetTime(); for (i = 1; i <= MaxClients; ++i) @@ -536,7 +538,7 @@ public void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadca public Action Timer_VIP_Expired(Handle hTimer, any UserID) { - DebugMessage("Timer_VIP_Expired %d:", UserID) + DBG_CLIENTS("Timer_VIP_Expired %d:", UserID) int iClient = CID(UserID); if (iClient && g_iClientInfo[iClient] & IS_VIP) @@ -544,7 +546,7 @@ public Action Timer_VIP_Expired(Handle hTimer, any UserID) int iExp; if (g_hFeatures[iClient].GetValue(KEY_EXPIRES, iExp) && iExp > 0 && iExp < GetTime()) { - DebugMessage("Timer_VIP_Expired %N:", iClient) + DBG_CLIENTS("Timer_VIP_Expired %N:", iClient) Clients_ExpiredClient(iClient); } @@ -553,7 +555,7 @@ public Action Timer_VIP_Expired(Handle hTimer, any UserID) void Clients_ExpiredClient(int iClient) { - DebugMessage("Clients_ExpiredClient %N:", iClient) + DBG_CLIENTS("Clients_ExpiredClient %N:", iClient) Features_TurnOffAll(iClient); int iClientID; @@ -565,6 +567,7 @@ void Clients_ExpiredClient(int iClient) LogToFile(g_szLogFile, "%T", "REMOVING_PLAYER", LANG_SERVER, iClient); Clients_RemoveVipPlayer(REASON_EXPIRED, iClient, _, true); + return; } } @@ -700,7 +703,7 @@ void Clients_RemoveVipPlayer( const char[] szByWho = NULL_STRING ) { - DebugMessage("Clients_RemoveVipPlayer %d: - > iTargetAccountID: %d, : bNotify: %b", iTarget, iTargetAccountID, bNotify) + DBG_CLIENTS("Clients_RemoveVipPlayer %d: - > iTargetAccountID: %d, : bNotify: %b", iTarget, iTargetAccountID, bNotify) if (iTarget) { iTargetAccountID = GetSteamAccountID(iTarget); @@ -754,13 +757,23 @@ void Clients_OnVipPlayerRemoved( { LogToFile(g_szLogFile, "%T", "LOG_VIP_DELETED", LANG_SERVER, szTargetInfo, iTargetAccountID, szGroup, szAdminInfo); + DebugMessage("Clients_OnVipPlayerRemoved(iAdmin: %d, szAdminInfo: %s, iTarget: %d, iTargetAccountID: %d, szTargetInfo: %s", iAdmin, szAdminInfo, iTarget, iTargetAccountID, szTargetInfo) + if (iTarget) { + if (g_iClientInfo[iTarget] & IS_MENU_OPEN) + { + CancelClientMenu(iTarget); + } + Features_TurnOffAll(iTarget); Clients_ResetClient(iTarget); - //CallForward_OnVIPClientRemoved(iTarget, "Removed by Admin", iClient); - // SET_BIT(g_iClientInfo[iTarget], IS_LOADED); - // DisplayClientInfo(iTarget, "expired_info"); + SET_BIT(g_iClientInfo[iTarget], IS_LOADED); + + // TODO: Fix this + CallForward_OnVIPClientRemoved(iTarget, "Expired"); + + DisplayClientInfo(iTarget, "expired_info"); if (bNotify) { diff --git a/addons/sourcemod/scripting/vip/Configs.sp b/addons/sourcemod/scripting/vip/Configs.sp index d57a41b..0a71529 100644 --- a/addons/sourcemod/scripting/vip/Configs.sp +++ b/addons/sourcemod/scripting/vip/Configs.sp @@ -1,14 +1,3 @@ -public void OnMapStart() -{ - LoadSounds(); - ReadDownloads(); - - if (g_hDatabase && (g_CVAR_iDeleteExpired != -1 || g_CVAR_iOutdatedExpired != -1)) - { - RemoveExpAndOutPlayers(); - } -} - void OnReadyToStart() { DebugMessage("OnReadyToStart") diff --git a/addons/sourcemod/scripting/vip/Database.sp b/addons/sourcemod/scripting/vip/Database.sp index 51bf382..045f3fc 100644 --- a/addons/sourcemod/scripting/vip/Database.sp +++ b/addons/sourcemod/scripting/vip/Database.sp @@ -145,10 +145,7 @@ public void SQL_Callback_TableCreate(Database hOwner, DBResultSet hResult, const Clients_ReloadVipPlayers(0, false); - if (g_CVAR_iDeleteExpired != -1 || g_CVAR_iOutdatedExpired != -1) - { - RemoveExpAndOutPlayers(); - } + RemoveExpAndOutPlayers(); } public void SQL_Callback_StorageTableCreate(Database hOwner, DBResultSet hResult, const char[] szError, any data) @@ -164,12 +161,17 @@ public void SQL_Callback_StorageTableCreate(Database hOwner, DBResultSet hResult void RemoveExpAndOutPlayers() { + DebugMessage("RemoveExpAndOutPlayers") + DebugMessage("g_CVAR_iDeleteExpired: %d", g_CVAR_iDeleteExpired) + DebugMessage("g_CVAR_iOutdatedExpired: %d", g_CVAR_iOutdatedExpired) + if (g_CVAR_iDeleteExpired >= 0) { char szQuery[256]; - FormatEx(SZF(szQuery), "SELECT `account_id`, `name`, `group` FROM `vip_users` WHERE `expires` > 0 AND `expires` < %d%s;", GetTime() - (g_CVAR_iDeleteExpired == 0 ? 1:g_CVAR_iDeleteExpired)*86400, g_szSID); + FormatEx(SZF(szQuery), "SELECT `account_id`, `name`, `group` FROM `vip_users` WHERE `expires` > 0 AND `expires` < %d%s;", (GetTime() - g_CVAR_iDeleteExpired*86400), g_szSID); DBG_SQL_Query(szQuery) + DebugMessage(szQuery) g_hDatabase.Query(SQL_Callback_SelectExpiredAndOutdated, szQuery, REASON_EXPIRED); } @@ -227,6 +229,7 @@ public void SQL_Callback_SelectExpiredAndOutdated(Database hOwner, DBResultSet h } DBG_SQL_Response("hResult.RowCount = %d", hResult.RowCount) + DebugMessage("hResult.RowCount = %d", hResult.RowCount) if (hResult.RowCount) { diff --git a/addons/sourcemod/scripting/vip/Debugger.sp b/addons/sourcemod/scripting/vip/Debugger.sp index ffea293..8e9edef 100644 --- a/addons/sourcemod/scripting/vip/Debugger.sp +++ b/addons/sourcemod/scripting/vip/Debugger.sp @@ -12,11 +12,11 @@ void DebugMsg(const char[] sMsg, any ...) // Детальность логов // #define LOG_DOWNLOADS // SQL Запросы -#define LOG_QUERIES // SQL Запросы -#define LOG_RESPONSE // Ответы SQL запросов +// #define LOG_QUERIES // SQL Запросы +// #define LOG_RESPONSE // Ответы SQL запросов // #define LOG_API // API -#define LOG_FEATURES // API -// #define LOG_CLIENTS // API +// #define LOG_FEATURES // API +#define LOG_CLIENTS // API // #define LOG_DB // API #define LOG_STORAGE @@ -60,3 +60,10 @@ void DebugMsg(const char[] sMsg, any ...) #else #define DBG_STORAGE(%0) #endif + + +#if defined LOG_CLIENTS +#define DBG_CLIENTS(%0) DebugMsg("STORAGE: " ... %0); +#else +#define DBG_CLIENTS(%0) +#endif diff --git a/addons/sourcemod/scripting/vip/Storage.sp b/addons/sourcemod/scripting/vip/Storage.sp index 8e76249..77aa832 100644 --- a/addons/sourcemod/scripting/vip/Storage.sp +++ b/addons/sourcemod/scripting/vip/Storage.sp @@ -82,6 +82,7 @@ public void SQL_Callback_OnClientLoadStorage(Database hOwner, DBResultSet hResul void Storage_OnClientLoaded(int iClient) { + DBG_STORAGE("Storage_OnClientLoaded: %N (%d)", iClient, iClient) g_bIsCacheLoaded[iClient] = true; CallForward_OnClientStorageLoaded(iClient); From 22e0ee1dd20791a9f373a8a4391c1188238fb410 Mon Sep 17 00:00:00 2001 From: R1KO Date: Thu, 25 Nov 2021 21:26:18 +0200 Subject: [PATCH 67/99] extends groups API --- .../sourcemod/scripting/include/vip_core.inc | 42 ++++++++++++++---- addons/sourcemod/scripting/vip/API.sp | 44 +++++++++++++++++++ 2 files changed, 77 insertions(+), 9 deletions(-) diff --git a/addons/sourcemod/scripting/include/vip_core.inc b/addons/sourcemod/scripting/include/vip_core.inc index 74721df..c0e17a4 100644 --- a/addons/sourcemod/scripting/include/vip_core.inc +++ b/addons/sourcemod/scripting/include/vip_core.inc @@ -280,7 +280,7 @@ native int VIP_GetClientAccessTime(int iClient); native bool VIP_SetClientAccessTime(int iClient, int iTime, bool bInDB = true); /** - * Получает VIP-группу игрока. + * Получает группу игрока. * * @param iClient Индекс игрока. * @param szGroup Буфер, в который будет помещен результат. @@ -292,10 +292,10 @@ native bool VIP_SetClientAccessTime(int iClient, int iTime, bool bInDB = true); native bool VIP_GetClientVIPGroup(int iClient, char[] szGroup, int iMaxLength); /** - * Устанавливает игроку VIP-группу. + * Устанавливает игроку группу. * * @param iClient Индекс игрока. - * @param szGroup VIP-группа. + * @param szGroup группа. * @param bInDBB Изменять ли в базе данных. * * @return true - Успешно. @@ -313,15 +313,39 @@ native bool VIP_SetClientVIPGroup(int iClient, const char[] szGroup, bool bInDB native StringMap VIP_GetVIPClientTrie(int iClient); /** - * Проверяет наличие VIP-группы. + * Проверяет наличие группы. * - * @param szGroup Имя VIP-группы. + * @param szGroup Имя группы. * - * @return true - VIP-группа существует. - * false - VIP-группа не существует. + * @return true - группа существует. + * false - группа не существует. */ +native bool VIP_IsGroupExists(const char[] szGroup); + +#pragma deprecated Use VIP_IsGroupExists() instead native bool VIP_IsValidVIPGroup(const char[] szGroup); +/** + * Добавляет группу. + * + * @param szGroup Имя группы. + * @param hFeatures Параметры группы. + * + * @return true - успешно. + * false - ошибка. +*/ +native bool VIP_AddGroup(const char[] szGroup, KeyValues hFeatures); + +/** + * Удаляет группу. + * + * @param szGroup Имя группы. + * + * @return true - успешно. + * false - ошибка. +*/ +native bool VIP_RemoveGroup(const char[] szGroup); + /** * Выводит игроку сообщение в чат с приставкой (фраза в переводе "VIP_CHAT_PREFIX"). * @@ -371,7 +395,7 @@ native void VIP_SendClientVIPMenu(int iClient, bool bSelection = false); * @param iAdmin Индекс админа (0 - сервер, -1 - плагин). * @param iClient Индекс игрока. * @param iTime Время в секундах. - * @param szGroup Имя VIP-группы. + * @param szGroup Имя группы. * @param bAddToDB Добавлять ли в базу данных. * * @noreturn @@ -458,7 +482,7 @@ native void VIP_UnregisterMe(); * @param szFeature Уникальное имя ф-и. * * @return true - VIP-функция существует. - * false - VIP-функция не существует. + * false - VIP-функция не существует. */ native bool VIP_IsValidFeature(const char[] szFeature); diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 4df169b..0d61329 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -262,6 +262,7 @@ public APLRes AskPluginLoad2(Handle myself, bool bLate, char[] szError, int err_ RegNative(SendClientVIPMenu); RegNative(IsValidVIPGroup); + RegNative(IsGroupExists); RegNative(GetClientFeatureStatus); RegNative(SetClientFeatureStatus); @@ -728,6 +729,49 @@ public int Native_IsValidVIPGroup(Handle hPlugin, int iNumParams) return UTIL_CheckValidVIPGroup(szGroup); } +public int Native_IsGroupExists(Handle hPlugin, int iNumParams) +{ + char szGroup[64]; + GetNativeString(1, SZF(szGroup)); + return UTIL_CheckValidVIPGroup(szGroup); +} + +public int Native_AddGroup(Handle hPlugin, int iNumParams) +{ + char szGroup[64]; + GetNativeString(1, SZF(szGroup)); + if (UTIL_CheckValidVIPGroup(szGroup)) + { + return 0; + } + + g_hGroups.Rewind(); + if (g_hGroups.JumpToKey(szGroup, true)) + { + KeyValues hGroupKv = view_as(GetNativeCell(2)); + KvCopySubkeys(hGroupKv, g_hGroups); + g_hGroups.Rewind(); + return 1; + } + + return 0; +} + + +public int Native_RemoveGroup(Handle hPlugin, int iNumParams) +{ + char szGroup[64]; + GetNativeString(1, SZF(szGroup)); + if (UTIL_CheckValidVIPGroup(szGroup)) + { + g_hGroups.DeleteThis(); + g_hGroups.Rewind(); + return 1; + } + + return 0; +} + public int Native_IsVIPLoaded(Handle hPlugin, int iNumParams) { return ((GLOBAL_INFO & IS_STARTED) && g_hDatabase); From 194a2d01139959c0c120ca97580b428c5db9bbc4 Mon Sep 17 00:00:00 2001 From: vandrienko Date: Tue, 7 Dec 2021 14:32:19 +0200 Subject: [PATCH 68/99] fix declare natives --- .gitignore | 1 + .travis.yml | 2 +- addons/sourcemod/scripting/include/vip_core.inc | 5 +++++ addons/sourcemod/scripting/vip/API.sp | 2 ++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 81cca17..b6f6890 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .vscode/ *.smx +*.code-workspace diff --git a/.travis.yml b/.travis.yml index 84e329f..fcaefd0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,7 +36,7 @@ before_script: - cp -R addons build - cp LICENSE build script: - - $SCRIPTING/spcomp -E -w203 -o$SCRIPTING'/compiled/VIP_Core' -v0 $SCRIPTING'/VIP_Core.sp' + - $SCRIPTING/spcomp -E -o$SCRIPTING'/compiled/VIP_Core' -v0 $SCRIPTING'/VIP_Core.sp' #Release before_deploy: diff --git a/addons/sourcemod/scripting/include/vip_core.inc b/addons/sourcemod/scripting/include/vip_core.inc index c0e17a4..ad31868 100644 --- a/addons/sourcemod/scripting/include/vip_core.inc +++ b/addons/sourcemod/scripting/include/vip_core.inc @@ -756,6 +756,9 @@ public void __pl_vip_core_SetNTVOptional() MarkNativeAsOptional("VIP_GetVIPClientTrie"); MarkNativeAsOptional("VIP_SendClientVIPMenu"); MarkNativeAsOptional("VIP_IsValidVIPGroup"); + MarkNativeAsOptional("VIP_IsGroupExists"); + MarkNativeAsOptional("VIP_AddGroup"); + MarkNativeAsOptional("VIP_RemoveGroup") MarkNativeAsOptional("VIP_GetClientFeatureStatus"); MarkNativeAsOptional("VIP_SetClientFeatureStatus"); MarkNativeAsOptional("VIP_IsClientFeatureUse"); @@ -773,5 +776,7 @@ public void __pl_vip_core_SetNTVOptional() MarkNativeAsOptional("VIP_GiveClientVIP"); MarkNativeAsOptional("VIP_GiveClientFeature"); MarkNativeAsOptional("VIP_RemoveClientFeature"); + MarkNativeAsOptional("VIP_SetClientStorageValue"); + MarkNativeAsOptional("VIP_GetClientStorageValue"); } #endif diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 0d61329..f8b62e4 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -263,6 +263,8 @@ public APLRes AskPluginLoad2(Handle myself, bool bLate, char[] szError, int err_ RegNative(IsValidVIPGroup); RegNative(IsGroupExists); + RegNative(AddGroup); + RegNative(RemoveGroup); RegNative(GetClientFeatureStatus); RegNative(SetClientFeatureStatus); From 51013ba8739f2a1d68e4233abcbaf772904a8573 Mon Sep 17 00:00:00 2001 From: vandrienko Date: Tue, 7 Dec 2021 14:34:47 +0200 Subject: [PATCH 69/99] add forward "VIP_OnConfigsLoaded" --- addons/sourcemod/scripting/include/vip_core.inc | 9 +++++++++ addons/sourcemod/scripting/vip/API.sp | 9 +++++++++ addons/sourcemod/scripting/vip/Configs.sp | 2 ++ 3 files changed, 20 insertions(+) diff --git a/addons/sourcemod/scripting/include/vip_core.inc b/addons/sourcemod/scripting/include/vip_core.inc index ad31868..4b27c8f 100644 --- a/addons/sourcemod/scripting/include/vip_core.inc +++ b/addons/sourcemod/scripting/include/vip_core.inc @@ -147,6 +147,15 @@ forward Action VIP_OnFeatureToggle(int iClient, const char[] szFeature, VIP_Togg */ forward void VIP_OnVIPLoaded(); +/** + * Вызывается когда VIP-плагин загрузил настройки. + * + * @noparams + * + * @noreturn +*/ +forward void VIP_OnConfigsLoaded(); + /** * Вызывается когда VIP-функция была зарегистрирована. * diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index f8b62e4..4381c3f 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -13,6 +13,7 @@ static Handle g_hGlobalForward_OnFeatureRegistered; static Handle g_hGlobalForward_OnFeatureUnregistered; static Handle g_hGlobalForward_OnClientDisconnect; static Handle g_hGlobalForward_OnClientStorageLoaded; +static Handle g_hGlobalForward_OnConfigsLoaded; void API_SetupForwards() { @@ -30,6 +31,7 @@ void API_SetupForwards() g_hGlobalForward_OnFeatureUnregistered = CreateGlobalForward("VIP_OnFeatureUnregistered", ET_Ignore, Param_String); g_hGlobalForward_OnClientDisconnect = CreateGlobalForward("VIP_OnClientDisconnect", ET_Ignore, Param_Cell, Param_Cell); g_hGlobalForward_OnClientStorageLoaded = CreateGlobalForward("VIP_OnClientStorageLoaded", ET_Ignore, Param_Cell); + g_hGlobalForward_OnConfigsLoaded = CreateGlobalForward("VIP_OnConfigsLoaded", ET_Ignore); } // Global Forwards @@ -40,6 +42,13 @@ void CallForward_OnVIPLoaded() Call_Finish(); } +void CallForward_OnConfigsLoaded() +{ + DBG_API("CallForward_OnConfigsLoaded()") + Call_StartForward(g_hGlobalForward_OnConfigsLoaded); + Call_Finish(); +} + bool CallForward_OnClientPreLoad(int iClient) { DBG_API("g_hGlobalForward_OnClientPreLoad(%N (%d), %b)", iClient, iClient, IS_CLIENT_VIP(iClient)) diff --git a/addons/sourcemod/scripting/vip/Configs.sp b/addons/sourcemod/scripting/vip/Configs.sp index 0a71529..4b1cbae 100644 --- a/addons/sourcemod/scripting/vip/Configs.sp +++ b/addons/sourcemod/scripting/vip/Configs.sp @@ -60,6 +60,8 @@ void ReadConfigs() g_hGroups = CreateConfig("data/vip/cfg/groups.ini", "VIP_GROUPS"); g_hInfo = CreateConfig("data/vip/cfg/info.ini", "VIP_INFO"); + + CallForward_OnConfigsLoaded(); } KeyValues CreateConfig(const char[] szFile, const char[] szKvName) From aa5a912a0621bdbd22f602ce2f34dd4f7f19fe7e Mon Sep 17 00:00:00 2001 From: R1KO Date: Wed, 8 Dec 2021 00:17:47 +0300 Subject: [PATCH 70/99] Update VIP_Core.sp --- addons/sourcemod/scripting/VIP_Core.sp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/VIP_Core.sp b/addons/sourcemod/scripting/VIP_Core.sp index 89d6c1b..ec68237 100644 --- a/addons/sourcemod/scripting/VIP_Core.sp +++ b/addons/sourcemod/scripting/VIP_Core.sp @@ -96,6 +96,7 @@ public void OnPluginStart() g_bIsTranslationPhraseExistsAvailable = (CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "TranslationPhraseExists") == FeatureStatus_Available); + API_SetupForwards(); ReadConfigs(); VIPMenu_Setup(); @@ -104,7 +105,6 @@ public void OnPluginStart() #endif Cvars_Setup(); - API_SetupForwards(); HookEvent("player_spawn", Event_PlayerSpawn); HookEvent("player_death", Event_PlayerDeath); From e17d231fa00ceb886c779f22b22445f98dbfdf91 Mon Sep 17 00:00:00 2001 From: vandrienko Date: Tue, 28 Dec 2021 14:24:29 +0200 Subject: [PATCH 71/99] fix debug --- addons/sourcemod/scripting/vip/API.sp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 4381c3f..1b9d497 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -151,7 +151,7 @@ VIP_ToggleState CallForward_OnFeatureToggle(int iClient, const char[] szFeature, Call_PushCell(eOldStatus); Call_PushCellRef(eResultStatus); Call_Finish(aResult); - DBG_API("CallForward_OnShowClientInfo = %b", bResult) + DBG_API("CallForward_OnFeatureToggle = %b", bResult) switch (aResult) { From c3cf2b6c1db1d287b70d75387aea833b49fea8e6 Mon Sep 17 00:00:00 2001 From: Mikhail Buchka <52104782+domikuss@users.noreply.github.com> Date: Sun, 13 Feb 2022 19:56:44 +0400 Subject: [PATCH 72/99] Forgotten ";" whoops, Forgotten ";" :) --- addons/sourcemod/scripting/include/vip_core.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/include/vip_core.inc b/addons/sourcemod/scripting/include/vip_core.inc index 4b27c8f..d0b2e8b 100644 --- a/addons/sourcemod/scripting/include/vip_core.inc +++ b/addons/sourcemod/scripting/include/vip_core.inc @@ -767,7 +767,7 @@ public void __pl_vip_core_SetNTVOptional() MarkNativeAsOptional("VIP_IsValidVIPGroup"); MarkNativeAsOptional("VIP_IsGroupExists"); MarkNativeAsOptional("VIP_AddGroup"); - MarkNativeAsOptional("VIP_RemoveGroup") + MarkNativeAsOptional("VIP_RemoveGroup"); MarkNativeAsOptional("VIP_GetClientFeatureStatus"); MarkNativeAsOptional("VIP_SetClientFeatureStatus"); MarkNativeAsOptional("VIP_IsClientFeatureUse"); From 90b6180ed7f96a88fbce8519b41b144a48ff35fc Mon Sep 17 00:00:00 2001 From: R1KO Date: Sun, 20 Mar 2022 19:36:31 +0200 Subject: [PATCH 73/99] fix display empty vip menu --- addons/sourcemod/scripting/vip/API.sp | 7 +- addons/sourcemod/scripting/vip/CMD.sp | 23 ++--- addons/sourcemod/scripting/vip/Global.sp | 4 +- addons/sourcemod/scripting/vip/VipMenu.sp | 95 +++++++++++++------ .../sourcemod/scripting/vip/adminmenu/List.sp | 2 +- 5 files changed, 78 insertions(+), 53 deletions(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 0d61329..309785d 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -524,7 +524,7 @@ public void SQL_Callback_ChangeClientSettings(Database hOwner, DBResultSet hResu public int Native_GetVIPClientTrie(Handle hPlugin, int iNumParams) { int iClient = GetNativeCell(1); - if (CheckValidClient(iClient, false) && VIP_CLIENT(iClient)) + if (CheckValidClient(iClient, false) && g_hFeatures[iClient]) { return view_as(g_hFeatures[iClient]); } @@ -945,11 +945,6 @@ void UnregisterFeature(const char[] szFeature, ArrayList hArray) break; } } - - if (g_hVIPMenu.ItemCount == 0) - { - g_hVIPMenu.AddItem("NO_FEATURES", "NO_FEATURES", ITEMDRAW_DISABLED); - } } for (int j = 1; j <= MaxClients; ++j) diff --git a/addons/sourcemod/scripting/vip/CMD.sp b/addons/sourcemod/scripting/vip/CMD.sp index 7beb414..75c574f 100644 --- a/addons/sourcemod/scripting/vip/CMD.sp +++ b/addons/sourcemod/scripting/vip/CMD.sp @@ -284,24 +284,17 @@ public Action DumpFeatures_CMD(int iClient, int iArgs) public Action VIPMenu_CMD(int iClient, int iArgs) { - if (iClient) + if (iClient && !IsVipMenuFlood(iClient)) { - if (OnVipMenuFlood(iClient) == false) + if (!IS_CLIENT_VIP(iClient)) { - if (g_iClientInfo[iClient] & IS_VIP) - { - g_hVIPMenu.Display(iClient, MENU_TIME_FOREVER); - } - else - { - /* - PrintToChat(iClient, "%t%t", "VIP_CHAT_PREFIX", "COMMAND_NO_ACCESS"); - */ - - PlaySound(iClient, NO_ACCESS_SOUND); - DisplayClientInfo(iClient, "no_access_info"); - } + PlaySound(iClient, NO_ACCESS_SOUND); + DisplayClientInfo(iClient, "no_access_info"); + return Plugin_Handled; } + + DisplayVipMenu(iClient); } + return Plugin_Handled; } diff --git a/addons/sourcemod/scripting/vip/Global.sp b/addons/sourcemod/scripting/vip/Global.sp index dd00542..ff70599 100644 --- a/addons/sourcemod/scripting/vip/Global.sp +++ b/addons/sourcemod/scripting/vip/Global.sp @@ -27,8 +27,8 @@ #define IS_SPAWNED (1<<4) // Игрок возродился #define IS_MENU_OPEN (1<<5) // VIP-меню открыто -#define IS_CLIENT_VIP(%0) g_iClientInfo[%0] & IS_VIP == IS_VIP -#define IS_CLIENT_LOADED(%0) g_iClientInfo[%0] & IS_LOADED == IS_LOADED +#define IS_CLIENT_VIP(%0) (g_iClientInfo[%0] & IS_VIP == IS_VIP) +#define IS_CLIENT_LOADED(%0) (g_iClientInfo[%0] & IS_LOADED == IS_LOADED) #define IS_STARTED (1<<0) #define IS_MySQL (1<<1) diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index af82028..41bf7e2 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -1,8 +1,6 @@ void VIPMenu_Setup() { g_hVIPMenu = new Menu(Handler_VIPMenu, MenuAction_Start | MenuAction_Display | MenuAction_Cancel | MenuAction_Select | MenuAction_DisplayItem | MenuAction_DrawItem); - - g_hVIPMenu.AddItem("NO_FEATURES", "NO_FEATURES", ITEMDRAW_DISABLED); } void AddFeatureToVIPMenu(const char[] szFeature) @@ -93,6 +91,7 @@ stock void PrintArray(ArrayList &hArray) } #endif */ + public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOption) { if ((action == MenuAction_Display || @@ -123,28 +122,10 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti DebugMessage("MenuAction_Display: Client: %i", iClient) char szTitle[256]; - int iExp; - if (g_hFeatures[iClient].GetValue(KEY_EXPIRES, iExp) && iExp > 0) + if (FormatMenuTitle(iClient, SZF(szTitle))) { - int iTime = GetTime(); - if (iTime < iExp) - { - char szExpires[64]; - UTIL_GetTimeFromStamp(SZF(szExpires), iExp - iTime, iClient); - FormatEx(SZF(szTitle), "%T\n \n%T: %s\n \n", "VIP_MENU_TITLE", iClient, "EXPIRES_IN", iClient, szExpires); - } - else - { - Clients_ExpiredClient(iClient); - return 0; - } - } - else - { - FormatEx(SZF(szTitle), "%T\n \n", "VIP_MENU_TITLE", iClient); + (view_as(iOption)).SetTitle(szTitle); } - - (view_as(iOption)).SetTitle(szTitle); } case MenuAction_DrawItem: @@ -189,12 +170,6 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti DebugMessage("MenuAction_DisplayItem: Client: %i, Feature: %s", iClient, szFeature) static char szDisplay[128]; - if (strcmp(szFeature, "NO_FEATURES") == 0) - { - FormatEx(SZF(szDisplay), "%T", "NO_FEATURES", iClient); - return RedrawMenuItem(szDisplay); - } - if (GLOBAL_TRIE.GetValue(szFeature, hBuffer)) { DataPack hDataPack = view_as(hBuffer.Get(FEATURES_MENU_CALLBACKS)); @@ -288,7 +263,30 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti return 0; } -bool OnVipMenuFlood(int iClient) +bool FormatMenuTitle(int iClient, char[] szTitle, int iMaxLen) +{ + int iExp; + if (g_hFeatures[iClient].GetValue(KEY_EXPIRES, iExp) && iExp > 0) + { + int iTime = GetTime(); + if (iTime > iExp) + { + Clients_ExpiredClient(iClient); + return false; + } + + char szExpires[64]; + UTIL_GetTimeFromStamp(SZF(szExpires), iExp - iTime, iClient); + FormatEx(szTitle, iMaxLen, "%T\n \n%T: %s\n ", "VIP_MENU_TITLE", iClient, "EXPIRES_IN", iClient, szExpires); + return true; + } + + FormatEx(szTitle, iMaxLen, "%T\n ", "VIP_MENU_TITLE", iClient); + + return true; +} + +bool IsVipMenuFlood(int iClient) { static float fLastTime[MAXPLAYERS + 1]; if (fLastTime[iClient] > 0.0) @@ -309,3 +307,42 @@ bool IsTranslationPhraseExists(const char[] szPhrase) return true; } + +void DisplayVipMenu(int iClient) +{ + bool bResult = g_hVIPMenu.Display(iClient, MENU_TIME_FOREVER); + if (!bResult) { + DisplayEmptyFeaturesMenu(iClient); + } +} + +void DisplayEmptyFeaturesMenu(int iClient) +{ + char szBuffer[256]; + if (!FormatMenuTitle(iClient, SZF(szBuffer))) + { + return; + } + + Menu hMenu = new Menu(Handler_EmptyVIPMenu, MenuAction_End); + + hMenu.SetTitle(szBuffer); + + FormatEx(SZF(szBuffer), "%T", "NO_FEATURES", iClient); + hMenu.AddItem(NULL_STRING, szBuffer, ITEMDRAW_DISABLED); + + hMenu.Display(iClient, MENU_TIME_FOREVER); +} + +public int Handler_EmptyVIPMenu(Menu hMenu, MenuAction action, int iClient, int iOption) +{ + switch (action) + { + case MenuAction_End: + { + delete hMenu; + } + } + + return 0; +} diff --git a/addons/sourcemod/scripting/vip/adminmenu/List.sp b/addons/sourcemod/scripting/vip/adminmenu/List.sp index 1011c5c..c6b7c63 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/List.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/List.sp @@ -423,7 +423,7 @@ void ShowTargetInfoMenu(int iClient) { FormatEx(SZF(szBuffer), "%T", "NEVER", iClient); } - + if (iClientID == -1) { Format(SZF(szBuffer), "%s (%T)", szBuffer, "TEMPORARY", iClient); From 9f445187141bba393efcc94fc89ca591d14979d1 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sun, 20 Mar 2022 19:42:08 +0200 Subject: [PATCH 74/99] refactor macros --- addons/sourcemod/scripting/vip/API.sp | 14 +++++++------- addons/sourcemod/scripting/vip/CMD.sp | 2 +- addons/sourcemod/scripting/vip/Clients.sp | 8 +++++--- addons/sourcemod/scripting/vip/VipMenu.sp | 2 +- addons/sourcemod/scripting/vip/adminmenu/Add.sp | 2 +- addons/sourcemod/scripting/vip/adminmenu/List.sp | 2 +- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index a61424b..30111bb 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -83,7 +83,7 @@ void CallForward_OnClientDisconnect(int iClient) DBG_API("CallForward_OnClientDisconnect(%N (%d), %b)", iClient, iClient, IS_CLIENT_VIP(iClient)) Call_StartForward(g_hGlobalForward_OnClientDisconnect); Call_PushCell(iClient); - Call_PushCell(g_iClientInfo[iClient] & IS_VIP); + Call_PushCell(IS_CLIENT_VIP(iClient)); Call_Finish(); } @@ -112,7 +112,7 @@ void CallForward_OnPlayerSpawn(int iClient, int iTeam) Call_StartForward(g_hGlobalForward_OnPlayerSpawn); Call_PushCell(iClient); Call_PushCell(iTeam); - Call_PushCell(g_iClientInfo[iClient] & IS_VIP); + Call_PushCell(IS_CLIENT_VIP(iClient)); Call_Finish(); } @@ -334,7 +334,7 @@ public int Native_IsClientVIP(Handle hPlugin, int iNumParams) DBG_API("iClient = %d", iClient) if (CheckValidClient(iClient, false)) { - DBG_API("IS_VIP = %b", (g_iClientInfo[iClient] & IS_VIP)) + DBG_API("IS_VIP = %b", IS_CLIENT_VIP(iClient)) DBG_API("IS_CLIENT_LOADED = %b", (g_iClientInfo[iClient] & IS_LOADED)) return IS_CLIENT_VIP(iClient) && IS_CLIENT_LOADED(iClient); } @@ -613,7 +613,7 @@ int API_GiveClientVIP(Handle hPlugin, return ThrowNativeError(SP_ERROR_NATIVE, "Invalid time (%d)", iTime); } - if (g_iClientInfo[iClient] & IS_VIP) + if (IS_CLIENT_VIP(iClient)) { int iClientID; g_hFeatures[iClient].GetValue(KEY_CID, iClientID); @@ -960,7 +960,7 @@ void UnregisterFeature(const char[] szFeature, ArrayList hArray) for (int j = 1; j <= MaxClients; ++j) { - if (IsClientInGame(j) && g_iClientInfo[j] & IS_VIP) + if (IsClientInGame(j) && IS_CLIENT_VIP(j)) { g_hFeatures[j].Remove(szFeature); g_hFeatureStatus[j].Remove(szFeature); @@ -1179,7 +1179,7 @@ public int Native_GiveClientFeature(Handle hPlugin, int iNumParams) char szValue[256]; GetNativeString(3, SZF(szValue)); - if (!(g_iClientInfo[iClient] & IS_VIP)) + if ((IS_CLIENT_VIP(iClient)) { Clients_InitVIPClient(iClient, -1, NULL_STRING, 0); g_hFeatures[iClient].SetValue(KEY_CID, -1); @@ -1387,7 +1387,7 @@ bool CheckValidClient(const int &iClient, bool bCheckVIP = true) ThrowNativeError(SP_ERROR_NATIVE, "Client %i is not loaded", iClient); return false; } - if (!(g_iClientInfo[iClient] & IS_VIP) || !(g_iClientInfo[iClient] & IS_AUTHORIZED)) + if (!IS_CLIENT_VIP(iClient) || !(g_iClientInfo[iClient] & IS_AUTHORIZED)) { ThrowNativeError(SP_ERROR_NATIVE, "Client %i is not VIP", iClient); return false; diff --git a/addons/sourcemod/scripting/vip/CMD.sp b/addons/sourcemod/scripting/vip/CMD.sp index 75c574f..3fe08d0 100644 --- a/addons/sourcemod/scripting/vip/CMD.sp +++ b/addons/sourcemod/scripting/vip/CMD.sp @@ -119,7 +119,7 @@ public Action AddVIP_CMD(int iClient, int iArgs) { if (IsClientInGame(iTargetList[i])) { - if (g_iClientInfo[iTargetList[i]] & IS_VIP) + if (IS_CLIENT_VIP(iTargetList[i])) { ReplyToCommand(iClient, "[VIP] %t", "ALREADY_HAS_VIP"); continue; diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index a276e74..e223c12 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -502,7 +502,7 @@ public Action Timer_OnPlayerSpawn(Handle hTimer, any UserID) { DBG_CLIENTS("Timer_OnPlayerSpawn: %N (%d)", iClient, iClient) - if (g_iClientInfo[iClient] & IS_VIP) + if (IS_CLIENT_VIP(iClient)) { int iExp; if (g_hFeatures[iClient].GetValue(KEY_EXPIRES, iExp) && iExp > 0 && iExp < GetTime()) @@ -528,7 +528,7 @@ public void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadca if (IsClientInGame(i)) { g_iClientInfo[i] &= ~IS_SPAWNED; - if ((g_iClientInfo[i] & IS_VIP) && g_hFeatures[i].GetValue(KEY_EXPIRES, iExp) && iExp > 0 && iExp < iTime) + if (IS_CLIENT_VIP(i) && g_hFeatures[i].GetValue(KEY_EXPIRES, iExp) && iExp > 0 && iExp < iTime) { Clients_ExpiredClient(i); } @@ -541,7 +541,7 @@ public Action Timer_VIP_Expired(Handle hTimer, any UserID) DBG_CLIENTS("Timer_VIP_Expired %d:", UserID) int iClient = CID(UserID); - if (iClient && g_iClientInfo[iClient] & IS_VIP) + if (iClient && IS_CLIENT_VIP(iClient)) { int iExp; if (g_hFeatures[iClient].GetValue(KEY_EXPIRES, iExp) && iExp > 0 && iExp < GetTime()) @@ -551,6 +551,8 @@ public Action Timer_VIP_Expired(Handle hTimer, any UserID) Clients_ExpiredClient(iClient); } } + + return Plugin_Stop; } void Clients_ExpiredClient(int iClient) diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index 41bf7e2..3dc336b 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -98,7 +98,7 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti action == MenuAction_DisplayItem || action == MenuAction_DrawItem || action == MenuAction_Select) && - (!(g_iClientInfo[iClient] & IS_VIP) || !g_hFeatures[iClient])) + (!IS_CLIENT_VIP(iClient) || !g_hFeatures[iClient])) { return 0; } diff --git a/addons/sourcemod/scripting/vip/adminmenu/Add.sp b/addons/sourcemod/scripting/vip/adminmenu/Add.sp index fbf1370..dd54b96 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/Add.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/Add.sp @@ -11,7 +11,7 @@ void ShowAddVIPMenu(int iClient) { if (IsClientInGame(i) && IsFakeClient(i) == false && GetClientName(i, SZF(szName))) { - if (g_iClientInfo[i] & IS_VIP) + if (IS_CLIENT_VIP(i)) { g_hFeatures[i].GetValue(KEY_CID, iClientID); if (iClientID != -1) diff --git a/addons/sourcemod/scripting/vip/adminmenu/List.sp b/addons/sourcemod/scripting/vip/adminmenu/List.sp index c6b7c63..03ff60d 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/List.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/List.sp @@ -21,7 +21,7 @@ void ShowVipPlayersListMenu(int iClient) szUserID[0] = 0; for (i = 1; i <= MaxClients; ++i) { - if (IsClientInGame(i) && (g_iClientInfo[i] & IS_VIP) && !IsFakeClient(i) && GetClientName(i, SZF(szName))) + if (IsClientInGame(i) && IS_CLIENT_VIP(i) && !IsFakeClient(i) && GetClientName(i, SZF(szName))) { g_hFeatures[i].GetValue(KEY_CID, iClientID); FormatEx(SZF(szUserID), "u%d", UID(i)); From 56dfbb15e6e73106bf1d44989592a134250df5c1 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sun, 20 Mar 2022 19:55:04 +0200 Subject: [PATCH 75/99] fix return statements --- addons/sourcemod/scripting/vip/API.sp | 64 ++++++++----- addons/sourcemod/scripting/vip/AdminMenu.sp | 6 +- addons/sourcemod/scripting/vip/Clients.sp | 2 +- addons/sourcemod/scripting/vip/Database.sp | 14 +-- addons/sourcemod/scripting/vip/Downloads.sp | 95 +++++++++++-------- addons/sourcemod/scripting/vip/Info.sp | 2 +- addons/sourcemod/scripting/vip/Storage.sp | 6 +- addons/sourcemod/scripting/vip/VipMenu.sp | 4 +- .../sourcemod/scripting/vip/adminmenu/Add.sp | 22 +++-- .../sourcemod/scripting/vip/adminmenu/List.sp | 4 + 10 files changed, 130 insertions(+), 89 deletions(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 30111bb..5d21a6f 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -325,6 +325,8 @@ public int Native_CheckClient(Handle hPlugin, int iNumParams) { Clients_CheckVipAccess(iClient, view_as(GetNativeCell(2)), view_as(GetNativeCell(3))); } + + return 0; } public int Native_IsClientVIP(Handle hPlugin, int iNumParams) @@ -339,7 +341,7 @@ public int Native_IsClientVIP(Handle hPlugin, int iNumParams) return IS_CLIENT_VIP(iClient) && IS_CLIENT_LOADED(iClient); } - return false; + return 0; } public int Native_PrintToChatClient(Handle hPlugin, int iNumParams) @@ -349,18 +351,20 @@ public int Native_PrintToChatClient(Handle hPlugin, int iNumParams) DBG_API("iClient = %d", iClient) if (CheckValidClient(iClient, false)) { - char szMessage[256]; + char szMessage[PMP]; SetGlobalTransTarget(iClient); FormatNativeString(0, 2, 3, sizeof(szMessage), _, szMessage); Colors_Print(iClient, szMessage); } + + return 0; } public int Native_PrintToChatAll(Handle hPlugin, int iNumParams) { DBG_API("Native_PrintToChatAll(%d)", iNumParams) - char szMessage[256]; + char szMessage[PMP]; for (int i = 1; i <= MCL; ++i) { @@ -371,6 +375,8 @@ public int Native_PrintToChatAll(Handle hPlugin, int iNumParams) Colors_Print(i, szMessage); } } + + return 0; } public int Native_LogMessage(Handle hPlugin, int iNumParams) @@ -382,6 +388,8 @@ public int Native_LogMessage(Handle hPlugin, int iNumParams) FormatNativeString(0, 1, 2, sizeof(szMessage), _, szMessage); LogToFile(g_szLogFile, szMessage); + + return 0; } public int Native_GetClientID(Handle hPlugin, int iNumParams) @@ -446,7 +454,7 @@ public int Native_SetClientVIPGroup(Handle hPlugin, int iNumParams) int iClientID; if (g_hFeatures[iClient].GetValue(KEY_CID, iClientID) && iClientID != -1) { - char szQuery[256]; + char szQuery[PMP]; FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `group` = '%s' WHERE `account_id` = %d%s;", szGroup, iClientID, g_szSID); DBG_SQL_Query(szQuery) g_hDatabase.Query(SQL_Callback_ChangeClientSettings, szQuery, UID(iClient)); @@ -502,7 +510,7 @@ public int Native_SetClientAccessTime(Handle hPlugin, int iNumParams) int iClientID; if (g_hFeatures[iClient].GetValue(KEY_CID, iClientID) && iClientID != -1) { - char szQuery[256]; + char szQuery[PMP]; FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `expires` = %d WHERE `account_id` = %d%s;", iTime, iClientID, g_szSID); DBG_SQL_Query(szQuery) g_hDatabase.Query(SQL_Callback_ChangeClientSettings, szQuery, UID(iClient)); @@ -546,26 +554,30 @@ public int Native_GetVIPClientTrie(Handle hPlugin, int iNumParams) public int Native_SendClientVIPMenu(Handle hPlugin, int iNumParams) { int iClient = GetNativeCell(1); - if (CheckValidClient(iClient)) + if (!CheckValidClient(iClient)) { - bool bSelection = false; + return 0; + } - if (iNumParams == 2) - { - bSelection = view_as(GetNativeCell(2)); - } - - if (bSelection) - { - g_hVIPMenu.Display(iClient, MENU_TIME_FOREVER); - return; - } - - int iItem = 0; - g_hFeatures[iClient].GetValue(KEY_MENUITEM, iItem); + bool bSelection = false; - g_hVIPMenu.DisplayAt(iClient, iItem, MENU_TIME_FOREVER); + if (iNumParams == 2) + { + bSelection = view_as(GetNativeCell(2)); } + + if (bSelection) + { + g_hVIPMenu.Display(iClient, MENU_TIME_FOREVER); + return; + } + + int iItem = 0; + g_hFeatures[iClient].GetValue(KEY_MENUITEM, iItem); + + g_hVIPMenu.DisplayAt(iClient, iItem, MENU_TIME_FOREVER); + + return 0; } public int Native_GiveClientVIP(Handle hPlugin, int iNumParams) @@ -969,6 +981,8 @@ void UnregisterFeature(const char[] szFeature, ArrayList hArray) CallForward_OnFeatureUnregistered(szFeature); DebugMessage("Feature \"%s\" unregistered", szFeature) + + return 0; } public int Native_IsValidFeature(Handle hPlugin, int iNumParams) @@ -1149,7 +1163,7 @@ public int Native_GetClientFeatureString(Handle hPlugin, int iNumParams) int iLen = GetNativeCell(4); if (CheckValidClient(iClient, false) && VIP_CLIENT(iClient)) { - char szFeature[64], szBuffer[256]; + char szFeature[64], szBuffer[PMP]; GetNativeString(2, SZF(szFeature)); if (g_hFeatures[iClient].GetString(szFeature, SZF(szBuffer))) @@ -1176,7 +1190,7 @@ public int Native_GiveClientFeature(Handle hPlugin, int iNumParams) return ThrowNativeError(SP_ERROR_NATIVE, "Feature \"%s\" is invalid", szFeature); } - char szValue[256]; + char szValue[PMP]; GetNativeString(3, SZF(szValue)); if ((IS_CLIENT_VIP(iClient)) @@ -1281,7 +1295,7 @@ public int Native_SetClientStorageValue(Handle hPlugin, int iNumParams) return 0; } - char szKey[128], szValue[256]; + char szKey[128], szValue[PMP]; GetNativeString(2, SZF(szKey)); GetNativeString(3, SZF(szValue)); @@ -1298,7 +1312,7 @@ public int Native_GetClientStorageValue(Handle hPlugin, int iNumParams) return 0; } - char szKey[128], szValue[256]; + char szKey[128], szValue[PMP]; GetNativeString(2, SZF(szKey)); Storage_GetClientValue(iClient, szKey, SZF(szValue)); diff --git a/addons/sourcemod/scripting/vip/AdminMenu.sp b/addons/sourcemod/scripting/vip/AdminMenu.sp index 90e71d6..2a01edc 100644 --- a/addons/sourcemod/scripting/vip/AdminMenu.sp +++ b/addons/sourcemod/scripting/vip/AdminMenu.sp @@ -517,7 +517,7 @@ public int MenuHandler_GroupsList(Menu hMenu, MenuAction action, int iClient, in } case MENU_TYPE_EDIT: { - char szQuery[256], szName[MNL], szOldGroup[64]; + char szQuery[PMP], szName[MNL], szOldGroup[64]; hMenu.GetItem(Item, SZF(szGroup)); int iTargetID; g_hClientData[iClient].GetValue(DATA_KEY_TargetID, iTargetID); @@ -547,7 +547,7 @@ public int MenuHandler_GroupsList(Menu hMenu, MenuAction action, int iClient, in VIP_PrintToChatClient(iClient, "%t", "ADMIN_SET_GROUP", szName, szGroup); - char szAdmin[256], szAdminInfo[128]; + char szAdmin[PMP], szAdminInfo[128]; UTIL_GetClientInfo(iClient, SZF(szAdminInfo)); FormatEx(SZF(szAdmin), "%T %s", "BY_ADMIN", LANG_SERVER, szAdminInfo); LogToFile(g_szLogFile, "%T", "LOG_CHANGE_GROUP", LANG_SERVER, szName, iTargetID, szOldGroup, szGroup, szAdmin); @@ -557,6 +557,8 @@ public int MenuHandler_GroupsList(Menu hMenu, MenuAction action, int iClient, in } } } + + return 0; } public void SQL_Callback_ChangeTime(Database hOwner, DBResultSet hResult, const char[] szError, any UserID) diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index e223c12..2c36319 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -432,7 +432,7 @@ bool GetFeatureValue(int iClient, VIP_ValueType ValueType, const char[] szFeatur } case STRING: { - char szBuffer[256]; + char szBuffer[PMP]; g_hGroups.GetString(szFeature, SZF(szBuffer)); if (szBuffer[0]) { diff --git a/addons/sourcemod/scripting/vip/Database.sp b/addons/sourcemod/scripting/vip/Database.sp index 045f3fc..3bd1a03 100644 --- a/addons/sourcemod/scripting/vip/Database.sp +++ b/addons/sourcemod/scripting/vip/Database.sp @@ -27,7 +27,7 @@ void DB_Connect() } else { - char szError[256]; + char szError[PMP]; g_hDatabase = SQLite_UseDatabase("vip_core", SZF(szError)); OnDBConnect(g_hDatabase, szError, 1); } @@ -167,7 +167,7 @@ void RemoveExpAndOutPlayers() if (g_CVAR_iDeleteExpired >= 0) { - char szQuery[256]; + char szQuery[PMP]; FormatEx(SZF(szQuery), "SELECT `account_id`, `name`, `group` FROM `vip_users` WHERE `expires` > 0 AND `expires` < %d%s;", (GetTime() - g_CVAR_iDeleteExpired*86400), g_szSID); DBG_SQL_Query(szQuery) @@ -177,7 +177,7 @@ void RemoveExpAndOutPlayers() if (g_CVAR_iOutdatedExpired > 0) { - char szQuery[256]; + char szQuery[PMP]; FormatEx(SZF(szQuery), "SELECT `account_id`, `name`, `group` FROM `vip_users` WHERE `lastvisit` > 0 AND `lastvisit` < %d%s;", (GetTime() - g_CVAR_iOutdatedExpired*86400), g_szSID); DBG_SQL_Query(szQuery) @@ -200,7 +200,7 @@ void DB_UpdateClient(int iClient, const char[] szDbName = NULL_STRING) int iClientID; g_hFeatures[iClient].GetValue(KEY_CID, iClientID); - char szQuery[256]; + char szQuery[PMP]; if (g_CVAR_bUpdateName || !strcmp(szDbName, "unknown")) { @@ -483,7 +483,7 @@ void DB_RemoveVipPlayerByData( hDataPack.WriteString(szGroup); hDataPack.WriteCell(bNotify); - char szQuery[256]; + char szQuery[PMP]; FormatEx(SZF(szQuery), "DELETE FROM `vip_users` WHERE `account_id` = %d%s;", iTargetAccountID, g_szSID); DBG_SQL_Query(szQuery) @@ -554,7 +554,7 @@ void DB_RemoveClientFromID(int iAdmin = 0, const char[] szByWho = NULL_STRING) { DebugMessage("DB_RemoveClientFromID %N (%d): - > iClientID: %d, : bNotify: %b", iClient, iClient, iClientID, bNotify) - char szQuery[256], szName[MNL], szGroup[64]; + char szQuery[PMP], szName[MNL], szGroup[64]; DataPack hDataPack = new DataPack(); if (iClient) @@ -665,7 +665,7 @@ public void SQL_Callback_SelectRemoveClient(Database hOwner, DBResultSet hResult void DB_RemoveClient(int iClientID, DataPack hDataPack) { - char szQuery[256]; + char szQuery[PMP]; FormatEx(SZF(szQuery), "DELETE FROM `vip_users` WHERE `account_id` = %d%s;", iClientID, g_szSID); DBG_SQL_Query(szQuery) diff --git a/addons/sourcemod/scripting/vip/Downloads.sp b/addons/sourcemod/scripting/vip/Downloads.sp index 848586d..01d4638 100644 --- a/addons/sourcemod/scripting/vip/Downloads.sp +++ b/addons/sourcemod/scripting/vip/Downloads.sp @@ -6,38 +6,40 @@ void ReadDownloads() BuildPath(Path_SM, SZF(szBuffer), "data/vip/modules/downloadlist.txt"); File hFile = OpenFile(szBuffer, "r"); - if (hFile != null) + if (hFile == null) { - DBG_Download("OpenFile('%s')", szBuffer) - int iEndPos; - while (!hFile.EndOfFile() && hFile.ReadLine(SZF(szBuffer))) + return; + } + DBG_Download("OpenFile('%s')", szBuffer) + int iEndPos; + while (!hFile.EndOfFile() && hFile.ReadLine(SZF(szBuffer))) + { + DBG_Download("ReadLine = '%s'", szBuffer) + if (!szBuffer[0]) + { + continue; + } + iEndPos = StrContains(szBuffer, "//"); + DBG_Download("iEndPos = %d", iEndPos) + if (iEndPos != -1) { - DBG_Download("ReadLine = '%s'", szBuffer) - if (szBuffer[0]) - { - iEndPos = StrContains(szBuffer, "//"); - DBG_Download("iEndPos = %d", iEndPos) - if (iEndPos != -1) - { - szBuffer[iEndPos] = 0; - } + szBuffer[iEndPos] = 0; + } - if (szBuffer[0] && IsCharAlpha(szBuffer[0])) - { - DBG_Download("ReadFileLine: '%s'", szBuffer) - - TrimString(szBuffer); + if (szBuffer[0] && IsCharAlpha(szBuffer[0])) + { + DBG_Download("ReadFileLine: '%s'", szBuffer) + + TrimString(szBuffer); - File_AddToDownloadsTable(szBuffer); - } - } + File_AddToDownloadsTable(szBuffer); } - - delete hFile; } + + delete hFile; } -bool File_AddToDownloadsTable(const char[] szPath) +void File_AddToDownloadsTable(const char[] szPath) { DBG_Download("File_AddToDownloadsTable: '%s'", szPath) @@ -46,33 +48,44 @@ bool File_AddToDownloadsTable(const char[] szPath) DBG_Download("File '%s' Loaded", szPath) AddFileToDownloadsTable(szPath); + return; } - else if (DirExists(szPath)) + + if (DirExists(szPath)) { Dir_AddToDownloadsTable(szPath); } } -bool Dir_AddToDownloadsTable(const char[] szPath) +void Dir_AddToDownloadsTable(const char[] szPath) { DBG_Download("Dir_AddToDownloadsTable: '%s'", szPath) - if (DirExists(szPath)) + if (!DirExists(szPath)) { - DirectoryListing hDir = OpenDirectory(szPath); - if (hDir != null) - { - char szDirEntry[PLATFORM_MAX_PATH]; - while (hDir.GetNext(SZF(szDirEntry))) - { - if ((UTIL_StrCmpEx(szDirEntry, ".") || UTIL_StrCmpEx(szDirEntry, "..") || UTIL_StrCmpEx(szDirEntry[strlen(szDirEntry)-4], ".bz2")) == false) - { - Format(SZF(szDirEntry), "%s/%s", szPath, szDirEntry); + return; + } + + DirectoryListing hDir = OpenDirectory(szPath); + if (hDir == null) + { + return; + } - File_AddToDownloadsTable(szDirEntry); - } - } - delete hDir; + char szDirEntry[PMP]; + while (hDir.GetNext(SZF(szDirEntry))) + { + if ( + UTIL_StrCmpEx(szDirEntry, ".") || + UTIL_StrCmpEx(szDirEntry, "..") || + UTIL_StrCmpEx(szDirEntry[strlen(szDirEntry)-4], ".bz2"))) + { + continue; } + + Format(SZF(szDirEntry), "%s/%s", szPath, szDirEntry); + File_AddToDownloadsTable(szDirEntry); } -} \ No newline at end of file + + delete hDir; +} diff --git a/addons/sourcemod/scripting/vip/Info.sp b/addons/sourcemod/scripting/vip/Info.sp index d658195..f906a45 100644 --- a/addons/sourcemod/scripting/vip/Info.sp +++ b/addons/sourcemod/scripting/vip/Info.sp @@ -195,5 +195,5 @@ void ReplaceValues(int iClient, char[] szBuffer, int iBufLen, bool bExt) public int SelectInfoPanel(Menu hPanel, MenuAction action, int iClient, int iOption) { - + return 0; } diff --git a/addons/sourcemod/scripting/vip/Storage.sp b/addons/sourcemod/scripting/vip/Storage.sp index 77aa832..fae77b6 100644 --- a/addons/sourcemod/scripting/vip/Storage.sp +++ b/addons/sourcemod/scripting/vip/Storage.sp @@ -27,7 +27,7 @@ void Storage_GetClientValue(int iClient, const char[] szKey, char[] szValue, int void Storage_LoadClient(int iClient) { - char szQuery[256]; + char szQuery[PMP]; int iAccountID = GetSteamAccountID(iClient); DBG_STORAGE("Storage_LoadClient: %N (%d): %d", iClient, iClient, iAccountID) @@ -66,7 +66,7 @@ public void SQL_Callback_OnClientLoadStorage(Database hOwner, DBResultSet hResul return; } - char szKey[128], szValue[256]; + char szKey[128], szValue[PMP]; while (hResult.FetchRow()) { @@ -114,7 +114,7 @@ void Storage_SaveClient(int iClient) StringMapSnapshot hStorageSnapshot = g_hCache[iClient].Snapshot(); - char szKey[128], szValue[256]; + char szKey[128], szValue[PMP]; for(int i = 0, iSize = hStorageSnapshot.Length; i < iSize; ++i) { diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index 3dc336b..10aacf6 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -121,7 +121,7 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti g_hFeatures[iClient].Remove(KEY_MENUITEM); DebugMessage("MenuAction_Display: Client: %i", iClient) - char szTitle[256]; + char szTitle[PMP]; if (FormatMenuTitle(iClient, SZF(szTitle))) { (view_as(iOption)).SetTitle(szTitle); @@ -318,7 +318,7 @@ void DisplayVipMenu(int iClient) void DisplayEmptyFeaturesMenu(int iClient) { - char szBuffer[256]; + char szBuffer[PMP]; if (!FormatMenuTitle(iClient, SZF(szBuffer))) { return; diff --git a/addons/sourcemod/scripting/vip/adminmenu/Add.sp b/addons/sourcemod/scripting/vip/adminmenu/Add.sp index dd54b96..dceb96f 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/Add.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/Add.sp @@ -43,20 +43,28 @@ public int MenuHandler_AddVip_PlayerList(Menu hMenu, MenuAction action, int iCli case MenuAction_End:delete hMenu; case MenuAction_Cancel: { - if (Item == MenuCancel_ExitBack) BackToAdminMenu(iClient); + if (Item == MenuCancel_ExitBack) + { + BackToAdminMenu(iClient); + } } case MenuAction_Select: { char szUserID[16]; hMenu.GetItem(Item, SZF(szUserID)); int UserID = StringToInt(szUserID); - if (CID(UserID)) + if (!CID(UserID)) { - g_hClientData[iClient].SetValue(DATA_KEY_TargetUID, UserID); - g_hClientData[iClient].SetValue(DATA_KEY_TimeType, TIME_SET); - g_hClientData[iClient].SetValue(DATA_KEY_MenuType, MENU_TYPE_ADD); - ShowTimeMenu(iClient); - } else VIP_PrintToChatClient(iClient, "%t", "PLAYER_NO_LONGER_AVAILABLE"); + VIP_PrintToChatClient(iClient, "%t", "PLAYER_NO_LONGER_AVAILABLE"); + return 0; + } + + g_hClientData[iClient].SetValue(DATA_KEY_TargetUID, UserID); + g_hClientData[iClient].SetValue(DATA_KEY_TimeType, TIME_SET); + g_hClientData[iClient].SetValue(DATA_KEY_MenuType, MENU_TYPE_ADD); + ShowTimeMenu(iClient); } } + + return 0; } diff --git a/addons/sourcemod/scripting/vip/adminmenu/List.sp b/addons/sourcemod/scripting/vip/adminmenu/List.sp index 03ff60d..ce384c2 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/List.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/List.sp @@ -186,6 +186,8 @@ public int MenuHandler_SearchPlayersListMenu(Menu hMenu, MenuAction action, int } } } + + return 0; } void ShowVipPlayersFromDBMenu(int iClient, int iOffset = 0) @@ -490,4 +492,6 @@ public int MenuHandler_VipClientInfoMenu(Menu hMenu, MenuAction action, int iCli } } } + + return 0; } From a9aa1324320d4fa183db2e74e47c7c856a7e834a Mon Sep 17 00:00:00 2001 From: R1KO Date: Sun, 20 Mar 2022 21:02:46 +0200 Subject: [PATCH 76/99] add build --- .github/workflow/build.yml | 58 ++++++++++++++++++++++++++ addons/sourcemod/scripting/VIP_Core.sp | 4 ++ 2 files changed, 62 insertions(+) create mode 100644 .github/workflow/build.yml diff --git a/.github/workflow/build.yml b/.github/workflow/build.yml new file mode 100644 index 0000000..839367a --- /dev/null +++ b/.github/workflow/build.yml @@ -0,0 +1,58 @@ +name: Build and deploy + +on: + push: + branches: + - '*' + pull_request: + branches: + - '*' + +jobs: + compile: + runs-on: ubuntu-latest + continue-on-error: ${{ matrix.sm-version == '1.11.x' }} + strategy: + matrix: + sm-version: [ '1.9.x', '1.10.x', '1.11.x' ] + # compiler-options: [ '', '__MADEBUG=1' ] + + env: + DEBUG: ${{ contains(matrix.compiler-options, '__XDEBUG=1') }} + + name: "SM version ${{ matrix.sm-version }} ${{ matrix.compiler-options != '' && format('({0})', matrix.compiler-options) || '' }}" + steps: + - uses: actions/checkout@v2 + + - name: Setup SP + uses: rumblefrog/setup-sp@master + with: + version: ${{ matrix.sm-version }} + + - name: Run compiler + run: | + cd addons/sourcemod + mkdir plugins + cd scripting + spcomp __GITHUB=1 VIP_Core.sp -E -o ../plugins/VIP_Core.smx -iinclude ${{ matrix.compiler-options }} + + # - name: Make artifact archive + # if: github.ref == 'refs/heads/master' + # run: | + # if [[ "$DEBUG" == "true" ]]; then export CUSTOM_POSTFIX="d"; fi + # SMVERSION_FULL=${{ matrix.sm-version }} + + # export SMVERSION_SHORT=${SMVERSION_FULL:0:-2} + # export ARCHIVE_FILENAME=sbma-newplugin.${GITHUB_SHA::7}.${SMVERSION_SHORT}${CUSTOM_POSTFIX}.tar.gz + + # echo "ARCHIVE_FILENAME=$ARCHIVE_FILENAME" >> $GITHUB_ENV + # echo "SMVERSION_SHORT=$SMVERSION_SHORT" >> $GITHUB_ENV + + # tar -cvf $ARCHIVE_FILENAME addons + + - name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: VIP-Core + path: VIP-Core + \ No newline at end of file diff --git a/addons/sourcemod/scripting/VIP_Core.sp b/addons/sourcemod/scripting/VIP_Core.sp index ec68237..5efd83e 100644 --- a/addons/sourcemod/scripting/VIP_Core.sp +++ b/addons/sourcemod/scripting/VIP_Core.sp @@ -6,8 +6,12 @@ #include #if !defined VIP_CORE_VERSION +#if defined COMMIT_HASH +#define VIP_CORE_VERSION "3.1.0 DEV (#" ... COMMIT_HASH ... ")" +#else #define VIP_CORE_VERSION "3.1.0 DEV" #endif +#endif #define DEBUG_MODE 0 // Режим отладки From 12d40453765ee226f9b379476f0eafe0e1efea52 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sun, 20 Mar 2022 21:18:10 +0200 Subject: [PATCH 77/99] build --- .github/workflow/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflow/build.yml b/.github/workflow/build.yml index 839367a..c31dc99 100644 --- a/.github/workflow/build.yml +++ b/.github/workflow/build.yml @@ -20,7 +20,7 @@ jobs: env: DEBUG: ${{ contains(matrix.compiler-options, '__XDEBUG=1') }} - name: "SM version ${{ matrix.sm-version }} ${{ matrix.compiler-options != '' && format('({0})', matrix.compiler-options) || '' }}" + name: "Build SM ${{ matrix.sm-version }} ${{ matrix.compiler-options != '' && format('({0})', matrix.compiler-options) || '' }}" steps: - uses: actions/checkout@v2 From a0fe84c26ac75b65dbbf9f06e163514f5934948b Mon Sep 17 00:00:00 2001 From: R1KO Date: Sun, 20 Mar 2022 21:20:04 +0200 Subject: [PATCH 78/99] fix build --- .github/workflow/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflow/build.yml b/.github/workflow/build.yml index c31dc99..d0469f3 100644 --- a/.github/workflow/build.yml +++ b/.github/workflow/build.yml @@ -1,4 +1,4 @@ -name: Build and deploy +name: Build on: push: @@ -34,7 +34,7 @@ jobs: cd addons/sourcemod mkdir plugins cd scripting - spcomp __GITHUB=1 VIP_Core.sp -E -o ../plugins/VIP_Core.smx -iinclude ${{ matrix.compiler-options }} + spcomp VIP_Core.sp -E -o ../plugins/VIP_Core.smx -iinclude ${{ matrix.compiler-options }} # - name: Make artifact archive # if: github.ref == 'refs/heads/master' From abe4e343b9e272e07bd430d4e0e35c4c684f734b Mon Sep 17 00:00:00 2001 From: R1KO Date: Sun, 20 Mar 2022 21:34:59 +0200 Subject: [PATCH 79/99] fix build --- .github/workflow/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflow/build.yml b/.github/workflow/build.yml index d0469f3..0f5f3c9 100644 --- a/.github/workflow/build.yml +++ b/.github/workflow/build.yml @@ -54,5 +54,4 @@ jobs: uses: actions/upload-artifact@v3 with: name: VIP-Core - path: VIP-Core - \ No newline at end of file + path: addons From d086be436f8eeaba6b652664eafd787219191086 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sun, 20 Mar 2022 22:04:04 +0200 Subject: [PATCH 80/99] fix build --- .github/workflow/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflow/build.yml b/.github/workflow/build.yml index 0f5f3c9..34cbb73 100644 --- a/.github/workflow/build.yml +++ b/.github/workflow/build.yml @@ -3,10 +3,10 @@ name: Build on: push: branches: - - '*' + - '**' # matches every branch pull_request: branches: - - '*' + - '**' # matches every branch jobs: compile: From 5fd895fbff13e9e5902ec7185105124be0d725f0 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sun, 20 Mar 2022 22:08:37 +0200 Subject: [PATCH 81/99] fix upload artifacts --- .github/workflow/build.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflow/build.yml b/.github/workflow/build.yml index 34cbb73..4dc5af3 100644 --- a/.github/workflow/build.yml +++ b/.github/workflow/build.yml @@ -3,10 +3,14 @@ name: Build on: push: branches: - - '**' # matches every branch + - '*' + - 'master' + - 'add_internal_storage' pull_request: branches: - - '**' # matches every branch + - '*' + - 'master' + - 'add_internal_storage' jobs: compile: @@ -51,7 +55,7 @@ jobs: # tar -cvf $ARCHIVE_FILENAME addons - name: Upload artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v3 with: name: VIP-Core path: addons From 17a3a8c91f26314867e3f59e3f8d9ea2fe9c8935 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sun, 20 Mar 2022 22:27:47 +0200 Subject: [PATCH 82/99] fix create artifacts --- .github/workflow/build.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflow/build.yml b/.github/workflow/build.yml index 4dc5af3..4ef8e1c 100644 --- a/.github/workflow/build.yml +++ b/.github/workflow/build.yml @@ -53,9 +53,8 @@ jobs: # echo "SMVERSION_SHORT=$SMVERSION_SHORT" >> $GITHUB_ENV # tar -cvf $ARCHIVE_FILENAME addons - - - name: Upload artifact - uses: actions/upload-artifact@v3 + - name: Upload artifact + uses: actions/upload-artifact@v3 with: name: VIP-Core - path: addons + path: ../VIP-Core From 2a8d16af2b1c9aef19fd0938101711b55b468d1f Mon Sep 17 00:00:00 2001 From: R1KO Date: Sun, 20 Mar 2022 22:28:58 +0200 Subject: [PATCH 83/99] fix ci --- .github/workflow/build.yml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/.github/workflow/build.yml b/.github/workflow/build.yml index 4ef8e1c..0387d10 100644 --- a/.github/workflow/build.yml +++ b/.github/workflow/build.yml @@ -1,16 +1,6 @@ name: Build -on: - push: - branches: - - '*' - - 'master' - - 'add_internal_storage' - pull_request: - branches: - - '*' - - 'master' - - 'add_internal_storage' +on: [push, pull_request, workflow_dispatch] jobs: compile: From bdffc796b92f06d4ea7af9ac4eef983485ba128a Mon Sep 17 00:00:00 2001 From: R1KO Date: Tue, 5 Apr 2022 22:51:05 +0300 Subject: [PATCH 84/99] fix compile errors --- addons/sourcemod/scripting/vip/API.sp | 6 ++---- addons/sourcemod/scripting/vip/Downloads.sp | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 5d21a6f..fad5a13 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -569,7 +569,7 @@ public int Native_SendClientVIPMenu(Handle hPlugin, int iNumParams) if (bSelection) { g_hVIPMenu.Display(iClient, MENU_TIME_FOREVER); - return; + return 0; } int iItem = 0; @@ -981,8 +981,6 @@ void UnregisterFeature(const char[] szFeature, ArrayList hArray) CallForward_OnFeatureUnregistered(szFeature); DebugMessage("Feature \"%s\" unregistered", szFeature) - - return 0; } public int Native_IsValidFeature(Handle hPlugin, int iNumParams) @@ -1193,7 +1191,7 @@ public int Native_GiveClientFeature(Handle hPlugin, int iNumParams) char szValue[PMP]; GetNativeString(3, SZF(szValue)); - if ((IS_CLIENT_VIP(iClient)) + if (IS_CLIENT_VIP(iClient)) { Clients_InitVIPClient(iClient, -1, NULL_STRING, 0); g_hFeatures[iClient].SetValue(KEY_CID, -1); diff --git a/addons/sourcemod/scripting/vip/Downloads.sp b/addons/sourcemod/scripting/vip/Downloads.sp index 01d4638..77e9236 100644 --- a/addons/sourcemod/scripting/vip/Downloads.sp +++ b/addons/sourcemod/scripting/vip/Downloads.sp @@ -78,7 +78,7 @@ void Dir_AddToDownloadsTable(const char[] szPath) if ( UTIL_StrCmpEx(szDirEntry, ".") || UTIL_StrCmpEx(szDirEntry, "..") || - UTIL_StrCmpEx(szDirEntry[strlen(szDirEntry)-4], ".bz2"))) + UTIL_StrCmpEx(szDirEntry[strlen(szDirEntry)-4], ".bz2")) { continue; } From 0c7ba9ae23fb0dd00c46274d902c330f9bee385a Mon Sep 17 00:00:00 2001 From: R1KO Date: Tue, 5 Apr 2022 23:09:06 +0300 Subject: [PATCH 85/99] fix open vip menu from api --- addons/sourcemod/scripting/VIP_Core.sp | 4 ---- addons/sourcemod/scripting/vip/API.sp | 4 ++-- addons/sourcemod/scripting/vip/VipMenu.sp | 7 ++++--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/addons/sourcemod/scripting/VIP_Core.sp b/addons/sourcemod/scripting/VIP_Core.sp index 5efd83e..ec68237 100644 --- a/addons/sourcemod/scripting/VIP_Core.sp +++ b/addons/sourcemod/scripting/VIP_Core.sp @@ -6,12 +6,8 @@ #include #if !defined VIP_CORE_VERSION -#if defined COMMIT_HASH -#define VIP_CORE_VERSION "3.1.0 DEV (#" ... COMMIT_HASH ... ")" -#else #define VIP_CORE_VERSION "3.1.0 DEV" #endif -#endif #define DEBUG_MODE 0 // Режим отладки diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index fad5a13..d99b50c 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -568,14 +568,14 @@ public int Native_SendClientVIPMenu(Handle hPlugin, int iNumParams) if (bSelection) { - g_hVIPMenu.Display(iClient, MENU_TIME_FOREVER); + DisplayVipMenu(iClient); return 0; } int iItem = 0; g_hFeatures[iClient].GetValue(KEY_MENUITEM, iItem); - g_hVIPMenu.DisplayAt(iClient, iItem, MENU_TIME_FOREVER); + DisplayVipMenu(iClient, iItem); return 0; } diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index 10aacf6..18ceb02 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -308,10 +308,11 @@ bool IsTranslationPhraseExists(const char[] szPhrase) return true; } -void DisplayVipMenu(int iClient) +void DisplayVipMenu(int iClient, int iItem = 0) { - bool bResult = g_hVIPMenu.Display(iClient, MENU_TIME_FOREVER); - if (!bResult) { + bool bResult = g_hVIPMenu.DisplayAt(iClient, iItem, MENU_TIME_FOREVER); + if (!bResult) + { DisplayEmptyFeaturesMenu(iClient); } } From d58c1d8fea54afacb1f09a77a2e4f0430fdc9bd5 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sun, 10 Apr 2022 14:45:32 +0300 Subject: [PATCH 86/99] fix ci --- .github/workflow/build.yml | 50 ---------------- .travis.yml | 59 ------------------- .../sourcemod/scripting/include/vip_core.inc | 2 +- addons/sourcemod/scripting/vip/Debugger.sp | 4 +- 4 files changed, 3 insertions(+), 112 deletions(-) delete mode 100644 .github/workflow/build.yml delete mode 100644 .travis.yml diff --git a/.github/workflow/build.yml b/.github/workflow/build.yml deleted file mode 100644 index 0387d10..0000000 --- a/.github/workflow/build.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Build - -on: [push, pull_request, workflow_dispatch] - -jobs: - compile: - runs-on: ubuntu-latest - continue-on-error: ${{ matrix.sm-version == '1.11.x' }} - strategy: - matrix: - sm-version: [ '1.9.x', '1.10.x', '1.11.x' ] - # compiler-options: [ '', '__MADEBUG=1' ] - - env: - DEBUG: ${{ contains(matrix.compiler-options, '__XDEBUG=1') }} - - name: "Build SM ${{ matrix.sm-version }} ${{ matrix.compiler-options != '' && format('({0})', matrix.compiler-options) || '' }}" - steps: - - uses: actions/checkout@v2 - - - name: Setup SP - uses: rumblefrog/setup-sp@master - with: - version: ${{ matrix.sm-version }} - - - name: Run compiler - run: | - cd addons/sourcemod - mkdir plugins - cd scripting - spcomp VIP_Core.sp -E -o ../plugins/VIP_Core.smx -iinclude ${{ matrix.compiler-options }} - - # - name: Make artifact archive - # if: github.ref == 'refs/heads/master' - # run: | - # if [[ "$DEBUG" == "true" ]]; then export CUSTOM_POSTFIX="d"; fi - # SMVERSION_FULL=${{ matrix.sm-version }} - - # export SMVERSION_SHORT=${SMVERSION_FULL:0:-2} - # export ARCHIVE_FILENAME=sbma-newplugin.${GITHUB_SHA::7}.${SMVERSION_SHORT}${CUSTOM_POSTFIX}.tar.gz - - # echo "ARCHIVE_FILENAME=$ARCHIVE_FILENAME" >> $GITHUB_ENV - # echo "SMVERSION_SHORT=$SMVERSION_SHORT" >> $GITHUB_ENV - - # tar -cvf $ARCHIVE_FILENAME addons - - name: Upload artifact - uses: actions/upload-artifact@v3 - with: - name: VIP-Core - path: ../VIP-Core diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index fcaefd0..0000000 --- a/.travis.yml +++ /dev/null @@ -1,59 +0,0 @@ -#General settings -dist: xenial -os: linux - -#Install some apt packages needed for spcomp -addons: - apt_packages: - - lib32z1 - - lib32stdc++6 - -language: c - -#Set the build environment -env: - global: - - INCLUDE=addons/sourcemod/scripting/include - - SCRIPTING=addons/sourcemod/scripting - - PLUGINS=addons/sourcemod/plugins - jobs: - - SMVERSION=1.9 - - SMVERSION=1.10 - - SMVERSION=1.11 - -jobs: - allow_failures: - - env: SMVERSION=1.11 - -install: - # Sourcemod download - - wget --input-file=http://sourcemod.net/smdrop/$SMVERSION/sourcemod-latest-linux - - tar -xzf $(cat sourcemod-latest-linux) -before_script: - - chmod +x $SCRIPTING/spcomp - - mkdir $SCRIPTING/compiled - - mkdir build - - cp -R addons build - - cp LICENSE build -script: - - $SCRIPTING/spcomp -E -o$SCRIPTING'/compiled/VIP_Core' -v0 $SCRIPTING'/VIP_Core.sp' - -#Release -before_deploy: - - ls -lR - - cp $SCRIPTING/compiled/VIP_Core.smx build/$PLUGINS - - zip -rq VIP_Core.zip build - - tar -czf VIP_Core.tar.gz build -deploy: - provider: releases - token: ${GH_TOKEN} - file: - - VIP_Core.zip - - VIP_Core.tar.gz - draft: true - on: - tags: true - -#Notifications -notifications: - email: true diff --git a/addons/sourcemod/scripting/include/vip_core.inc b/addons/sourcemod/scripting/include/vip_core.inc index d0b2e8b..49a2881 100644 --- a/addons/sourcemod/scripting/include/vip_core.inc +++ b/addons/sourcemod/scripting/include/vip_core.inc @@ -624,7 +624,7 @@ native bool VIP_RemoveClientFeature(int iClient, const char[] szFeature); /** - * Сохраняет значение в хранилище игрока + * Сохраняет значение в хранилище игрока (сохраняется при переподключении) * * @param iClient Индекс игрока. * @param szKey Ключ diff --git a/addons/sourcemod/scripting/vip/Debugger.sp b/addons/sourcemod/scripting/vip/Debugger.sp index 8e9edef..87a87d7 100644 --- a/addons/sourcemod/scripting/vip/Debugger.sp +++ b/addons/sourcemod/scripting/vip/Debugger.sp @@ -16,9 +16,9 @@ void DebugMsg(const char[] sMsg, any ...) // #define LOG_RESPONSE // Ответы SQL запросов // #define LOG_API // API // #define LOG_FEATURES // API -#define LOG_CLIENTS // API +// #define LOG_CLIENTS // API // #define LOG_DB // API -#define LOG_STORAGE +// #define LOG_STORAGE #else #define DebugMessage(%0) From ca1d22aed80f96705135e6d2d8af6166c758d786 Mon Sep 17 00:00:00 2001 From: R1KO Date: Mon, 11 Apr 2022 00:12:04 +0300 Subject: [PATCH 87/99] Add cvar "sm_vip_storage_id" --- addons/sourcemod/scripting/vip/API.sp | 6 +-- addons/sourcemod/scripting/vip/AdminMenu.sp | 4 +- addons/sourcemod/scripting/vip/CMD.sp | 2 +- addons/sourcemod/scripting/vip/Clients.sp | 2 +- addons/sourcemod/scripting/vip/Cvars.sp | 31 +++++++++++++-- addons/sourcemod/scripting/vip/Database.sp | 38 +++++++++---------- addons/sourcemod/scripting/vip/Global.sp | 4 +- addons/sourcemod/scripting/vip/Storage.sp | 6 +-- .../sourcemod/scripting/vip/adminmenu/List.sp | 6 +-- 9 files changed, 61 insertions(+), 38 deletions(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index 5271f8b..f076b82 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -453,7 +453,7 @@ public int Native_SetClientVIPGroup(Handle hPlugin, int iNumParams) if (g_hFeatures[iClient].GetValue(KEY_CID, iClientID) && iClientID != -1) { char szQuery[PMP]; - FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `group` = '%s' WHERE `account_id` = %d%s;", szGroup, iClientID, g_szSID); + FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `group` = '%s' WHERE `account_id` = %d%s;", szGroup, iClientID, g_szServerID); DBG_SQL_Query(szQuery) g_hDatabase.Query(SQL_Callback_ChangeClientSettings, szQuery, UID(iClient)); @@ -509,7 +509,7 @@ public int Native_SetClientAccessTime(Handle hPlugin, int iNumParams) if (g_hFeatures[iClient].GetValue(KEY_CID, iClientID) && iClientID != -1) { char szQuery[PMP]; - FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `expires` = %d WHERE `account_id` = %d%s;", iTime, iClientID, g_szSID); + FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `expires` = %d WHERE `account_id` = %d%s;", iTime, iClientID, g_szServerID); DBG_SQL_Query(szQuery) g_hDatabase.Query(SQL_Callback_ChangeClientSettings, szQuery, UID(iClient)); } @@ -1324,7 +1324,7 @@ public int Native_GetDatabase(Handle hPlugin, int iNumParams) public int Native_GetDatabaseType(Handle hPlugin, int iNumParams) { - return (GLOBAL_INFO & IS_MySQL); + return DB_IsMysql(); } public int Native_TimeToSeconds(Handle hPlugin, int iNumParams) diff --git a/addons/sourcemod/scripting/vip/AdminMenu.sp b/addons/sourcemod/scripting/vip/AdminMenu.sp index 83354e2..2550656 100644 --- a/addons/sourcemod/scripting/vip/AdminMenu.sp +++ b/addons/sourcemod/scripting/vip/AdminMenu.sp @@ -435,7 +435,7 @@ public int MenuHandler_TimeMenu(Menu hMenu, MenuAction action, int iClient, int g_hClientData[iClient].SetValue(DATA_KEY_Time, iExpires); char szQuery[512]; - FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `expires` = '%d' WHERE `account_id` = '%d'%s;", iExpires, iTarget, g_szSID); + FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `expires` = '%d' WHERE `account_id` = '%d'%s;", iExpires, iTarget, g_szServerID); DBG_SQL_Query(szQuery) g_hDatabase.Query(SQL_Callback_ChangeTime, szQuery, UID(iClient)); @@ -539,7 +539,7 @@ public int MenuHandler_GroupsList(Menu hMenu, MenuAction action, int iClient, in g_hClientData[iClient].GetString(DATA_KEY_Name, SZF(szName)); g_hClientData[iClient].GetString(DATA_KEY_Group, SZF(szOldGroup)); - FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `group` = '%s' WHERE `account_id` = %d%s;", szGroup, iTargetID, g_szSID); + FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `group` = '%s' WHERE `account_id` = %d%s;", szGroup, iTargetID, g_szServerID); DBG_SQL_Query(szQuery) g_hDatabase.Query(SQL_Callback_ErrorCheck, szQuery); diff --git a/addons/sourcemod/scripting/vip/CMD.sp b/addons/sourcemod/scripting/vip/CMD.sp index c3f5049..4c9f9ca 100644 --- a/addons/sourcemod/scripting/vip/CMD.sp +++ b/addons/sourcemod/scripting/vip/CMD.sp @@ -146,7 +146,7 @@ public Action DelVIP_CMD(int iClient, int iArgs) FormatEx(SZF(szQuery), "SELECT `account_id`, `name`, `group` \ FROM `vip_users` \ - WHERE `account_id` = %d%s LIMIT 1;", iAccountID, g_szSID); + WHERE `account_id` = %d%s LIMIT 1;", iAccountID, g_szServerID); DebugMessage(szQuery) if (iClient) diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index 08ad817..95ffbf7 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -75,7 +75,7 @@ void Clients_LoadClient(int iClient, bool bNotify) FormatEx(SZF(szQuery), "SELECT `expires`, `group`, `name` \ FROM `vip_users` \ WHERE `account_id` = %d%s LIMIT 1;", - iAccountID, g_szSID); + iAccountID, g_szServerID); DataPack hDataPack = new DataPack(); hDataPack.WriteCell(UID(iClient)); diff --git a/addons/sourcemod/scripting/vip/Cvars.sp b/addons/sourcemod/scripting/vip/Cvars.sp index 717b406..092d0ab 100644 --- a/addons/sourcemod/scripting/vip/Cvars.sp +++ b/addons/sourcemod/scripting/vip/Cvars.sp @@ -14,6 +14,11 @@ void Cvars_Setup() g_CVAR_iServerID = hCvar.IntValue; SetupServerID(); + hCvar = CreateConVar("sm_vip_storage_id", "0", "ID группы серверов для хранилища данных игроков", _, true, 0.0); + hCvar.AddChangeHook(OnStorageIDChange); + g_CVAR_iStorageID = hCvar.IntValue; + SetupStorageID(); + hCvar = CreateConVar("sm_vip_auto_open_menu", "0", "Автоматически открывать VIP-меню при входе (0 - Выключено, 1 - Включено)", _, true, 0.0, true, 1.0); hCvar.AddChangeHook(OnAutoOpenMenuChange); g_CVAR_bAutoOpenMenu = hCvar.BoolValue; @@ -71,17 +76,35 @@ public void OnServerIDChange(ConVar hCvar, const char[] szOldValue, const char[] void SetupServerID() { - if (GLOBAL_INFO & IS_MySQL) + if (DB_IsMysql()) { #if USE_MORE_SERVERS 1 - FormatEx(SZF(g_szSID), " AND (`sid` = %d OR `sid` = 0)", g_CVAR_iServerID); + FormatEx(SZF(g_szServerID), " AND (`sid` = %d OR `sid` = 0)", g_CVAR_iServerID); #else - FormatEx(SZF(g_szSID), " AND `sid` = %d", g_CVAR_iServerID); + FormatEx(SZF(g_szServerID), " AND `sid` = %d", g_CVAR_iServerID); #endif } else { - g_szSID[0] = 0; + g_szServerID[0] = 0; + } +} + +public void OnStorageIDChange(ConVar hCvar, const char[] szOldValue, const char[] szNewValue) +{ + g_CVAR_iStorageID = hCvar.IntValue; + SetupStorageID(); +} + +void SetupStorageID() +{ + if (DB_IsMysql()) + { + FormatEx(SZF(g_szStorageID), " AND `sid` = %d", g_CVAR_iStorageID); + } + else + { + g_szStorageID[0] = 0; } } diff --git a/addons/sourcemod/scripting/vip/Database.sp b/addons/sourcemod/scripting/vip/Database.sp index 4f28a16..51cca8d 100644 --- a/addons/sourcemod/scripting/vip/Database.sp +++ b/addons/sourcemod/scripting/vip/Database.sp @@ -70,7 +70,7 @@ public void OnDBConnect(Database hDatabase, const char[] szError, int data) } } - DebugMessage("OnDBConnect %x, %u - > (MySQL: %b)", g_hDatabase, g_hDatabase, GLOBAL_INFO & IS_MySQL) + DebugMessage("OnDBConnect %x, %u - > (MySQL: %b)", g_hDatabase, g_hDatabase, DB_IsMysql()) CreateTables(); } @@ -79,14 +79,8 @@ void CreateTables() { DebugMessage("CreateTables") - if (GLOBAL_INFO & IS_MySQL) + if (DB_IsMysql()) { - #if USE_MORE_SERVERS 1 - FormatEx(SZF(g_szSID), " AND (`sid` = %d OR `sid` = 0)", g_CVAR_iServerID); - #else - FormatEx(SZF(g_szSID), " AND `sid` = %d", g_CVAR_iServerID); - #endif - g_hDatabase.Query(SQL_Callback_TableCreate, "CREATE TABLE IF NOT EXISTS `vip_users` (\ `account_id` INT NOT NULL, \ `name` VARCHAR(64) NOT NULL default 'unknown' COLLATE '" ... COLLATION ... "', \ @@ -108,7 +102,7 @@ void CreateTables() } else { - g_szSID[0] = 0; + g_szServerID[0] = 0; g_hDatabase.Query(SQL_Callback_TableCreate, "CREATE TABLE IF NOT EXISTS `vip_users` (\ `account_id` INTEGER PRIMARY KEY NOT NULL, \ @@ -137,7 +131,7 @@ public void SQL_Callback_TableCreate(Database hOwner, DBResultSet hResult, const return; } - if (GLOBAL_INFO & IS_MySQL) + if (DB_IsMysql()) { g_hDatabase.Query(SQL_Callback_ErrorCheck, "SET NAMES '" ... CHARSET ... "'"); g_hDatabase.Query(SQL_Callback_ErrorCheck, "SET CHARSET '" ... CHARSET ... "'"); @@ -174,7 +168,7 @@ void RemoveExpAndOutPlayers() if (g_CVAR_iDeleteExpired >= 0) { char szQuery[PMP]; - FormatEx(SZF(szQuery), "SELECT `account_id`, `name`, `group` FROM `vip_users` WHERE `expires` > 0 AND `expires` < %d%s;", (GetTime() - g_CVAR_iDeleteExpired*86400), g_szSID); + FormatEx(SZF(szQuery), "SELECT `account_id`, `name`, `group` FROM `vip_users` WHERE `expires` > 0 AND `expires` < %d%s;", (GetTime() - g_CVAR_iDeleteExpired*86400), g_szServerID); DBG_SQL_Query(szQuery) DebugMessage(szQuery) @@ -184,7 +178,7 @@ void RemoveExpAndOutPlayers() if (g_CVAR_iOutdatedExpired > 0) { char szQuery[PMP]; - FormatEx(SZF(szQuery), "SELECT `account_id`, `name`, `group` FROM `vip_users` WHERE `lastvisit` > 0 AND `lastvisit` < %d%s;", (GetTime() - g_CVAR_iOutdatedExpired*86400), g_szSID); + FormatEx(SZF(szQuery), "SELECT `account_id`, `name`, `group` FROM `vip_users` WHERE `lastvisit` > 0 AND `lastvisit` < %d%s;", (GetTime() - g_CVAR_iOutdatedExpired*86400), g_szServerID); DBG_SQL_Query(szQuery) g_hDatabase.Query(SQL_Callback_SelectExpiredAndOutdated, szQuery, REASON_OUTDATED); @@ -213,11 +207,11 @@ void DB_UpdateClient(int iClient, const char[] szDbName = NULL_STRING) char szName[MNL*2+1]; GetClientName(iClient, szQuery, MNL); g_hDatabase.Escape(szQuery, SZF(szName)); - FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `name` = '%s', `lastvisit` = %d WHERE `account_id` = %d%s;", szName, GetTime(), iClientID, g_szSID); + FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `name` = '%s', `lastvisit` = %d WHERE `account_id` = %d%s;", szName, GetTime(), iClientID, g_szServerID); } else { - FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `lastvisit` = %d WHERE `account_id` = %d%s;", GetTime(), iClientID, g_szSID); + FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `lastvisit` = %d WHERE `account_id` = %d%s;", GetTime(), iClientID, g_szServerID); } DBG_SQL_Query(szQuery) @@ -309,7 +303,7 @@ void DB_AddVipPlayer( strcopy(SZF(szName), "unknown"); } - if (GLOBAL_INFO & IS_MySQL) + if (DB_IsMysql()) { FormatEx(SZF(szQuery), "INSERT INTO `vip_users` (`account_id`, `sid`, `expires`, `group`, `name`, `lastvisit`) VALUES (%d, %d, %d, '%s', '%s', %d) \ ON DUPLICATE KEY UPDATE `expires` = %d, `group` = '%s';", iTargetAccountID, g_CVAR_iServerID, iExpires, szGroup, szName, iLastVisit, iExpires, szGroup); @@ -403,7 +397,7 @@ void DB_RemoveVipPlayer( hDataPack.WriteCell(bNotify); char szQuery[512]; - FormatEx(SZF(szQuery), "SELECT `name`, `group` FROM `vip_users` WHERE `account_id` = %d%s;", iTargetAccountID, g_szSID); + FormatEx(SZF(szQuery), "SELECT `name`, `group` FROM `vip_users` WHERE `account_id` = %d%s;", iTargetAccountID, g_szServerID); DBG_SQL_Query(szQuery) g_hDatabase.Query(SQL_Callback_SelectForRemoveClient, szQuery, hDataPack); @@ -490,7 +484,7 @@ void DB_RemoveVipPlayerByData( hDataPack.WriteCell(bNotify); char szQuery[PMP]; - FormatEx(SZF(szQuery), "DELETE FROM `vip_users` WHERE `account_id` = %d%s;", iTargetAccountID, g_szSID); + FormatEx(SZF(szQuery), "DELETE FROM `vip_users` WHERE `account_id` = %d%s;", iTargetAccountID, g_szServerID); DBG_SQL_Query(szQuery) g_hDatabase.Query(SQL_Callback_RemoveClient, szQuery, hDataPack); @@ -629,7 +623,7 @@ void DB_RemoveClientFromID(int iAdmin = 0, return; } - FormatEx(SZF(szQuery), "SELECT `name`, `group` FROM `vip_users` WHERE `account_id` = %d%s;", iClientID, g_szSID); + FormatEx(SZF(szQuery), "SELECT `name`, `group` FROM `vip_users` WHERE `account_id` = %d%s;", iClientID, g_szServerID); DBG_SQL_Query(szQuery) g_hDatabase.Query(SQL_Callback_SelectRemoveClient, szQuery, hDataPack); @@ -672,7 +666,7 @@ public void SQL_Callback_SelectRemoveClient(Database hOwner, DBResultSet hResult void DB_RemoveClient(int iClientID, DataPack hDataPack) { char szQuery[PMP]; - FormatEx(SZF(szQuery), "DELETE FROM `vip_users` WHERE `account_id` = %d%s;", iClientID, g_szSID); + FormatEx(SZF(szQuery), "DELETE FROM `vip_users` WHERE `account_id` = %d%s;", iClientID, g_szServerID); DBG_SQL_Query(szQuery) g_hDatabase.Query(SQL_Callback_RemoveClient, szQuery, hDataPack); @@ -716,4 +710,8 @@ public void SQL_Callback_RemoveClient(Database hOwner, DBResultSet hResult, cons szGroup ); } -*/ \ No newline at end of file +*/ +bool DB_IsMysql() +{ + return (GLOBAL_INFO & IS_MySQL) == IS_MySQL; +} diff --git a/addons/sourcemod/scripting/vip/Global.sp b/addons/sourcemod/scripting/vip/Global.sp index 03e6246..2cbc6b9 100644 --- a/addons/sourcemod/scripting/vip/Global.sp +++ b/addons/sourcemod/scripting/vip/Global.sp @@ -108,6 +108,7 @@ ConVar g_CVAR_hVIPMenu_CMD; int g_CVAR_iAdminFlag; int g_CVAR_iServerID; +int g_CVAR_iStorageID; int g_CVAR_iTimeMode; int g_CVAR_iDeleteExpired; int g_CVAR_iOutdatedExpired; @@ -120,4 +121,5 @@ bool g_CVAR_bDefaultStatus; EngineVersion g_EngineVersion; bool g_bIsTranslationPhraseExistsAvailable; -char g_szSID[64]; +char g_szServerID[64]; +char g_szStorageID[64]; diff --git a/addons/sourcemod/scripting/vip/Storage.sp b/addons/sourcemod/scripting/vip/Storage.sp index fae77b6..987c990 100644 --- a/addons/sourcemod/scripting/vip/Storage.sp +++ b/addons/sourcemod/scripting/vip/Storage.sp @@ -35,7 +35,7 @@ void Storage_LoadClient(int iClient) FormatEx(SZF(szQuery), "SELECT `key`, `value` \ FROM `vip_storage` \ WHERE `account_id` = %d%s;", - iAccountID, g_szSID); + iAccountID, g_szStorageID); DBG_SQL_Query(szQuery) g_hDatabase.Query(SQL_Callback_OnClientLoadStorage, szQuery, UID(iClient)); @@ -132,13 +132,13 @@ void Storage_SaveClient(int iClient) void Storage_SaveClientValue(int iAccountID, const char[] szKey, const char[] szValue, int iUpdated) { char szQuery[512]; - if (GLOBAL_INFO & IS_MySQL) + if (DB_IsMysql()) { g_hDatabase.Format(SZF(szQuery), "INSERT INTO `vip_storage` (`account_id`, `sid`, `key`, `value`, `updated`) \ VALUES (%d, %d, \"%s\", \"%s\", %d) \ ON DUPLICATE KEY UPDATE \ `value` = \"%s\", `updated` = %d;", - iAccountID, g_CVAR_iServerID, szKey, szValue, iUpdated, szValue, iUpdated); + iAccountID, g_CVAR_iStorageID, szKey, szValue, iUpdated, szValue, iUpdated); } else { diff --git a/addons/sourcemod/scripting/vip/adminmenu/List.sp b/addons/sourcemod/scripting/vip/adminmenu/List.sp index 5adaf45..836b5bf 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/List.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/List.sp @@ -212,14 +212,14 @@ void ShowVipPlayersFromDBMenu(int iClient, int iOffset = 0) } } - if (GLOBAL_INFO & IS_MySQL) + if (DB_IsMysql()) { FormatEx(SZF(szQuery), "SELECT `account_id`, \ `name` \ FROM `vip_users` \ WHERE %s%s \ LIMIT %d, %d;", - g_szSID[5], szWhere, iOffset, LIST_OFFSET); + g_szServerID[5], szWhere, iOffset, LIST_OFFSET); } else { @@ -319,7 +319,7 @@ void ShowTargetInfo(int iClient) `account_id` \ FROM `vip_users` \ WHERE `account_id` = %d%s LIMIT 1;", - iClientID, g_szSID); + iClientID, g_szServerID); DBG_SQL_Query(szQuery) g_hDatabase.Query(SQL_Callback_SelectVipClientInfo, szQuery, UID(iClient)); From 8a12a8f5ebb5312e8540ca1bed0eb07f8ff9bd23 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sat, 16 Apr 2022 16:25:12 +0300 Subject: [PATCH 88/99] fix "VIP_OnFeatureToggle" --- addons/sourcemod/scripting/vip/API.sp | 2 +- addons/sourcemod/scripting/vip/VipMenu.sp | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/addons/sourcemod/scripting/vip/API.sp b/addons/sourcemod/scripting/vip/API.sp index f076b82..f674efa 100644 --- a/addons/sourcemod/scripting/vip/API.sp +++ b/addons/sourcemod/scripting/vip/API.sp @@ -25,7 +25,7 @@ void API_SetupForwards() g_hGlobalForward_OnVIPClientRemoved = CreateGlobalForward("VIP_OnVIPClientRemoved", ET_Ignore, Param_Cell, Param_String, Param_Cell); g_hGlobalForward_OnPlayerSpawn = CreateGlobalForward("VIP_OnPlayerSpawn", ET_Ignore, Param_Cell, Param_Cell, Param_Cell); g_hGlobalForward_OnShowClientInfo = CreateGlobalForward("VIP_OnShowClientInfo", ET_Hook, Param_Cell, Param_String, Param_String, Param_Cell); - g_hGlobalForward_OnFeatureToggle = CreateGlobalForward("VIP_OnFeatureToggle", ET_Ignore, Param_Cell, Param_String, Param_Cell, Param_CellByRef); + g_hGlobalForward_OnFeatureToggle = CreateGlobalForward("VIP_OnFeatureToggle", ET_Hook, Param_Cell, Param_String, Param_Cell, Param_CellByRef); g_hGlobalForward_OnFeatureRegistered = CreateGlobalForward("VIP_OnFeatureRegistered", ET_Ignore, Param_String); g_hGlobalForward_OnFeatureUnregistered = CreateGlobalForward("VIP_OnFeatureUnregistered", ET_Ignore, Param_String); g_hGlobalForward_OnClientDisconnect = CreateGlobalForward("VIP_OnClientDisconnect", ET_Ignore, Param_Cell, Param_Cell); diff --git a/addons/sourcemod/scripting/vip/VipMenu.sp b/addons/sourcemod/scripting/vip/VipMenu.sp index c35e828..6fc7191 100644 --- a/addons/sourcemod/scripting/vip/VipMenu.sp +++ b/addons/sourcemod/scripting/vip/VipMenu.sp @@ -232,6 +232,7 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti eOldStatus = Features_GetStatus(iClient, szFeature); eNewStatus = (eOldStatus == ENABLED) ? DISABLED : ENABLED; + eNewStatus = CallForward_OnFeatureToggle(iClient, szFeature, eOldStatus, eNewStatus); if (fCallback != INVALID_FUNCTION) { eNewStatus = Function_OnItemToggle(hPlugin, fCallback, iClient, szFeature, eOldStatus, eNewStatus); @@ -239,12 +240,8 @@ public int Handler_VIPMenu(Menu hMenu, MenuAction action, int iClient, int iOpti if (eNewStatus != eOldStatus) { - eNewStatus = CallForward_OnFeatureToggle(iClient, szFeature, eOldStatus, eNewStatus); - if (eNewStatus != eOldStatus) - { - Features_SetStatus(iClient, szFeature, eNewStatus); - Features_SetStatusToStorage(iClient, szFeature, eNewStatus); - } + Features_SetStatus(iClient, szFeature, eNewStatus); + Features_SetStatusToStorage(iClient, szFeature, eNewStatus); } hMenu.DisplayAt(iClient, hMenu.Selection, MENU_TIME_FOREVER); From 77c0114646eaeb768bfa4ededff4b43051b92dc6 Mon Sep 17 00:00:00 2001 From: R1KO Date: Wed, 20 Apr 2022 00:14:42 +0300 Subject: [PATCH 89/99] Fix mysql server id --- addons/sourcemod/scripting/vip/Database.sp | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/sourcemod/scripting/vip/Database.sp b/addons/sourcemod/scripting/vip/Database.sp index 51cca8d..85ac281 100644 --- a/addons/sourcemod/scripting/vip/Database.sp +++ b/addons/sourcemod/scripting/vip/Database.sp @@ -72,6 +72,7 @@ public void OnDBConnect(Database hDatabase, const char[] szError, int data) DebugMessage("OnDBConnect %x, %u - > (MySQL: %b)", g_hDatabase, g_hDatabase, DB_IsMysql()) + SetupServerID(); CreateTables(); } From b48a3ec9eaff53fdcbd2b0a36b230bfed1fc5629 Mon Sep 17 00:00:00 2001 From: Mikhail Buchka <52104782+domikuss@users.noreply.github.com> Date: Mon, 25 Apr 2022 04:53:49 +0400 Subject: [PATCH 90/99] Typo --- addons/sourcemod/data/vip/cfg/info.ini | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/sourcemod/data/vip/cfg/info.ini b/addons/sourcemod/data/vip/cfg/info.ini index ff02670..af64262 100644 --- a/addons/sourcemod/data/vip/cfg/info.ini +++ b/addons/sourcemod/data/vip/cfg/info.ini @@ -18,7 +18,7 @@ "time" "12" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) | After how many seconds the menu will be closed automatically (0 - until the player closes himself) "ru" { - // Пукнты меню | Menu Items + // Пункты меню | Menu Items "item" "Вы имеете VIP-статус" "item" "SPACER" "item" "Ник: {NAME}" @@ -62,7 +62,7 @@ "time" "30" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) | After how many seconds the menu will be closed automatically (0 - until the player closes himself) "ru" { - // Пукнты меню | Menu Items + // Пункты меню | Menu Items "item" "Вы имеете VIP-статус" "item" "Группа: {GROUP}" } @@ -85,7 +85,7 @@ "time" "12" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) | After how many seconds the menu will be closed automatically (0 - until the player closes himself) "ru" { - // Пукнты меню | Menu Items + // Пункты меню | Menu Items "item" "У вас нет доступа к этому меню" "item" "Чтобы приобрести VIP-статус" "item" "Oбратитесь к администратору" @@ -118,7 +118,7 @@ "time" "12" // Через сколько секунд меню будет закрыто автоматически (0 - пока игрок сам не закроет) | After how many seconds the menu will be closed automatically (0 - until the player closes himself) "ru" { - // Пукнты меню | Menu Items + // Пункты меню | Menu Items "item" "Срок вашего VIP-статуса истек" "item" "Чтобы вновь приобрести VIP-статус" "item" "Oбратитесь к администратору" From be71ee0ae046af90c3da9da07c933ec054679090 Mon Sep 17 00:00:00 2001 From: Mikhail Buchka <52104782+domikuss@users.noreply.github.com> Date: Mon, 25 Apr 2022 05:08:04 +0400 Subject: [PATCH 91/99] Typo and tab fix --- .../translations/vip_core.phrases.txt | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/addons/sourcemod/translations/vip_core.phrases.txt b/addons/sourcemod/translations/vip_core.phrases.txt index 030cb6a..6cc4c27 100644 --- a/addons/sourcemod/translations/vip_core.phrases.txt +++ b/addons/sourcemod/translations/vip_core.phrases.txt @@ -669,7 +669,7 @@ } "FIND_THE_ID_FAIL" { - "en" "Synax: sm_delvip " + "en" "Syntax: sm_delvip " "fi" "Käyttö: sm_delvip " "de" "Synax: sm_delvip " "pt" "Sintaxe: sm_delvip " @@ -729,17 +729,17 @@ "ua" "Зазначена VIP-група не існує!" } "FIND_PLAYER" - { - "en" "Search for a player" - "pt" "Buscar por um jogador" + { + "en" "Search for a player" + "pt" "Buscar por um jogador" "ru" "Найти игрока" - } - "SHOW_ALL" - { - "en" "Show all players" - "pt" "Mostrar todos jogadores" + } + "SHOW_ALL" + { + "en" "Show all players" + "pt" "Mostrar todos jogadores" "ru" "Показать всех" - } + } "y." { "en" "y." From a2a0bebc3dc1e128d113abab596cd67781166321 Mon Sep 17 00:00:00 2001 From: Mikhail Buchka <52104782+domikuss@users.noreply.github.com> Date: Mon, 25 Apr 2022 10:17:09 +0400 Subject: [PATCH 92/99] Update List.sp Removed unnecessary log output --- addons/sourcemod/scripting/vip/adminmenu/List.sp | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/sourcemod/scripting/vip/adminmenu/List.sp b/addons/sourcemod/scripting/vip/adminmenu/List.sp index 836b5bf..8f9200e 100644 --- a/addons/sourcemod/scripting/vip/adminmenu/List.sp +++ b/addons/sourcemod/scripting/vip/adminmenu/List.sp @@ -192,7 +192,6 @@ public int MenuHandler_SearchPlayersListMenu(Menu hMenu, MenuAction action, int void ShowVipPlayersFromDBMenu(int iClient, int iOffset = 0) { - LogMessage("ShowVipPlayersFromDBMenu"); g_hClientData[iClient].SetValue(DATA_KEY_MenuListType, MENU_TYPE_DB_LIST); g_hClientData[iClient].SetValue(DATA_KEY_Offset, iOffset); From 2a738cac0c7794039f0642be53716c6d6c6f46d4 Mon Sep 17 00:00:00 2001 From: R1KO Date: Sun, 11 Sep 2022 21:26:00 +0300 Subject: [PATCH 93/99] fix errors --- .gitattributes | 3 +- addons/sourcemod/scripting/vip/Clients.sp | 1613 ++++++++++---------- addons/sourcemod/scripting/vip/Database.sp | 1436 ++++++++--------- updates.md | 582 +++---- 4 files changed, 1819 insertions(+), 1815 deletions(-) diff --git a/.gitattributes b/.gitattributes index 4868048..b786d55 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,3 @@ *.sp gitlab-language=cpp -*.inc gitlab-language=cpp \ No newline at end of file +*.inc gitlab-language=cpp +* text eol=lf diff --git a/addons/sourcemod/scripting/vip/Clients.sp b/addons/sourcemod/scripting/vip/Clients.sp index 95ffbf7..c2c702e 100644 --- a/addons/sourcemod/scripting/vip/Clients.sp +++ b/addons/sourcemod/scripting/vip/Clients.sp @@ -1,805 +1,808 @@ - -void Clients_ResetClient(int iClient) -{ - g_iClientInfo[iClient] = 0; - - UTIL_CloseHandleEx(g_hFeatures[iClient]); - UTIL_CloseHandleEx(g_hFeatureStatus[iClient]); -} - -public void OnClientPutInServer(int iClient) -{ - // g_iClientInfo[iClient] = 0; - DBG_CLIENTS("OnClientPutInServer %N (%d): %b", iClient, iClient, g_iClientInfo[iClient]) - - if (IsFakeClient(iClient) || IsClientSourceTV(iClient)) - { - return; - } - - Storage_LoadClient(iClient); - Clients_CheckVipAccess(iClient, true, true); -} - -public void OnClientDisconnect(int iClient) -{ - /* if (g_bIsClientVIP[iClient]) - { - SaveClient(iClient); - }*/ - - if (!IsFakeClient(iClient)) - { - CallForward_OnClientDisconnect(iClient); - Storage_SaveClient(iClient); - } - - Clients_ResetClient(iClient); - UTIL_CloseHandleEx(g_hClientData[iClient]); - g_iClientInfo[iClient] = 0; - - Storage_ResetClient(iClient); -} - -void Clients_CheckVipAccess(int iClient, bool bNotify = false, bool bForward = false) -{ - if (bForward && !CallForward_OnClientPreLoad(iClient)) - { - return; - } - - Clients_ResetClient(iClient); - - // UNSET_BIT(g_iClientInfo[iClient], IS_LOADED); - - if (IsFakeClient(iClient) == false && (GLOBAL_INFO & IS_STARTED) && g_hDatabase) - { - Clients_LoadClient(iClient, bNotify); - // DBG_CLIENTS("Clients_CheckVipAccess %N:\tИгрок %sявляется VIP игроком", iClient, g_bIsClientVIP[iClient] ? "":"не ") - } - else - { - SET_BIT(g_iClientInfo[iClient], IS_LOADED); - CallForward_OnClientLoaded(iClient); - } -} - -void Clients_LoadClient(int iClient, bool bNotify) -{ - char szQuery[512]; - - int iAccountID = GetSteamAccountID(iClient); - - DBG_CLIENTS("Clients_LoadClient %N (%d), %b: - > %x, %u", iClient, iClient, g_iClientInfo[iClient], g_hDatabase, g_hDatabase) - - FormatEx(SZF(szQuery), "SELECT `expires`, `group`, `name` \ - FROM `vip_users` \ - WHERE `account_id` = %d%s LIMIT 1;", - iAccountID, g_szServerID); - - DataPack hDataPack = new DataPack(); - hDataPack.WriteCell(UID(iClient)); - hDataPack.WriteCell(iAccountID); - hDataPack.WriteCell(bNotify); - - DBG_SQL_Query(szQuery) - g_hDatabase.Query(SQL_Callback_OnClientAuthorized, szQuery, hDataPack); -} - -public void SQL_Callback_OnClientAuthorized(Database hOwner, DBResultSet hResult, const char[] szError, any hPack) -{ - DBG_SQL_Response("SQL_Callback_OnClientAuthorized") - DataPack hDataPack = view_as(hPack); - if (hResult == null || szError[0]) - { - LogError("SQL_Callback_OnClientAuthorized: %s", szError); - delete hDataPack; - return; - } - - hDataPack.Reset(); - - int iClient = CID(hDataPack.ReadCell()); - int iAccountID = hDataPack.ReadCell(); - bool bNotify = view_as(hDataPack.ReadCell()); - delete hDataPack; - - DBG_CLIENTS("SQL_Callback_OnClientAuthorized: %d", iClient) - if (!iClient || !IsClientInGame(iClient)) - { - return; - } - - if (!hResult.FetchRow()) - { - OnClientLoaded(iClient); - return; - } - DBG_SQL_Response("hResult.FetchRow()") - - int iExpires = hResult.FetchInt(0); - DBG_SQL_Response("hResult.FetchInt(0) = %d", iExpires) - char szGroup[64]; - hResult.FetchString(1, SZF(szGroup)); - DBG_SQL_Response("hResult.FetchString(1) = '%s", szGroup) - - - LoadClient(iClient, iAccountID, szGroup, iExpires); - - if (IS_CLIENT_VIP(iClient)) - { - char szName[MAX_NAME_LENGTH*2+1]; - hResult.FetchString(2, SZF(szName)); - DB_UpdateClient(iClient, szName); - - if (bNotify) - { - if (g_CVAR_bAutoOpenMenu) - { - g_hVIPMenu.Display(iClient, MENU_TIME_FOREVER); - } - - DisplayClientInfo(iClient, iExpires == 0 ? "connect_info_perm":"connect_info_time"); - } - - Clients_TryLoadFeatures(iClient); - return; - } - - OnClientLoaded(iClient); -} - -void LoadClient(int iClient, int iAccountID, const char[] szGroup, int iExpires) -{ - DBG_CLIENTS("LoadClient: %d, %d, %s, %d", iClient, iAccountID, szGroup, iExpires) - if (!szGroup[0] || !UTIL_CheckValidVIPGroup(szGroup)) - { - LogError("Invalid VIP-Group/Некорректная VIP-группа: %s (Игрок: %d)", szGroup, iAccountID); - return; - } - - if (iExpires > 0) - { - int iTime = GetTime(); - - if (iTime > iExpires) - { - if (g_CVAR_iDeleteExpired == 0 || (g_CVAR_iDeleteExpired > 0 && iTime >= ((g_CVAR_iDeleteExpired * 86400) + iExpires))) - { - LogToFile(g_szLogFile, "%T", "REMOVING_PLAYER", LANG_SERVER, iClient); - - DBG_CLIENTS("Clients_LoadClient %N (%d): >>> Delete", iClient, iClient) - - Clients_RemoveVipPlayer(REASON_EXPIRED, iClient, iAccountID, true); - } - - CallForward_OnVIPClientRemoved(iClient, "Expired"); - - DisplayClientInfo(iClient, "expired_info"); - - return; - } - - Clients_CreateExpiredTimer(iClient, iExpires, iTime); - } - - Clients_InitVIPClient(iClient, iAccountID, szGroup, iExpires); -} - - -void OnClientLoaded(int iClient) -{ - SET_BIT(g_iClientInfo[iClient], IS_LOADED); - CallForward_OnClientLoaded(iClient); -} - -void OnVIPClientLoaded(int iClient) -{ - SET_BIT(g_iClientInfo[iClient], IS_LOADED); - CallForward_OnVIPClientLoaded(iClient); -} - -stock void Clients_OnVIPClientLoaded(int iClient) -{ - Features_TurnOnAll(iClient); - - CallForward_OnVIPClientLoaded(iClient); -} - -void Clients_InitVIPClient(int iClient, int iAccountID = -1, const char[] szGroup = NULL_STRING, int iExpires = 0) -{ - DBG_CLIENTS("Clients_InitVIPClient: %d, %d, %s, %d", iClient, iAccountID, szGroup, iExpires) - g_hFeatures[iClient] = new StringMap(); - g_hFeatureStatus[iClient] = new StringMap(); - - g_hFeatures[iClient].SetValue(KEY_EXPIRES, iExpires); - g_hFeatures[iClient].SetString(KEY_GROUP, szGroup); - g_hFeatures[iClient].SetValue(KEY_CID, iAccountID); - - SET_BIT(g_iClientInfo[iClient], IS_VIP); -} - -#if USE_CLIENTPREFS 1 -public void OnClientCookiesCached(int iClient) -{ - DBG_CLIENTS("OnClientCookiesCached %d %N", iClient, iClient) - - DBG_CLIENTS("AreClientCookiesCached %b", AreClientCookiesCached(iClient)) - //OnClientStorageLoaded(iClient); -} -#else -public void VIP_OnClientStorageLoaded(int iClient) -{ - DBG_CLIENTS("VIP_OnClientStorageLoaded: %d %N", iClient, iClient) - //OnClientStorageLoaded(iClient); -} -#endif -/* -void OnClientStorageLoaded(int iClient) -{ - DBG_CLIENTS("OnClientStorageLoaded: %d %N", iClient, iClient) -} -*/ - -bool IsClientStorageLoaded(int iClient) -{ - #if USE_CLIENTPREFS 1 - DBG_CLIENTS("AreClientCookiesCached: %d %N", iClient, iClient) - return AreClientCookiesCached(iClient); - #else - DBG_CLIENTS("Storage_IsClientLoaded: %d %N", iClient, iClient) - return Storage_IsClientLoaded(iClient); - #endif -} - -void Clients_TryLoadFeatures(int iClient) -{ - DBG_CLIENTS("Clients_TryLoadFeatures %L", iClient) - DBG_CLIENTS("IsClientStorageLoaded %b", IsClientStorageLoaded(iClient)) - - if (!IsClientStorageLoaded(iClient)) - { - // TODO: may be will add attempts counter - DataPack hDataPack = new DataPack(); - hDataPack.WriteCell(UID(iClient)); - CreateTimer(1.0, Timer_CheckStorageLoadFeatures, hDataPack, TIMER_FLAG_NO_MAPCHANGE|TIMER_DATA_HNDL_CLOSE); - return; - } - - Clients_LoadFeatures(iClient); -} - -public Action Timer_CheckStorageLoadFeatures(Handle hTimer, DataPack hDataPack) -{ - hDataPack.Reset(); - int iClient = CID(hDataPack.ReadCell()); - - DBG_CLIENTS("Timer_CheckStorageLoadFeatures -> iClient: %N (%d), IsClientVIP: %b", iClient, iClient, IS_CLIENT_VIP(iClient)) - if (iClient && IS_CLIENT_VIP(iClient)) - { - Clients_TryLoadFeatures(iClient); - } - - return Plugin_Stop; -} - - -void Clients_TryLoadFeature(int iClient, const char[] szFeature) -{ - DBG_CLIENTS("Clients_TryLoadFeature %L", iClient) - - if (!IsClientStorageLoaded(iClient)) - { - DataPack hDataPack = new DataPack(); - hDataPack.WriteCell(UID(iClient)); - hDataPack.WriteString(szFeature); - CreateTimer(1.0, Timer_CheckStorageLoadFeature, hDataPack, TIMER_FLAG_NO_MAPCHANGE|TIMER_DATA_HNDL_CLOSE); - } - - Clients_LoadFeature(iClient, szFeature); -} - -public Action Timer_CheckStorageLoadFeature(Handle hTimer, DataPack hDataPack) -{ - hDataPack.Reset(); - int iClient = CID(hDataPack.ReadCell()); - - DBG_CLIENTS("Timer_CheckStorageLoadFeature -> iClient: %N (%d), IsClientVIP: %b", iClient, iClient, IS_CLIENT_VIP(iClient)) - if (iClient && IS_CLIENT_VIP(iClient)) - { - char szFeature[FEATURE_NAME_LENGTH]; - hDataPack.ReadString(SZF(szFeature)); - Clients_LoadFeature(iClient, szFeature); - } - - return Plugin_Stop; -} - -void Clients_LoadFeatures(int iClient) -{ - DBG_CLIENTS("LoadVIPFeatures %N", iClient) - - int iFeaturesCount = g_hFeaturesArray.Length; - DBG_CLIENTS("FeaturesArraySize: %d", iFeaturesCount) - if (iFeaturesCount > 0) - { - char szFeature[FEATURE_NAME_LENGTH]; - - g_hFeatures[iClient].GetString(KEY_GROUP, SZF(szFeature)); - if (UTIL_CheckValidVIPGroup(szFeature)) - { - for (int i = 0; i < iFeaturesCount; ++i) - { - g_hFeaturesArray.GetString(i, SZF(szFeature)); - Clients_LoadFeatureValue(iClient, szFeature); - } - } - } - - DBG_CLIENTS("Clients_OnVIPClientLoaded: %d %N", iClient, iClient) - - OnClientLoaded(iClient); - OnVIPClientLoaded(iClient); - Features_TurnOnAll(iClient); -} - -void Clients_LoadFeature(int iClient, const char[] szFeature) -{ - DBG_CLIENTS("LoadVIPFeature %N", iClient) - - int iFeaturesCount = g_hFeaturesArray.Length; - DBG_CLIENTS("FeaturesArraySize: %d", iFeaturesCount) - if (iFeaturesCount > 0) - { - char szGroup[FEATURE_NAME_LENGTH]; - - g_hFeatures[iClient].GetString(KEY_GROUP, SZF(szGroup)); - if (UTIL_CheckValidVIPGroup(szGroup)) - { - Clients_LoadFeatureValue(iClient, szFeature); - } - } -/* - DBG_CLIENTS("Clients_OnVIPClientLoaded: %d %N", iClient, iClient) - - Clients_OnVIPClientLoaded(iClient); - */ -} - -void Clients_LoadFeatureValue(int iClient, const char[] szFeature) -{ - static ArrayList hArray; - if (!GLOBAL_TRIE.GetValue(szFeature, hArray)) - return; - - DBG_CLIENTS("Clients_LoadFeatureValue: %s", szFeature) - - if (!GetFeatureValue(iClient, view_as(hArray.Get(FEATURES_VALUE_TYPE)), szFeature)) - return; - - static VIP_ToggleState eStatus; - DBG_CLIENTS("GetValue: == true") - if (view_as(hArray.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) - { - eStatus = Features_GetStatusFromStorage(iClient, szFeature, hArray); - DBG_CLIENTS("Features_GetStatusFromStorage: '%d'", eStatus) - } - else - { - eStatus = ENABLED; - } - - Features_SetStatus(iClient, szFeature, eStatus); -} - -bool GetFeatureValue(int iClient, VIP_ValueType ValueType, const char[] szFeature) -{ - DBG_CLIENTS("GetFeatureValue: %d - %s", ValueType, szFeature) - switch (ValueType) - { - case BOOL: - { - if (g_hGroups.GetNum(szFeature)) - { - DBG_CLIENTS("value: 1") - return g_hFeatures[iClient].SetValue(szFeature, true); - } - return false; - } - case INT: - { - int iValue; - iValue = g_hGroups.GetNum(szFeature); - if (iValue != 0) - { - DBG_CLIENTS("value: %d", iValue) - return g_hFeatures[iClient].SetValue(szFeature, iValue); - } - return false; - } - case FLOAT: - { - float fValue; - fValue = g_hGroups.GetFloat(szFeature); - if (fValue != 0.0) - { - DBG_CLIENTS("value: %f", fValue) - return g_hFeatures[iClient].SetValue(szFeature, fValue); - } - - return false; - } - case STRING: - { - char szBuffer[PMP]; - g_hGroups.GetString(szFeature, SZF(szBuffer)); - if (szBuffer[0]) - { - DBG_CLIENTS("value: %s", szBuffer) - return g_hFeatures[iClient].SetString(szFeature, szBuffer); - } - return false; - } - case VIP_NULL: - { - return false; - } - } - - return false; -} - -void Clients_CreateExpiredTimer(int iClient, int iExp, int iTime) -{ - int iTimeLeft; - GetMapTimeLeft(iTimeLeft); - DBG_CLIENTS("Clients_CreateExpiredTimer %N (%d): iTimeLeft: %d", iClient, iClient, iTimeLeft) - if (iTimeLeft > 0) - { - DBG_CLIENTS("Clients_CreateExpiredTimer %N (%d): iTimeLeft+iTime: %d", iClient, iClient, iTimeLeft + iTime) - if ((iTimeLeft + iTime) < iExp) - { - DBG_CLIENTS("Skip timer") - return; - } - } - - DBG_CLIENTS("Clients_CreateExpiredTimer %N (%d): TimerDealy: %f", iClient, iClient, float((iExp - iTime) + 3)) - CreateTimer(float((iExp - iTime) + 3), Timer_VIP_Expired, UID(iClient), TIMER_FLAG_NO_MAPCHANGE); -} - -public void Event_MatchEndRestart(Event hEvent, const char[] sEvName, bool bDontBroadcast) -{ - RemoveExpAndOutPlayers(); -} - -public void Event_PlayerSpawn(Event hEvent, const char[] sEvName, bool bDontBroadcast) -{ - int UserID = hEvent.GetInt("userid"); - int iClient = CID(UserID); - DBG_CLIENTS("Event_PlayerSpawn: %N (%d)", iClient, iClient) - if (!(g_iClientInfo[iClient] & IS_SPAWNED)) - { - CreateTimer(g_CVAR_fSpawnDelay, Timer_OnPlayerSpawn, UserID, TIMER_FLAG_NO_MAPCHANGE); - } -} - -public void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast) -{ - int iClient = CID(hEvent.GetInt("userid")); - DBG_CLIENTS("Event_PlayerDeath: %N (%d)", iClient, iClient) - g_iClientInfo[iClient] &= ~IS_SPAWNED; -} - -public Action Timer_OnPlayerSpawn(Handle hTimer, any UserID) -{ - int iClient = CID(UserID); - if (iClient && IsClientInGame(iClient)) - { - int iTeam = GetClientTeam(iClient); - if (iTeam > 1 && IsPlayerAlive(iClient)) - { - DBG_CLIENTS("Timer_OnPlayerSpawn: %N (%d)", iClient, iClient) - - if (IS_CLIENT_VIP(iClient)) - { - int iExp; - if (g_hFeatures[iClient].GetValue(KEY_EXPIRES, iExp) && iExp > 0 && iExp < GetTime()) - { - Clients_ExpiredClient(iClient); - } - } - - g_iClientInfo[iClient] |= IS_SPAWNED; - CallForward_OnPlayerSpawn(iClient, iTeam); - } - } - return Plugin_Stop; -} - -public void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast) -{ - DBG_CLIENTS("Event_RoundEnd") - int iTime, iExp, i; - iTime = GetTime(); - for (i = 1; i <= MaxClients; ++i) - { - if (IsClientInGame(i)) - { - g_iClientInfo[i] &= ~IS_SPAWNED; - if (IS_CLIENT_VIP(i) && g_hFeatures[i].GetValue(KEY_EXPIRES, iExp) && iExp > 0 && iExp < iTime) - { - Clients_ExpiredClient(i); - } - } - } -} - -public Action Timer_VIP_Expired(Handle hTimer, any UserID) -{ - DBG_CLIENTS("Timer_VIP_Expired %d:", UserID) - - int iClient = CID(UserID); - if (iClient && IS_CLIENT_VIP(iClient)) - { - int iExp; - if (g_hFeatures[iClient].GetValue(KEY_EXPIRES, iExp) && iExp > 0 && iExp < GetTime()) - { - DBG_CLIENTS("Timer_VIP_Expired %N:", iClient) - - Clients_ExpiredClient(iClient); - } - } - - return Plugin_Stop; -} - -void Clients_ExpiredClient(int iClient) -{ - DBG_CLIENTS("Clients_ExpiredClient %N:", iClient) - Features_TurnOffAll(iClient); - - int iClientID; - g_hFeatures[iClient].GetValue(KEY_EXPIRES, iClientID); - if (g_CVAR_iDeleteExpired == 0 || GetTime() >= ((g_CVAR_iDeleteExpired*86400) + iClientID)) - { - if (g_hFeatures[iClient].GetValue(KEY_CID, iClientID) && iClientID != -1) - { - LogToFile(g_szLogFile, "%T", "REMOVING_PLAYER", LANG_SERVER, iClient); - - Clients_RemoveVipPlayer(REASON_EXPIRED, iClient, _, true); - return; - } - } - - if (g_iClientInfo[iClient] & IS_MENU_OPEN) - { - CancelClientMenu(iClient); - } - - Clients_ResetClient(iClient); - SET_BIT(g_iClientInfo[iClient], IS_LOADED); - - CallForward_OnVIPClientRemoved(iClient, "Expired"); - - DisplayClientInfo(iClient, "expired_info"); -} - -void Clients_AddVipPlayer( - int iAdmin = OWNER_SERVER, - int iTarget = 0, - int iTargetAccountID = 0, - int iDuration, - const char[] szGroup, - const char[] szByWho = NULL_STRING -) -{ - char szAdminInfo[PMP], szTargetInfo[PMP]; - int iExpires; - - if (iDuration) - { - iExpires = iDuration + GetTime(); - } - else - { - iExpires = iDuration; - } - - if (iTarget) - { - iTargetAccountID = GetSteamAccountID(iTarget); - UTIL_GetClientInfo(iTarget, SZF(szTargetInfo)); - } - else - { - char szAuth[32]; - UTIL_GetSteamIDFromAccountID(iTargetAccountID, SZF(szAuth)); - FormatEx(SZF(szTargetInfo), "unknown (%s, unknown)", szAuth); - } - - switch(iAdmin) - { - case OWNER_PLUGIN: - { - FormatEx(SZF(szAdminInfo), "%T %s", "BY_PLUGIN", LANG_SERVER, szByWho); - } - case OWNER_SERVER: - { - FormatEx(SZF(szAdminInfo), "%T", "BY_SERVER", LANG_SERVER); - } - default: - { - char szAdmin[128]; - UTIL_GetClientInfo(iAdmin, SZF(szAdmin)); - FormatEx(SZF(szAdminInfo), "%T %s", "BY_ADMIN", LANG_SERVER, szAdmin); - iAdmin = UID(iAdmin); - } - } - - DB_AddVipPlayer( - iAdmin, - szAdminInfo, - iTarget, - iTargetAccountID, - szTargetInfo, - iDuration, - iExpires, - szGroup - ); -} - -void Clients_OnVipPlayerAdded( - const int iAdmin, - const char[] szAdminInfo, - const int iTarget, - const int iTargetAccountID, - const char[] szTargetInfo, - const int iDuration, - const int iExpires, - const char[] szGroup -) -{ - char szExpires[64], szDuration[64]; - - if (iTarget) - { - Clients_CheckVipAccess(iTarget, true); - CallForward_OnVIPClientAdded(iTarget, iAdmin); - } - - if (iAdmin >= 0) - { - if (iDuration) - { - UTIL_GetTimeFromStamp(SZF(szDuration), iDuration, iAdmin); - FormatTime(SZF(szExpires), "%d/%m/%Y - %H:%M", iExpires); - } - else - { - FormatEx(SZF(szDuration), "%T", "PERMANENT", iAdmin); - FormatEx(SZF(szExpires), "%T", "NEVER", iAdmin); - } - UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_SUCCESS", szTargetInfo, szGroup); - } - - if (iDuration) - { - UTIL_GetTimeFromStamp(SZF(szExpires), iDuration, LANG_SERVER); - } - else - { - FormatEx(SZF(szExpires), "%T", "PERMANENT", LANG_SERVER); - FormatEx(SZF(szExpires), "%T", "NEVER", LANG_SERVER); - } - - LogToFile(g_szLogFile, "%T", "LOG_VIP_ADDED", LANG_SERVER, szTargetInfo, iTargetAccountID, szDuration, szExpires, szGroup, szAdminInfo); -} - -void Clients_RemoveVipPlayer( - int iAdmin = 0, - int iTarget = 0, - int iTargetAccountID = 0, - bool bNotify, - const char[] szByWho = NULL_STRING -) -{ - DBG_CLIENTS("Clients_RemoveVipPlayer %d: - > iTargetAccountID: %d, : bNotify: %b", iTarget, iTargetAccountID, bNotify) - - if (iTarget) { - iTargetAccountID = GetSteamAccountID(iTarget); - } - - char szAdminInfo[PMP]; - switch(iAdmin) - { - case REASON_EXPIRED: - { - FormatEx(SZF(szAdminInfo), "%T", "REASON_EXPIRED", LANG_SERVER); - } - case REASON_OUTDATED: - { - FormatEx(SZF(szAdminInfo), "%T", "REASON_INACTIVITY", LANG_SERVER); - } - case OWNER_PLUGIN: - { - FormatEx(SZF(szAdminInfo), "%T %s", "BY_PLUGIN", LANG_SERVER, szByWho); - } - case OWNER_SERVER: - { - FormatEx(SZF(szAdminInfo), "%T", "BY_SERVER", LANG_SERVER); - } - default: - { - char szAdmin[128]; - UTIL_GetClientInfo(iAdmin, SZF(szAdmin)); - FormatEx(SZF(szAdminInfo), "%T %s", "BY_ADMIN", LANG_SERVER, szAdmin); - } - } - - DB_RemoveVipPlayer( - iAdmin, - szAdminInfo, - iTarget, - iTargetAccountID, - bNotify - ); -} - -void Clients_OnVipPlayerRemoved( - const int iAdmin, - const char[] szAdminInfo, - const int iTarget, - const int iTargetAccountID, - const char[] szTargetInfo, - const char[] szGroup, - const bool bNotify -) -{ - LogToFile(g_szLogFile, "%T", "LOG_VIP_DELETED", LANG_SERVER, szTargetInfo, iTargetAccountID, szGroup, szAdminInfo); - - DebugMessage("Clients_OnVipPlayerRemoved(iAdmin: %d, szAdminInfo: %s, iTarget: %d, iTargetAccountID: %d, szTargetInfo: %s", iAdmin, szAdminInfo, iTarget, iTargetAccountID, szTargetInfo) - - if (iTarget) - { - if (g_iClientInfo[iTarget] & IS_MENU_OPEN) - { - CancelClientMenu(iTarget); - } - - Features_TurnOffAll(iTarget); - Clients_ResetClient(iTarget); - SET_BIT(g_iClientInfo[iTarget], IS_LOADED); - - // TODO: Fix this - CallForward_OnVIPClientRemoved(iTarget, "Expired"); - - DisplayClientInfo(iTarget, "expired_info"); - - if (bNotify) - { - // TODO: notify player - } - } - - if (iAdmin > 0) - { - UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_PLAYER_DELETED", szTargetInfo, szGroup); - } -} - -void Clients_ReloadVipPlayers(int iClient, bool bNotify) -{ - for (int i = 1; i <= MaxClients; ++i) - { - if (IsClientInGame(i)) - { - Clients_CheckVipAccess(i, false, true); - } - } - - if (bNotify) - { - UTIL_Reply(iClient, "%t", "VIP_CACHE_REFRESHED"); - } -} + +void Clients_ResetClient(int iClient) +{ + g_iClientInfo[iClient] = 0; + + UTIL_CloseHandleEx(g_hFeatures[iClient]); + UTIL_CloseHandleEx(g_hFeatureStatus[iClient]); +} + +public void OnClientPutInServer(int iClient) +{ + // g_iClientInfo[iClient] = 0; + DBG_CLIENTS("OnClientPutInServer %N (%d): %b", iClient, iClient, g_iClientInfo[iClient]) + + if (IsFakeClient(iClient) || IsClientSourceTV(iClient)) + { + return; + } + + Storage_LoadClient(iClient); + Clients_CheckVipAccess(iClient, true, true); +} + +public void OnClientDisconnect(int iClient) +{ + /* if (g_bIsClientVIP[iClient]) + { + SaveClient(iClient); + }*/ + + if (!IsFakeClient(iClient)) + { + CallForward_OnClientDisconnect(iClient); + Storage_SaveClient(iClient); + } + + Clients_ResetClient(iClient); + UTIL_CloseHandleEx(g_hClientData[iClient]); + g_iClientInfo[iClient] = 0; + + Storage_ResetClient(iClient); +} + +void Clients_CheckVipAccess(int iClient, bool bNotify = false, bool bForward = false) +{ + if (bForward && !CallForward_OnClientPreLoad(iClient)) + { + return; + } + + Clients_ResetClient(iClient); + + // UNSET_BIT(g_iClientInfo[iClient], IS_LOADED); + + if (IsFakeClient(iClient) == false && (GLOBAL_INFO & IS_STARTED) && g_hDatabase) + { + Clients_LoadClient(iClient, bNotify); + // DBG_CLIENTS("Clients_CheckVipAccess %N:\tИгрок %sявляется VIP игроком", iClient, g_bIsClientVIP[iClient] ? "":"не ") + } + else + { + SET_BIT(g_iClientInfo[iClient], IS_LOADED); + CallForward_OnClientLoaded(iClient); + } +} + +void Clients_LoadClient(int iClient, bool bNotify) +{ + char szQuery[512]; + + int iAccountID = GetSteamAccountID(iClient); + + DBG_CLIENTS("Clients_LoadClient %N (%d), %b: - > %x, %u", iClient, iClient, g_iClientInfo[iClient], g_hDatabase, g_hDatabase) + + FormatEx(SZF(szQuery), "SELECT `expires`, `group`, `name` \ + FROM `vip_users` \ + WHERE `account_id` = %d%s LIMIT 1;", + iAccountID, g_szServerID); + + DataPack hDataPack = new DataPack(); + hDataPack.WriteCell(UID(iClient)); + hDataPack.WriteCell(iAccountID); + hDataPack.WriteCell(bNotify); + + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_OnClientAuthorized, szQuery, hDataPack); +} + +public void SQL_Callback_OnClientAuthorized(Database hOwner, DBResultSet hResult, const char[] szError, any hPack) +{ + DBG_SQL_Response("SQL_Callback_OnClientAuthorized") + DataPack hDataPack = view_as(hPack); + if (hResult == null || szError[0]) + { + LogError("SQL_Callback_OnClientAuthorized: %s", szError); + delete hDataPack; + return; + } + + hDataPack.Reset(); + + int iClient = CID(hDataPack.ReadCell()); + int iAccountID = hDataPack.ReadCell(); + bool bNotify = view_as(hDataPack.ReadCell()); + delete hDataPack; + + DBG_CLIENTS("SQL_Callback_OnClientAuthorized: %d", iClient) + if (!iClient || !IsClientInGame(iClient)) + { + return; + } + + if (!hResult.FetchRow()) + { + OnClientLoaded(iClient); + return; + } + DBG_SQL_Response("hResult.FetchRow()") + + int iExpires = hResult.FetchInt(0); + DBG_SQL_Response("hResult.FetchInt(0) = %d", iExpires) + char szGroup[64]; + hResult.FetchString(1, SZF(szGroup)); + DBG_SQL_Response("hResult.FetchString(1) = '%s", szGroup) + + + LoadClient(iClient, iAccountID, szGroup, iExpires); + + if (IS_CLIENT_VIP(iClient)) + { + char szName[MAX_NAME_LENGTH*2+1]; + hResult.FetchString(2, SZF(szName)); + DB_UpdateClient(iClient, szName); + + if (bNotify) + { + if (g_CVAR_bAutoOpenMenu) + { + g_hVIPMenu.Display(iClient, MENU_TIME_FOREVER); + } + + DisplayClientInfo(iClient, iExpires == 0 ? "connect_info_perm":"connect_info_time"); + } + + Clients_TryLoadFeatures(iClient); + return; + } + + OnClientLoaded(iClient); +} + +void LoadClient(int iClient, int iAccountID, const char[] szGroup, int iExpires) +{ + DBG_CLIENTS("LoadClient: %d, %d, %s, %d", iClient, iAccountID, szGroup, iExpires) + if (!szGroup[0] || !UTIL_CheckValidVIPGroup(szGroup)) + { + LogError("Invalid VIP-Group/Некорректная VIP-группа: %s (Игрок: %d)", szGroup, iAccountID); + return; + } + + if (iExpires > 0) + { + int iTime = GetTime(); + + if (iTime > iExpires) + { + if (g_CVAR_iDeleteExpired == 0 || (g_CVAR_iDeleteExpired > 0 && iTime >= ((g_CVAR_iDeleteExpired * 86400) + iExpires))) + { + LogToFile(g_szLogFile, "%T", "REMOVING_PLAYER", LANG_SERVER, iClient); + + DBG_CLIENTS("Clients_LoadClient %N (%d): >>> Delete", iClient, iClient) + + Clients_RemoveVipPlayer(REASON_EXPIRED, iClient, iAccountID, true); + } + + CallForward_OnVIPClientRemoved(iClient, "Expired"); + + DisplayClientInfo(iClient, "expired_info"); + + return; + } + + Clients_CreateExpiredTimer(iClient, iExpires, iTime); + } + + Clients_InitVIPClient(iClient, iAccountID, szGroup, iExpires); +} + + +void OnClientLoaded(int iClient) +{ + SET_BIT(g_iClientInfo[iClient], IS_LOADED); + CallForward_OnClientLoaded(iClient); +} + +void OnVIPClientLoaded(int iClient) +{ + SET_BIT(g_iClientInfo[iClient], IS_LOADED); + CallForward_OnVIPClientLoaded(iClient); +} + +stock void Clients_OnVIPClientLoaded(int iClient) +{ + Features_TurnOnAll(iClient); + + CallForward_OnVIPClientLoaded(iClient); +} + +void Clients_InitVIPClient(int iClient, int iAccountID = -1, const char[] szGroup = NULL_STRING, int iExpires = 0) +{ + DBG_CLIENTS("Clients_InitVIPClient: %d, %d, %s, %d", iClient, iAccountID, szGroup, iExpires) + g_hFeatures[iClient] = new StringMap(); + g_hFeatureStatus[iClient] = new StringMap(); + + g_hFeatures[iClient].SetValue(KEY_EXPIRES, iExpires); + g_hFeatures[iClient].SetString(KEY_GROUP, szGroup); + g_hFeatures[iClient].SetValue(KEY_CID, iAccountID); + + SET_BIT(g_iClientInfo[iClient], IS_VIP); +} + +#if USE_CLIENTPREFS 1 +public void OnClientCookiesCached(int iClient) +{ + DBG_CLIENTS("OnClientCookiesCached %d %N", iClient, iClient) + + DBG_CLIENTS("AreClientCookiesCached %b", AreClientCookiesCached(iClient)) + //OnClientStorageLoaded(iClient); +} +#else +public void VIP_OnClientStorageLoaded(int iClient) +{ + DBG_CLIENTS("VIP_OnClientStorageLoaded: %d %N", iClient, iClient) + //OnClientStorageLoaded(iClient); +} +#endif +/* +void OnClientStorageLoaded(int iClient) +{ + DBG_CLIENTS("OnClientStorageLoaded: %d %N", iClient, iClient) +} +*/ + +bool IsClientStorageLoaded(int iClient) +{ + #if USE_CLIENTPREFS 1 + DBG_CLIENTS("AreClientCookiesCached: %d %N", iClient, iClient) + return AreClientCookiesCached(iClient); + #else + DBG_CLIENTS("Storage_IsClientLoaded: %d %N", iClient, iClient) + return Storage_IsClientLoaded(iClient); + #endif +} + +void Clients_TryLoadFeatures(int iClient) +{ + DBG_CLIENTS("Clients_TryLoadFeatures %L", iClient) + DBG_CLIENTS("IsClientStorageLoaded %b", IsClientStorageLoaded(iClient)) + + if (!IsClientStorageLoaded(iClient)) + { + // TODO: may be will add attempts counter + DataPack hDataPack = new DataPack(); + hDataPack.WriteCell(UID(iClient)); + CreateTimer(1.0, Timer_CheckStorageLoadFeatures, hDataPack, TIMER_FLAG_NO_MAPCHANGE|TIMER_DATA_HNDL_CLOSE); + return; + } + + Clients_LoadFeatures(iClient); +} + +public Action Timer_CheckStorageLoadFeatures(Handle hTimer, DataPack hDataPack) +{ + hDataPack.Reset(); + int iClient = CID(hDataPack.ReadCell()); + + DBG_CLIENTS("Timer_CheckStorageLoadFeatures -> iClient: %N (%d), IsClientVIP: %b", iClient, iClient, IS_CLIENT_VIP(iClient)) + if (iClient && IS_CLIENT_VIP(iClient)) + { + Clients_TryLoadFeatures(iClient); + } + + return Plugin_Stop; +} + + +void Clients_TryLoadFeature(int iClient, const char[] szFeature) +{ + DBG_CLIENTS("Clients_TryLoadFeature %L", iClient) + + if (!IsClientStorageLoaded(iClient)) + { + DataPack hDataPack = new DataPack(); + hDataPack.WriteCell(UID(iClient)); + hDataPack.WriteString(szFeature); + CreateTimer(1.0, Timer_CheckStorageLoadFeature, hDataPack, TIMER_FLAG_NO_MAPCHANGE|TIMER_DATA_HNDL_CLOSE); + } + + Clients_LoadFeature(iClient, szFeature); +} + +public Action Timer_CheckStorageLoadFeature(Handle hTimer, DataPack hDataPack) +{ + hDataPack.Reset(); + int iClient = CID(hDataPack.ReadCell()); + + DBG_CLIENTS("Timer_CheckStorageLoadFeature -> iClient: %N (%d), IsClientVIP: %b", iClient, iClient, IS_CLIENT_VIP(iClient)) + if (iClient && IS_CLIENT_VIP(iClient)) + { + char szFeature[FEATURE_NAME_LENGTH]; + hDataPack.ReadString(SZF(szFeature)); + Clients_LoadFeature(iClient, szFeature); + } + + return Plugin_Stop; +} + +void Clients_LoadFeatures(int iClient) +{ + DBG_CLIENTS("LoadVIPFeatures %N", iClient) + + int iFeaturesCount = g_hFeaturesArray.Length; + DBG_CLIENTS("FeaturesArraySize: %d", iFeaturesCount) + if (iFeaturesCount > 0) + { + char szFeature[FEATURE_NAME_LENGTH]; + + g_hFeatures[iClient].GetString(KEY_GROUP, SZF(szFeature)); + if (UTIL_CheckValidVIPGroup(szFeature)) + { + for (int i = 0; i < iFeaturesCount; ++i) + { + g_hFeaturesArray.GetString(i, SZF(szFeature)); + Clients_LoadFeatureValue(iClient, szFeature); + } + } + } + + DBG_CLIENTS("Clients_OnVIPClientLoaded: %d %N", iClient, iClient) + + OnClientLoaded(iClient); + OnVIPClientLoaded(iClient); + Features_TurnOnAll(iClient); +} + +void Clients_LoadFeature(int iClient, const char[] szFeature) +{ + DBG_CLIENTS("LoadVIPFeature %N", iClient) + + int iFeaturesCount = g_hFeaturesArray.Length; + DBG_CLIENTS("FeaturesArraySize: %d", iFeaturesCount) + if (iFeaturesCount > 0) + { + char szGroup[FEATURE_NAME_LENGTH]; + + g_hFeatures[iClient].GetString(KEY_GROUP, SZF(szGroup)); + if (UTIL_CheckValidVIPGroup(szGroup)) + { + Clients_LoadFeatureValue(iClient, szFeature); + } + } +/* + DBG_CLIENTS("Clients_OnVIPClientLoaded: %d %N", iClient, iClient) + + Clients_OnVIPClientLoaded(iClient); + */ +} + +void Clients_LoadFeatureValue(int iClient, const char[] szFeature) +{ + static ArrayList hArray; + if (!GLOBAL_TRIE.GetValue(szFeature, hArray)) + return; + + DBG_CLIENTS("Clients_LoadFeatureValue: %s", szFeature) + + if (!GetFeatureValue(iClient, view_as(hArray.Get(FEATURES_VALUE_TYPE)), szFeature)) + return; + + static VIP_ToggleState eStatus; + DBG_CLIENTS("GetValue: == true") + if (view_as(hArray.Get(FEATURES_ITEM_TYPE)) == TOGGLABLE) + { + eStatus = Features_GetStatusFromStorage(iClient, szFeature, hArray); + DBG_CLIENTS("Features_GetStatusFromStorage: '%d'", eStatus) + } + else + { + eStatus = ENABLED; + } + + Features_SetStatus(iClient, szFeature, eStatus); +} + +bool GetFeatureValue(int iClient, VIP_ValueType ValueType, const char[] szFeature) +{ + DBG_CLIENTS("GetFeatureValue: %d - %s", ValueType, szFeature) + switch (ValueType) + { + case BOOL: + { + if (g_hGroups.GetNum(szFeature)) + { + DBG_CLIENTS("value: 1") + return g_hFeatures[iClient].SetValue(szFeature, true); + } + return false; + } + case INT: + { + int iValue; + iValue = g_hGroups.GetNum(szFeature); + if (iValue != 0) + { + DBG_CLIENTS("value: %d", iValue) + return g_hFeatures[iClient].SetValue(szFeature, iValue); + } + return false; + } + case FLOAT: + { + float fValue; + fValue = g_hGroups.GetFloat(szFeature); + if (fValue != 0.0) + { + DBG_CLIENTS("value: %f", fValue) + return g_hFeatures[iClient].SetValue(szFeature, fValue); + } + + return false; + } + case STRING: + { + char szBuffer[PMP]; + g_hGroups.GetString(szFeature, SZF(szBuffer)); + if (szBuffer[0]) + { + DBG_CLIENTS("value: %s", szBuffer) + return g_hFeatures[iClient].SetString(szFeature, szBuffer); + } + return false; + } + case VIP_NULL: + { + return false; + } + } + + return false; +} + +void Clients_CreateExpiredTimer(int iClient, int iExp, int iTime) +{ + int iTimeLeft; + GetMapTimeLeft(iTimeLeft); + DBG_CLIENTS("Clients_CreateExpiredTimer %N (%d): iTimeLeft: %d", iClient, iClient, iTimeLeft) + if (iTimeLeft > 0) + { + DBG_CLIENTS("Clients_CreateExpiredTimer %N (%d): iTimeLeft+iTime: %d", iClient, iClient, iTimeLeft + iTime) + if ((iTimeLeft + iTime) < iExp) + { + DBG_CLIENTS("Skip timer") + return; + } + } + + DBG_CLIENTS("Clients_CreateExpiredTimer %N (%d): TimerDealy: %f", iClient, iClient, float((iExp - iTime) + 3)) + CreateTimer(float((iExp - iTime) + 3), Timer_VIP_Expired, UID(iClient), TIMER_FLAG_NO_MAPCHANGE); +} + +public void Event_MatchEndRestart(Event hEvent, const char[] sEvName, bool bDontBroadcast) +{ + RemoveExpAndOutPlayers(); +} + +public void Event_PlayerSpawn(Event hEvent, const char[] sEvName, bool bDontBroadcast) +{ + int UserID = hEvent.GetInt("userid"); + int iClient = CID(UserID); + DBG_CLIENTS("Event_PlayerSpawn: %N (%d)", iClient, iClient) + if (!(g_iClientInfo[iClient] & IS_SPAWNED)) + { + CreateTimer(g_CVAR_fSpawnDelay, Timer_OnPlayerSpawn, UserID, TIMER_FLAG_NO_MAPCHANGE); + } +} + +public void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast) +{ + int iClient = CID(hEvent.GetInt("userid")); + DBG_CLIENTS("Event_PlayerDeath: %N (%d)", iClient, iClient) + g_iClientInfo[iClient] &= ~IS_SPAWNED; +} + +public Action Timer_OnPlayerSpawn(Handle hTimer, any UserID) +{ + int iClient = CID(UserID); + if (iClient && IsClientInGame(iClient)) + { + int iTeam = GetClientTeam(iClient); + if (iTeam > 1 && IsPlayerAlive(iClient)) + { + DBG_CLIENTS("Timer_OnPlayerSpawn: %N (%d)", iClient, iClient) + + if (IS_CLIENT_VIP(iClient)) + { + int iExp; + if (g_hFeatures[iClient].GetValue(KEY_EXPIRES, iExp) && iExp > 0 && iExp < GetTime()) + { + Clients_ExpiredClient(iClient); + } + } + + g_iClientInfo[iClient] |= IS_SPAWNED; + CallForward_OnPlayerSpawn(iClient, iTeam); + } + } + return Plugin_Stop; +} + +public void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast) +{ + DBG_CLIENTS("Event_RoundEnd") + int iTime, iExp, i; + iTime = GetTime(); + for (i = 1; i <= MaxClients; ++i) + { + if (IsClientInGame(i)) + { + g_iClientInfo[i] &= ~IS_SPAWNED; + if (IS_CLIENT_VIP(i) && g_hFeatures[i].GetValue(KEY_EXPIRES, iExp) && iExp > 0 && iExp < iTime) + { + Clients_ExpiredClient(i); + } + } + } +} + +public Action Timer_VIP_Expired(Handle hTimer, any UserID) +{ + DBG_CLIENTS("Timer_VIP_Expired %d:", UserID) + + int iClient = CID(UserID); + if (iClient && IS_CLIENT_VIP(iClient)) + { + int iExp; + if (g_hFeatures[iClient].GetValue(KEY_EXPIRES, iExp) && iExp > 0 && iExp < GetTime()) + { + DBG_CLIENTS("Timer_VIP_Expired %N:", iClient) + + Clients_ExpiredClient(iClient); + } + } + + return Plugin_Stop; +} + +void Clients_ExpiredClient(int iClient) +{ + DBG_CLIENTS("Clients_ExpiredClient %N:", iClient) + Features_TurnOffAll(iClient); + + int iClientID; + g_hFeatures[iClient].GetValue(KEY_EXPIRES, iClientID); + if (g_CVAR_iDeleteExpired == 0 || GetTime() >= ((g_CVAR_iDeleteExpired*86400) + iClientID)) + { + if (g_hFeatures[iClient].GetValue(KEY_CID, iClientID) && iClientID != -1) + { + LogToFile(g_szLogFile, "%T", "REMOVING_PLAYER", LANG_SERVER, iClient); + + Clients_RemoveVipPlayer(REASON_EXPIRED, iClient, _, true); + return; + } + } + + if (g_iClientInfo[iClient] & IS_MENU_OPEN) + { + CancelClientMenu(iClient); + } + + Clients_ResetClient(iClient); + SET_BIT(g_iClientInfo[iClient], IS_LOADED); + + CallForward_OnVIPClientRemoved(iClient, "Expired"); + + DisplayClientInfo(iClient, "expired_info"); +} + +void Clients_AddVipPlayer( + int iAdmin = OWNER_SERVER, + int iTarget = 0, + int iTargetAccountID = 0, + int iDuration, + const char[] szGroup, + const char[] szByWho = NULL_STRING +) +{ + char szAdminInfo[PMP], szTargetInfo[PMP]; + int iExpires; + + if (iDuration) + { + iExpires = iDuration + GetTime(); + } + else + { + iExpires = iDuration; + } + + if (iTarget) + { + iTargetAccountID = GetSteamAccountID(iTarget); + UTIL_GetClientInfo(iTarget, SZF(szTargetInfo)); + } + else + { + char szAuth[32]; + UTIL_GetSteamIDFromAccountID(iTargetAccountID, SZF(szAuth)); + FormatEx(SZF(szTargetInfo), "unknown (%s, unknown)", szAuth); + } + + switch(iAdmin) + { + case OWNER_PLUGIN: + { + FormatEx(SZF(szAdminInfo), "%T %s", "BY_PLUGIN", LANG_SERVER, szByWho); + } + case OWNER_SERVER: + { + FormatEx(SZF(szAdminInfo), "%T", "BY_SERVER", LANG_SERVER); + } + default: + { + char szAdmin[128]; + UTIL_GetClientInfo(iAdmin, SZF(szAdmin)); + FormatEx(SZF(szAdminInfo), "%T %s", "BY_ADMIN", LANG_SERVER, szAdmin); + iAdmin = UID(iAdmin); + } + } + + DB_AddVipPlayer( + iAdmin, + szAdminInfo, + iTarget, + iTargetAccountID, + szTargetInfo, + iDuration, + iExpires, + szGroup + ); +} + +void Clients_OnVipPlayerAdded( + const int iAdmin, + const char[] szAdminInfo, + const int iTarget, + const int iTargetAccountID, + const char[] szTargetInfo, + const int iDuration, + const int iExpires, + const char[] szGroup +) +{ + char szExpires[64], szDuration[64]; + + if (iTarget) + { + Clients_CheckVipAccess(iTarget, true); + CallForward_OnVIPClientAdded(iTarget, iAdmin); + } + + if (iAdmin >= 0) + { + if (iDuration) + { + UTIL_GetTimeFromStamp(SZF(szDuration), iDuration, iAdmin); + FormatTime(SZF(szExpires), "%d/%m/%Y - %H:%M", iExpires); + } + else + { + FormatEx(SZF(szDuration), "%T", "PERMANENT", iAdmin); + FormatEx(SZF(szExpires), "%T", "NEVER", iAdmin); + } + UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_SUCCESS", szTargetInfo, szGroup); + } + + if (iDuration) + { + UTIL_GetTimeFromStamp(SZF(szExpires), iDuration, LANG_SERVER); + } + else + { + FormatEx(SZF(szExpires), "%T", "PERMANENT", LANG_SERVER); + FormatEx(SZF(szExpires), "%T", "NEVER", LANG_SERVER); + } + + LogToFile(g_szLogFile, "%T", "LOG_VIP_ADDED", LANG_SERVER, szTargetInfo, iTargetAccountID, szDuration, szExpires, szGroup, szAdminInfo); +} + +void Clients_RemoveVipPlayer( + int iAdmin = 0, + int iTarget = 0, + int iTargetAccountID = 0, + bool bNotify, + const char[] szByWho = NULL_STRING +) +{ + DBG_CLIENTS("Clients_RemoveVipPlayer %d: - > iTargetAccountID: %d, : bNotify: %b", iTarget, iTargetAccountID, bNotify) + + if (iTarget) { + iTargetAccountID = GetSteamAccountID(iTarget); + } + + char szAdminInfo[PMP]; + switch(iAdmin) + { + case REASON_EXPIRED: + { + FormatEx(SZF(szAdminInfo), "%T", "REASON_EXPIRED", LANG_SERVER); + } + case REASON_OUTDATED: + { + FormatEx(SZF(szAdminInfo), "%T", "REASON_INACTIVITY", LANG_SERVER); + } + case OWNER_PLUGIN: + { + FormatEx(SZF(szAdminInfo), "%T %s", "BY_PLUGIN", LANG_SERVER, szByWho); + } + case OWNER_SERVER: + { + FormatEx(SZF(szAdminInfo), "%T", "BY_SERVER", LANG_SERVER); + } + default: + { + char szAdmin[128]; + UTIL_GetClientInfo(iAdmin, SZF(szAdmin)); + FormatEx(SZF(szAdminInfo), "%T %s", "BY_ADMIN", LANG_SERVER, szAdmin); + } + } + + DB_RemoveVipPlayer( + iAdmin, + szAdminInfo, + iTarget, + iTargetAccountID, + bNotify + ); +} + +void Clients_OnVipPlayerRemoved( + const int iAdmin, + const char[] szAdminInfo, + const int iTarget, + const int iTargetAccountID, + const char[] szTargetInfo, + const char[] szGroup, + const bool bNotify +) +{ + LogToFile(g_szLogFile, "%T", "LOG_VIP_DELETED", LANG_SERVER, szTargetInfo, iTargetAccountID, szGroup, szAdminInfo); + + DebugMessage("Clients_OnVipPlayerRemoved(iAdmin: %d, szAdminInfo: %s, iTarget: %d, iTargetAccountID: %d, szTargetInfo: %s", iAdmin, szAdminInfo, iTarget, iTargetAccountID, szTargetInfo) + + if (iTarget > 0) + { + if (g_iClientInfo[iTarget] & IS_MENU_OPEN) + { + CancelClientMenu(iTarget); + } + + if (g_hFeatureStatus[iTarget]) + { + Features_TurnOffAll(iTarget); + } + Clients_ResetClient(iTarget); + SET_BIT(g_iClientInfo[iTarget], IS_LOADED); + + // TODO: Fix this + CallForward_OnVIPClientRemoved(iTarget, "Expired"); + + DisplayClientInfo(iTarget, "expired_info"); + + if (bNotify) + { + // TODO: notify player + } + } + + if (iAdmin > 0) + { + UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_PLAYER_DELETED", szTargetInfo, szGroup); + } +} + +void Clients_ReloadVipPlayers(int iClient, bool bNotify) +{ + for (int i = 1; i <= MaxClients; ++i) + { + if (IsClientInGame(i)) + { + Clients_CheckVipAccess(i, false, true); + } + } + + if (bNotify) + { + UTIL_Reply(iClient, "%t", "VIP_CACHE_REFRESHED"); + } +} diff --git a/addons/sourcemod/scripting/vip/Database.sp b/addons/sourcemod/scripting/vip/Database.sp index 85ac281..14695a6 100644 --- a/addons/sourcemod/scripting/vip/Database.sp +++ b/addons/sourcemod/scripting/vip/Database.sp @@ -1,718 +1,718 @@ -#define CHARSET "utf8mb4" -#define COLLATION "utf8mb4_unicode_ci" - -//#define CHARSET "utf8" -//#define COLLATION "utf8_unicode_ci" - -void DB_OnPluginStart() -{ - DB_Connect(); -} - -void DB_Connect() -{ - // DebugMessage("DB_Connect: %b", g_bIsVIPLoaded) - DebugMessage("DB_Connect") - - if (GLOBAL_INFO & IS_LOADING) - { - return; - } - - if (g_hDatabase != null) - { - UNSET_BIT(GLOBAL_INFO, IS_LOADING); - return; - } - - SET_BIT(GLOBAL_INFO, IS_LOADING); - - if (SQL_CheckConfig("vip_core")) // "vip_core" - { - Database.Connect(OnDBConnect, "vip_core", 0); - } - else - { - char szError[PMP]; - g_hDatabase = SQLite_UseDatabase("vip_core", SZF(szError)); - OnDBConnect(g_hDatabase, szError, 1); - } -} - -public void OnDBConnect(Database hDatabase, const char[] szError, int data) -{ - if (hDatabase == null || szError[0]) - { - SetFailState("OnDBConnect %s", szError); - UNSET_BIT(GLOBAL_INFO, IS_MySQL); - // CreateTimer(5.0, Timer_DB_Reconnect); - return; - } - - g_hDatabase = hDatabase; - - if (data == 1) - { - UNSET_BIT(GLOBAL_INFO, IS_MySQL); - } - else - { - char szDriver[8]; - g_hDatabase.Driver.GetIdentifier(SZF(szDriver)); - - if (strcmp(szDriver, "mysql", false) == 0) - { - SET_BIT(GLOBAL_INFO, IS_MySQL); - } - else - { - UNSET_BIT(GLOBAL_INFO, IS_MySQL); - } - } - - DebugMessage("OnDBConnect %x, %u - > (MySQL: %b)", g_hDatabase, g_hDatabase, DB_IsMysql()) - - SetupServerID(); - CreateTables(); -} - -void CreateTables() -{ - DebugMessage("CreateTables") - - if (DB_IsMysql()) - { - g_hDatabase.Query(SQL_Callback_TableCreate, "CREATE TABLE IF NOT EXISTS `vip_users` (\ - `account_id` INT NOT NULL, \ - `name` VARCHAR(64) NOT NULL default 'unknown' COLLATE '" ... COLLATION ... "', \ - `lastvisit` INT UNSIGNED NOT NULL default 0, \ - `sid` INT UNSIGNED NOT NULL, \ - `group` VARCHAR(64) NOT NULL, \ - `expires` INT UNSIGNED NOT NULL default 0, \ - CONSTRAINT pk_PlayerID PRIMARY KEY (`account_id`, `sid`) \ - ) DEFAULT CHARSET=" ... CHARSET ... ";"); - - g_hDatabase.Query(SQL_Callback_StorageTableCreate, "CREATE TABLE IF NOT EXISTS `vip_storage` (\ - `account_id` INT NOT NULL, \ - `key` VARCHAR(128) NOT NULL, \ - `value` varchar(256) NOT NULL default '', \ - `sid` INT UNSIGNED NOT NULL, \ - `updated` INT UNSIGNED NOT NULL default 0, \ - PRIMARY KEY (`account_id`, `key`, `sid`) \ - ) DEFAULT CHARSET=" ... CHARSET ... ";"); - } - else - { - g_szServerID[0] = 0; - - g_hDatabase.Query(SQL_Callback_TableCreate, "CREATE TABLE IF NOT EXISTS `vip_users` (\ - `account_id` INTEGER PRIMARY KEY NOT NULL, \ - `name` VARCHAR(64) NOT NULL default 'unknown', \ - `lastvisit` INTEGER UNSIGNED NOT NULL default 0, \ - `group` VARCHAR(64) NOT NULL, \ - `expires` INTEGER UNSIGNED NOT NULL default 0);"); - - g_hDatabase.Query(SQL_Callback_StorageTableCreate, "CREATE TABLE IF NOT EXISTS `vip_storage` (\ - `account_id` INTEGER NOT NULL, \ - `key` VARCHAR(128) NOT NULL, \ - `value` TEXT NOT NULL default '', \ - `updated` INTEGER UNSIGNED NOT NULL default 0, \ - PRIMARY KEY (`account_id`, `key`) \ - );"); - } -} - -public void SQL_Callback_TableCreate(Database hOwner, DBResultSet hResult, const char[] szError, any data) -{ - DBG_SQL_Response("SQL_Callback_TableCreate") - - if (!hResult || szError[0]) - { - SetFailState("SQL_Callback_TableCreate: %s", szError); - return; - } - - if (DB_IsMysql()) - { - g_hDatabase.Query(SQL_Callback_ErrorCheck, "SET NAMES '" ... CHARSET ... "'"); - g_hDatabase.Query(SQL_Callback_ErrorCheck, "SET CHARSET '" ... CHARSET ... "'"); - - g_hDatabase.SetCharset(CHARSET); - } - - UNSET_BIT(GLOBAL_INFO, IS_LOADING); - - OnReadyToStart(); - - Clients_ReloadVipPlayers(0, false); - - RemoveExpAndOutPlayers(); -} - -public void SQL_Callback_StorageTableCreate(Database hOwner, DBResultSet hResult, const char[] szError, any data) -{ - DBG_SQL_Response("SQL_Callback_StorageTableCreate") - - if (!hResult || szError[0]) - { - SetFailState("SQL_Callback_StorageTableCreate: %s", szError); - return; - } -} - -void RemoveExpAndOutPlayers() -{ - DebugMessage("RemoveExpAndOutPlayers") - DebugMessage("g_CVAR_iDeleteExpired: %d", g_CVAR_iDeleteExpired) - DebugMessage("g_CVAR_iOutdatedExpired: %d", g_CVAR_iOutdatedExpired) - - if (g_CVAR_iDeleteExpired >= 0) - { - char szQuery[PMP]; - FormatEx(SZF(szQuery), "SELECT `account_id`, `name`, `group` FROM `vip_users` WHERE `expires` > 0 AND `expires` < %d%s;", (GetTime() - g_CVAR_iDeleteExpired*86400), g_szServerID); - - DBG_SQL_Query(szQuery) - DebugMessage(szQuery) - g_hDatabase.Query(SQL_Callback_SelectExpiredAndOutdated, szQuery, REASON_EXPIRED); - } - - if (g_CVAR_iOutdatedExpired > 0) - { - char szQuery[PMP]; - FormatEx(SZF(szQuery), "SELECT `account_id`, `name`, `group` FROM `vip_users` WHERE `lastvisit` > 0 AND `lastvisit` < %d%s;", (GetTime() - g_CVAR_iOutdatedExpired*86400), g_szServerID); - - DBG_SQL_Query(szQuery) - g_hDatabase.Query(SQL_Callback_SelectExpiredAndOutdated, szQuery, REASON_OUTDATED); - } -} - -public void SQL_Callback_ErrorCheck(Database hOwner, DBResultSet hResult, const char[] szError, any data) -{ - DBG_SQL_Response("SQL_Callback_ErrorCheck") - - if (szError[0]) - { - LogError("SQL_Callback_ErrorCheck: %s", szError); - } -} - -void DB_UpdateClient(int iClient, const char[] szDbName = NULL_STRING) -{ - int iClientID; - g_hFeatures[iClient].GetValue(KEY_CID, iClientID); - - char szQuery[PMP]; - - if (g_CVAR_bUpdateName || !strcmp(szDbName, "unknown")) - { - char szName[MNL*2+1]; - GetClientName(iClient, szQuery, MNL); - g_hDatabase.Escape(szQuery, SZF(szName)); - FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `name` = '%s', `lastvisit` = %d WHERE `account_id` = %d%s;", szName, GetTime(), iClientID, g_szServerID); - } - else - { - FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `lastvisit` = %d WHERE `account_id` = %d%s;", GetTime(), iClientID, g_szServerID); - } - - DBG_SQL_Query(szQuery) - g_hDatabase.Query(SQL_Callback_ErrorCheck, szQuery); -} - -public void SQL_Callback_SelectExpiredAndOutdated(Database hOwner, DBResultSet hResult, const char[] szError, int iReason) -{ - DBG_SQL_Response("SQL_Callback_SelectExpiredAndOutdated") - - if (szError[0]) - { - LogError("SQL_Callback_SelectExpiredAndOutdated: %s", szError); - return; - } - - DBG_SQL_Response("hResult.RowCount = %d", hResult.RowCount) - DebugMessage("hResult.RowCount = %d", hResult.RowCount) - - if (hResult.RowCount) - { - int iAccountID; - char szName[MNL*2], szGroup[64], szAdminInfo[128], szTargetInfo[128], szAuth[32]; - FormatEx(SZF(szAdminInfo), "%T", "REASON_EXPIRED", LANG_SERVER); - while (hResult.FetchRow()) - { - DBG_SQL_Response("hResult.FetchRow()") - iAccountID = hResult.FetchInt(0); - hResult.FetchString(1, SZF(szName)); - hResult.FetchString(2, SZF(szGroup)); - - DBG_SQL_Response("hResult.FetchInt(0) = %d", iAccountID) - DBG_SQL_Response("hResult.FetchString(1) = '%s'", szName) - DBG_SQL_Response("hResult.FetchString(2) = '%s'", szGroup) - - UTIL_GetSteamIDFromAccountID(iAccountID, SZF(szAuth)); - FormatEx(SZF(szTargetInfo), "%s (%s, unknown)", szName, szAuth); - - DB_RemoveVipPlayerByData( - REASON_EXPIRED, - szAdminInfo, - 0, - iAccountID, - szTargetInfo, - szGroup, - true - ); - } - } -} - -void DB_AddVipPlayer( - const int iAdmin, - const char[] szAdminInfo, - const int iTarget, - const int iTargetAccountID, - const char[] szTargetInfo, - const int iDuration, - const int iExpires, - const char[] szGroup -) -{ - DataPack hDataPack = new DataPack(); - - // Admin - hDataPack.WriteCell(iAdmin); - hDataPack.WriteString(szAdminInfo); - - // Target - hDataPack.WriteCell(GET_UID(iTarget)); - hDataPack.WriteCell(iTargetAccountID); - hDataPack.WriteString(szTargetInfo); - - // Data - hDataPack.WriteCell(iDuration); - hDataPack.WriteCell(iExpires); - hDataPack.WriteString(szGroup); - - int iLastVisit = iTarget ? GetTime() : 0; - - char szQuery[512], szName[MNL*2+1]; - if (iTarget) - { - GetClientName(iTarget, SZF(szQuery)); - g_hDatabase.Escape(szQuery, SZF(szName)); - } - else - { - strcopy(SZF(szName), "unknown"); - } - - if (DB_IsMysql()) - { - FormatEx(SZF(szQuery), "INSERT INTO `vip_users` (`account_id`, `sid`, `expires`, `group`, `name`, `lastvisit`) VALUES (%d, %d, %d, '%s', '%s', %d) \ - ON DUPLICATE KEY UPDATE `expires` = %d, `group` = '%s';", iTargetAccountID, g_CVAR_iServerID, iExpires, szGroup, szName, iLastVisit, iExpires, szGroup); - DBG_SQL_Query(szQuery) - g_hDatabase.Query(SQL_Callback_OnVIPClientAdded, szQuery, hDataPack); - - return; - } - - FormatEx(SZF(szQuery), "INSERT OR REPLACE INTO `vip_users` (`account_id`, `name`, `expires`, `group`, `lastvisit`) VALUES (%d, '%s', %d, '%s', %d);", iTargetAccountID, szName, iExpires, szGroup, iLastVisit); - DBG_SQL_Query(szQuery) - g_hDatabase.Query(SQL_Callback_OnVIPClientAdded, szQuery, hDataPack); -} - -public void SQL_Callback_OnVIPClientAdded(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hDataPack) -{ - DBG_SQL_Response("SQL_Callback_OnVIPClientAdded") - hDataPack.Reset(); - - // Admin - int iAdmin = GET_CID(hDataPack.ReadCell()); - - if (hResult == null || szError[0]) - { - delete hDataPack; - - if (iAdmin >= 0) - { - UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_FAILED"); - } - - LogError("SQL_Callback_OnVIPClientAdded: %s", szError); - return; - } - - DBG_SQL_Response("hResult.AffectedRows = %d", hResult.AffectedRows) - - if (!hResult.AffectedRows) - { - delete hDataPack; - - if (iAdmin >= 0) - { - UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_FAILED"); - } - return; - } - - int iTarget, iDuration, iExpires, iAccountID; - char szAdminInfo[PMP], szTargetInfo[PMP], szGroup[64]; - - hDataPack.ReadString(SZF(szAdminInfo)); - - // Target - iTarget = GET_CID(hDataPack.ReadCell()); - iAccountID = hDataPack.ReadCell(); - hDataPack.ReadString(SZF(szTargetInfo)); - - // Data - iDuration = hDataPack.ReadCell(); - iExpires = hDataPack.ReadCell(); - hDataPack.ReadString(SZF(szGroup)); - - delete hDataPack; - - Clients_OnVipPlayerAdded( - iAdmin, - szAdminInfo, - iTarget, - iAccountID, - szTargetInfo, - iDuration, - iExpires, - szGroup - ); -} - -void DB_RemoveVipPlayer( - const int iAdmin, - const char[] szAdminInfo, - const int iTarget, - const int iTargetAccountID, - const bool bNotify -) -{ - DataPack hDataPack = new DataPack(); - hDataPack.WriteCell(GET_UID(iAdmin)); - hDataPack.WriteString(szAdminInfo); - hDataPack.WriteCell(GET_UID(iTarget)); - hDataPack.WriteCell(iTargetAccountID); - hDataPack.WriteCell(bNotify); - - char szQuery[512]; - FormatEx(SZF(szQuery), "SELECT `name`, `group` FROM `vip_users` WHERE `account_id` = %d%s;", iTargetAccountID, g_szServerID); - - DBG_SQL_Query(szQuery) - g_hDatabase.Query(SQL_Callback_SelectForRemoveClient, szQuery, hDataPack); -} - -public void SQL_Callback_SelectForRemoveClient(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hDataPack) -{ - DBG_SQL_Response("SQL_Callback_SelectForRemoveClient") - - if (szError[0]) - { - delete hDataPack; - LogError("SQL_Callback_SelectForRemoveClient: %s", szError); - return; - } - - if (!hResult.FetchRow()) - { - delete hDataPack; - return; - } - - DBG_SQL_Response("hResult.FetchRow()") - hDataPack.Reset(); - - int iAdmin, iTarget, iTargetAccountID; - char szAdminInfo[128], szTargetInfo[128]; - - iAdmin = GET_CID(hDataPack.ReadCell()); - hDataPack.ReadString(SZF(szAdminInfo)); - iTarget = GET_CID(hDataPack.ReadCell()); - iTargetAccountID = hDataPack.ReadCell(); - bool bNotify = hDataPack.ReadCell(); - - char szGroup[64]; - hResult.FetchString(1, SZF(szGroup)); - - if (iTarget) - { - UTIL_GetClientInfo(iTarget, SZF(szTargetInfo)); - } - else - { - char szName[MAX_NAME_LENGTH*2+1], szAuth[32]; - UTIL_GetSteamIDFromAccountID(iTargetAccountID, SZF(szAuth)); - hResult.FetchString(0, SZF(szName)); - FormatEx(SZF(szTargetInfo), "%s (%s, unknown)", szName, szAuth); - } - - DB_RemoveVipPlayerByData( - iAdmin, - szAdminInfo, - iTarget, - iTargetAccountID, - szTargetInfo, - szGroup, - bNotify - ); -} - -void DB_RemoveVipPlayerByData( - const int iAdmin, - const char[] szAdminInfo, - const int iTarget, - const int iTargetAccountID, - const char[] szTargetInfo, - const char[] szGroup, - const bool bNotify -) -{ - DataPack hDataPack = new DataPack(); - - // Admin - hDataPack.WriteCell(GET_UID(iAdmin)); - hDataPack.WriteString(szAdminInfo); - - // Target - hDataPack.WriteCell(GET_UID(iTarget)); - hDataPack.WriteCell(iTargetAccountID); - hDataPack.WriteString(szTargetInfo); - - // Data - hDataPack.WriteString(szGroup); - hDataPack.WriteCell(bNotify); - - char szQuery[PMP]; - FormatEx(SZF(szQuery), "DELETE FROM `vip_users` WHERE `account_id` = %d%s;", iTargetAccountID, g_szServerID); - - DBG_SQL_Query(szQuery) - g_hDatabase.Query(SQL_Callback_RemoveClient, szQuery, hDataPack); -} - -public void SQL_Callback_RemoveClient(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hDataPack) -{ - DBG_SQL_Response("SQL_Callback_SelectRemoveClient") - - if (szError[0]) - { - delete hDataPack; - LogError("SQL_Callback_RemoveClient: %s", szError); - return; - } - - DBG_SQL_Response("hResult.AffectedRows = %d", hResult.AffectedRows) - - if (!hResult.AffectedRows) - { - delete hDataPack; - return; - } - hDataPack.Reset(); - - - int iAdmin, iTarget, iAccountID; - char szAdminInfo[PMP], szTargetInfo[PMP], szGroup[64]; - - // Admin - iAdmin = GET_CID(hDataPack.ReadCell()); - hDataPack.ReadString(SZF(szAdminInfo)); - - // Target - iTarget = GET_CID(hDataPack.ReadCell()); - iAccountID = hDataPack.ReadCell(); - hDataPack.ReadString(SZF(szTargetInfo)); - - // Data - hDataPack.ReadString(SZF(szGroup)); - bool bNotify = hDataPack.ReadCell(); - - delete hDataPack; - - if (!iTarget) - { - iTarget = UTIL_GetVipClientByAccountID(iAccountID); - } - - Clients_OnVipPlayerRemoved( - iAdmin, - szAdminInfo, - iTarget, - iAccountID, - szTargetInfo, - szGroup, - bNotify - ); -} -/** -void DB_RemoveClientFromID(int iAdmin = 0, - int iClient = 0, - int iClientID = 0, - bool bNotify, - const char[] szSourceName = NULL_STRING, - const char[] szSourceGroup = NULL_STRING, - const char[] szByWho = NULL_STRING) -{ - DebugMessage("DB_RemoveClientFromID %N (%d): - > iClientID: %d, : bNotify: %b", iClient, iClient, iClientID, bNotify) - char szQuery[PMP], szName[MNL], szGroup[64]; - DataPack hDataPack = new DataPack(); - - if (iClient) - { - if (szSourceName[0]) - { - strcopy(SZF(szName), szSourceName); - } - else - { - GetClientName(iClient, SZF(szName)); - } - - if (szSourceGroup[0]) - { - strcopy(SZF(szGroup), szSourceGroup); - } - else if (g_hFeatures[iClient]) - { - g_hFeatures[iClient].GetString(KEY_GROUP, SZF(szGroup)); - - if (!iClientID) - { - g_hFeatures[iClient].GetValue(KEY_CID, iClientID); - } - } - } - hDataPack.WriteCell(iClientID); - hDataPack.WriteCell(GET_UID(iAdmin)); - hDataPack.WriteCell(bNotify); - - char szAdmin[PMP]; - switch(iAdmin) - { - case REASON_EXPIRED: - { - FormatEx(SZF(szAdmin), "%T", "REASON_EXPIRED", LANG_SERVER); - } - case REASON_OUTDATED: - { - FormatEx(SZF(szAdmin), "%T", "REASON_INACTIVITY", LANG_SERVER); - } - case REASON_PLUGIN: - { - FormatEx(SZF(szAdmin), "%T %s", "BY_PLUGIN", LANG_SERVER, szByWho); - } - case 0: - { - FormatEx(SZF(szAdmin), "%T", "BY_SERVER", LANG_SERVER); - } - default: - { - char szAdminInfo[128]; - UTIL_GetClientInfo(iAdmin, SZF(szAdminInfo)); - FormatEx(SZF(szAdmin), "%T %s", "BY_ADMIN", LANG_SERVER, szAdminInfo); - } - } - - hDataPack.WriteString(szAdmin); - - if (szName[0] && szGroup[0]) - { - hDataPack.WriteString(szName); - hDataPack.WriteString(szGroup); - DB_RemoveClient(hDataPack, iClientID); - return; - } - - FormatEx(SZF(szQuery), "SELECT `name`, `group` FROM `vip_users` WHERE `account_id` = %d%s;", iClientID, g_szServerID); - - DBG_SQL_Query(szQuery) - g_hDatabase.Query(SQL_Callback_SelectRemoveClient, szQuery, hDataPack); -} - -public void SQL_Callback_SelectRemoveClient(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hDataPack) -{ - DBG_SQL_Response("SQL_Callback_SelectRemoveClient") - - if (szError[0]) - { - delete hDataPack; - LogError("SQL_Callback_SelectRemoveClient: %s", szError); - return; - } - - if (!hResult.FetchRow()) - { - delete hDataPack; - return; - } - - DBG_SQL_Response("hResult.FetchRow()") - hDataPack.Reset(); - int iClientID = hDataPack.ReadCell(); - hDataPack.ReadCell(); - hDataPack.ReadCell(); - char szName[MAX_NAME_LENGTH*2+1]; - hDataPack.ReadString(SZF(szName)); - hResult.FetchString(0, SZF(szName)); - DBG_SQL_Response("hResult.FetchString(0) = '%s", szName) - hDataPack.WriteString(szName); - hResult.FetchString(1, SZF(szName)); - DBG_SQL_Response("hResult.FetchString(1) = '%s", szName) - hDataPack.WriteString(szName); - - DB_RemoveClient(hDataPack, iClientID); -} - -void DB_RemoveClient(int iClientID, DataPack hDataPack) -{ - char szQuery[PMP]; - FormatEx(SZF(szQuery), "DELETE FROM `vip_users` WHERE `account_id` = %d%s;", iClientID, g_szServerID); - - DBG_SQL_Query(szQuery) - g_hDatabase.Query(SQL_Callback_RemoveClient, szQuery, hDataPack); -} - -public void SQL_Callback_RemoveClient(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hDataPack) -{ - DBG_SQL_Response("SQL_Callback_SelectRemoveClient") - - if (szError[0]) - { - delete hDataPack; - LogError("SQL_Callback_RemoveClient: %s", szError); - return; - } - - DBG_SQL_Response("hResult.AffectedRows = %d", hResult.AffectedRows) - - if (!hResult.AffectedRows) - { - delete hDataPack; - return; - } - hDataPack.Reset(); - - int iClientID = hDataPack.ReadCell(); - int iAdmin = GET_CID(hDataPack.ReadCell()); - bool bNotify = view_as(hDataPack.ReadCell()); - char szAdmin[128], szName[MNL], szGroup[64]; - hDataPack.ReadString(SZF(szAdmin)); - hDataPack.ReadString(SZF(szName)); - hDataPack.ReadString(SZF(szGroup)); - delete hDataPack; - - Clients_OnVipPlayerRemoved( - iAdmin, - szAdminInfo, - iTarget, - iTargetAccountID, - szTargetInfo, - szGroup - ); -} -*/ -bool DB_IsMysql() -{ - return (GLOBAL_INFO & IS_MySQL) == IS_MySQL; -} +#define CHARSET "utf8mb4" +#define COLLATION "utf8mb4_unicode_ci" + +//#define CHARSET "utf8" +//#define COLLATION "utf8_unicode_ci" + +void DB_OnPluginStart() +{ + DB_Connect(); +} + +void DB_Connect() +{ + // DebugMessage("DB_Connect: %b", g_bIsVIPLoaded) + DebugMessage("DB_Connect") + + if (GLOBAL_INFO & IS_LOADING) + { + return; + } + + if (g_hDatabase != null) + { + UNSET_BIT(GLOBAL_INFO, IS_LOADING); + return; + } + + SET_BIT(GLOBAL_INFO, IS_LOADING); + + if (SQL_CheckConfig("vip_core")) // "vip_core" + { + Database.Connect(OnDBConnect, "vip_core", 0); + } + else + { + char szError[PMP]; + g_hDatabase = SQLite_UseDatabase("vip_core", SZF(szError)); + OnDBConnect(g_hDatabase, szError, 1); + } +} + +public void OnDBConnect(Database hDatabase, const char[] szError, int data) +{ + if (hDatabase == null || szError[0]) + { + SetFailState("OnDBConnect %s", szError); + UNSET_BIT(GLOBAL_INFO, IS_MySQL); + // CreateTimer(5.0, Timer_DB_Reconnect); + return; + } + + g_hDatabase = hDatabase; + + if (data == 1) + { + UNSET_BIT(GLOBAL_INFO, IS_MySQL); + } + else + { + char szDriver[8]; + g_hDatabase.Driver.GetIdentifier(SZF(szDriver)); + + if (strcmp(szDriver, "mysql", false) == 0) + { + SET_BIT(GLOBAL_INFO, IS_MySQL); + } + else + { + UNSET_BIT(GLOBAL_INFO, IS_MySQL); + } + } + + DebugMessage("OnDBConnect %x, %u - > (MySQL: %b)", g_hDatabase, g_hDatabase, DB_IsMysql()) + + SetupServerID(); + CreateTables(); +} + +void CreateTables() +{ + DebugMessage("CreateTables") + + if (DB_IsMysql()) + { + g_hDatabase.Query(SQL_Callback_TableCreate, "CREATE TABLE IF NOT EXISTS `vip_users` (\ + `account_id` INT NOT NULL, \ + `name` VARCHAR(64) NOT NULL default 'unknown' COLLATE '" ... COLLATION ... "', \ + `lastvisit` INT UNSIGNED NOT NULL default 0, \ + `sid` INT UNSIGNED NOT NULL, \ + `group` VARCHAR(64) NOT NULL, \ + `expires` INT UNSIGNED NOT NULL default 0, \ + CONSTRAINT pk_PlayerID PRIMARY KEY (`account_id`, `sid`) \ + ) DEFAULT CHARSET=" ... CHARSET ... ";"); + + g_hDatabase.Query(SQL_Callback_StorageTableCreate, "CREATE TABLE IF NOT EXISTS `vip_storage` (\ + `account_id` INT NOT NULL, \ + `key` VARCHAR(128) NOT NULL, \ + `value` varchar(256) NOT NULL default '', \ + `sid` INT UNSIGNED NOT NULL, \ + `updated` INT UNSIGNED NOT NULL default 0, \ + PRIMARY KEY (`account_id`, `key`, `sid`) \ + ) DEFAULT CHARSET=" ... CHARSET ... ";"); + } + else + { + g_szServerID[0] = 0; + + g_hDatabase.Query(SQL_Callback_TableCreate, "CREATE TABLE IF NOT EXISTS `vip_users` (\ + `account_id` INTEGER PRIMARY KEY NOT NULL, \ + `name` VARCHAR(64) NOT NULL default 'unknown', \ + `lastvisit` INTEGER UNSIGNED NOT NULL default 0, \ + `group` VARCHAR(64) NOT NULL, \ + `expires` INTEGER UNSIGNED NOT NULL default 0);"); + + g_hDatabase.Query(SQL_Callback_StorageTableCreate, "CREATE TABLE IF NOT EXISTS `vip_storage` (\ + `account_id` INTEGER NOT NULL, \ + `key` VARCHAR(128) NOT NULL, \ + `value` TEXT NOT NULL default '', \ + `updated` INTEGER UNSIGNED NOT NULL default 0, \ + PRIMARY KEY (`account_id`, `key`) \ + );"); + } +} + +public void SQL_Callback_TableCreate(Database hOwner, DBResultSet hResult, const char[] szError, any data) +{ + DBG_SQL_Response("SQL_Callback_TableCreate") + + if (!hResult || szError[0]) + { + SetFailState("SQL_Callback_TableCreate: %s", szError); + return; + } + + if (DB_IsMysql()) + { + g_hDatabase.Query(SQL_Callback_ErrorCheck, "SET NAMES '" ... CHARSET ... "'"); + g_hDatabase.Query(SQL_Callback_ErrorCheck, "SET CHARSET '" ... CHARSET ... "'"); + + g_hDatabase.SetCharset(CHARSET); + } + + UNSET_BIT(GLOBAL_INFO, IS_LOADING); + + OnReadyToStart(); + + Clients_ReloadVipPlayers(0, false); + + RemoveExpAndOutPlayers(); +} + +public void SQL_Callback_StorageTableCreate(Database hOwner, DBResultSet hResult, const char[] szError, any data) +{ + DBG_SQL_Response("SQL_Callback_StorageTableCreate") + + if (!hResult || szError[0]) + { + SetFailState("SQL_Callback_StorageTableCreate: %s", szError); + return; + } +} + +void RemoveExpAndOutPlayers() +{ + DebugMessage("RemoveExpAndOutPlayers") + DebugMessage("g_CVAR_iDeleteExpired: %d", g_CVAR_iDeleteExpired) + DebugMessage("g_CVAR_iOutdatedExpired: %d", g_CVAR_iOutdatedExpired) + + if (g_CVAR_iDeleteExpired >= 0) + { + char szQuery[PMP]; + FormatEx(SZF(szQuery), "SELECT `account_id`, `name`, `group` FROM `vip_users` WHERE `expires` > 0 AND `expires` < %d%s;", (GetTime() - g_CVAR_iDeleteExpired*86400), g_szServerID); + + DBG_SQL_Query(szQuery) + DebugMessage(szQuery) + g_hDatabase.Query(SQL_Callback_SelectExpiredAndOutdated, szQuery, REASON_EXPIRED); + } + + if (g_CVAR_iOutdatedExpired > 0) + { + char szQuery[PMP]; + FormatEx(SZF(szQuery), "SELECT `account_id`, `name`, `group` FROM `vip_users` WHERE `lastvisit` > 0 AND `lastvisit` < %d%s;", (GetTime() - g_CVAR_iOutdatedExpired*86400), g_szServerID); + + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_SelectExpiredAndOutdated, szQuery, REASON_OUTDATED); + } +} + +public void SQL_Callback_ErrorCheck(Database hOwner, DBResultSet hResult, const char[] szError, any data) +{ + DBG_SQL_Response("SQL_Callback_ErrorCheck") + + if (szError[0]) + { + LogError("SQL_Callback_ErrorCheck: %s", szError); + } +} + +void DB_UpdateClient(int iClient, const char[] szDbName = NULL_STRING) +{ + int iClientID; + g_hFeatures[iClient].GetValue(KEY_CID, iClientID); + + char szQuery[PMP]; + + if (g_CVAR_bUpdateName || !strcmp(szDbName, "unknown")) + { + char szName[MNL*2+1]; + GetClientName(iClient, szQuery, MNL); + g_hDatabase.Escape(szQuery, SZF(szName)); + FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `name` = '%s', `lastvisit` = %d WHERE `account_id` = %d%s;", szName, GetTime(), iClientID, g_szServerID); + } + else + { + FormatEx(SZF(szQuery), "UPDATE `vip_users` SET `lastvisit` = %d WHERE `account_id` = %d%s;", GetTime(), iClientID, g_szServerID); + } + + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_ErrorCheck, szQuery); +} + +public void SQL_Callback_SelectExpiredAndOutdated(Database hOwner, DBResultSet hResult, const char[] szError, int iReason) +{ + DBG_SQL_Response("SQL_Callback_SelectExpiredAndOutdated") + + if (szError[0]) + { + LogError("SQL_Callback_SelectExpiredAndOutdated: %s", szError); + return; + } + + DBG_SQL_Response("hResult.RowCount = %d", hResult.RowCount) + DebugMessage("hResult.RowCount = %d", hResult.RowCount) + + if (hResult.RowCount) + { + int iAccountID; + char szName[MNL*2], szGroup[64], szAdminInfo[128], szTargetInfo[128], szAuth[32]; + FormatEx(SZF(szAdminInfo), "%T", "REASON_EXPIRED", LANG_SERVER); + while (hResult.FetchRow()) + { + DBG_SQL_Response("hResult.FetchRow()") + iAccountID = hResult.FetchInt(0); + hResult.FetchString(1, SZF(szName)); + hResult.FetchString(2, SZF(szGroup)); + + DBG_SQL_Response("hResult.FetchInt(0) = %d", iAccountID) + DBG_SQL_Response("hResult.FetchString(1) = '%s'", szName) + DBG_SQL_Response("hResult.FetchString(2) = '%s'", szGroup) + + UTIL_GetSteamIDFromAccountID(iAccountID, SZF(szAuth)); + FormatEx(SZF(szTargetInfo), "%s (%s, unknown)", szName, szAuth); + + DB_RemoveVipPlayerByData( + REASON_EXPIRED, + szAdminInfo, + 0, + iAccountID, + szTargetInfo, + szGroup, + true + ); + } + } +} + +void DB_AddVipPlayer( + const int iAdmin, + const char[] szAdminInfo, + const int iTarget, + const int iTargetAccountID, + const char[] szTargetInfo, + const int iDuration, + const int iExpires, + const char[] szGroup +) +{ + DataPack hDataPack = new DataPack(); + + // Admin + hDataPack.WriteCell(iAdmin); + hDataPack.WriteString(szAdminInfo); + + // Target + hDataPack.WriteCell(GET_UID(iTarget)); + hDataPack.WriteCell(iTargetAccountID); + hDataPack.WriteString(szTargetInfo); + + // Data + hDataPack.WriteCell(iDuration); + hDataPack.WriteCell(iExpires); + hDataPack.WriteString(szGroup); + + int iLastVisit = iTarget ? GetTime() : 0; + + char szQuery[512], szName[MNL*2+1]; + if (iTarget) + { + GetClientName(iTarget, SZF(szQuery)); + g_hDatabase.Escape(szQuery, SZF(szName)); + } + else + { + strcopy(SZF(szName), "unknown"); + } + + if (DB_IsMysql()) + { + FormatEx(SZF(szQuery), "INSERT INTO `vip_users` (`account_id`, `sid`, `expires`, `group`, `name`, `lastvisit`) VALUES (%d, %d, %d, '%s', '%s', %d) \ + ON DUPLICATE KEY UPDATE `expires` = %d, `group` = '%s';", iTargetAccountID, g_CVAR_iServerID, iExpires, szGroup, szName, iLastVisit, iExpires, szGroup); + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_OnVIPClientAdded, szQuery, hDataPack); + + return; + } + + FormatEx(SZF(szQuery), "INSERT OR REPLACE INTO `vip_users` (`account_id`, `name`, `expires`, `group`, `lastvisit`) VALUES (%d, '%s', %d, '%s', %d);", iTargetAccountID, szName, iExpires, szGroup, iLastVisit); + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_OnVIPClientAdded, szQuery, hDataPack); +} + +public void SQL_Callback_OnVIPClientAdded(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hDataPack) +{ + DBG_SQL_Response("SQL_Callback_OnVIPClientAdded") + hDataPack.Reset(); + + // Admin + int iAdmin = GET_CID(hDataPack.ReadCell()); + + if (hResult == null || szError[0]) + { + delete hDataPack; + + if (iAdmin >= 0) + { + UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_FAILED"); + } + + LogError("SQL_Callback_OnVIPClientAdded: %s", szError); + return; + } + + DBG_SQL_Response("hResult.AffectedRows = %d", hResult.AffectedRows) + + if (!hResult.AffectedRows) + { + delete hDataPack; + + if (iAdmin >= 0) + { + UTIL_Reply(iAdmin, "%t", "ADMIN_VIP_ADD_FAILED"); + } + return; + } + + int iTarget, iDuration, iExpires, iAccountID; + char szAdminInfo[PMP], szTargetInfo[PMP], szGroup[64]; + + hDataPack.ReadString(SZF(szAdminInfo)); + + // Target + iTarget = GET_CID(hDataPack.ReadCell()); + iAccountID = hDataPack.ReadCell(); + hDataPack.ReadString(SZF(szTargetInfo)); + + // Data + iDuration = hDataPack.ReadCell(); + iExpires = hDataPack.ReadCell(); + hDataPack.ReadString(SZF(szGroup)); + + delete hDataPack; + + Clients_OnVipPlayerAdded( + iAdmin, + szAdminInfo, + iTarget, + iAccountID, + szTargetInfo, + iDuration, + iExpires, + szGroup + ); +} + +void DB_RemoveVipPlayer( + const int iAdmin, + const char[] szAdminInfo, + const int iTarget, + const int iTargetAccountID, + const bool bNotify +) +{ + DataPack hDataPack = new DataPack(); + hDataPack.WriteCell(GET_UID(iAdmin)); + hDataPack.WriteString(szAdminInfo); + hDataPack.WriteCell(GET_UID(iTarget)); + hDataPack.WriteCell(iTargetAccountID); + hDataPack.WriteCell(bNotify); + + char szQuery[512]; + FormatEx(SZF(szQuery), "SELECT `name`, `group` FROM `vip_users` WHERE `account_id` = %d%s;", iTargetAccountID, g_szServerID); + + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_SelectForRemoveClient, szQuery, hDataPack); +} + +public void SQL_Callback_SelectForRemoveClient(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hDataPack) +{ + DBG_SQL_Response("SQL_Callback_SelectForRemoveClient") + + if (szError[0]) + { + delete hDataPack; + LogError("SQL_Callback_SelectForRemoveClient: %s", szError); + return; + } + + if (!hResult.FetchRow()) + { + delete hDataPack; + return; + } + + DBG_SQL_Response("hResult.FetchRow()") + hDataPack.Reset(); + + int iAdmin, iTarget, iTargetAccountID; + char szAdminInfo[128], szTargetInfo[128]; + + iAdmin = GET_CID(hDataPack.ReadCell()); + hDataPack.ReadString(SZF(szAdminInfo)); + iTarget = GET_CID(hDataPack.ReadCell()); + iTargetAccountID = hDataPack.ReadCell(); + bool bNotify = hDataPack.ReadCell(); + + char szGroup[64]; + hResult.FetchString(1, SZF(szGroup)); + + if (iTarget > 0) + { + UTIL_GetClientInfo(iTarget, SZF(szTargetInfo)); + } + else + { + char szName[MAX_NAME_LENGTH*2+1], szAuth[32]; + UTIL_GetSteamIDFromAccountID(iTargetAccountID, SZF(szAuth)); + hResult.FetchString(0, SZF(szName)); + FormatEx(SZF(szTargetInfo), "%s (%s, unknown)", szName, szAuth); + } + + DB_RemoveVipPlayerByData( + iAdmin, + szAdminInfo, + iTarget, + iTargetAccountID, + szTargetInfo, + szGroup, + bNotify + ); +} + +void DB_RemoveVipPlayerByData( + const int iAdmin, + const char[] szAdminInfo, + const int iTarget, + const int iTargetAccountID, + const char[] szTargetInfo, + const char[] szGroup, + const bool bNotify +) +{ + DataPack hDataPack = new DataPack(); + + // Admin + hDataPack.WriteCell(GET_UID(iAdmin)); + hDataPack.WriteString(szAdminInfo); + + // Target + hDataPack.WriteCell(GET_UID(iTarget)); + hDataPack.WriteCell(iTargetAccountID); + hDataPack.WriteString(szTargetInfo); + + // Data + hDataPack.WriteString(szGroup); + hDataPack.WriteCell(bNotify); + + char szQuery[PMP]; + FormatEx(SZF(szQuery), "DELETE FROM `vip_users` WHERE `account_id` = %d%s;", iTargetAccountID, g_szServerID); + + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_RemoveClient, szQuery, hDataPack); +} + +public void SQL_Callback_RemoveClient(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hDataPack) +{ + DBG_SQL_Response("SQL_Callback_SelectRemoveClient") + + if (szError[0]) + { + delete hDataPack; + LogError("SQL_Callback_RemoveClient: %s", szError); + return; + } + + DBG_SQL_Response("hResult.AffectedRows = %d", hResult.AffectedRows) + + if (!hResult.AffectedRows) + { + delete hDataPack; + return; + } + hDataPack.Reset(); + + + int iAdmin, iTarget, iAccountID; + char szAdminInfo[PMP], szTargetInfo[PMP], szGroup[64]; + + // Admin + iAdmin = GET_CID(hDataPack.ReadCell()); + hDataPack.ReadString(SZF(szAdminInfo)); + + // Target + iTarget = GET_CID(hDataPack.ReadCell()); + iAccountID = hDataPack.ReadCell(); + hDataPack.ReadString(SZF(szTargetInfo)); + + // Data + hDataPack.ReadString(SZF(szGroup)); + bool bNotify = hDataPack.ReadCell(); + + delete hDataPack; + + if (!iTarget) + { + iTarget = UTIL_GetVipClientByAccountID(iAccountID); + } + + Clients_OnVipPlayerRemoved( + iAdmin, + szAdminInfo, + iTarget, + iAccountID, + szTargetInfo, + szGroup, + bNotify + ); +} +/** +void DB_RemoveClientFromID(int iAdmin = 0, + int iClient = 0, + int iClientID = 0, + bool bNotify, + const char[] szSourceName = NULL_STRING, + const char[] szSourceGroup = NULL_STRING, + const char[] szByWho = NULL_STRING) +{ + DebugMessage("DB_RemoveClientFromID %N (%d): - > iClientID: %d, : bNotify: %b", iClient, iClient, iClientID, bNotify) + char szQuery[PMP], szName[MNL], szGroup[64]; + DataPack hDataPack = new DataPack(); + + if (iClient) + { + if (szSourceName[0]) + { + strcopy(SZF(szName), szSourceName); + } + else + { + GetClientName(iClient, SZF(szName)); + } + + if (szSourceGroup[0]) + { + strcopy(SZF(szGroup), szSourceGroup); + } + else if (g_hFeatures[iClient]) + { + g_hFeatures[iClient].GetString(KEY_GROUP, SZF(szGroup)); + + if (!iClientID) + { + g_hFeatures[iClient].GetValue(KEY_CID, iClientID); + } + } + } + hDataPack.WriteCell(iClientID); + hDataPack.WriteCell(GET_UID(iAdmin)); + hDataPack.WriteCell(bNotify); + + char szAdmin[PMP]; + switch(iAdmin) + { + case REASON_EXPIRED: + { + FormatEx(SZF(szAdmin), "%T", "REASON_EXPIRED", LANG_SERVER); + } + case REASON_OUTDATED: + { + FormatEx(SZF(szAdmin), "%T", "REASON_INACTIVITY", LANG_SERVER); + } + case REASON_PLUGIN: + { + FormatEx(SZF(szAdmin), "%T %s", "BY_PLUGIN", LANG_SERVER, szByWho); + } + case 0: + { + FormatEx(SZF(szAdmin), "%T", "BY_SERVER", LANG_SERVER); + } + default: + { + char szAdminInfo[128]; + UTIL_GetClientInfo(iAdmin, SZF(szAdminInfo)); + FormatEx(SZF(szAdmin), "%T %s", "BY_ADMIN", LANG_SERVER, szAdminInfo); + } + } + + hDataPack.WriteString(szAdmin); + + if (szName[0] && szGroup[0]) + { + hDataPack.WriteString(szName); + hDataPack.WriteString(szGroup); + DB_RemoveClient(hDataPack, iClientID); + return; + } + + FormatEx(SZF(szQuery), "SELECT `name`, `group` FROM `vip_users` WHERE `account_id` = %d%s;", iClientID, g_szServerID); + + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_SelectRemoveClient, szQuery, hDataPack); +} + +public void SQL_Callback_SelectRemoveClient(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hDataPack) +{ + DBG_SQL_Response("SQL_Callback_SelectRemoveClient") + + if (szError[0]) + { + delete hDataPack; + LogError("SQL_Callback_SelectRemoveClient: %s", szError); + return; + } + + if (!hResult.FetchRow()) + { + delete hDataPack; + return; + } + + DBG_SQL_Response("hResult.FetchRow()") + hDataPack.Reset(); + int iClientID = hDataPack.ReadCell(); + hDataPack.ReadCell(); + hDataPack.ReadCell(); + char szName[MAX_NAME_LENGTH*2+1]; + hDataPack.ReadString(SZF(szName)); + hResult.FetchString(0, SZF(szName)); + DBG_SQL_Response("hResult.FetchString(0) = '%s", szName) + hDataPack.WriteString(szName); + hResult.FetchString(1, SZF(szName)); + DBG_SQL_Response("hResult.FetchString(1) = '%s", szName) + hDataPack.WriteString(szName); + + DB_RemoveClient(hDataPack, iClientID); +} + +void DB_RemoveClient(int iClientID, DataPack hDataPack) +{ + char szQuery[PMP]; + FormatEx(SZF(szQuery), "DELETE FROM `vip_users` WHERE `account_id` = %d%s;", iClientID, g_szServerID); + + DBG_SQL_Query(szQuery) + g_hDatabase.Query(SQL_Callback_RemoveClient, szQuery, hDataPack); +} + +public void SQL_Callback_RemoveClient(Database hOwner, DBResultSet hResult, const char[] szError, DataPack hDataPack) +{ + DBG_SQL_Response("SQL_Callback_SelectRemoveClient") + + if (szError[0]) + { + delete hDataPack; + LogError("SQL_Callback_RemoveClient: %s", szError); + return; + } + + DBG_SQL_Response("hResult.AffectedRows = %d", hResult.AffectedRows) + + if (!hResult.AffectedRows) + { + delete hDataPack; + return; + } + hDataPack.Reset(); + + int iClientID = hDataPack.ReadCell(); + int iAdmin = GET_CID(hDataPack.ReadCell()); + bool bNotify = view_as(hDataPack.ReadCell()); + char szAdmin[128], szName[MNL], szGroup[64]; + hDataPack.ReadString(SZF(szAdmin)); + hDataPack.ReadString(SZF(szName)); + hDataPack.ReadString(SZF(szGroup)); + delete hDataPack; + + Clients_OnVipPlayerRemoved( + iAdmin, + szAdminInfo, + iTarget, + iTargetAccountID, + szTargetInfo, + szGroup + ); +} +*/ +bool DB_IsMysql() +{ + return (GLOBAL_INFO & IS_MySQL) == IS_MySQL; +} diff --git a/updates.md b/updates.md index 7c9e8d8..f28b50b 100644 --- a/updates.md +++ b/updates.md @@ -1,291 +1,291 @@ -# [VIP] Core 3.0 DEV #41 - -### Изменения: -- Доработана формировка sql запросов для `USE_MORE_SERVERS`. - -# [VIP] Core 3.0 DEV #40 - -### Изменения: -- Изменен натив `VIP_RegisterFeature` (Добавлен параметр `bCookie` - Регистрировать ли куки для ф-и (действительно только для типа SELECTABLE)). - -# [VIP] Core 3.0 DEV #39 - -### Изменения: -- Исправлена ошибка на SQLite `SQL_Callback_RemoveClient: no such column: sid`. - -# [VIP] Core 3.0 DEV #38 - -### Изменения: -- Исправлена ошибка на SQLite `SQL_Callback_ErrorCheck: no such column: sid`. - -# [VIP] Core 3.0 DEV #37 - -### Изменения: -- Исправлена ошибка когда не удалялись истекшие VIP-игроки. - -# [VIP] Core 3.0 DEV #36 - -### Изменения: -- Теперь точно исправлена ошибка `Invalid Handle 0 (error 4)` (`DB_RemoveClientFromID`). - -# [VIP] Core 3.0 DEV #35 - -### Изменения: -- Исправлена ошибка `Invalid Handle 0 (error 4)` (`DB_RemoveClientFromID`). - -# [VIP] Core 3.0 DEV #34 - -### Изменения: -- Натив `VIP_RemoveClientVIP` помечен как устаревший и будет удален в будущем. -- Добавлен новый натив `VIP_RemoveClientVIP2`. -- Исправлена ошибка `Client index 0 is invalid` при добавлении VIP-игрока через `sm_addvip`. - -# [VIP] Core 3.0 DEV #33 - -### Изменения: -- Изменени натив `VIP_SetClientFeatureStatus`. -- Исправлена ошибка `SQL_Callback_SelectExpiredAndOutdated: Unknown column 'iTime' in 'where clause'`. -- Переработана система логов. - -# [VIP] Core 3.0 DEV #32 (спасибо DarklSide за обнаруженные ошибок) - -### Изменения: -- Исправлено описание форварда `VIP_OnClientPreLoad`. -- Исправлен натив `VIP_GiveClientFeature`. -- Исправлена ошибка `SQL_Callback_SelectExpiredAndOutdated: no such function: UNIX_TIMESTAMP` на SQLite. -- Исправлено обновление ников игроков. -- Исправлена работа DataPack на sm 1.10. - -# [VIP] Core 3.0 DEV #31 - -### Изменения: -- Добавлен форвард `VIP_OnClientPreLoad`. -- Исправлен и включен натив `VIP_GiveClientFeature`. -- Добавлен натив `VIP_RemoveClientFeature`. -- Изменен натив `VIP_CheckClient`. -- Значение по-умолчанию для `sm_vip_delete_outdated` изменено на `-1`. -- Исправлено удаление истекших и не активных игроков. - -# [VIP] Core 3.0 DEV #30 - -### Изменения: -- Исправлена работа списка VIP-игроков. - -# [VIP] Core 3.0 DEV #29 - -### Изменения: -- Исправлены SQL ошибки. -- Небольшая оптимизация. -- Исправлена отладка. - -# [VIP] Core 3.0 DEV #28 - -### Изменения: -- Исправлена ошибка из-за которой плагин не запускался `Fatal error creating dynamic native!/unexpected error 23 in AskPluginLoad callback`. -- Изменено имя базы данных с `"vip"` на `"vip_core"` (еще в версии 3.0 DEV #25, просто забыл упомянуть). -- Исправлена попытка установки кодировки для SQLite базы. - -# [VIP] Core 3.0 DEV #27 - -### Изменения: -- Активирована работа квара `sm_vip_delete_outdated`. -- Полный переход на новую структуру базы данных. - -# [VIP] Core 3.0 DEV #26 - -### Изменения: -- Вернул прежний вид натива VIP_SetClientVIP и пометил как устаревший. -- Добавлен новый натив `VIP_GiveClientVIP`, как замена устаревшему `VIP_SetClientVIP`. -- Добавлена обратная совместимость натива `VIP_RemoveClientVIP`. -- Изменента структура таблиц (MySQL). - -# [VIP] Core 3.0 DEV #25 - -### Изменения: -- Добавлено использование `TranslationPhraseExists` для предовтращения ошибок (При отсутствии фразы модуля в переводе). -- Начал переводить отладку более расширенный и гибкий вид. -- Добавлен квар `sm_vip_delete_outdated` (пока не функционирует). - -# [VIP] Core 3.0 DEV #24 - -### Изменения: -- Исправлены SQL ошибки. - -# [VIP] Core 3.0 DEV #23 - -### Изменения: -- Удален столбец `id` из базы данных. -- Исправлена ошибка `SQL_Callback_SelectVipClientInfo` . -- Исправлена ошибка `SQL_Callback_ChangeTime: Unknown column 'user_id' in 'where clause'`. - -# [VIP] Core 3.0 DEV #22 - -### Изменения: -- Попытка исправления ошибки `Invalid Handle 0 (error 4)`. -- Исправлена ошибка когда у no-steam игроков значение `account_id` в базе данных становилось равным 0. - -# [VIP] Core 3.0 DEV #21 - -### Изменения: -- Исправлена ошибка `SQL_Callback_SelectVipPlayers: near ")": syntax error`. - -# [VIP] Core 3.0 DEV #20 - -### Изменения: -- Исправлена ошибка когда значение `name` в базе данных становилось равным 0. - -# [VIP] Core 3.0 DEV #19 - -### Изменения: -- Добавлена мультиязычность кнопки `"Выход"` в инфо-меню. - -# [VIP] Core 3.0 DEV #18 - -### Изменения: -- Исправлена ошибка `SQL_Callback_SelectVipPlayers: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0, 60' at line 1`. - -# [VIP] Core 3.0 DEV #17 - -### Изменения: -- Добавлено сохранение последнего входа игрока на сервер. - -# [VIP] Core 3.0 DEV #16 - -### Изменения: -- Теперь игроки хранятся в базе по AccountID. -- Исправлена работа команды `sm_addvip`: - - Теперь она может принимать: SteamID2, SteamID3 и ник. - - Исправлена выдача VIP-статуса оффлайн. - -# [VIP] Core 3.0 DEV #15 - -### Изменения: -- Добавлено исправление работы MOTD окна на CS:GO. -- Добавлена директива FIX_CSGO_MOTD, которая позволяет компилировать ядро с фиксом MOTD и без. - -# [VIP] Core 3.0 DEV #14 - -### Изменения: -- Обновлено API: - - Добавлен форвард `VIP_OnShowClientInfo`. - - Изменен натив `VIP_RemoveClientVIP`. - - Доработано и исправлено описание всех нативов и форвадов. -- Обновлен файл `addons/sourcemod/data/vip/cfg/info.ini` (Исправлено описание и опечатки, добавлен английский перевод). - -# [VIP] Core 3.0 DEV #13 - -### Изменения: -- Исправлена логическая ошибка в работе `VIP_UnregisterFeature` когда добавлялись лишние пункты в VIP-меню. -- Изменен натив `VIP_RegisterFeature` для устранения конфликта с `sm_vip_features_default_status`. -- Добавлен натив `VIP_UnregisterMe()`. - -# [VIP] Core 3.0 DEV #12 - -### Изменения: -- Исправлена ошибка `Invalid data pack handle 1f4 (error 1)`. - -# [VIP] Core 3.0 DEV #11 - -### Изменения: -- Удален натив `VIP_SetFeatureDefStatus`. -- Добавлен параметр в натив `VIP_RegisterFeature`: -``` -@param bDefStatus Значение по-умолчанию (true - Включена, false - Выключена). -``` -- Исправлена ошибка работы натива `VIP_SetClientFeatureStatus`. -- Исправлена ошибка при отправке rcon команд для работы с вип от имени сервера. - -# [VIP] Core 3.0 DEV #10 - -### Изменения: -- Исправлена ошибка `DataPack operation is out of bounds`. - -# [VIP] Core 3.0 DEV #9 - -### Изменения: -- Исправлены ошибки компиляции. - -# [VIP] Core 3.0 DEV #8 - -### Изменения: -- Добавлен параметр в натив `VIP_SetClientFeatureStatus`: -``` -@param bCallback Вызывать ли toggle каллбэк. -``` - -# [VIP] Core 3.0 DEV #7 - -### Изменения: -- Доработано меню управления VIP-игроками. -- Добавлены форварды: -``` -forward void VIP_OnFeatureRegistered(const char[] sFeatureName); -forward void VIP_OnFeatureUnregistered(const char[] sFeatureName); -``` -- Теперь `VIP_OnVIPClientLoaded` вызывается когда игрок уже полностью был загружен. -- Изменены нативы: -``` -native void VIP_GetClientID(int iClient); -// На -native int VIP_GetClientID(int iClient); - -native void VIP_SendClientVIPMenu(int iClient); -// На -native void VIP_SendClientVIPMenu(int iClient, bool bSelection = false); -``` -- Добавлены нативы: -``` -native VIP_FeatureType VIP_GetFeatureType(const char[] sFeatureName); -native VIP_ValueType VIP_GetFeatureValueType(const char[] sFeatureName); -native void VIP_SetFeatureDefStatus(const char[] sFeatureName, bool bStatus); -native int VIP_FillArrayByFeatures(ArrayList hArray); -``` - -# [VIP] Core 3.0 DEV #6 - -### Изменения: -- Исправлены ошибки. - -# [VIP] Core 3.0 DEV #5 - -### Изменения: -- Исправлены ошибки. - -# [VIP] Core 3.0 DEV #4 - -### Изменения: -- Полный перевод на новый синтаксис (`newdecls required`) -- VIP_OnVIPClientLoaded теперь вызывается когда полностью загружены настройки игрока. -- Изменен натив `VIP_SetClientVIP`. -- Удалены лишние фразы из файла перевода. - - -# [VIP] Core 3.0 DEV #3 - -### Изменения: -- Удалены все типы авторизации кроме AUTH_STEAM. -- Изменена команда sm_addvip. -- Временно отключены все функции админ-меню, кроме добавления VIP-игроков. - - -# [VIP] Core 3.0 DEV #2 - -### Изменения: -- Перевод на новый синтаксис файла vars.sp и частичный перевод других. -- Удалены пароли (из базы, запросов, api, cvars). - -# [VIP] Core 3.0 DEV #1 - -### Изменения: -- Корректная компиляция на см >= 1.7. -- Добавлена переменная time в информационных сообщениях типа меню. Отвечает за время отображения меню игроку. -- Исправлен сброс настроек при перезаходе в случае когда куки не успели загрузится. - -# [VIP] Core 3.0 DEV - -### Что изменено: -- Добавлена директива USE_ADMINMENU, которая позволяет компилировать ядро с админкой vip и без неё. -- Добавлен квар sm_vip_add_item_to_admin_menu - Добавить пункт "Управление VIP" в админ-меню. -- Добавлено отдельно меню администрирования VIP, команда для открытия sm_vipadmin, !vipadmin, /vipadmin. -- Удален частный форвард спавна игрока (и нативы хука/анхука). -- Теперь для работы требуется SM 1.5.0 или выше. +# [VIP] Core 3.0 DEV #41 + +### Изменения: +- Доработана формировка sql запросов для `USE_MORE_SERVERS`. + +# [VIP] Core 3.0 DEV #40 + +### Изменения: +- Изменен натив `VIP_RegisterFeature` (Добавлен параметр `bCookie` - Регистрировать ли куки для ф-и (действительно только для типа SELECTABLE)). + +# [VIP] Core 3.0 DEV #39 + +### Изменения: +- Исправлена ошибка на SQLite `SQL_Callback_RemoveClient: no such column: sid`. + +# [VIP] Core 3.0 DEV #38 + +### Изменения: +- Исправлена ошибка на SQLite `SQL_Callback_ErrorCheck: no such column: sid`. + +# [VIP] Core 3.0 DEV #37 + +### Изменения: +- Исправлена ошибка когда не удалялись истекшие VIP-игроки. + +# [VIP] Core 3.0 DEV #36 + +### Изменения: +- Теперь точно исправлена ошибка `Invalid Handle 0 (error 4)` (`DB_RemoveClientFromID`). + +# [VIP] Core 3.0 DEV #35 + +### Изменения: +- Исправлена ошибка `Invalid Handle 0 (error 4)` (`DB_RemoveClientFromID`). + +# [VIP] Core 3.0 DEV #34 + +### Изменения: +- Натив `VIP_RemoveClientVIP` помечен как устаревший и будет удален в будущем. +- Добавлен новый натив `VIP_RemoveClientVIP2`. +- Исправлена ошибка `Client index 0 is invalid` при добавлении VIP-игрока через `sm_addvip`. + +# [VIP] Core 3.0 DEV #33 + +### Изменения: +- Изменени натив `VIP_SetClientFeatureStatus`. +- Исправлена ошибка `SQL_Callback_SelectExpiredAndOutdated: Unknown column 'iTime' in 'where clause'`. +- Переработана система логов. + +# [VIP] Core 3.0 DEV #32 (спасибо DarklSide за обнаруженные ошибок) + +### Изменения: +- Исправлено описание форварда `VIP_OnClientPreLoad`. +- Исправлен натив `VIP_GiveClientFeature`. +- Исправлена ошибка `SQL_Callback_SelectExpiredAndOutdated: no such function: UNIX_TIMESTAMP` на SQLite. +- Исправлено обновление ников игроков. +- Исправлена работа DataPack на sm 1.10. + +# [VIP] Core 3.0 DEV #31 + +### Изменения: +- Добавлен форвард `VIP_OnClientPreLoad`. +- Исправлен и включен натив `VIP_GiveClientFeature`. +- Добавлен натив `VIP_RemoveClientFeature`. +- Изменен натив `VIP_CheckClient`. +- Значение по-умолчанию для `sm_vip_delete_outdated` изменено на `-1`. +- Исправлено удаление истекших и не активных игроков. + +# [VIP] Core 3.0 DEV #30 + +### Изменения: +- Исправлена работа списка VIP-игроков. + +# [VIP] Core 3.0 DEV #29 + +### Изменения: +- Исправлены SQL ошибки. +- Небольшая оптимизация. +- Исправлена отладка. + +# [VIP] Core 3.0 DEV #28 + +### Изменения: +- Исправлена ошибка из-за которой плагин не запускался `Fatal error creating dynamic native!/unexpected error 23 in AskPluginLoad callback`. +- Изменено имя базы данных с `"vip"` на `"vip_core"` (еще в версии 3.0 DEV #25, просто забыл упомянуть). +- Исправлена попытка установки кодировки для SQLite базы. + +# [VIP] Core 3.0 DEV #27 + +### Изменения: +- Активирована работа квара `sm_vip_delete_outdated`. +- Полный переход на новую структуру базы данных. + +# [VIP] Core 3.0 DEV #26 + +### Изменения: +- Вернул прежний вид натива VIP_SetClientVIP и пометил как устаревший. +- Добавлен новый натив `VIP_GiveClientVIP`, как замена устаревшему `VIP_SetClientVIP`. +- Добавлена обратная совместимость натива `VIP_RemoveClientVIP`. +- Изменента структура таблиц (MySQL). + +# [VIP] Core 3.0 DEV #25 + +### Изменения: +- Добавлено использование `TranslationPhraseExists` для предовтращения ошибок (При отсутствии фразы модуля в переводе). +- Начал переводить отладку более расширенный и гибкий вид. +- Добавлен квар `sm_vip_delete_outdated` (пока не функционирует). + +# [VIP] Core 3.0 DEV #24 + +### Изменения: +- Исправлены SQL ошибки. + +# [VIP] Core 3.0 DEV #23 + +### Изменения: +- Удален столбец `id` из базы данных. +- Исправлена ошибка `SQL_Callback_SelectVipClientInfo` . +- Исправлена ошибка `SQL_Callback_ChangeTime: Unknown column 'user_id' in 'where clause'`. + +# [VIP] Core 3.0 DEV #22 + +### Изменения: +- Попытка исправления ошибки `Invalid Handle 0 (error 4)`. +- Исправлена ошибка когда у no-steam игроков значение `account_id` в базе данных становилось равным 0. + +# [VIP] Core 3.0 DEV #21 + +### Изменения: +- Исправлена ошибка `SQL_Callback_SelectVipPlayers: near ")": syntax error`. + +# [VIP] Core 3.0 DEV #20 + +### Изменения: +- Исправлена ошибка когда значение `name` в базе данных становилось равным 0. + +# [VIP] Core 3.0 DEV #19 + +### Изменения: +- Добавлена мультиязычность кнопки `"Выход"` в инфо-меню. + +# [VIP] Core 3.0 DEV #18 + +### Изменения: +- Исправлена ошибка `SQL_Callback_SelectVipPlayers: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0, 60' at line 1`. + +# [VIP] Core 3.0 DEV #17 + +### Изменения: +- Добавлено сохранение последнего входа игрока на сервер. + +# [VIP] Core 3.0 DEV #16 + +### Изменения: +- Теперь игроки хранятся в базе по AccountID. +- Исправлена работа команды `sm_addvip`: + - Теперь она может принимать: SteamID2, SteamID3 и ник. + - Исправлена выдача VIP-статуса оффлайн. + +# [VIP] Core 3.0 DEV #15 + +### Изменения: +- Добавлено исправление работы MOTD окна на CS:GO. +- Добавлена директива FIX_CSGO_MOTD, которая позволяет компилировать ядро с фиксом MOTD и без. + +# [VIP] Core 3.0 DEV #14 + +### Изменения: +- Обновлено API: + - Добавлен форвард `VIP_OnShowClientInfo`. + - Изменен натив `VIP_RemoveClientVIP`. + - Доработано и исправлено описание всех нативов и форвадов. +- Обновлен файл `addons/sourcemod/data/vip/cfg/info.ini` (Исправлено описание и опечатки, добавлен английский перевод). + +# [VIP] Core 3.0 DEV #13 + +### Изменения: +- Исправлена логическая ошибка в работе `VIP_UnregisterFeature` когда добавлялись лишние пункты в VIP-меню. +- Изменен натив `VIP_RegisterFeature` для устранения конфликта с `sm_vip_features_default_status`. +- Добавлен натив `VIP_UnregisterMe()`. + +# [VIP] Core 3.0 DEV #12 + +### Изменения: +- Исправлена ошибка `Invalid data pack handle 1f4 (error 1)`. + +# [VIP] Core 3.0 DEV #11 + +### Изменения: +- Удален натив `VIP_SetFeatureDefStatus`. +- Добавлен параметр в натив `VIP_RegisterFeature`: +``` +@param bDefStatus Значение по-умолчанию (true - Включена, false - Выключена). +``` +- Исправлена ошибка работы натива `VIP_SetClientFeatureStatus`. +- Исправлена ошибка при отправке rcon команд для работы с вип от имени сервера. + +# [VIP] Core 3.0 DEV #10 + +### Изменения: +- Исправлена ошибка `DataPack operation is out of bounds`. + +# [VIP] Core 3.0 DEV #9 + +### Изменения: +- Исправлены ошибки компиляции. + +# [VIP] Core 3.0 DEV #8 + +### Изменения: +- Добавлен параметр в натив `VIP_SetClientFeatureStatus`: +``` +@param bCallback Вызывать ли toggle каллбэк. +``` + +# [VIP] Core 3.0 DEV #7 + +### Изменения: +- Доработано меню управления VIP-игроками. +- Добавлены форварды: +``` +forward void VIP_OnFeatureRegistered(const char[] sFeatureName); +forward void VIP_OnFeatureUnregistered(const char[] sFeatureName); +``` +- Теперь `VIP_OnVIPClientLoaded` вызывается когда игрок уже полностью был загружен. +- Изменены нативы: +``` +native void VIP_GetClientID(int iClient); +// На +native int VIP_GetClientID(int iClient); + +native void VIP_SendClientVIPMenu(int iClient); +// На +native void VIP_SendClientVIPMenu(int iClient, bool bSelection = false); +``` +- Добавлены нативы: +``` +native VIP_FeatureType VIP_GetFeatureType(const char[] sFeatureName); +native VIP_ValueType VIP_GetFeatureValueType(const char[] sFeatureName); +native void VIP_SetFeatureDefStatus(const char[] sFeatureName, bool bStatus); +native int VIP_FillArrayByFeatures(ArrayList hArray); +``` + +# [VIP] Core 3.0 DEV #6 + +### Изменения: +- Исправлены ошибки. + +# [VIP] Core 3.0 DEV #5 + +### Изменения: +- Исправлены ошибки. + +# [VIP] Core 3.0 DEV #4 + +### Изменения: +- Полный перевод на новый синтаксис (`newdecls required`) +- VIP_OnVIPClientLoaded теперь вызывается когда полностью загружены настройки игрока. +- Изменен натив `VIP_SetClientVIP`. +- Удалены лишние фразы из файла перевода. + + +# [VIP] Core 3.0 DEV #3 + +### Изменения: +- Удалены все типы авторизации кроме AUTH_STEAM. +- Изменена команда sm_addvip. +- Временно отключены все функции админ-меню, кроме добавления VIP-игроков. + + +# [VIP] Core 3.0 DEV #2 + +### Изменения: +- Перевод на новый синтаксис файла vars.sp и частичный перевод других. +- Удалены пароли (из базы, запросов, api, cvars). + +# [VIP] Core 3.0 DEV #1 + +### Изменения: +- Корректная компиляция на см >= 1.7. +- Добавлена переменная time в информационных сообщениях типа меню. Отвечает за время отображения меню игроку. +- Исправлен сброс настроек при перезаходе в случае когда куки не успели загрузится. + +# [VIP] Core 3.0 DEV + +### Что изменено: +- Добавлена директива USE_ADMINMENU, которая позволяет компилировать ядро с админкой vip и без неё. +- Добавлен квар sm_vip_add_item_to_admin_menu - Добавить пункт "Управление VIP" в админ-меню. +- Добавлено отдельно меню администрирования VIP, команда для открытия sm_vipadmin, !vipadmin, /vipadmin. +- Удален частный форвард спавна игрока (и нативы хука/анхука). +- Теперь для работы требуется SM 1.5.0 или выше. From 8ffc3e7eee3a6594b1fefdfa2e51b0f36260da25 Mon Sep 17 00:00:00 2001 From: Mikhail Buchka <52104782+domikuss@users.noreply.github.com> Date: Sat, 8 Oct 2022 02:05:45 +0400 Subject: [PATCH 94/99] Update Cvars.sp --- addons/sourcemod/scripting/vip/Cvars.sp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/vip/Cvars.sp b/addons/sourcemod/scripting/vip/Cvars.sp index 092d0ab..9e49ee1 100644 --- a/addons/sourcemod/scripting/vip/Cvars.sp +++ b/addons/sourcemod/scripting/vip/Cvars.sp @@ -9,7 +9,7 @@ void Cvars_Setup() g_CVAR_hVIPMenu_CMD = CreateConVar("sm_vip_menu_commands", "vip;sm_vip;sm_vipmenu", "Команды для вызова VIP-меню (разделять ;)"); - hCvar = CreateConVar("sm_vip_server_id", "0", "ID сервера при приспользовании MySQL базы данных", _, true, 0.0); + hCvar = CreateConVar("sm_vip_server_id", "0", "ID сервера при использовании MySQL базы данных", _, true, 0.0); hCvar.AddChangeHook(OnServerIDChange); g_CVAR_iServerID = hCvar.IntValue; SetupServerID(); From f2d22a2298c9fcc99c76c3b406b73dd963702d26 Mon Sep 17 00:00:00 2001 From: crashzk Date: Sun, 17 Sep 2023 13:24:42 -0300 Subject: [PATCH 95/99] Update build.yml --- .github/workflows/build.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 971efeb..685815c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,7 +8,7 @@ jobs: continue-on-error: ${{ matrix.sm-version == '1.11.x' }} strategy: matrix: - sm-version: [ '1.9.x', '1.10.x', '1.11.x' ] + sm-version: [ '1.10.x', '1.11.x', '1.12.x' ] include: - sm-version: "1.11.x" # https://github.com/rumblefrog/setup-sp/issues/5 compiler-options: "-i=$includePath" @@ -57,15 +57,15 @@ jobs: - name: Find Assets shell: bash run: | - echo "artifact-1_9=$(find * -maxdepth 0 -type d -name "*1.9*")" >> $GITHUB_ENV echo "artifact-1_10=$(find * -maxdepth 0 -type d -name "*1.10*")" >> $GITHUB_ENV echo "artifact-1_11=$(find * -maxdepth 0 -type d -name "*1.11*")" >> $GITHUB_ENV + echo "artifact-1_12=$(find * -maxdepth 0 -type d -name "*1.12*")" >> $GITHUB_ENV - name: Arhive Assets run: | - zip -r ${{ env.artifact-1_9 }}.zip ${{ env.artifact-1_9 }} zip -r ${{ env.artifact-1_10 }}.zip ${{ env.artifact-1_10 }} zip -r ${{ env.artifact-1_11 }}.zip ${{ env.artifact-1_11 }} + zip -r ${{ env.artifact-1_12 }}.zip ${{ env.artifact-1_12 }} - name: Create Release id: create_release @@ -77,15 +77,15 @@ jobs: release_name: ${{ github.ref_name }} draft: true prerelease: false - + - name: Upload Asset uses: actions/upload-release-asset@v1.0.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ${{ env.artifact-1_9 }}.zip - asset_name: ${{ env.artifact-1_9 }}.zip + asset_path: ${{ env.artifact-1_10 }}.zip + asset_name: ${{ env.artifact-1_10 }}.zip asset_content_type: application/zip - name: Upload Asset @@ -94,16 +94,16 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ${{ env.artifact-1_10 }}.zip - asset_name: ${{ env.artifact-1_10 }}.zip + asset_path: ${{ env.artifact-1_11 }}.zip + asset_name: ${{ env.artifact-1_11 }}.zip asset_content_type: application/zip - - name: Upload Asset + - name: Upload Asset uses: actions/upload-release-asset@v1.0.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ${{ env.artifact-1_11 }}.zip - asset_name: ${{ env.artifact-1_11 }}.zip - asset_content_type: application/zip \ No newline at end of file + asset_path: ${{ env.artifact-1_12 }}.zip + asset_name: ${{ env.artifact-1_12 }}.zip + asset_content_type: application/zip From c6beeef908add3f293c74d1c18e383d2b43e7ba2 Mon Sep 17 00:00:00 2001 From: crashzk Date: Sun, 17 Sep 2023 13:30:21 -0300 Subject: [PATCH 96/99] Update build.yml --- .github/workflows/build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 685815c..9c14106 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -60,7 +60,7 @@ jobs: echo "artifact-1_10=$(find * -maxdepth 0 -type d -name "*1.10*")" >> $GITHUB_ENV echo "artifact-1_11=$(find * -maxdepth 0 -type d -name "*1.11*")" >> $GITHUB_ENV echo "artifact-1_12=$(find * -maxdepth 0 -type d -name "*1.12*")" >> $GITHUB_ENV - + - name: Arhive Assets run: | zip -r ${{ env.artifact-1_10 }}.zip ${{ env.artifact-1_10 }} @@ -107,3 +107,4 @@ jobs: asset_path: ${{ env.artifact-1_12 }}.zip asset_name: ${{ env.artifact-1_12 }}.zip asset_content_type: application/zip + From 75da6f7700060a188a5b0bc40c91a44829d03bff Mon Sep 17 00:00:00 2001 From: crashzk Date: Sun, 17 Sep 2023 13:31:36 -0300 Subject: [PATCH 97/99] Update build.yml --- .github/workflows/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9c14106..b9fb3e9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -98,7 +98,7 @@ jobs: asset_name: ${{ env.artifact-1_11 }}.zip asset_content_type: application/zip - - name: Upload Asset + - name: Upload Asset uses: actions/upload-release-asset@v1.0.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -107,4 +107,3 @@ jobs: asset_path: ${{ env.artifact-1_12 }}.zip asset_name: ${{ env.artifact-1_12 }}.zip asset_content_type: application/zip - From 6c0d63838d84717201d02a855a62c4951fa73cbd Mon Sep 17 00:00:00 2001 From: crashzk Date: Sun, 17 Sep 2023 17:02:34 -0300 Subject: [PATCH 98/99] Update build.yml --- .github/workflows/build.yml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b9fb3e9..e142d3f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,13 +5,10 @@ on: [push, pull_request, workflow_dispatch] jobs: compile: runs-on: ubuntu-latest - continue-on-error: ${{ matrix.sm-version == '1.11.x' }} + continue-on-error: ${{ matrix.sm-version == '1.12.x' }} strategy: matrix: sm-version: [ '1.10.x', '1.11.x', '1.12.x' ] - include: - - sm-version: "1.11.x" # https://github.com/rumblefrog/setup-sp/issues/5 - compiler-options: "-i=$includePath" name: "Build SM ${{ matrix.sm-version }}" steps: @@ -60,7 +57,7 @@ jobs: echo "artifact-1_10=$(find * -maxdepth 0 -type d -name "*1.10*")" >> $GITHUB_ENV echo "artifact-1_11=$(find * -maxdepth 0 -type d -name "*1.11*")" >> $GITHUB_ENV echo "artifact-1_12=$(find * -maxdepth 0 -type d -name "*1.12*")" >> $GITHUB_ENV - + - name: Arhive Assets run: | zip -r ${{ env.artifact-1_10 }}.zip ${{ env.artifact-1_10 }} @@ -78,7 +75,7 @@ jobs: draft: true prerelease: false - - name: Upload Asset + - name: Upload Asset 1.10 uses: actions/upload-release-asset@v1.0.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -88,7 +85,7 @@ jobs: asset_name: ${{ env.artifact-1_10 }}.zip asset_content_type: application/zip - - name: Upload Asset + - name: Upload Asset 1.11 uses: actions/upload-release-asset@v1.0.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -98,7 +95,7 @@ jobs: asset_name: ${{ env.artifact-1_11 }}.zip asset_content_type: application/zip - - name: Upload Asset + - name: Upload Asset 1.12 uses: actions/upload-release-asset@v1.0.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -107,3 +104,4 @@ jobs: asset_path: ${{ env.artifact-1_12 }}.zip asset_name: ${{ env.artifact-1_12 }}.zip asset_content_type: application/zip + From 344c467e8ae270945c4643fb961d4da3b98a35d2 Mon Sep 17 00:00:00 2001 From: crashzk Date: Sun, 17 Sep 2023 17:04:28 -0300 Subject: [PATCH 99/99] Update build.yml --- .github/workflows/build.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e142d3f..e6a0b6c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,7 +32,7 @@ jobs: mkdir plugins cd scripting spcomp VIP_Core.sp -E -o ../plugins/VIP_Core.smx -iinclude ${{ matrix.compiler-options }} - + - name: Upload artifact uses: actions/upload-artifact@v3 with: @@ -41,7 +41,7 @@ jobs: addons LICENSE retention-days: 2 - + release: name: Release if: github.ref_type == 'tag' @@ -57,7 +57,7 @@ jobs: echo "artifact-1_10=$(find * -maxdepth 0 -type d -name "*1.10*")" >> $GITHUB_ENV echo "artifact-1_11=$(find * -maxdepth 0 -type d -name "*1.11*")" >> $GITHUB_ENV echo "artifact-1_12=$(find * -maxdepth 0 -type d -name "*1.12*")" >> $GITHUB_ENV - + - name: Arhive Assets run: | zip -r ${{ env.artifact-1_10 }}.zip ${{ env.artifact-1_10 }} @@ -104,4 +104,3 @@ jobs: asset_path: ${{ env.artifact-1_12 }}.zip asset_name: ${{ env.artifact-1_12 }}.zip asset_content_type: application/zip -